基于Keil双核架构的研究1 -core1作为显示核心 1. 设计思想LPC55S69具有2个相同的Cortex-M33内核,Core0作为主核心,Core1作为辅助核心。使用Core1驱动Oled显示器,作为显示模块使用。可以大大的解放Core0的工作量,完成数据的采集和运行,让后将结果通过Core1显示出来。 显示模块为0.96寸的Oled显示器,采用SPI接口通讯。为了充分的设计验证,分别采用GPIO的方式模拟SPI时序和SPI硬件方式驱动oled显示器。基本引脚引用关系为: 2. 软件实践2.1. 资源配置通过Config tools工具完成对于Core1引脚使用的配置。 GPIO模式下的配置: SPI模式下的配置: 配置完成后生成驱动代码。 2.2. 增加OLED驱动到Core1工程中如图所示,将oled.c oled.h font.h增加到Core1的工程中。 2.3. 修改oled驱动移植oled驱动中写入字节的函数,完成驱动修改。GPIO模式如下所示: void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; // OLED_RS=cmd;//命令、数据选择 // OLED_CS=0; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_RS_GPIO,BOARD_INITPINS_CORE1_LCD_RS_PORT, (BOARD_INITPINS_CORE1_LCD_RS_PIN),cmd); GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_CS_GPIO,BOARD_INITPINS_CORE1_LCD_CS_PORT, (BOARD_INITPINS_CORE1_LCD_CS_PIN),0); //数据移位输出,msb first for(i=0;i<8;i++) { // OLED_SCLK=0; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SCK_GPIO,BOARD_INITPINS_CORE1_LCD_SCK_PORT, (BOARD_INITPINS_CORE1_LCD_SCK_PIN),0); if(dat&0x80) // OLED_SDIN=1; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SDA_GPIO,BOARD_INITPINS_CORE1_LCD_SDA_PORT, (BOARD_INITPINS_CORE1_LCD_SDA_PIN),1); else // OLED_SDIN=0; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SDA_GPIO,BOARD_INITPINS_CORE1_LCD_SDA_PORT, (BOARD_INITPINS_CORE1_LCD_SDA_PIN),0); // OLED_SCLK=1; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_SCK_GPIO,BOARD_INITPINS_CORE1_LCD_SCK_PORT, (BOARD_INITPINS_CORE1_LCD_SCK_PIN),1); dat<<=1; } // OLED_CS=1; // OLED_RS=1; GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_CS_GPIO,BOARD_INITPINS_CORE1_LCD_CS_PORT, (BOARD_INITPINS_CORE1_LCD_CS_PIN),1); GPIO_PinWrite(BOARD_INITPINS_CORE1_LCD_RS_GPIO,BOARD_INITPINS_CORE1_LCD_RS_PORT, (BOARD_INITPINS_CORE1_LCD_RS_PIN),1); } SPI模式如下所示: void OLED_WR_Byte(u8 dat,u8 cmd) { spi_transfer_t xfer ={0}; GPIO_PinWrite(BOARD_INITPINS_LCD_RS_GPIO,BOARD_INITPINS_LCD_RS_PORT, (BOARD_INITPINS_LCD_RS_PIN),cmd); srcBuff[0]= dat; /*Start Transfer*/ xfer.txData = srcBuff; xfer.rxData = destBuff; xfer.dataSize = 1; xfer.configFlags = kSPI_FrameAssert; SPI_MasterTransferBlocking(SPI1, &xfer); GPIO_PinWrite(BOARD_INITPINS_LCD_RS_GPIO,BOARD_INITPINS_LCD_RS_PORT, (BOARD_INITPINS_LCD_RS_PIN),1); } 2.4. 初始化和显示刷新Core1的main函数中,增加Oled的初始化函数,显示刷新函数。 OLED_Init(); OLED_ShowString(10,0,"OKDoE1 NXP"); OLED_Refresh_Gram(); for (;;) { lcd_count++; if((lcd_count% 500) == 0) { GPIO_PortToggle(GPIO, BOARD_INITPINS_CORE1_LED_R_PORT, 1u <<BOARD_INITPINS_CORE1_LED_R_PIN); } sprintf((char*)lcd_disp,"%05d",lcd_count); OLED_ShowString(20,25,lcd_disp); OLED_Refresh_Gram(); } 显示效果为在屏幕上刷新一个自增的16位数字,增加到65535后自动变为0. 3. 效果验证通过GPIO模式和SPI模式都可以在core1中正确运行,驱动显示刷新。 实际显示效果展示,通过Core1完成了oled的显示驱动。
|