在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753018
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32035
- 最后登录
- 2024-4-26
|
基于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的显示驱动。
|
|