前面已介绍了机智云功能板上的红外感应器及OLED接口的使用,本打算将后续的功能模块用法陆续写出,后经测试LPC54114对机智云功能板的支持似乎并不强,以小电机的控制为例,在发出启动信号后,小电机却能快速转起来,但停止时却失控了,这大概是小电机在启动时跑的电流较大或干扰较大,程序就跑飞了从而导致失控。此外,RGB_LED在完成引脚配置后就自行发光,再指定色彩显示时也不受控制。故本帖就利用已介绍的2个器件结合任务要求来实现双核通信下的交互应答。 具体实现的功能:(IR感知外部状态变化并由LCD5110屏显示状态值:A/B,然后)使用M4内核发送数据给M0(状态值:A/B),然后用M0将数据通过串口打印(输出感知状态);通过串口向M0传送数据(接收状态变化信息后,发送反馈值:C),再将数据通过M0传送给M4内核(并由LCD5110屏显示已得知反馈信息:C)。 整体工作流程如图1所示: 图1 工作流程图
图2 串口通讯显示效果
图3 LCD5110显示界面
控制代码: M4: - void MAILBOX_IRQHandler() //M0+
- {
- g_msg = MAILBOX_GetValue(MAILBOX,kMAILBOX_CM4); //kMAILBOX_CM0Plus
- PRINTF("已接收反馈! \r\n");
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
- int main(void)
- {
- unsigned char bz='z';
- /* Init board hardware.*/
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);
- BOARD_InitPins_Core0();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
- #ifdef CORE1_IMAGE_COPY_TO_RAM
- /* Calculate size of the image - not required on LPCExpresso. LPCExpresso copies image to RAM during startup
- * automatically */
- uint32_t core1_image_size;
- core1_image_size = get_core1_image_size();
- //PRINTF("Copy Secondary core image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);
- /* Copy Secondary core application from FLASH to RAM. Primary core code is executed from FLASH, Secondary from RAM
- * for maximal effectivity.*/
- memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
- #endif
- /* Initialize MCMGR before calling its API */
- MCMGR_Init();
- /* Boot Secondary core application */
- //PRINTF("\r\nStarting Secondary core.\n");
- MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);
- /* Print the initial banner from Primary core */
- //PRINTF("\r\nHello World from the Primary Core!\r\n\n");
- // Initialize Mailbox
- MAILBOX_Init(MAILBOX);
- // Enable mailbox interrupt
- NVIC_EnableIRQ(MAILBOX_IRQn);
- LCD_Configuration();
- LCD_init();
- LCD_write_english_string(10,1,"LPC54114",0);
- LCD_write_english_string(36,2,"&",0);
- LCD_write_english_string(20,3,"IOTKIT",0);
- LCD_write_english_string(10,5,"2017.8.1",0);
- delay();
- delay();
- LCD_clear();
- LCD_write_english_string(0,2,"IOTKIT",0);//LCD_write_english_string(20,3,"IOTKIT",0);
-
- CLOCK_EnableClock(kCLOCK_Gpio0);
- gpio_pin_config_t Ir_config = { kGPIO_DigitalInput, 0,};
- GPIO_PinInit(GPIO, 0U, 22U, &Ir_config);
- bz='b';
- while(1)
- {
- if (!GPIO_ReadPinInput(GPIO, 0U, 22U))
- {
- if (bz=='b')
- {
- LCD_write_english_string(50,2,"A",0);
- MAILBOX_SetValue(MAILBOX,kMAILBOX_CM0Plus, 'A');
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- bz='a';
-
- }
- }
- else
- {
- if (bz=='a')
- {
- LCD_write_english_string(50,2,"B",0);
- MAILBOX_SetValue(MAILBOX,kMAILBOX_CM0Plus, 'B');
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- bz='b';
- }
- }
-
- if ('C'==g_msg)
- {
- LCD_write_english_string(50,2,"C",0);
- g_msg=' ';
- }
- }
-
- }
复制代码M0+: - void FLEXCOMM0_IRQHandler(void)
- {
- if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(USART0))
- {
- ch = USART_ReadByte(USART0);
- PRINTF("\r\nM0 Receive from PC : %c\r\n", ch);
- }
- }
- void MAILBOX_IRQHandler() // M4
- {
- msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus); //kMAILBOX_CM4
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- }
- int main(void)
- {
- uint32_t startupData, i;
- /* Initialize MCMGR before calling its API */
- MCMGR_Init();
- /* 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();
- /* Init board hardware.*/
- /* enable clock for GPIO */
- CLOCK_EnableClock(kCLOCK_Gpio0);
- CLOCK_EnableClock(kCLOCK_Gpio1);
- BOARD_InitPins_Core1();
- /* Signal the other core we are ready */
- MCMGR_SignalReady(kMCMGR_Core1);
- BOARD_InitDebugConsole();
- // Initialize Mailbox
- MAILBOX_Init(MAILBOX);
- // Enable mailbox interrupt
- NVIC_EnableIRQ(MAILBOX_IRQn);
- PRINTF("\r\nM4 Receive from PC \r\n");
- USART_EnableInterrupts(USART0, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
- EnableIRQ(FLEXCOMM0_IRQn);
- while (1)
- {
- if('A'==msg)
- {
- PRINTF("\r\n主人,有人靠近!\r\n");
- msg='N';
- }
- if('B'==msg)
- {
- PRINTF("\r\主人,它走开了!\r\n");
- msg='N';
- }
- if(ch=='C')
- {
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, 'C');
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- ch=' ';
- }
- }
- }
复制代码
|