基于TI MSPM0L1306的1.47寸ST7789V3彩屏SPI驱动移植实战最近在准备电赛手头正好有TI的MSPM0L1306开发板和一块1.47寸的彩色LCD屏。想把屏幕驱动起来显示点参数和波形结果发现网上针对这个具体型号的完整教程不多。折腾了两天总算把驱动调通了过程踩了不少坑也总结了一些经验。今天我就把从拿到屏幕资料到最终点亮显示的完整过程手把手分享给大家希望能帮到同样在用这块板子和屏幕的朋友。咱们的目标很明确把一块1.47寸、驱动芯片是ST7789V3、采用SPI接口的彩色LCD屏成功驱动在TI MSPM0L1306开发板上。整个过程会涉及到资料获取、工程搭建、引脚配置、代码修改和功能验证。我会尽量把每一步的原理和操作细节讲清楚就算你是刚接触嵌入式的新手跟着做也能搞定。1. 准备工作认识你的屏幕在动手写代码之前咱们得先搞清楚要驱动的对象是什么。这块屏幕的关键信息都在厂家提供的资料里。模块来源与资料获取我用的屏幕是在淘宝上买的搜索“1.47寸lcd显示屏高清ips172x320 st7789驱动液晶屏”就能找到。配套的资料包括数据手册和示例代码可以通过百度网盘下载。资料链接https://pan.baidu.com/s/15OWpndYzyW8kFPqmfKNfxQ提取码8888屏幕关键参数拿到资料后先看看屏幕的基本规格这对后续的硬件连接和软件配置很重要参数项规格说明工作电压3.3V (和MSPM0L1306开发板IO电压一致可以直接连接)工作电流约90mA (背光全亮时供电要充足)屏幕尺寸30mm x 37mm分辨率172 (水平) x 320 (垂直) 像素驱动芯片ST7789V3 (这是一款很常见的LCD驱动IC)通信接口SPI (串行外设接口占用引脚少)接口引脚8个Pin2.54mm间距排针引脚定义与连接思路屏幕有8个引脚但实际和MCU通信有几种灵活的接法。理解每个引脚的作用是正确移植的前提。VCC/GND电源和地接3.3V和GND。SCL (SCK)SPI时钟线接MCU的SPI时钟引脚。SDA (MOSI)SPI数据线主机输出从机输入接MCU的MOSI引脚。RES (复位)屏幕复位引脚低电平有效。可以接MCU的GPIO控制也可以偷个懒。DC (数据/命令)非常重要的引脚用来告诉屏幕你接下来发送的是命令如设置地址还是数据如像素颜色。必须接MCU的GPIO。CS (片选)SPI片选引脚低电平选中屏幕。必须接MCU的GPIO。BLK (背光)背光控制高电平点亮。可以接MCU的GPIO进行PWM调光也可以直接接3.3V常亮。硬件连接的两个“偷懒”技巧RES引脚如果你GPIO紧张可以把屏幕的RES直接接到MCU的复位引脚NRST。这样MCU一复位屏幕也跟着复位省下一个GPIO但无法单独复位屏幕。BLK引脚如果不需要调节背光亮度可以直接接到3.3V让背光常亮又省下一个GPIO。2. 移植第一步搭建工程与文件处理厂家提供的资料里一般都有示例代码但通常是针对某款特定开发板写的。我们的任务就是把这些代码“搬”到自己的MSPM0L1306工程里并修改适配。2.1 获取并导入源码从之前提到的网盘链接里下载厂家的全套资料包。在资料包里找到LCD屏幕的驱动程序文件夹通常名字叫LCD或ST7789。把这个整个文件夹复制到你自己的MSPM0L1306工程目录下。你的工程可以用TI官方例程模板或者自己新建的空工程。打开你的工程我用的CCS或Keil在工程管理器中将刚才复制过来的lcd.c和lcd_init.c文件添加到工程同时把LCD文件夹的路径添加到编译器的头文件包含路径中。这样编译器才能找到.h文件。2.2 修改头文件依赖厂家代码为了通用可能会包含一些我们工程里没有的头文件直接编译会报错。我们需要做两处修改修改lcd_init.h和lcd.h 打开这两个文件找到类似#include “sys.h”的语句。我们的MSPM0工程里一般没有这个文件而是使用board.h来包含芯片的所有外设定义。所以把它们都改成#include “board.h”处理数据类型定义 厂家代码里可能用u8、u16、u32这样的简写来定义变量类型。我们需要确保这些类型在我们的工程里有定义。在lcd_init.h或lcd.h文件的开头#include语句之后添加以下代码#ifndef u8 #define u8 uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif这段代码的意思是如果编译器还没定义u8那我就把它定义为uint8_t标准8位无符号整数类型。u16和u32同理。这样既兼容了原代码又符合标准。注释掉不存在的延时头文件 打开lcd_init.c和lcd.c找到#include “delay.h”这一行。厂家例程可能自带延时函数但我们用MSPM0的SDK通常有自己的一套延时方式比如DL_Timer。为了避免冲突我们可以先把这行注释掉。// #include “delay.h”后续的延时函数我们需要用MSPM0 SDK里的函数来替换这个后面会讲到。做完这些工程应该能编译通过了可能还有警告但没错误。如果还有错误根据编译器的报错信息逐个解决头文件或函数找不到的问题。3. 核心移植配置引脚与实现“软件SPI”这块屏幕用的是SPI协议但驱动代码里用的是“模拟SPI”也叫软件SPI意思是不用MCU硬件SPI外设而是用普通的GPIO引脚通过程序控制电平变化来模拟出SPI的时序。这样做的好处是引脚分配非常灵活不受硬件SPI模块固定引脚的限制。3.1 使用SYSCONFIG图形化工具配置引脚TI为MSPM0系列提供了非常方便的图形化配置工具SysConfig。我们用这个工具来分配屏幕需要的几个GPIO引脚。在你的CCS工程里找到并双击*.syscfg文件例如empty.syscfg这会打开SysConfig配置界面。在界面中点击Add按钮为屏幕的每个控制引脚添加GPIO配置。我们需要配置的有SCL (SPI时钟)SDA (SPI数据)RES (复位)DC (数据/命令)CS (片选)BLK (背光)(如果选择用GPIO控制的话)为每个引脚选择一个具体的MCU引脚比如PA0 PB1等并将功能设置为GPIO Output。你可以根据开发板的布局和你的布线方便来选。配置完成后点击保存。保存时可能会弹出一个对话框询问是否生成代码一定要选择Yes to All。保存后SysConfig会自动在后台生成代码。它会更新ti_msp_dl_config.h和ti_msp_dl_config.c文件。这些文件里已经为我们定义好了引脚名称例如GPIO_SCL_PORT、GPIO_SCL_PIN。因为我们工程的主头文件board.h已经包含了ti_msp_dl_config.h所以我们直接用board.h就行。提示使用SysConfig后引脚的初始化设置方向、上下拉等已经在生成的代码里自动完成了。所以我们自己的LCD_GPIO_Init()函数里可以是空的这很正常。3.2 修改驱动层的引脚控制宏接下来我们要修改LCD驱动代码让它知道每个控制信号对应到我们刚才配置的哪个MCU引脚。修改lcd_init.h文件。找到文件中关于“LCD端口定义”的部分通常是一系列#define宏。我们需要将它们修改为使用MSPM0 SDK的GPIO控制函数。修改后的内容如下//-----------------LCD端口定义---------------- // 时钟线 SCL #define LCD_SCLK_Clr() DL_GPIO_clearPins(GPIO_SCL_PORT, GPIO_SCL_PIN) #define LCD_SCLK_Set() DL_GPIO_setPins(GPIO_SCL_PORT, GPIO_SCL_PIN) // 数据线 SDA (MOSI) #define LCD_MOSI_Clr() DL_GPIO_clearPins(GPIO_SDA_PORT, GPIO_SDA_PIN) #define LCD_MOSI_Set() DL_GPIO_setPins(GPIO_SDA_PORT, GPIO_SDA_PIN) // 复位线 RES #define LCD_RES_Clr() DL_GPIO_clearPins(GPIO_RES_PORT, GPIO_RES_PIN) #define LCD_RES_Set() DL_GPIO_setPins(GPIO_RES_PORT, GPIO_RES_PIN) // 数据/命令选择线 DC #define LCD_DC_Clr() DL_GPIO_clearPins(GPIO_DC_PORT, GPIO_DC_PIN) #define LCD_DC_Set() DL_GPIO_setPins(GPIO_DC_PORT, GPIO_DC_PIN) // 片选线 CS #define LCD_CS_Clr() DL_GPIO_clearPins(GPIO_CS_PORT, GPIO_CS_PIN) #define LCD_CS_Set() DL_GPIO_setPins(GPIO_CS_PORT, GPIO_CS_PIN) // 背光线 BLK (如果接了GPIO) #define LCD_BLK_Clr() DL_GPIO_clearPins(GPIO_BLK_PORT, GPIO_BLK_PIN) #define LCD_BLK_Set() DL_GPIO_setPins(GPIO_BLK_PORT, GPIO_BLK_PIN)这些宏定义了控制每个引脚输出高电平_Set和低电平_Clr的具体操作。驱动库里的底层函数如LCD_WriteByte会调用这些宏来产生SPI时序。由于引脚初始化已在SysConfig中完成我们的LCD_GPIO_Init函数可以保持为空void LCD_GPIO_Init(void) { // 引脚初始化已由SysConfig自动生成此处无需额外操作 }3.3 替换延时函数还记得之前我们注释掉的delay.h吗现在需要提供替代的延时。在lcd_init.c和lcd.c中找到所有调用delay_ms()和delay_us()的地方。我们需要使用MSPM0 SDK提供的延时。假设你已经有一个基于系统滴答定时器SysTick或通用定时器的毫秒/微秒延时函数比如叫my_delay_ms()和my_delay_us()。那么就把原代码中的delay_ms(100);替换为my_delay_ms(100); // 使用你自己的延时函数注意屏幕初始化序列和读写数据对延时比较敏感尤其是复位和命令发送之间的延时。如果替换后发现屏幕不亮可以适当增加这些延时时间试试比如把delay_ms(120)改成my_delay_ms(150)。4. 上电测试编写主程序验证显示所有底层修改完成后就可以写个简单的主程序来测试屏幕是否正常工作了。在你的主文件比如main.c或empty.c中写入以下测试代码#include “board.h” #include “lcd.h” #include “lcd_init.h” // 假设你有一个自定义的毫秒延时函数 extern void my_delay_ms(uint32_t ms); int main(void) { // 开发板初始化时钟、外设等 board_init(); // 初始化LCD屏幕 LCD_Init(); // 清屏填充为黑色 LCD_Fill(0, 0, LCD_W, LCD_H, BLACK); // 显示屏幕分辨率信息 LCD_ShowString(0, 0, (uint8_t *)“LCD Width:”, WHITE, BLACK, 16, 0); LCD_ShowIntNum(80, 0, LCD_W, 3, WHITE, BLACK, 16); // 显示172 LCD_ShowString(0, 16, (uint8_t *)“LCD Height:”, WHITE, BLACK, 16, 0); LCD_ShowIntNum(80, 16, LCD_H, 3, WHITE, BLACK, 16); // 显示320 // 显示一个动态变化的数字 float counter 0.0; while(1) { // 在指定位置显示浮点数 LCD_ShowFloatNum1(0, 32, counter, 4, WHITE, BLACK, 16); counter 0.11; my_delay_ms(500); // 延时500毫秒 } }代码逻辑说明board_init()初始化MSPM0L1306的系统和外设时钟这是SDK要求的。LCD_Init()调用我们移植好的初始化函数向屏幕发送一系列复位、上电、偏压、伽马校正等命令让屏幕进入正常工作状态。这是最关键的一步如果初始化序列不对屏幕就是一片黑。LCD_Fill()用黑色填充整个屏幕相当于清屏。LCD_ShowString()和LCD_ShowIntNum()在指定坐标显示字符串和整数用来验证基本显示功能。LCD_ShowFloatNum1()和循环显示一个不断累加的浮点数用来验证屏幕刷新是否正常没有残影。将代码编译下载到开发板上电。如果一切顺利你应该能看到屏幕点亮先全黑然后顶部显示分辨率“172”和“320”下方有一个不断变大的数字。如果屏幕不亮按这个顺序排查硬件连接确保VCC、GND、所有信号线连接正确且牢固。用万用表量一下屏幕供电是不是3.3V。背光检查BLK引脚是否接到了高电平3.3V或MCU输出高。复位时序检查RES引脚波形上电后是否有正确的低电平复位脉冲通常拉低至少10ms再拉高。可以尝试在LCD_Init()函数开始的地方手动加一段复位操作和长延时比如100ms。SPI时序如果屏幕背光亮但无显示可能是SPI通信失败。用逻辑分析仪或示波器抓一下SCL、SDA、DC、CS的波形看看在发送初始化命令时时序是否符合ST7789V3的数据手册要求极性和相位。软件SPI的延时时间可能需要微调。初始化序列核对lcd_init.c中的初始化命令序列是否与你的屏幕型号1.47寸172x320完全匹配。不同尺寸和排布的屏幕初始化参数可能有细微差别。驱动移植成功只是第一步接下来你可以在上面画点、线、矩形显示汉字、图片甚至做简单的UI。希望这篇实战记录能帮你少走弯路。在实际电赛项目中这种小尺寸彩屏用来显示传感器数据、系统状态或者简易菜单非常方便。
1. 基于TI MSPM0L1306的1.47寸ST7789V3彩屏SPI驱动移植实战
基于TI MSPM0L1306的1.47寸ST7789V3彩屏SPI驱动移植实战最近在准备电赛手头正好有TI的MSPM0L1306开发板和一块1.47寸的彩色LCD屏。想把屏幕驱动起来显示点参数和波形结果发现网上针对这个具体型号的完整教程不多。折腾了两天总算把驱动调通了过程踩了不少坑也总结了一些经验。今天我就把从拿到屏幕资料到最终点亮显示的完整过程手把手分享给大家希望能帮到同样在用这块板子和屏幕的朋友。咱们的目标很明确把一块1.47寸、驱动芯片是ST7789V3、采用SPI接口的彩色LCD屏成功驱动在TI MSPM0L1306开发板上。整个过程会涉及到资料获取、工程搭建、引脚配置、代码修改和功能验证。我会尽量把每一步的原理和操作细节讲清楚就算你是刚接触嵌入式的新手跟着做也能搞定。1. 准备工作认识你的屏幕在动手写代码之前咱们得先搞清楚要驱动的对象是什么。这块屏幕的关键信息都在厂家提供的资料里。模块来源与资料获取我用的屏幕是在淘宝上买的搜索“1.47寸lcd显示屏高清ips172x320 st7789驱动液晶屏”就能找到。配套的资料包括数据手册和示例代码可以通过百度网盘下载。资料链接https://pan.baidu.com/s/15OWpndYzyW8kFPqmfKNfxQ提取码8888屏幕关键参数拿到资料后先看看屏幕的基本规格这对后续的硬件连接和软件配置很重要参数项规格说明工作电压3.3V (和MSPM0L1306开发板IO电压一致可以直接连接)工作电流约90mA (背光全亮时供电要充足)屏幕尺寸30mm x 37mm分辨率172 (水平) x 320 (垂直) 像素驱动芯片ST7789V3 (这是一款很常见的LCD驱动IC)通信接口SPI (串行外设接口占用引脚少)接口引脚8个Pin2.54mm间距排针引脚定义与连接思路屏幕有8个引脚但实际和MCU通信有几种灵活的接法。理解每个引脚的作用是正确移植的前提。VCC/GND电源和地接3.3V和GND。SCL (SCK)SPI时钟线接MCU的SPI时钟引脚。SDA (MOSI)SPI数据线主机输出从机输入接MCU的MOSI引脚。RES (复位)屏幕复位引脚低电平有效。可以接MCU的GPIO控制也可以偷个懒。DC (数据/命令)非常重要的引脚用来告诉屏幕你接下来发送的是命令如设置地址还是数据如像素颜色。必须接MCU的GPIO。CS (片选)SPI片选引脚低电平选中屏幕。必须接MCU的GPIO。BLK (背光)背光控制高电平点亮。可以接MCU的GPIO进行PWM调光也可以直接接3.3V常亮。硬件连接的两个“偷懒”技巧RES引脚如果你GPIO紧张可以把屏幕的RES直接接到MCU的复位引脚NRST。这样MCU一复位屏幕也跟着复位省下一个GPIO但无法单独复位屏幕。BLK引脚如果不需要调节背光亮度可以直接接到3.3V让背光常亮又省下一个GPIO。2. 移植第一步搭建工程与文件处理厂家提供的资料里一般都有示例代码但通常是针对某款特定开发板写的。我们的任务就是把这些代码“搬”到自己的MSPM0L1306工程里并修改适配。2.1 获取并导入源码从之前提到的网盘链接里下载厂家的全套资料包。在资料包里找到LCD屏幕的驱动程序文件夹通常名字叫LCD或ST7789。把这个整个文件夹复制到你自己的MSPM0L1306工程目录下。你的工程可以用TI官方例程模板或者自己新建的空工程。打开你的工程我用的CCS或Keil在工程管理器中将刚才复制过来的lcd.c和lcd_init.c文件添加到工程同时把LCD文件夹的路径添加到编译器的头文件包含路径中。这样编译器才能找到.h文件。2.2 修改头文件依赖厂家代码为了通用可能会包含一些我们工程里没有的头文件直接编译会报错。我们需要做两处修改修改lcd_init.h和lcd.h 打开这两个文件找到类似#include “sys.h”的语句。我们的MSPM0工程里一般没有这个文件而是使用board.h来包含芯片的所有外设定义。所以把它们都改成#include “board.h”处理数据类型定义 厂家代码里可能用u8、u16、u32这样的简写来定义变量类型。我们需要确保这些类型在我们的工程里有定义。在lcd_init.h或lcd.h文件的开头#include语句之后添加以下代码#ifndef u8 #define u8 uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif这段代码的意思是如果编译器还没定义u8那我就把它定义为uint8_t标准8位无符号整数类型。u16和u32同理。这样既兼容了原代码又符合标准。注释掉不存在的延时头文件 打开lcd_init.c和lcd.c找到#include “delay.h”这一行。厂家例程可能自带延时函数但我们用MSPM0的SDK通常有自己的一套延时方式比如DL_Timer。为了避免冲突我们可以先把这行注释掉。// #include “delay.h”后续的延时函数我们需要用MSPM0 SDK里的函数来替换这个后面会讲到。做完这些工程应该能编译通过了可能还有警告但没错误。如果还有错误根据编译器的报错信息逐个解决头文件或函数找不到的问题。3. 核心移植配置引脚与实现“软件SPI”这块屏幕用的是SPI协议但驱动代码里用的是“模拟SPI”也叫软件SPI意思是不用MCU硬件SPI外设而是用普通的GPIO引脚通过程序控制电平变化来模拟出SPI的时序。这样做的好处是引脚分配非常灵活不受硬件SPI模块固定引脚的限制。3.1 使用SYSCONFIG图形化工具配置引脚TI为MSPM0系列提供了非常方便的图形化配置工具SysConfig。我们用这个工具来分配屏幕需要的几个GPIO引脚。在你的CCS工程里找到并双击*.syscfg文件例如empty.syscfg这会打开SysConfig配置界面。在界面中点击Add按钮为屏幕的每个控制引脚添加GPIO配置。我们需要配置的有SCL (SPI时钟)SDA (SPI数据)RES (复位)DC (数据/命令)CS (片选)BLK (背光)(如果选择用GPIO控制的话)为每个引脚选择一个具体的MCU引脚比如PA0 PB1等并将功能设置为GPIO Output。你可以根据开发板的布局和你的布线方便来选。配置完成后点击保存。保存时可能会弹出一个对话框询问是否生成代码一定要选择Yes to All。保存后SysConfig会自动在后台生成代码。它会更新ti_msp_dl_config.h和ti_msp_dl_config.c文件。这些文件里已经为我们定义好了引脚名称例如GPIO_SCL_PORT、GPIO_SCL_PIN。因为我们工程的主头文件board.h已经包含了ti_msp_dl_config.h所以我们直接用board.h就行。提示使用SysConfig后引脚的初始化设置方向、上下拉等已经在生成的代码里自动完成了。所以我们自己的LCD_GPIO_Init()函数里可以是空的这很正常。3.2 修改驱动层的引脚控制宏接下来我们要修改LCD驱动代码让它知道每个控制信号对应到我们刚才配置的哪个MCU引脚。修改lcd_init.h文件。找到文件中关于“LCD端口定义”的部分通常是一系列#define宏。我们需要将它们修改为使用MSPM0 SDK的GPIO控制函数。修改后的内容如下//-----------------LCD端口定义---------------- // 时钟线 SCL #define LCD_SCLK_Clr() DL_GPIO_clearPins(GPIO_SCL_PORT, GPIO_SCL_PIN) #define LCD_SCLK_Set() DL_GPIO_setPins(GPIO_SCL_PORT, GPIO_SCL_PIN) // 数据线 SDA (MOSI) #define LCD_MOSI_Clr() DL_GPIO_clearPins(GPIO_SDA_PORT, GPIO_SDA_PIN) #define LCD_MOSI_Set() DL_GPIO_setPins(GPIO_SDA_PORT, GPIO_SDA_PIN) // 复位线 RES #define LCD_RES_Clr() DL_GPIO_clearPins(GPIO_RES_PORT, GPIO_RES_PIN) #define LCD_RES_Set() DL_GPIO_setPins(GPIO_RES_PORT, GPIO_RES_PIN) // 数据/命令选择线 DC #define LCD_DC_Clr() DL_GPIO_clearPins(GPIO_DC_PORT, GPIO_DC_PIN) #define LCD_DC_Set() DL_GPIO_setPins(GPIO_DC_PORT, GPIO_DC_PIN) // 片选线 CS #define LCD_CS_Clr() DL_GPIO_clearPins(GPIO_CS_PORT, GPIO_CS_PIN) #define LCD_CS_Set() DL_GPIO_setPins(GPIO_CS_PORT, GPIO_CS_PIN) // 背光线 BLK (如果接了GPIO) #define LCD_BLK_Clr() DL_GPIO_clearPins(GPIO_BLK_PORT, GPIO_BLK_PIN) #define LCD_BLK_Set() DL_GPIO_setPins(GPIO_BLK_PORT, GPIO_BLK_PIN)这些宏定义了控制每个引脚输出高电平_Set和低电平_Clr的具体操作。驱动库里的底层函数如LCD_WriteByte会调用这些宏来产生SPI时序。由于引脚初始化已在SysConfig中完成我们的LCD_GPIO_Init函数可以保持为空void LCD_GPIO_Init(void) { // 引脚初始化已由SysConfig自动生成此处无需额外操作 }3.3 替换延时函数还记得之前我们注释掉的delay.h吗现在需要提供替代的延时。在lcd_init.c和lcd.c中找到所有调用delay_ms()和delay_us()的地方。我们需要使用MSPM0 SDK提供的延时。假设你已经有一个基于系统滴答定时器SysTick或通用定时器的毫秒/微秒延时函数比如叫my_delay_ms()和my_delay_us()。那么就把原代码中的delay_ms(100);替换为my_delay_ms(100); // 使用你自己的延时函数注意屏幕初始化序列和读写数据对延时比较敏感尤其是复位和命令发送之间的延时。如果替换后发现屏幕不亮可以适当增加这些延时时间试试比如把delay_ms(120)改成my_delay_ms(150)。4. 上电测试编写主程序验证显示所有底层修改完成后就可以写个简单的主程序来测试屏幕是否正常工作了。在你的主文件比如main.c或empty.c中写入以下测试代码#include “board.h” #include “lcd.h” #include “lcd_init.h” // 假设你有一个自定义的毫秒延时函数 extern void my_delay_ms(uint32_t ms); int main(void) { // 开发板初始化时钟、外设等 board_init(); // 初始化LCD屏幕 LCD_Init(); // 清屏填充为黑色 LCD_Fill(0, 0, LCD_W, LCD_H, BLACK); // 显示屏幕分辨率信息 LCD_ShowString(0, 0, (uint8_t *)“LCD Width:”, WHITE, BLACK, 16, 0); LCD_ShowIntNum(80, 0, LCD_W, 3, WHITE, BLACK, 16); // 显示172 LCD_ShowString(0, 16, (uint8_t *)“LCD Height:”, WHITE, BLACK, 16, 0); LCD_ShowIntNum(80, 16, LCD_H, 3, WHITE, BLACK, 16); // 显示320 // 显示一个动态变化的数字 float counter 0.0; while(1) { // 在指定位置显示浮点数 LCD_ShowFloatNum1(0, 32, counter, 4, WHITE, BLACK, 16); counter 0.11; my_delay_ms(500); // 延时500毫秒 } }代码逻辑说明board_init()初始化MSPM0L1306的系统和外设时钟这是SDK要求的。LCD_Init()调用我们移植好的初始化函数向屏幕发送一系列复位、上电、偏压、伽马校正等命令让屏幕进入正常工作状态。这是最关键的一步如果初始化序列不对屏幕就是一片黑。LCD_Fill()用黑色填充整个屏幕相当于清屏。LCD_ShowString()和LCD_ShowIntNum()在指定坐标显示字符串和整数用来验证基本显示功能。LCD_ShowFloatNum1()和循环显示一个不断累加的浮点数用来验证屏幕刷新是否正常没有残影。将代码编译下载到开发板上电。如果一切顺利你应该能看到屏幕点亮先全黑然后顶部显示分辨率“172”和“320”下方有一个不断变大的数字。如果屏幕不亮按这个顺序排查硬件连接确保VCC、GND、所有信号线连接正确且牢固。用万用表量一下屏幕供电是不是3.3V。背光检查BLK引脚是否接到了高电平3.3V或MCU输出高。复位时序检查RES引脚波形上电后是否有正确的低电平复位脉冲通常拉低至少10ms再拉高。可以尝试在LCD_Init()函数开始的地方手动加一段复位操作和长延时比如100ms。SPI时序如果屏幕背光亮但无显示可能是SPI通信失败。用逻辑分析仪或示波器抓一下SCL、SDA、DC、CS的波形看看在发送初始化命令时时序是否符合ST7789V3的数据手册要求极性和相位。软件SPI的延时时间可能需要微调。初始化序列核对lcd_init.c中的初始化命令序列是否与你的屏幕型号1.47寸172x320完全匹配。不同尺寸和排布的屏幕初始化参数可能有细微差别。驱动移植成功只是第一步接下来你可以在上面画点、线、矩形显示汉字、图片甚至做简单的UI。希望这篇实战记录能帮你少走弯路。在实际电赛项目中这种小尺寸彩屏用来显示传感器数据、系统状态或者简易菜单非常方便。