前言

在学习STM32时,跟着教程学标准库都是用Keil软件开发,HAL库配套的例程也是Keil开发的, 同时发现配套例程的HAL库程序的硬件配置代码都是自己编写的,而在网上搜的HAL库程序都是用STM32CubeMX+Keil编写的,而这种方法极大的节省了硬件配置的时间,但是对于Keil的风格并不太满意,于是跟着网上的教程搭了CLion编写STM32程序的平台…

正文

首先打开LCD配套例程的lcd.c文件找到发现,有关FSMC的配置在如下图所示位置



于是我们便可以根据例程的配置,用STM32CubeMX配置FSMC,如图

别忘了还有LCD屏幕的背光引脚,探索者的LCD屏幕背光引脚连接的是PB15,所以在STM32CubeMX也要配置相关的引脚,如图


然后新建一个lcd.h和lcd.c

然后将例程中的lcd.h的内容(除了引用的头文件)复制到我们新建的lcd.h文件中,注意,在CLion中新建的头文件是自动生成了条件编译(#ifndef和#endif)的,所以我们只需复制条件编译里面的内容即可,如图

复制完内容后我们可以发现有很多错误,没关系,这都是没有定义的数据类型而已,接下来我们自己进行定义就行了
在我们自己新建的lcd.h文件中添加以下代码:

#include "stdint.h"typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef volatile u8 vu8;
typedef volatile u16 vu16;
typedef volatile u32 vu32;

添加完后我们发现,原来的很多个错误只剩下一个错误,而这个错误只需要把extern SRAM_HandleTypeDef TFTSRAM_Handler; 删了或者注释了就行了,因为我们用STM32CubeMX配置了FSMC,所以并不需要在lcd.h跟lcd.c里面再定义,然后我们在main.c里面引入lcd.h就可以编译一下,并编译通过证明lcd.h这个头文件就修改好了



接下来我们将例程中的lcd.c的内容复制到我们新建的lcd.c文件中,同样的不需要把头文件的引入复制,错误同样的多,不要紧,我们一步步修改

首先我们引入刚刚修改完的lcd头文件#include "lcd.h",因为我们已经配置过FSMC了,所以我们要删除或注释有关FSMC配置的代码,以下是例程中配置FSMC所用到的代码

SRAM_HandleTypeDef TFTSRAM_Handler;

//SRAM底层驱动,时钟使能,引脚分配
//此函数会被HAL_SRAM_Init()调用
//hsram:SRAM句柄
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_FSMC_CLK_ENABLE();         //使能FSMC时钟__HAL_RCC_GPIOD_CLK_ENABLE();         //使能GPIOD时钟__HAL_RCC_GPIOE_CLK_ENABLE();            //使能GPIOE时钟__HAL_RCC_GPIOF_CLK_ENABLE();            //使能GPIOF时钟__HAL_RCC_GPIOG_CLK_ENABLE();            //使能GPIOG时钟//初始化PD0,1,4,5,8,9,10,14,15GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|\GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15;GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //推挽复用GPIO_Initure.Pull=GPIO_PULLUP;           //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;        //高速GPIO_Initure.Alternate=GPIO_AF12_FSMC; //复用为FSMCHAL_GPIO_Init(GPIOD,&GPIO_Initure);     //初始化//初始化PE7,8,9,10,11,12,13,14,15GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|\GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;HAL_GPIO_Init(GPIOE,&GPIO_Initure);//初始化PF12GPIO_Initure.Pin=GPIO_PIN_12;HAL_GPIO_Init(GPIOF,&GPIO_Initure);//初始化PG12GPIO_Initure.Pin=GPIO_PIN_12;HAL_GPIO_Init(GPIOG,&GPIO_Initure);
}

以下代码在LCD初始化函数void LCD_Init(void)中,因为屏幕背光引脚我们在STM32CubeMX中已经配置过了,所以也注释了背光引脚的配置

GPIO_InitTypeDef GPIO_Initure;FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;FSMC_NORSRAM_TimingTypeDef FSMC_WriteTim;__HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOB时钟GPIO_Initure.Pin=GPIO_PIN_15;           //PB15,背光控制GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速HAL_GPIO_Init(GPIOB,&GPIO_Initure);TFTSRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;TFTSRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;TFTSRAM_Handler.Init.NSBank=FSMC_NORSRAM_BANK4;                    //使用NE4TFTSRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;  //地址/数据线不复用TFTSRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM;              //SRAMTFTSRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度TFTSRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到TFTSRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用TFTSRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;   //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAITTFTSRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;    //存储器写使能TFTSRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE;           //等待使能位,此处未用到TFTSRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_ENABLE;        //读写使用不同的时序TFTSRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到TFTSRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURST_DISABLE;           //禁止突发写TFTSRAM_Handler.Init.ContinuousClock=FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC;//FMC读时序控制寄存器FSMC_ReadWriteTim.AddressSetupTime=0x0F;        //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96nsFSMC_ReadWriteTim.AddressHoldTime=0;FSMC_ReadWriteTim.DataSetupTime=60;                //数据保存时间为60个HCLK    =6*60=360nsFSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;//模式A//FMC写时序控制寄存器FSMC_WriteTim.BusTurnAroundDuration=0;         //总线周转阶段持续时间为0,此变量不赋值的话会莫名其妙的自动修改为4。导致程序运行正常FSMC_WriteTim.AddressSetupTime=9;               //地址建立时间(ADDSET)为9个HCLK =54nsFSMC_WriteTim.AddressHoldTime=0;FSMC_WriteTim.DataSetupTime=8;                //数据保存时间为6ns*9个HCLK=54nFSMC_WriteTim.AccessMode=FSMC_ACCESS_MODE_A;    //模式AHAL_SRAM_Init(&TFTSRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);delay_ms(50); // delay 50 ms

