本帖最后由 小马哥-1650185 于 2017-7-2 13:48 编辑
有了上贴【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0# 的PC收发机制,本帖将实现本周【LPC54114双核任务二】的最终需求。
一周过去了,不知道同学们还记得主题不,先来回顾下本周任务的主题吧。。。
【LPC54114双核任务二】开启!
- 本周的任务按照计划,是:掌握使用M0+内核进行串行接口通讯的操作方法</font>
- 具体要实现的功能:使用M4内核发送数据给M0,然后用M0将数据通过串口打印;通过串口向M0传送数据,再将数据通过M0传送给M4内核。
复制代码
有题才有答,对吧,万物完事都有原则,当然是不能离开主题喽。刚查看了帖子,截止目前为止(2017年7月1日10:49:34)貌似还没有看到关于本次最终任务完成的帖子,那么小马哥就不客气了。
-----------------------------------------------------分割线------------------------------------------------------
看题,本周的任务按照计划,是掌握使用M0+内核进行串行接口通讯的操作方法,需要使用M4内核发送数据给M0,然后用M0将数据通过串口打印;通过串口向M0传送数据,再将数据通过M0传送给M4内核。
小马哥的完成思路流程:
1:需要使用M4内核发送数据给M0,然后用M0将数据通过串口打印
实现思路:
使用按键PB2触发,让M4核通过mailbox的中断机制给M0核发送数据,M0核收到数据后触犯mailbox中断ISR,接收数据,打印,自加1,返给M4,打印。
效果看下图
代码分析:
(1)PB2按键部分,这一块详细配置操作,请看前面几个帖子mailbox通信3、mailbox通信4。
这里在贴一下按键扫描,贴下的代码吧
- while (1)
- {
- key_scan();
-
- if(1== key_M)
- {
- key_M=0;
- PRINTF("Press Button :PB2(M4) \n");
- led7_flg ^=1;
- PRINTF("----M4 SEND DATA TO M0 BY BUTTON PB2----\r\n\r\n");
- 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");
- }
- PRINTF("-小马哥-Rress PB2 Send Data t0 M0 : %d\n", g_msg);
-
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
-
- }
- }
复制代码(2)按下按键,触发MAILBOX_SetValue发送数据给M0的mailbox中断函数void MAILBOX_IRQHandler(),然后数据++操作,LED11翻转,在通过MAILBOX_SetValue函数将 运算后的数据传给M4核,进入M4核后,触发mailbox中断,把接收的数据打印出来,完成 如下流程:
按键PB2触发--->M4--->M0--->M4--->打印
(M0、M4的mailbox中断处理函数 在帖子最下面)
2:通过串口向M0传送数据,再将数据通过M0传送给M4内核。
实现思路:
使用串口助手像M0的usart0 发送一个数据,触发M0的串口接收中断。收到数据后打印,然后通过mailbox的中断机制给M4核发送数据,并打印。
效果看下图
代码分析:(1)在M0核 工程中添加"fsl_usart.h"头文件,配置串口0 等信息
- #define DEMO_USART USART0
- #define DEMO_USART_CLK_SRC kCLOCK_Flexcomm0
- #define DEMO_USART_CLK_FREQ CLOCK_GetFreq(kCLOCK_Flexcomm0)
- #define DEMO_USART_IRQHandler FLEXCOMM0_IRQHandler
- #define DEMO_USART_IRQn FLEXCOMM0_IRQn
- /*! @brief Ring buffer size (Unit: Byte). */
- #define DEMO_RING_BUFFER_SIZE 16
- uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];
- volatile uint16_t txIndex; /* Index of the data to send out. */
- volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */
复制代码 (2)在main函数中 初始化串口0配置,115200,8,n,1,开启接收中断,完成uart0的初始化
- usart_config_t config;
- USART_GetDefaultConfig(&config);
- config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
- config.enableTx = true;
- config.enableRx = true;
- USART_Init(DEMO_USART, &config, DEMO_USART_CLK_FREQ);
- /* Enable RX interrupt. */
- USART_EnableInterrupts(DEMO_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
- EnableIRQ(DEMO_USART_IRQn);
复制代码 (3)当pc通过串口助手发送给板子数据的时候,进入M0核的串口中断函数
- void DEMO_USART_IRQHandler(void)
- {
- /* If new data arrived. */
- if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
- {
- g_msg = USART_ReadByte(DEMO_USART);//data;
- PRINTF("M0-小马哥:Receive from PC Data: %d\n", g_msg);
- rxIndex = HexToChar(g_msg,demoRingBuffer);
- txIndex=0;
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- PRINTF("****M0 SEND DATA TO M4 BY PC****\r\n\r\n");
- PRINTF("M0-小马哥:Send to M4 Data: %d\n", g_msg);
- }
- }
复制代码 (4) 通过USART_ReadByte函数接收PC发送的数据,打印M0核接收的数据,并通过MAILBOX_SetValue将这个数据传给M4核,触发M4核的mailbox中断处理函数,把接收的数据打印出来,完成 如下流程:
PC--->M0--->M4--->打印
/////////////////////////////////////////////////M0核的mailbox 中断处理函数void MAILBOX_IRQHandler()/////////////////
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- PRINTF("M0-СÂí¸ç:Receive from M4 Data: %d\n", g_msg);
- if(g_msg<=255) g_msg++;
- else
- {
- g_msg = 0;
- }
- PRINTF("M0-СÂí¸ç:Send to M4 Data: %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);
-
- }
复制代码
////////////////////////M4核的mailbox 中断处理函数void MAILBOX_IRQHandler()//////////////////////////
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
-
- rxIndex = HexToChar(g_msg,demoRingBuffer);
- PRINTF("M4-小马哥:Receive from M0 Data: %d\n", 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双核任务二】传送门--------------------
|