查看: 3597|回复: 0

[原创] 【LPC54114双核任务二】双核MailBox和PC串口通信

[复制链接]

该用户从未签到

2

主题

5

帖子

0

注册会员

Rank: 2

积分
57
最后登录
2018-4-4
发表于 2017-7-27 20:53:02 | 显示全部楼层 |阅读模式
本帖最后由 pewill 于 2017-7-27 20:54 编辑

感谢社区送的板子。
现在先交一下作业吧。

创建工程就不说了,前面有很多大神都有帖子了。
那我现在就说说其他吧。

首先说一下官方的SDK 双核的串口例程吧。
之前又坛友发帖说每次上电M0核都会产生一次MailBox中断,我也发现了这个问题。
而且无论我再M0核开MailBox中断前如何清除 MailBox的值都不可以清除这个中断的,暂时没有找到清除MailBox中断的方法。
例如:MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
          MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, 0);
都是不可以的。

但是我找到了根源,M4核启动的时候会调用 MCMGR_StartCore函数。
  1. MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);
复制代码
这个函数会进入另一个函数:

  1. static mcmgr_status_t mcmgr_start_core_lpc54114(mcmgr_core_t coreNum,
  2.                                                 void *bootAddress,
  3.                                                 uint32_t startupData,
  4.                                                 mcmgr_start_mode_t mode)
  5. {
  6.     if (coreNum != kMCMGR_Core1)
  7.     {
  8.         return kStatus_MCMGR_Error;
  9.     }

  10.     MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, startupData);
  11.     MAILBOX_GetMutex(MAILBOX); /* Lock the mutex, let the other side unlock it */

  12.     /* Boot source for Core 1 from flash */
  13.     SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)bootAddress + 0x4));
  14.     SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)bootAddress);

  15.     uint32_t temp = SYSCON->CPCTRL;
  16.     temp |= 0xc0c48000U;
  17.     SYSCON->CPCTRL = temp | SYSCON_CPCTRL_CM0RSTEN_MASK | SYSCON_CPCTRL_CM0CLKEN_MASK;
  18.     SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0CLKEN_MASK) & (~SYSCON_CPCTRL_CM0RSTEN_MASK);

  19.     if (mode == kMCMGR_Start_Synchronous)
  20.     {
  21.         while (MAILBOX_GetMutex(MAILBOX) == 0)
  22.         {
  23.         } /* Wait for other core to unlock the mutex */
  24.     }

  25.     MAILBOX_SetMutex(MAILBOX); /* Unlock the mutex after locking it, to keep it in default state */

  26.     return kStatus_MCMGR_Success;
  27. }
复制代码


相信大家都看到了那行。
MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, startupData);
这句使M0核产生了一个MailBox中断。


我用了一个方法解决:
  1. MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 0, kMCMGR_Start_Synchronous);
复制代码

  只要startupData是0,M0的MailBox就不会中断了。


M0核读取startupData 不知道是不是只用来延迟这么简单了。
  1.   /* Get the startup data */
  2.     MCMGR_GetStartupData(kMCMGR_Core1, &startupData);

  3.     /* Make a noticable delay after the reset */
  4.     /* Use startup parameter from the master core... */
  5.     for (i = 0; i < startupData; i++)
  6.         delay();
复制代码


下面就开始完成任务了。
先初始化MailBox和串口,
然后就是打开中断。

1. M4核只用到了MailBox中断,在中断中处理然后回传给M0
  1. void MAILBOX_IRQHandler()
  2. {
  3.     uint32_t g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
  4.          PRINTF("M4_MaliBox:Receive from M0_Data: %d\r\n", g_msg);
  5.         if(g_msg < 10)
  6.                                 {
  7.                                                 g_msg++;
  8.                                                 MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
  9.                                 }
  10.       
  11.    
  12.    MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
  13. }
复制代码



2. M0核与PC串口传输,就收到数据后发个M4核,再接收M4核处理后返回的数据

  1. void FLEXCOMM0_IRQHandler(void)
  2. {
  3.         if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
  4.     {
  5.                         uint32_t  g_msg = USART_ReadByte(DEMO_USART);//data;
  6.                         PRINTF("M0-:Receive from PC Data: %d\r\n", g_msg);
  7.                                        
  8.                         MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
  9.                         
  10.                         
  11.     }
  12. }


  13. void MAILBOX_IRQHandler()
  14. {
  15.     uint32_t g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
  16.          PRINTF("M0_MailBox:Receive from M4 Data: %d \r\n", g_msg);
  17.                                 if(g_msg < 10)
  18.                                 {
  19.                                                 g_msg++;
  20.                                                 MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
  21.                                 }
  22.         
  23.                  MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
  24. }
复制代码


串口接收

串口接收



时间有限,先研究到这里吧!
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-26 08:00 , Processed in 0.112298 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表