在线时间543 小时
UID1650185
注册时间2017-4-19
NXP金币630
TA的每日心情 | 怒 2021-1-28 20:09 |
---|
签到天数: 317 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 9321
- 最后登录
- 2022-5-12
|
本帖最后由 小马哥-1650185 于 2017-7-2 11:32 编辑
这个帖子主要讲解下 双核mailbox通信,采用中断模式
实现功能:M4核上电后 给m0 通过mailbox 发送 一个数据,同时触发中断 MAILBOX IRQ,m0收到数据后进入接受中断,并把这个数据++返回给m4,同样m4收到后进入接受中断,数据++再发给m0,一直发下去。。。。
先看下 串口打印的数据吧
这里主要用到了"fsl_mailbox.h"中的一些函数
- void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData);
复制代码 解释:−Set (non-zero) value “mboxData” to CPU “cpu_id”, as well as trigger its MAILBOXIRQ
给“cpu_id” 这个核心发送非零数据 “mboxData” ,并触发 MAILBOX IRQ
- uint32_t MAILBOX_GetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id);
复制代码 解释:−Get mailbox value of CPU “cpu_id”.
读取“cpu_id”核的邮箱传送的数据
- void MAILBOX_ClearValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxClrBits);
复制代码 解释:−Clear mailbox value bits of CPU “cpu_id” masked by “mboxClrBits”, uses 0xFFFFFFFF to clear allbits.
清除标志位,写0xFFFFFFFF 全清
程序初始化要加上这2句话- /* Init Mailbox */
- MAILBOX_Init(MAILBOX);
- /* Enable mailbox interrupt */
- NVIC_EnableIRQ(MAILBOX_IRQn);
复制代码 接着就要在相应的中断函数里面实现上述功能了
M4:
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
- PRINTF("СÂí¸ç:Read value from CM4 mailbox register: %d\n", g_msg);
- g_msg++;
- PRINTF("СÂí¸ç:Write to CM0+ mailbox register: %d\n", g_msg);
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
复制代码
M0:
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- g_msg++;
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- }
复制代码
然后参看文档中的配置下 双核的启动顺序和控制
设置下这几个寄存器
SYSCON->CPBOOT ,SYSCON->CPSTACK,SYSCON->CPCTRL,SYSCON->CPSATA关于这几个寄存器的详细说明,5楼有个热心同学帮忙讲解到了,在此谢谢5楼这位童鞋
程序配置如下
- /* Boot source for Core 1 from flash */
- SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)CORE1_BOOT_ADDRESS + 0x4));
- SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)CORE1_BOOT_ADDRESS);
- int32_t temp = SYSCON->CPCTRL;
- temp |= 0xc0c48000;
- SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0RSTEN_MASK);
- SYSCON->CPCTRL = (temp);
复制代码
然后,M4发送给m0一条邮箱指令,触发中断
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
复制代码
这样双核的程序就会一直在邮箱中断中收发数据了
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置#
【LPC54114双核任务二】双核之从零开始--#HelloWorld双核调试#
【LPC54114双核任务二】双核之从零开始--#MDK生成BIN#
【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#
【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#
【LPC54114双核任务二】双核之从零开始--#mailbox通信3之按键#
【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0#
【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#
【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0#
【LPC54114双核任务二】已完结,小马哥出品,谢谢大家支持。。。。
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
|
|