本帖最后由 lulugl 于 2025-7-13 12:51 编辑
#申请原创#
【前言】
非常感谢21ic与ST,给予我这次参与【STM32U385RG 测评】评测的机会。本次我参与的计划是移植TouchGFX并且制做一个基于TouchGFX的门禁控制系统。下面我将分享如何创建这个综合的管理系统。
【开发环境】
1、STM32CubeMX,这个是工程的软件核心,用其配置工程所有的外设、时钟、操作系统、TouchGFX的基础代码。
2、STM32CubeCLT,这个是进行编译的核心,提供了交叉编译工具。
3、CLion,提供代码编辑工具。
4、TouchGFX Designer,做为最优秀的GUI设计工具,做到所见即所得。
【硬件】
1、NUCLEO_U3385RG-Q开发板。
2、ST7789LCD(带GT911触摸屏)
【工程创建】
1、打开STM32CubeMX创建基于STM32U385RG的基础工程。
2、配置主时钟为96MHz
3、配置sys的时基为TIM15
为了移植FreeRTOS后,出现HAL_Delay卡死,修改TIM15的中断级别为1:
4、配置USART1为日志输出,根据原理图,IO使用PA9、PA10,波特率为115200。
5、配置操作系统为FreeRTOS,内存管理为heap_4
修改Heap Size、Stack Size为0x2000
使能CMISIS RTOS2:
6、打开ICHACE
7、为了使用TouchGFX,打开CRC
到此基础的工程已经移植好了。
【移植TouchGFX】
移植touchgGFX需要驱动带触摸的LCD屏,TFT为st7789、触摸为GT911
1、使用SPI1来驱动LCD屏,同时还需要指定CS、DC、RST三个IO,定义IO如下:
- /*
- LCD_PWR:PB10
- LCD_RST:PC6
- LCD_WR: PC7
- LCD_CS: PC9
- LCD_SCK PA1
- LCD_SDA PA7
- */
在stm32cubeMX配置如下:
特别注意一点是SCK必须配置为上拉,并且速度需要设置为very high。
传输数据宽度为8bit,时钟极性为空闲是高电平,第二个时钟沿采样。
为了提高传输效率,给SPI1的TX配置GPDMA
为CH0配置为SPI1_TX,传输为从内存到外设,地址为自动增长,为了更高效的传输,传宽宽为Half Word即为16bit宽度。
打开spi以及GPDMA中断
2、配置PC6、PC7、PC9为普通输出。用于LCD的CS、RST、DC。
3、配置GT911,GT911使用I2C2,同时还需要配置RST与INT
- /*
- //引脚图:
- SDA--PB13
- SCL--PB14
- INT--PC8
- RST--PB5
- */
触摸屏配置到这里结束了。
【背光控制】
为了可以实现背光控制,启用TIM2_CH3为PWM输出,配置为2K的输出:
同时还需要添加一个定时器6,为touchgGFX提供一个20ms心跳。
到此外设配置结束
【TouchGFX】
打开cube-touchGFX
配置为自定义外设,宽长为240*320
实时操作系统为FreeRTOS V2
添加一个任务如下:
最后在工程中生成CMake的工程:
【创建touchGFX基础界面】
使用TouchGFX Designer在创建的工程中添加一个空白GUI添加界面如下:
生成代码后,使用Clion打开工程项目文件夹
【配置编译工具】
打开工程后,配置编工具链如下:
然后选择此工具链:
点击确定,打开工程。CMake会自动配置工程。
编译后成功生成工程:
看到RAM占用达到95%,因此需要把heap放到第二个内存区域,修改链接文件如下:
- ._user_heap_stack :
- {
- . = ALIGN(8);
- PROVIDE ( end = . );
- PROVIDE ( _end = . );
- . = . + _Min_Heap_Size;
- . = . + _Min_Stack_Size;
- . = ALIGN(8);
- } >RAM2
重新编译后点用内存如下:
- [89/89] Linking CXX executable 21ic_touchGFX.elf
- Memory region Used Size Region Size %age Used
- RAM: 170420 B 192 KB 86.68%
- RAM2: 16 KB 64 KB 25.00%
- FLASH: 305288 B 1 MB 29.11%
【移植lcd驱动】
将st7789与GT911的驱动添加到工程中。
将工程选项添加进CMakeLists.txt中
在lcd中配置spi写入字节的函数:
- /**************************************************************
- 函数名称 : sp1_write_byte
- 函数功能 : SPI1 写一个字节
- 输入参数 : w_data:要写入的字节,size:写入字节大小
- 返回值 : 0 --> 写入成功,其他 --> 写入失败
- 备注 : 无
- **************************************************************/
- uint8_t sp1_write_byte(uint8_t *r_data, uint16_t size)
- {
- return HAL_SPI_Transmit(&hspi1, r_data, size, 1000);
- }
【区配置touchgfx显示】
1、打开TouchGFXHAL.cpp中在顶部添加代码如下:
|