请选择 进入手机版 | 继续访问电脑版
搜索
查看: 135|回复: 0

[原创] 【LPC54114 Bonus任务】双核通信下的机智云功能板控制--交互

[复制链接]
  • TA的每日心情
    慵懒
    2016-12-12 08:39
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    112

    主题

    1108

    帖子

    3625

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    3625
    发表于 2017-8-10 18:41:27 | 显示全部楼层 |阅读模式
    前面已介绍了机智云功能板上的红外感应器及OLED接口的使用,本打算将后续的功能模块用法陆续写出,后经测试LPC54114对机智云功能板的支持似乎并不强,以小电机的控制为例,在发出启动信号后,小电机却能快速转起来,但停止时却失控了,这大概是小电机在启动时跑的电流较大或干扰较大,程序就跑飞了从而导致失控。此外,RGB_LED在完成引脚配置后就自行发光,再指定色彩显示时也不受控制。故本帖就利用已介绍的2个器件结合任务要求来实现双核通信交互应答。
    具体实现的功能:IR感知外部状态变化并由LCD5110屏显示状态值:A/B,然后)使用M4内核发送数据给M0(状态值:A/B,然后用M0将数据通过串口打印(输出感知状态);通过串口向M0传送数据(接收状态变化信息后,发送反馈值:C,再将数据通过M0传送给M4内核(并由LCD5110屏显示已得知反馈信息:C
    整体工作流程如图1所示:
    图片a.png
    1 工作流程图

    图片B.png
    2 串口通讯显示效果

    图片c.png
    3 LCD5110显示界面

    控制代码:
    M4:
    1. void MAILBOX_IRQHandler()   //M0+
    2. {
    3.       g_msg = MAILBOX_GetValue(MAILBOX,kMAILBOX_CM4);  //kMAILBOX_CM0Plus
    4.             PRINTF("已接收反馈! \r\n");
    5.             MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    6. }
    7. int main(void)
    8. {
    9.           unsigned char bz='z';
    10.     /* Init board hardware.*/
    11.     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    12.     CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);

    13.     BOARD_InitPins_Core0();
    14.     BOARD_BootClockFROHF48M();
    15.     BOARD_InitDebugConsole();

    16.     #ifdef CORE1_IMAGE_COPY_TO_RAM
    17.     /* Calculate size of the image  - not required on LPCExpresso. LPCExpresso copies image to RAM during startup
    18.      * automatically */
    19.     uint32_t core1_image_size;
    20.     core1_image_size = get_core1_image_size();
    21.     //PRINTF("Copy Secondary core image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);

    22.     /* Copy Secondary core application from FLASH to RAM. Primary core code is executed from FLASH, Secondary from RAM
    23.      * for maximal effectivity.*/
    24.     memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
    25.     #endif

    26.     /* Initialize MCMGR before calling its API */
    27.     MCMGR_Init();

    28.     /* Boot Secondary core application */
    29.     //PRINTF("\r\nStarting Secondary core.\n");
    30.     MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);

    31.     /* Print the initial banner from Primary core */
    32.     //PRINTF("\r\nHello World from the Primary Core!\r\n\n");

    33.     // Initialize Mailbox
    34.     MAILBOX_Init(MAILBOX);
    35.     // Enable mailbox interrupt
    36.     NVIC_EnableIRQ(MAILBOX_IRQn);

    37.     LCD_Configuration();
    38.           LCD_init();
    39.           LCD_write_english_string(10,1,"LPC54114",0);
    40.           LCD_write_english_string(36,2,"&",0);
    41.           LCD_write_english_string(20,3,"IOTKIT",0);
    42.           LCD_write_english_string(10,5,"2017.8.1",0);
    43.           delay();
    44.           delay();
    45.           LCD_clear();
    46.           LCD_write_english_string(0,2,"IOTKIT",0);//LCD_write_english_string(20,3,"IOTKIT",0);
    47.          
    48.           CLOCK_EnableClock(kCLOCK_Gpio0);
    49.           gpio_pin_config_t Ir_config = {  kGPIO_DigitalInput, 0,};
    50.           GPIO_PinInit(GPIO, 0U, 22U, &Ir_config);
    51.     bz='b';
    52.     while(1)   
    53.           {
    54.                  if (!GPIO_ReadPinInput(GPIO, 0U, 22U))
    55.                  {
    56.                          if (bz=='b')
    57.                          {
    58.                          LCD_write_english_string(50,2,"A",0);  
    59.                          MAILBOX_SetValue(MAILBOX,kMAILBOX_CM0Plus, 'A');
    60.              MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    61.                          bz='a';
    62.                          
    63.                          }
    64.                  }
    65.                  else   
    66.                  {
    67.                          if (bz=='a')
    68.                          {
    69.                          LCD_write_english_string(50,2,"B",0);  
    70.                          MAILBOX_SetValue(MAILBOX,kMAILBOX_CM0Plus, 'B');
    71.              MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    72.                          bz='b';
    73.                          }
    74.                  }
    75.                  
    76.                  if ('C'==g_msg)
    77.                  {
    78.                          LCD_write_english_string(50,2,"C",0);  
    79.                          g_msg=' ';
    80.                  }
    81.     }
    82.          
    83. }
    复制代码
    M0+:
    1. void FLEXCOMM0_IRQHandler(void)
    2. {
    3.     if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(USART0))
    4.     {
    5.                         ch = USART_ReadByte(USART0);
    6.                         PRINTF("\r\nM0 Receive from PC :  %c\r\n", ch);
    7.                 }
    8. }


    9. void MAILBOX_IRQHandler()   // M4
    10. {
    11.      msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus); //kMAILBOX_CM4
    12.      MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
    13. }

    14. int main(void)
    15. {
    16.     uint32_t startupData, i;
    17.   /* Initialize MCMGR before calling its API */
    18.     MCMGR_Init();
    19.     /* Get the startup data */
    20.     MCMGR_GetStartupData(kMCMGR_Core1, &startupData);
    21.   /* Make a noticable delay after the reset */
    22.     /* Use startup parameter from the master core... */
    23.     for (i = 0; i < startupData; i++)
    24.         delay();
    25.     /* Init board hardware.*/
    26.     /* enable clock for GPIO */
    27.     CLOCK_EnableClock(kCLOCK_Gpio0);
    28.     CLOCK_EnableClock(kCLOCK_Gpio1);
    29.     BOARD_InitPins_Core1();
    30.     /* Signal the other core we are ready */
    31.     MCMGR_SignalReady(kMCMGR_Core1);
    32.     BOARD_InitDebugConsole();
    33.           // Initialize Mailbox
    34.     MAILBOX_Init(MAILBOX);
    35.     // Enable mailbox interrupt
    36.     NVIC_EnableIRQ(MAILBOX_IRQn);
    37.           PRINTF("\r\nM4 Receive from PC \r\n");
    38.     USART_EnableInterrupts(USART0, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
    39.     EnableIRQ(FLEXCOMM0_IRQn);       
    40.    while (1)
    41.    {
    42.             if('A'==msg)
    43.                 {
    44.                   PRINTF("\r\n主人,有人靠近!\r\n");
    45.                   msg='N';
    46.                 }
    47.             if('B'==msg)
    48.                 {
    49.                         PRINTF("\r\主人,它走开了!\r\n");
    50.                         msg='N';
    51.                 }
    52.     if(ch=='C')
    53.                 {
    54.                   MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, 'C');
    55.                     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
    56.                   ch=' ';
    57.                 }
    58.         }

    59. }
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区    

    GMT+8, 2017-10-23 06:33 , Processed in 0.099552 second(s), 15 queries , Memcache On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表