基于STM32HAL库驱动ST7789芯片,1.69寸 240*280 屏幕模块,软件开源
1.硬件介绍
本文使用于使用ST7789驱动芯片的1.69寸TFT屏幕,分辨率为240*280,使用SPI通信,支持背光调节
本文使用自制模块为例,原理图及模块实物图如下,只是多了两个按键,其他接口定义与模块一致
2.部署使用
使用软件:STM32CubeMX + Keil v5
硬件:STM32F103RET6 基于Boring TECH V3.9开发板
自制LCD模块
硬件连接:NSS>PB0, SCK>PA5, MOSI>PA7, BLK>PA1, RST>PC5, DC>PC4
第一部分:CubeMX配置
本文所使用工程已配置好时钟树和指示灯等,实现基本运行,由于不是纯小白教程,这部分不在赘述
1.配置SPI
首先开启SPI接口,本文使用SPI1,因为LCD屏幕只需要接收SPI数据,所有选择后将第一个红框中的Mode设置为只发送主机模式,NSS片选保持默认,稍后自定义设置片选接口,然后将下方两个红框处按图中选项修改,其他保持默认,完成SPI基本设置
配置GPIO
需要配置的GPIO有三个,分别是SPI的自定义片选脚,LCD的复位端口,LCD的DC控制端口
将三个GPIO都设置为推挽输出模式,其他选项默认,为方便程序调用,自定义用户标签为:
PB0 > LCD_CS
PC4 > LCD_DC
PC5 > LCD_RES
配置定时器
由硬件电路可知,该模块可以通过PWM占空比来调节屏幕亮度,本文使用TIM2 CH2作为PWM输出口
选中TIM2中的Channel2,将选项更改为PWM Generation CH2,设置为PWM模式
更改下方红色框内为 36-1和20000 将PWM频率设置为100Hz,最后打开自动重装载
如果使用裸机,本部设置完成后,直接点击生成代码
如果使用FreeRTOS,则需要如下图所示先创建LCD任务再生成代码
第二部分:Keli代码配置
1.代码移植
将lcd.c等5个文件移动到工程目录下,本文以\user\module为例,将lcd.c 和image.h添加到工程中,并在魔术棒C/C++中添加头文件路径
添加对应文件到工程
添加头文件路径
设置好后先编译检查,没有错误可以进到下一步,由于程序默认使用SPI1和TIM2,若前置步骤配置的是其他SPI和定时器或者是其他名称的用户标签则会报错,请在lcd.h中修改。
最后可以看到编译0错误0警告
2.1使用裸机(RTOS直接跳到下面的2.2)
初始化
在main包含头文件 lcd.h
在main.c中,main函数前进行初始化,运行LCD_Init()和PWM开启输出
LCD_Init(); //LCD初始化
HAL_Delay(100);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); //启动背光PWM
调用使用
在需要使用的地方,调用lcd操作指令
LCD_Fill(0,0,LCD_W, LCD_H,WHITE); //填充全屏白色
LCD_ShowPicture(0,100,204,132,gImage_xiaoba); //展示图片
LCD_ShowString(20, 60,(uint8_t *)"[Kazami_Dunmi]", BLUE, WHITE, 24, 0); //显示文字
2.2使用FreeRTOS
初始化
在main和freertos中包含头文件 lcd.h
在main.c中,OS初始化前(USER CODE BEGIN 2)进行初始化,运行LCD_Init()和PWM开启输出
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI1_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
//在这里初始化
LCD_Init(); //LCD初始化
HAL_Delay(100);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); //启动背光PWM
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
/* Start scheduler */
osKernelStart();
.......
调用使用
在freertos.c中,对应任务函数下调用
/* USER CODE END Header_LcdTask */
void LcdTask(void const * argument)
{
/* USER CODE BEGIN LcdTask */
/* Infinite loop */
LCD_Fill(0,0,LCD_W, LCD_H,WHITE); //填充全屏白色
LCD_ShowPicture(0,100,204,132,gImage_xiaoba); //展示图片
LCD_ShowString(20, 60,(uint8_t *)"[Kazami_Dunmi]", BLUE, WHITE, 24, 0); //显示文字
for(;;)
{
osDelay(1);
}
/* USER CODE END LcdTask */
}
查看效果
编译下载,查看LCD模块状态,发现小八就说明成功了
附件下载
后续更新