在线时间9 小时
UID2064870
注册时间2016-8-18
NXP金币0
该用户从未签到
注册会员

- 积分
- 57
- 最后登录
- 2018-4-4
|
本帖最后由 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函数。
- MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);
复制代码 这个函数会进入另一个函数:
- static mcmgr_status_t mcmgr_start_core_lpc54114(mcmgr_core_t coreNum,
- void *bootAddress,
- uint32_t startupData,
- mcmgr_start_mode_t mode)
- {
- if (coreNum != kMCMGR_Core1)
- {
- return kStatus_MCMGR_Error;
- }
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, startupData);
- MAILBOX_GetMutex(MAILBOX); /* Lock the mutex, let the other side unlock it */
- /* Boot source for Core 1 from flash */
- SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)bootAddress + 0x4));
- SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)bootAddress);
- uint32_t temp = SYSCON->CPCTRL;
- temp |= 0xc0c48000U;
- SYSCON->CPCTRL = temp | SYSCON_CPCTRL_CM0RSTEN_MASK | SYSCON_CPCTRL_CM0CLKEN_MASK;
- SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0CLKEN_MASK) & (~SYSCON_CPCTRL_CM0RSTEN_MASK);
- if (mode == kMCMGR_Start_Synchronous)
- {
- while (MAILBOX_GetMutex(MAILBOX) == 0)
- {
- } /* Wait for other core to unlock the mutex */
- }
- MAILBOX_SetMutex(MAILBOX); /* Unlock the mutex after locking it, to keep it in default state */
- return kStatus_MCMGR_Success;
- }
复制代码
相信大家都看到了那行。
MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, startupData);
这句使M0核产生了一个MailBox中断。
我用了一个方法解决:
- MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 0, kMCMGR_Start_Synchronous);
复制代码
只要startupData是0,M0的MailBox就不会中断了。
M0核读取startupData 不知道是不是只用来延迟这么简单了。
- /* Get the startup data */
- MCMGR_GetStartupData(kMCMGR_Core1, &startupData);
- /* Make a noticable delay after the reset */
- /* Use startup parameter from the master core... */
- for (i = 0; i < startupData; i++)
- delay();
复制代码
下面就开始完成任务了。
先初始化MailBox和串口,
然后就是打开中断。
1. M4核只用到了MailBox中断,在中断中处理然后回传给M0
- void MAILBOX_IRQHandler()
- {
- uint32_t g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
- PRINTF("M4_MaliBox:Receive from M0_Data: %d\r\n", g_msg);
- if(g_msg < 10)
- {
- g_msg++;
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- }
-
-
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
复制代码
2. M0核与PC串口传输,就收到数据后发个M4核,再接收M4核处理后返回的数据
- void FLEXCOMM0_IRQHandler(void)
- {
- if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
- {
- uint32_t g_msg = USART_ReadByte(DEMO_USART);//data;
- PRINTF("M0-:Receive from PC Data: %d\r\n", g_msg);
-
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
-
-
- }
- }
- void MAILBOX_IRQHandler()
- {
- uint32_t g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- PRINTF("M0_MailBox:Receive from M4 Data: %d \r\n", g_msg);
- if(g_msg < 10)
- {
- g_msg++;
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
- }
-
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- }
复制代码
串口接收
时间有限,先研究到这里吧!
|
|