2-1嵌入式进阶指南:P169H002 基于 ST7789T3 和 CST816D 驱动的 LCD 触摸显示屏开发手册(2)
基于P169H002的LCD 触摸显示屏的驱动板制作
学会驱动板制作就可以将LCD 触摸显示屏添加到你的任何项目中。
本教程覆盖全面,看完即可自己从0完成,包含了:
硬件: 原理图、PCB 、器件选型。
软件:新建工程、LCD底层驱动、触摸屏底层驱动、LVGL的UI界面。
本文是基于P169H002的LCD触摸显示屏的第二部分。
如果有需要可以点击下方链接跳转
前一节:第一部分:绘制原理图和PCB
后一节:第三部分:LCD屏幕驱动程序编写
第二部分:软件底层基础实现
本文使用的STM32F411RET6相关资料如下(需要可直接跳转):
1、Keil5的Device:STM32F4xx CMSIS Packs;
2、HAL库和RTOS:STM32CubeF4 MCU和MPU包;
3、参考手册:STM32F411xC/E 参考手册.PDF;
1、准备软件开发环境
①新建工程
(1)点击下载CMSIS包
(2)安装时的路径一定要在你的Keil安装路径之下
(3)新建工程选择芯片型号
②配置HAL库
建立好自己的工程文件之后,把从官方下载下来的STM32Cube MCU和MPU包中的配置HAL库需要的文件,粘贴复制到自己的工程中。
注:我的工程结构并不规范,但是这样便利性会更好,后期可以自己调整
(1)一级目录
(2)CMSIS
INC目录
一共33个文件
Src目录
(3)Hardware
这里放自己写的底层驱动加上Inc和Src即可。
(4)Library
Inc目录
要把 STM32F4XX_HAL_conf_template.h 重命名成 STM32F4XX_HAL_conf.h
Src目录
库文件大概加上就可以,如果你觉得工程体积太大可以只加需要用到的。
(5)LVGL
这个文件是LVGL的移植,具体操作在另一篇专门写LVGL移植的文章中。
③配置工程
Startup
CMSIS
library
Define的填写 和 头文件的包含
完成这些点击编译,完成后 0 Error(s), 0 Warning(s) 就是成功完成了开发环境的配置。
2、选择内部高速时钟
在main函数中的HAL_Init()之后为保证程序顺利运行,自己配置一次内部高数时钟。
uint32_t RCC_Init(void)
{RCC_OscInitTypeDef RCC_OscInitStructure;RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStructure.HSIState = RCC_HSI_ON; //开启HSI 16MHzRCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON; //开启PLLRCC_OscInitStructure.PLL.PLLM = 16; //PLL分频到1MHz,将输入时钟分频到 1~2MHz(PLL 最佳工作范围)RCC_OscInitStructure.PLL.PLLN = 200; //PLL倍频到200MHzRCC_OscInitStructure.PLL.PLLP = RCC_PLLP_DIV2; //PLL分频到100Mhz,分频后作为 SYSCLK(CPU 主时钟)频率最高 100 MHzRCC_OscInitStructure.PLL.PLLQ = 4; //为 USB OTG、SDIO 等外设提供时钟RCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI; //PLL选择内部高速时钟源HAL_RCC_OscConfig(&RCC_OscInitStructure);RCC_ClkInitTypeDef RCC_ClkInitStructure;RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1; //HCLK 最高100MHzRCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV2; //PCLK1 最高50MHzRCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1; //PCLK2 最高100MHzRCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_HCLK |RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2; //配置4条时钟线RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_3);/* 检查时钟频率 */uint32_t CLK[3] = {0};HAL_RCC_MCOConfig(RCC_MCO2,RCC_MCO2SOURCE_SYSCLK,RCC_MCODIV_2);SystemCoreClockUpdate();CLK[0] = HAL_RCC_GetHCLKFreq();CLK[1] = HAL_RCC_GetPCLK1Freq();CLK[2] = HAL_RCC_GetPCLK2Freq();return CLK[0];
}
因为内部高速时钟的稳定性不好,对环境温度和电压有一定要求,HAL_RCC_MCOConfig();这个函数通过参数的配置可以输出芯片内部的时钟频率,用示波器可以获取真实的时钟波形,然后通过RCC_OscInitStructure.HSICalibrationValue这个成员来微调HSI,来保持稳定可知的时钟频率。
像在文中的参数,有如下解释:
@param1:RCC_MCO2: Clock source to output on MCO2 pin(PC9).
@param2:RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source.
@param3:RCC_MCODIV_1: no division applied to MCOx clock
通过PC9把SYSCLK的时钟频率1分频的输出出来。
(这里要注意GPIO的最高输出速率,如果时钟频率超过了GPIO的最高速率,输出的波形会有错误)
3、通过USART进行调试
这里没有什么需要赘述的,简单的配置串口。
串口初始化
void UART_Debug_Init(void)
{UART_Debug.Uart.Instance = USART6;UART_Debug.Uart.Init.BaudRate = 9600;UART_Debug.Uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;UART_Debug.Uart.Init.Mode = UART_MODE_TX_RX;UART_Debug.Uart.Init.OverSampling = UART_OVERSAMPLING_16;UART_Debug.Uart.Init.Parity = UART_PARITY_NONE;UART_Debug.Uart.Init.StopBits = UART_STOPBITS_1;UART_Debug.Uart.Init.WordLength = UART_WORDLENGTH_8B;HAL_UART_Init(&UART_Debug.Uart);
}void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{if(huart->Instance == USART6){/* 打开外设时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_USART6_CLK_ENABLE();/* 初始化GPIO */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Alternate = GPIO_AF8_USART6;GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;GPIO_InitStructure.Pin = GPIO_PIN_6;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.Alternate = GPIO_AF8_USART6;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;GPIO_InitStructure.Pin = GPIO_PIN_7;GPIO_InitStructure.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);}
}
正常启动提示
int main(void)
{/* 初始化 */System_Init();UART_Debug_Init();/* 启动正常提示 */HAL_Delay(50);HAL_UART_Transmit(&UART_Debug.Uart,(uint8_t *)"STM32F411RET6 开机\r\n",18,100);while(1){}
}
准备工作成功完成
本文结语:如果觉得不错可以点赞收藏一下,没准哪天你就用到了。