在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币12
TA的每日心情 | 郁闷 2022-4-4 11:28 |
---|
签到天数: 351 天 [LV.8]以坛为家I
金牌会员
- 积分
- 5740
- 最后登录
- 2022-4-4
|
本帖最后由 wambob 于 2017-6-28 12:06 编辑
使用Inter-CPU Mailbox模块进行核间通讯。mailbox提供了一种在双核之间通讯的简单方法。
SDK里提供了Mailbox模块外设驱动,还有简单的例子代码。包括mailbox的初始化、设置值和获取值。
多核例程 hello world 已经跑起来了,在其基础上添加 Mailbox 相关代码 进一步学习。
添加开关PB4,当按下开关时,M4核发送数据到mailbox。M0核接收到数据后打印到串口,然后改变值,清除mailbox后发回M4核,M4核收到后打印到串口,并清除mailbox。
mailbox代码要在CM4和CM4中同时添加,稍有不同的发送方向不同。
CM4工程中添加的部分代码有:
读取M0核送到CM4邮箱的信息。
- void MAILBOX_IRQHandler()
- {
- /* Read message from CM<font size="3">4</font> mailbox register, sent by primary core */
- uint32_t message;
- message = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
- PRINTF("CM4 core received:%d\r\n",message);
- /* Clear mailbox CM4 mailbox register */
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
复制代码 在主函数中初始化mailbox、使能mailbox中断
- MAILBOX_Init(MAILBOX);
- NVIC_EnableIRQ(MAILBOX_IRQn);
复制代码
在while循环里发送到M0核的代码
- if (!GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN))
- {
- delay();
- if (GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN)!=0)
- {
- uint32_t message = 1;
- /* Write message to CM0+ mailbox register - it causes interrupt on CM0+ core */
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, message);
- }
- }
复制代码 CM0工程添加代码和CM4差不多。除了mailbox相关代码外,还需要添加串口打印相关代码。
串口打印信息
有个问题是当启动m0核时,不清楚为何会触发邮箱中断,导致一次通讯。只要启动M0核,就会导致一次通讯。
|
|