本文主要内容如下:
使用STM32CubeMX生成Keil工程,并移植TFT-LCD的显示和触摸驱动到正点原子的探索者开发板【STM32F407ZGT6】以及STM32F407ZGT6最小系统板上。
文末提供程序【百度网盘】
写这篇博客的原因: 没有看到有完整移植过程、描述清楚的博客。导致我认识的同学在移植的过程中遇到了很多问题。我尽力写得清楚点。
注意: 本文不介绍原理,原因是我个人认为能用就行,遇到了问题或者感兴趣再去了解原理。本文只是记录了一个完整的移植过程。后文提供博客中提到的所有程序。
环境:
文中没有标注序号的均是可以不用修改的部分
配置串口的原因:正点原子的代码中含有自己写的串口代码,并且和HAL生成的串口代码文件一致,均为usart.c和usart.h。后续移植过程中不会引入正点原子的串口程序,但是他的其他文件中包含这两个uart文件,所以在这里配置一下。
生成代码后进入Keil,建议编译一下空项目,没问题就进入下一步。
将件夹下的Drivers\BSP\LCD移植到自己工程下,我移植到了这里面
正点原子重新实现了一些函数,包括delay,引脚控制等,移植的时候很容易在这上面出错。我们也不需要重写或者做大幅度的修改。只需要解决一些冲突和报错即可。
打开正点原子工程中的Drivers\SYSTEM,将下图中的两个文件夹复制到自己的工程下面。我的放在了BSP\SYSTEM下面。【参考上图文件夹】
移植好后不能编译,因为头文件路径有问题。我们需要修改所有引入的文件的路径。只要有一个没改就会有报错。另外图中的usart.h可以注释也可以不注释,如果没有在STM32CubeMX配置串口,就需要注释。
修改头文件路径后,还需要注释所有的printf,可以快捷键Ctrl + F呼出搜索面板:
然后注释掉引入的文件中的所有printf。【这么做的原因是我没有写串口重定向,后面调试的时候需要的话还是可以取消注释的】
此时再次编译,依旧会报错,报错问题在HAL_SRAM_MspInit这个函数上。原因是正点原子在lcd.c文件中定义并实现了这个函数,STM32CubeMX在生成代码时,在fsmc.c中也生成了这个函数,导致了多重定义。
解决办法也很简单:注释其中一个即可,为了不破坏HAL库,我们可以优先注释lcd.c的HAL_SRAM_MspInit【两种注释方法我都尝试了,都能正常驱动屏幕】
此时编译不会再出现问题。但是驱动屏幕会无法正常显示。问题出在delay.c这个文件中。
我们将delay_us这个函数中的内容进行注释,并写入如下内容(需要注意,下面的delay_us延时时间是不准确的。):
void delay_us(uint32_t nus)
{
for(int i = 0; i < nus ; i ++) {
__asm volatile ("nop");
}
}
注释delay_ms中的内容,并修改为HAL_Delay
void delay_ms(uint16_t nms)
{
HAL_Delay(nms);
}
同时也要注意,文件中含有两个delay_ms和delay_ns,实在分不清楚,请两个都做修改。并且delay.c的最下方有一个HAL_Delay,请将这个函数的内容包括函数名都注释掉,如下图。【2023-3-18补充】
在main.c中引入lcd.h这个头文件并且在main函数的**while(1)**之前写上:
lcd_init()
lcd_clear(GREEN);
如果此时编译还出现报错,很有可能是你引入了lcd_ex.c这个文件,移除重新编译即可【如下图】
和上面的步骤是类似的,先找到触摸工程:
并将路径Drivers\BSP下的三个文件夹【如下图】复制到自己工程中
和引入显示驱动一致,需要修改一下文件中头文件的路径。也要注释printf。
报错虽然多,但是容易修改。ft5206.c中有一个printf忘记注释导致触摸无法工作,顺带还影响了显示。
在最小系统板上,下面的代码调用了触摸案例。
而在正点原子的探索者开发板上,初始化的时候进入到了其他的else中,这个else中没有触摸测试程序。所以还需要移植一下正点原子的触摸案例。
完整的工程如下:
链接:https://pan.baidu.com/s/1wJnGJlebi5vQRwY_XeEwmA?pwd=3hxg
提取码:3hxg
待补充。