在线时间543 小时
UID1650185
注册时间2017-4-19
NXP金币674
TA的每日心情 | 怒 2021-1-28 20:09 |
---|
签到天数: 317 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 9365
- 最后登录
- 2022-5-12
|
本帖最后由 小马哥-1650185 于 2017-7-2 11:32 编辑
本讲主要是基于【LPC54114双核任务二】双核之从零开始--#双核mailbox通信1#这一讲的延伸扩展。
在“”“双核之从零开始--#双核mailbox通信1#”这一讲中主要讲了双核通信的mailbox方式的中断模式,上电后一直双核循环通讯。
本讲呢,再次基础上,增加了按钮控制功能,LED提示功能等。
开机上电后,通过按键PB2 触发 M4邮箱发送函数,发送数据到M0,M0收到数据进入邮箱中断,继续通过邮箱返回数据给M4,LED11变化表示M4 发送数据给M0,LED10变化表示M0 发送数据给M4.
在上个工程的基础上 需要添加LED和按键PB的初始化相关代码,随便写了一个按键扫描函数,保证按键按下并弹起后才能发送数据给M0核,如果按键按下没有释放是不发送数据的。。。
先上个图看下 效果吧(手机拍的,不是很清楚哇)
1.上电初始化效果图
2.PB2第一次按下
3.PB2第二次按下
整体串口信息
整体来说达到了预期的效果。为下一步串口收发数据做个准备吧。。。。
下面大致讲解下程序,在 双核mailbox通信1 帖子中,大部分已经讲解了,这里只说下新加的部分吧。。。
宏定义一些led11和 led7 的初始化,开,关,翻转等。记得在主函数中调用。
- #define LED11_INIT() GPIO_PinInit(GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, &led_config);
- #define LED11_TOGGLE() GPIO_TogglePinsOutput(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);
- #define LED11_ON() GPIO_SetPinsOutput(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);
- #define LED11_OFF() GPIO_ClearPinsOutput(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);
- #define LED7_INIT() GPIO_PinInit(GPIO, 0, 25, &led_config);
- #define LED7_TOGGLE() GPIO_TogglePinsOutput(GPIO, 0, 1u << 25);
- #define LED7_OFF() GPIO_SetPinsOutput(GPIO, 0, 1u << 25);
- #define LED7_ON() GPIO_ClearPinsOutput(GPIO, 0, 1u << 25);
复制代码
初始化按键
- GPIO_PinInit(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN, &sw_config);
- GPIO_PinInit(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PORT, BOARD_SW2_GPIO_PIN, &sw_config);
复制代码
在m4中,通过扫描按键函数key_scan(),检测按键状态,检测到按下PB2一次,条用过MAILBOX_SetValue发送邮箱mailboxdata,并翻转led7。
主函数如下
- while (1)
- {
- key_scan();
-
- if(1== key_M)
- {
- key_M=0;
- PRINTF("Press Button :PB2(M4) \n");
- led7_flg ^=1;
- if(led7_flg==1 )
- {
- LED7_OFF();
- PRINTF("M4:LED7####ON####\r\n\r\n");
- }
- else
- {
- LED7_ON();
- PRINTF("M4-:LED7####OFF####\r\n\r\n");
- }
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
-
- }
- }
复制代码 中断函数
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
- PRINTF("M4-СÂí¸ç:Read value from CM4 mailbox register: %d\n", g_msg);
- g_msg++;
- PRINTF("M4-СÂí¸ç:Write to CM0+ mailbox register: %d\n", g_msg);
- // MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- PRINTF("Please press the PB2 button \r\n\r\n");
- }
复制代码
M0代码
中断函数
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- PRINTF("M0-СÂí¸ç:Read to CM4+ mailbox register: %d\n", g_msg);
- g_msg++;
- PRINTF("M0-СÂí¸ç:Write to CM4+ mailbox register: %d\n", g_msg);
- led11_flg ^=1;
- if(1 ==led11_flg )
- {
- LED11_ON();
- PRINTF("M0:LED11****ON****\r\n\r\n");
- }
- else
- {
- LED11_OFF();
- PRINTF("M0-:LED11****OFF****\r\n\r\n");
- }
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
-
- }
复制代码 然后就完事了,这个还是挺简单。
-----------------------小马哥系列之【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双核任务二】传送门--------------------
|
|