STemwin 系列(一)STM32 HAL库 裸机移植STemwin

2024-01-24 23:18

本文主要是介绍STemwin 系列(一)STM32 HAL库 裸机移植STemwin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、准备工作

1、STM32CubeMx     我使用的是4.25版本的,软件还没装上的自己去下载安装就可以了


2、下载F103最新的固件库,新建工程的时候,会自动提示让你下载的,不用另行下载

下载保存的地方可以在软件的project -> setting 页面的最底下看到


3、TFT屏幕,了解清楚平模的驱动IC型号(后面会用到),同时准备好此屏幕的驱动。注意这里只说明支持FSMC驱动的LCD屏幕(数据输出最少16个),为避免其它错误操作,应先确保驱动文件和屏幕都是好的,比如先跑个例程之类的。

4、编译环境Keil uVision5

二、添加文件

1、新建工程,我这里是F103VET6的芯片


2、配置FSMC,这里只有NE1可以选,那就选NE1了,不同的选择,会导致不同的代码,后面再说,这里先选上NE1

,寄存器的选择就选A16,也可以选其它,同样,不同的选择,会导致不同的代码,后面再说。注意数据选16位(这里只讲16位,8位的其实一样)。


    注意一定要选上CRC校验,这里是ST的一个保护机制,没什么卵用,强制要求的,选上就是了。

    屏幕一般都是由22个引脚来控制的,其中16个引脚是数据,6个是控制,对应关系:

    FSMC_NOE    LCD_RD    读 

    FSMC_NWE    LCD_WR    写

    FSMC_NEx    LCD_CS    片选

    FSMC_Ax    LCD_RS    寄存器选择,注意不是复位

    FSMC_D00~D15 对应 LCD_D0~D15    数据引脚 

    到这里,已经配置了LCD屏幕的20个引脚了,(16个数据引脚,4个控制引脚),还需要在配置LCD的RST和BK引脚,也就是复位和背光灯引脚,没有的话可以不配置,我这里有,配置为输出即可(默认推挽输出)


至此,引脚配置完。把时钟配置一下,就可以生成了。


3、把STemwin复制到工程文件




把整个STemwin复制到工程文件里面,要把SemWin文件夹改个名称,否则的话,在重新生成代码的时候,改文件夹可能会被删除


再工程新建一个分组STemwin,把这几个文件添加到工程:


  • GUI_X.C:\OS 文件夹
  • GUIConf.cLCDConf_FlexColor_Template.c:\Config 文件夹
  • STemWin522_CM3_Keil.lib :\Lib 文件夹

把LCD驱动文件也放到工程里面,注意驱动文件的名称不能为lcd.c、lcd.h,因为emwin里有一个文件也叫lcd.c,改一下名称就好,我这里改为:


其中,ili9341是我屏幕的驱动IC,再次提醒,记住这个IC芯片的型号,把相应的头文件也加进去(个人习惯把头文件和源文件分开两个文件夹存放)


添加到工程里面,把相应的头文件路径加进去:


然后编译一下:


一堆错误(错误数量跟LCD的驱动文件有关),前面的都是一些体力活,真正要改代码的工作终于开始了。

三、修改代码

1、GUI_X.c

    这里只需要修改一个代码,源码里面由这么一个变量:volatile GUI_TIMER_TIME OS_TimeMS;


这是整个emwin的心跳,必须要让它跳起来(我是直接把它放到了系统时钟里面,由兴趣的朋友可以放在定时器里面,注意是1ms的心跳):


这里系统会报错,提示GUI_TIMER_TIME这个数据类型未定义,很简单,在文件里加上 #include “GUI.h”就可以了

2、GUIConf.c


只需要把这个数据改小一点就可以了,我这里改成10*1024,也就是10K字节,具体看芯片的内存空间大小,大点小点都无所谓。

3、LCDConf_FlexColor_Template.c

先把LCD驱动头文件加进来:#include "bsp_ili9341_lcd.h"


屏幕分辨率,按实际屏幕分辨率大小修改就可以了

然后要修改这4个函数:

static void LcdWriteReg(U16 Data) ;

static void LcdWriteData(U16 Data);

static void LcdWriteDataMultiple(U16 * pData, int NumItems);

static void LcdReadDataMultiple(U16 * pData, int NumItems);

这时候需要回去看我们LCD的驱动代码了,先看头文件bsp_ili9341_lcd.h,找到类似下面定义的东西:

#define      macFSMC_Addr_ILI9341_CMD         ( ( uint32_t ) 0x60000000 )      //FSMC_Bank1_NORSRAM1用于LCD命令操作的地址
#define      macFSMC_Addr_ILI9341_DATA        ( ( uint32_t ) 0x60020000 )      //FSMC_Bank1_NORSRAM1用于LCD数据操作的地址  


为何是0x60000000?这又牵连到了一开始我们配置的FSCM了,具体可以查看FSMC的相关时序,我们的LCD驱动协议,实际上跟FSMC是一毛一样的。这里只介绍怎么决定这个值就好:

NE1 0x600000000
NE2 0x640000000
NE3 0x680000000

NE4 0x6C0000000

然后0x60020000的决定方式:

 0x600000000 |  ( 0x1<<( 16 + 1 ) )  = 0x60020000;

其中的16就是A16,如果是A17,那就是17+1,结果为0x60040000

现在只要记住,写LCD命令是小的数值,写LCD数据是大的数值就好了。

然后定义两个宏定义:


#define LCD_WRITE_REG ( *(__IO uint16_t *) (macFSMC_Addr_ILI9341_CMD) )

#define LCD_WRITE_DATA ( *(__IO uint16_t *) (macFSMC_Addr_ILI9341_DATA) )

然后,写上代码:

static void LcdWriteReg(U16 Data) {
  // ... TBD by user
  LCD_WRITE_REG = Data;
}
static void LcdWriteData(U16 Data) {
  // ... TBD by user
  LCD_WRITE_DATA = Data;
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
    LCD_WRITE_DATA = *pData++;
  }
}
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
    *pData++ = LCD_WRITE_DATA;
  }

}

在LCD_X_Config函数里面,加入一行代码

Config.NumDummyReads = 2; 

表示第二个数据才是真实数据(不理解的话就先记住,以后慢慢会清楚)


第二个红框的就是由驱动芯片决定的,打开这个文档:


在1127页左右,找到你对应的芯片驱动IC,然后决定红框中的值取什么:


我这里是ili9341,所以要改成GUIDRV_FLEXCOLOR_F66709

GUIDRV_FLEXCOLOR_M16C0B16的意思页可以在文档中找到:


然后,把驱动文件的初始化函数放在这里:

剩下的,就是把LCD的驱动代码修改为HAL库的了,没什么难度,自行修改吧,注意要细心点。

至此,移植代码做完了,写个测试代码

四、测试代码

先加入头文件  #include "GUI.h"和lcd驱动#include "bsp_ili9341_lcd.h"

写入代码:





这篇关于STemwin 系列(一)STM32 HAL库 裸机移植STemwin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641338

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类