注释完后我们发现错误仅剩下几个了

接着我们看一下错误描述,并定位到错误的位置

我们看到第1个错误跟第3,4,5,6,7个错误都是跟延时有关的,我们知道,delay_ms()跟delay_us()是正点原子自己编写的,独自放在SYSTEAM/delay文件夹里面的,我们并没有引用,而HAL库自带了延时函数HAL_Delay(),注意HAL_Delay()函数最少延时时间是1ms,而第1个错误delay_us(5)是延时5us,我们直接使用HAL_Delay(1)延时1ms代替就行了,剩下的延时函数错误的都是ms级的,直接替换成HAL_Delay()就行了,替换完后发现,延时有关的函数还是有问题,不要着急,后面引入相关的头文件就行了




然后引入头文件#include "main.h"后发现,不但HAL_Delay()函数有关的错误没有了,FSMC_Bank1E有关的错误也没有了,因为这两个错误都依赖stm32f4xx_hal.h头文件,而main.h里面引用了stm32f4xx_hal.h头文件,所以错误就没有了,当然我们也可以直接引用stm32f4xx_hal.h头文件




printf()函数错误,我们引入#include "stdio.h"头文件即可



LCD_LED=1;这个点亮背光代码错误是因为正点原子用了宏替换来置位引脚的,我们直接改为
HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);
就可以直接点亮背光了


最后就剩下字体文件的错误了,我们只需要把例程中的font.h文件添加到项目的\Core\Inc文件夹中,并在lcd.c文件中引入#include "font.h"头文件即可



接着我们编译一下,编译通过即完成移植。

最后,我们把例程中的main.c有关屏幕显示的代码复制到我们的main.c文件中测试

下载烧录后

正点原子STM32F4探索者开发板HAL库TFT LCD屏幕例程移植到STM32CubeMX+CLion相关推荐

  1. 正点原子STM32F4探索者开发板HAL库触摸屏例程移植到STM32CubeMX+CLion

    前言 本次移植我们将在移植好的TFT LCD屏幕例程的基础上进行修改 正文 我们打开STM32CubeMX文件,并配置好一个1us的定时器,我这里使用的是定时器6 我这里的系统时钟频率是168M,定时 ...

  2. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验

    一.首先我们来了解建立好的工程框架 1.USER 组USER下面主要存放的是用户代码. main.c是主函数 system_stm32f4xx.c文件是片上外设接入层系统文件,主要是申明设置系统及总线 ...

  3. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...

  4. stm32f407 spi3 mosi没有输出_正点原子STM32F407探索者开发板资料连载第56章 USB 读卡器实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十六章 USB 读 ...

  5. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十三章 手写识别实 ...

  6. 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  7. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  8. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  9. 正点原子stm32f407开发板pcb图_#试用名单公布#正点原子ARM Linux开发板I.MX6ULL

    活动报名链接: http://www.cirmall.com/bbs/thread-161572-1-1.html 恭喜以下五位获得试用资格,管理员会将确认邮件发送至各位获奖者邮箱,请在3个工作日内回 ...

  10. STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

    STM32下载程序至SRAM--基于正点原子精英STM32F103ZET6开发板 如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是 ...

最新文章

  1. 《基于场景的工程方法》作者问答录
  2. python应声虫代码_前端大牛们都学过哪些东西?
  3. 【转】Pro Android学习笔记(八):了解Content Provider(下中)
  4. jggrid 设置了自适应宽度仍然有滚动条的问题
  5. python 邮件中生成图表_60秒一口Python:147个demo,助你从新手小白步步进阶编程高手...
  6. 酷开网络首推“无界空间”,酷开系统8正式发布!
  7. python下载离线包
  8. 科大学长对数学系学弟学妹的忠告
  9. 8080端口号被占用的解决方法
  10. 2021年,小傅哥の年终总结
  11. 互融云人行二代征信系统对接服务
  12. consol32.exe
  13. 数字证书的概念以及作用
  14. 阿里云最新可申请试用云产品汇总(免费领阿里云服务器)
  15. Java知识——精华总结
  16. C语言获取norflash大小,NOR Flash 编程
  17. 题目 1018: 有规律的数列求和
  18. PR-AE-C4D 视频编辑工具的下载地址
  19. HelloGitHub 开源月刊(第 55 期):终端“百战天虫”,来战?
  20. 从浏览器地址栏输入url到请求返回发生了什么?

热门文章

  1. 财务总监的秘密:不用代码和Excel,10分钟做出高大上财务分析
  2. 新手入门Java疯狂讲义遇到的100个问题
  3. caffe教程笔记《Blobs, Layers, and Nets》
  4. 支付设计白皮书:支付系统的概念与中国互联网支付清算体系
  5. AppScan安装使用
  6. 代码的检查走查与评审
  7. R语言 软件安装 源码安装R
  8. 每天工作忙,学会python自动收发邮件,代替你问候女友
  9. linux 内核头文件、内核库文件
  10. 纯JS实现简易扫雷小游戏网页项目