STM32 F407探索者使用CubeMx移植正点原子LCD例程

正点原子LCD移植教程

先说明本次实验所使用的硬件型号,本次实验使用正点原子F407探索者V3.4版本,屏幕尺寸为4.3寸 TFTLCD。

本文章主要讲解如何移植正点原子的官方LCD代码,并不涉及太多理论知识。然后,官方的LCD代码应该是更新过了,因为之前也移植过一次其他板子的,好像也不是酱紫,所以大家看到有些教程照着移植不能成功,便抽时间写一下教程,希望对大家有所帮助。

进入正题,首先打开CubeMx,本次省略了芯片选择,时钟配置、调试接口、以及文件保存等配置,如有需要可看上一个教程。

完成基础配置后,首先配置串口1,这一步是为了printf能正常使用

接下来配置FSMC,如图

首先Chip Select与LCD Register Select的选择需要根据板子来,如果读者是其他型号板子需查看原理图LCD部分,然后内存类型选择LCD Interface,数据选择16位,接下来需要继续配置下面的一些参数,这时需参考例程参数配置,首先打开正点原子官方LCD例程,打开之后先进行编译,然后进入LCD初始化函数,如图

如出现这种情况

也不用着急,打开魔术棒进行设置,如图进行设置后再点击编译即可进入

进入lcd_init函数后,下滑找到图示部分

这时我们需要根据此参数进行LCD配置

再继续填写参数,如图各项数据对应已用箭头指示好,方便其他型号的板子也可根据教程移植

填写完参数后继续配置LCD的背光引脚,查看原理图选择背光引脚,如图

配置好之后点生成代码,之后打开工程文件夹目录

将正点原子官方的LCD复制到我们的工程目录下,如图

文件存放如图

打开Keil将lcd.c文件添加到工程进来

再点击编译,会发现开始出现报错,不用着急,这是正常现象,在左边文件栏打开lcd.c文件,将头文件添加部分更改成图示添加方式

代码如下:

#include "lcd.h"

#include "lcdfont.h"

#include "main.h"

#include "stdio.h"

#include "fsmc.h"

#include "lcd_ex.c"

添加完毕后再次点击编译,打开lcd.h文件,添加main.h,并删除sys.h,如图

再点击编译,打开main.h文件,在图示位置添加以下代码。

typedef uint32_t  u32;

typedef uint16_t u16;

typedef uint8_t  u8;

typedef __IO uint32_t  vu32;

typedef __IO uint16_t vu16;

typedef __IO uint8_t  vu8;

点击编译,打开lcd_ex.c文件,修改头文件添加,删除delay.h文件,添加main.h文件,如图

这时如果编译会看到报的错误是没有delay_ms或delay_us这两个函数,这是由于官方例程中自己定义了这两个函数,这里我们将代码中的这两个函数全部替换成HAL_Delay即可,首先替换delay_us,这个函数是us级别的延时,我们全部替换成HAL_Delay(1); 即可,如图,我们可以按下Ctrl+F,使用查找功能,在搜索框输入delay_us,之后查找全部,将其全部替换为HAL_Delay(1); HAL_Delay函数是以毫秒(ms)为单位的延时,故delay_us全部换成HAL_Delay(1);

将所有delay_us更改完之后,继续更改delay_ms函数,继续刚刚的操作搜索delay_ms函数,再跳转对应的位置修改,注意,刚刚的delay_us函数是微秒(us)级别的延时,更改是用HAL_Delay(1)替换,现在更改的delay_ms函数只需替换前面的名字,即将delay_ms更换成HAL_Delay即可

修改完后进行编译的话可以看到已经没有此类错误,但仍有其他错误需要修改

继续,打开main.c文件,在图示位置添加头文件、

#include "lcd.h"

#include "stdio.h"

再打上lcd_init();初始化函数,如图

lcd_init();

之后右键或者选中按F12跳转进入lcd_init函数,在该函数中,从第一句代码到HAL_Delay(50)这一句;中间的代码,全部删除,只保留

FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;

这句代码,删除完毕如图

接下来往上滑,将lcd_init上方的HAL_SRAM_MspInit函数整个删除,如图

这时点击编译已经没有错误了,到这里已经快完成了,再修改一下最后几个地方,在lcd_init函数最后,我们修改一下背光引脚,第一种方式可直接将LCD_BL(1);  替换为

HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);

或者进入LCD_BL里修改引脚定义,第二种方式如图

在这个移植过程中,复制过来的lcd文件中定义的背光引脚跟原理图一样,若操作过程中发现其他例程若不一样如图修改即可。

接下来重定向一下串口,打开usart.c文件,首先在上方添加#include "stdio.h"头文件如图

再下滑到usart.c文件最底部,添加如下代码:

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif

PUTCHAR_PROTOTYPE

{

       HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

       return ch;

}

再打开魔术棒,勾选Use Micro LIB

        至此,LCD移植已经结束,接下来可以开始进行LCD显示操作了,前面操作过程中已经添加了lcd_init函数对LCD进行初始化,接下来直接调用显示函数即可,在正点原子LCD官方例程main函数中复制lcd显示代码,注意不同例程显示代码可能有所差别,本次代码如下:

lcd_show_string(10, 40, 240, 32, 32, "STM32", RED);

lcd_show_string(10, 80, 240, 24, 24, "TFTLCD TEST", RED);

lcd_show_string(10, 110, 240, 16, 16, "ATOM@ALIENTEK", RED);

由于该函数中包括了字体颜色设置,所以不需要在前面设置颜色。

编译下载到板子上,可看到LCD成功点亮。

        最后说几个需要注意的点,在CubeMx中生成的文件中添加头文件,需要按教程所示在注释Begin与End之间添加,否则下次在CubeMx重新生成的话代码会被清除;然后注意看教程中的步骤,漏了某个步骤都可能导致失败,可通过编译报错那里检查。

希望本教程能对屏幕前的各位有所帮助,教程中的图片看起来有点糊是被CSDN压缩了一下,大家将就看一下,有问题欢迎留言探讨。

作者:要做人间第一流

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 F407探索者使用CubeMx移植正点原子LCD例程

发表评论