【CH549评测】第3篇 底层驱动软件对比评测-SPI接口LCD驱动
关于软件开发环境和相关设置,我在之前的帖子“【CH554评测】第2篇 编译,软件开发环境评测https://bbs.eeworld.com.cn/thread-567677-1-1.html”中说的很详细,感兴趣的网友可以看看。
在这里我想详细的对比一下CH554和CH549的底层驱动软件,以及相关调试。
因为后续会用到LCD显示,所以这一贴就先说说后续准备用到的SPI接口的LCD的驱动调试。
沁恒的SPI接口底层驱动程序写的还是不错的,我这次用的的SPI接口的LCD之前已经在其他芯片上驱动过了,已经有比较完善的驱动程序,只需把SPI接口的驱动程序移植一下就好。实际结果也是这样的。只是重新封装了一下SPI接口的写函数就可以了。
原来的SPI写函数:
static void SPIx_Write(uint16_t Value)
{
*(__IO uint8_t*)&SPI1 -> DR = (uint8_t)Value;
while(SPI1 -> SR & SPI_SR_BSY);
}
CH549上的SPI写函数:
unsigned char SPI_RW(unsigned char byte)
{
CH549SPIMasterWrite(byte);
return byte;
}
原来的SPI片选和指令和数据选择宏定义:
/* Chip Select macro definition */
#define LCD_CS_LOW() GPIOA -> BSRR = GPIO_BSRR_BR_0
#define LCD_CS_HIGH() GPIOA -> BSRR = GPIO_BSRR_BS_0
/* Set WRX High to send data */
#define LCD_CD_LOW() GPIOA -> BSRR = GPIO_BSRR_BR_1
#define LCD_CD_HIGH() GPIOA -> BSRR = GPIO_BSRR_BS_1
CH549上的SPI片选和指令和数据选择宏定义:
sbit LCD_CD =P1^3;
sbit LCD_CS =P1^4;
主程序部分,注意做好SPI接口模式和时钟设置:
// 配置SPI //
SPIMasterModeSet(3); //SPI主机模式设置,模式3
SPI_CK_SET(2); //试2分频
再调用LCD的初始化函数LCD_Init()(这个都不需要修改);
LCD_Init();
移植完成。
整个过程下来,感觉沁恒CH549的SPI底层驱动写得很好,移植起来很方便。只是以前芯片是ARM Cortex-M3内核,现在改为增强51内核,有些小细节需要注意一下。
首先,CH549虽然是增强51内核,但毕竟还是51内核。直接可用(直接寻址)的RAM只有128字节,不像许多ARM Cortex-M3内核的MCU,最少也有个4K字节 RAM。好在CH549毕竟是增强51内核,RAM也扩展了2K字节片内 xRAM,不过不能直接寻址,要用的话还需做些设置。
上图提示地址空间溢出。仔细看可以发现 data = 190.5,而xdata = 0。
在Keil的项目设置中如下图选择使用扩展的2K字节片内 xRAM:
此外就是当LCD显示用的字库太大时,也会出现下面错误报警:
此时,把字库空间定义到程序FLASHRAM中就好了,毕竟有64K不是!
原来的代码:
const unsigned char asc2_1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
。。。。。。
};
加关键字 code
code const unsigned char asc2_1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
。。。。。。。。。。
};
这样,移植就顺利地完成了。看一下效果吧:
这里还要注意一下,不同的MCU配合LCD时,提取字模的顺序可能不同。在CH549上配合ILI9341驱动的LCD,顺序如下图:
接下来显示一下我做的初步测试界面:
白色底:
黑色底:
感觉整个过程要数字模最花时间了。
本帖最后由 yang_alex 于 2019-7-31 14:25 编辑
感谢分享,学习啦,收藏一下备用