【开源】STM32HAL库驱动ST7789_240×240(硬件SPI+软件SPI)

项目开源链接

github主页 https://github.com/snqx-lqh
本项目github地址 https://github.com/snqx-lqh/STM32F103C8T6HalDemo
作者 VX Qinghua-Li7

📖 欢迎交流 如果开源的代码对你有帮助,希望可以帮我点个赞👍和收藏

项目说明

最近调试了一款1.3寸的ST7789的液晶显示屏,主要使用的是STM32HAL库和中景元电子提供的库函数,使用软件SPI和硬件SPI分别成功的驱动了显示屏。这篇文章分享一下在使用过程中遇到的问题。

下面是实际的效果,使用的是面包板。

代码移植

主要提供了一个接口函数的部分。需要根据自己实际单片机的操作函数来修改这些引脚的变化方式。如果打开了软件SPI,需要把LCD_USE_SOFT_SPI 置1,而且是HAL库的话,需要使用CubeMx把硬件SPI去掉,然后初始化引脚为普通的输入输出模式。软件SPI我是使用的函数指针的方式写的,使用前,需要初始化一个对象,并且将对应的操作函数赋值。其余的操作和中景元电子差不多,可以看开源代码。默认我是使用的硬件SPI。

c 复制代码
/**************** 用户处理区域  Start *********************/
// 这部分处理自己写的时候可以分文件

#define LCD_DELAY_XMS(XMS)  HAL_Delay(XMS)

#define LCD_USE_SOFT_SPI 0

/**
  * @brief   初始化LCD相关引脚,以及初始化SPI,如果使能了软件spi需要初始化软件相关的引脚
  * @param   : [输入/出] 
  * @retval
 **/
void lcd_spi_init()
{
	// 使用的HAL库已经自己初始化了
}

/**
  * @brief   设置RES引脚电平
  * @param   level : 电平 0低 1高
  * @retval
 **/
void lcd_res_set_level(uint8_t level)
{
	if(0 == level)
	{
		HAL_GPIO_WritePin(LCD_RES_GPIO_Port,LCD_RES_Pin,GPIO_PIN_RESET);
	}else if(1 == level)
	{
		HAL_GPIO_WritePin(LCD_RES_GPIO_Port,LCD_RES_Pin,GPIO_PIN_SET);
	}
}

/**
  * @brief   设置DC引脚电平
  * @param   level : 电平 0低 1高
  * @retval
 **/
void lcd_dc_set_level(uint8_t level)
{
	if(0 == level)
	{
		HAL_GPIO_WritePin(LCD_DC_GPIO_Port,LCD_DC_Pin,GPIO_PIN_RESET);
	}else if(1 == level)
	{
		HAL_GPIO_WritePin(LCD_DC_GPIO_Port,LCD_DC_Pin,GPIO_PIN_SET);
	}
}

/**
  * @brief   设置CS引脚电平
  * @param   level : 电平 0低 1高
  * @retval
 **/
void lcd_cs_set_level(uint8_t level)
{
	if(0 == level)
	{
		 
	}else if(1 == level)
	{
		 
	}
}

/**
  * @brief   设置BLK引脚电平
  * @param   level : 电平 0低 1高
  * @retval
 **/
void lcd_blk_set_level(uint8_t level)
{
	if(0 == level)
	{
		HAL_GPIO_WritePin(LCD_BLK_GPIO_Port,LCD_BLK_Pin,GPIO_PIN_RESET);
	}else if(1 == level)
	{
		HAL_GPIO_WritePin(LCD_BLK_GPIO_Port,LCD_BLK_Pin,GPIO_PIN_SET);
	}
}

#if LCD_USE_SOFT_SPI
#include "bsp_soft_spi.h"

static void set_sck_level(uint8_t level)
{
	if(0 == level){
		HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port,SPI1_SCK_Pin,GPIO_PIN_RESET);
	}else{
		HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port,SPI1_SCK_Pin,GPIO_PIN_SET);
	}
}

static void set_mosi_level(uint8_t level)
{
	if(0 == level){
		HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port,SPI1_MOSI_Pin,GPIO_PIN_RESET);
	}else{
		HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port,SPI1_MOSI_Pin,GPIO_PIN_SET);
	}
}

static uint8_t get_miso_level( )
{
	uint8_t level;
	level = HAL_GPIO_ReadPin(SPI1_MISO_GPIO_Port,SPI1_MISO_Pin);
	return level; 
}

//定义软件SPI变量
soft_spi_t soft_spi = {
	.spi_init           = lcd_spi_init,
	.set_spi_sck_level  = set_sck_level,
	.set_spi_mosi_level = set_mosi_level,
	.spi_miso_read      = get_miso_level,
    .spi_mode=  2,
};
#else

#include "spi.h"

#endif
/**
  * @brief   lcd的SPI收发数据 
  * @param    
  * @retval
 **/
uint8_t lcd_read_write_byte(uint8_t TxData)
{
	uint8_t RxData;
	#if LCD_USE_SOFT_SPI
		RxData = soft_spi_read_write_byte(&soft_spi,TxData);	
	#else
		HAL_SPI_TransmitReceive(&hspi1,&TxData,&RxData,1, 100);  
	#endif
	return RxData;
}

/**************** 用户处理区域  end ******************/

移植BUG

使用过程中,我使用软件SPI的时候,模式0和1都不行,调到模式2才可以,使用硬件SPI的时候,多种模式都可以,除了模式3不行,这让我比较困惑,如果有人能告诉我原因,欢迎评论区留言。还有就是,如果你驱动不成功,尝试一下换一下SPI的模式。就是CPOL和CPHA这两个参数的设置值。还有就是,中景元电子不同屏幕牌子好像初始化的方式不太一样。可以淘宝看看你的属于哪一款。

相关推荐
DisonTangor1 小时前
Mistral AI开源 Magistral-Small-2507
人工智能·语言模型·开源·aigc
Electrical_IT1 小时前
STM32-PWM输入捕获的配置
stm32·单片机
风吹花中花吹风3 小时前
原创-锐能微82xx系列电能计量芯片软件驱动开发与精度校准流程完全指南
驱动开发·单片机·嵌入式硬件·锐能微·计量芯片·精度校准·电能表校准
嵌入式小白牙5 小时前
ARM-DMA
arm开发·stm32·单片机
说私域7 小时前
技术赋能与营销创新:开源链动2+1模式AI智能名片S2B2C商城小程序的流量转化路径研究
人工智能·小程序·开源
青牛科技-Allen7 小时前
GC8871刷式直流电机驱动器深度解析:3.6A驱动与内置电流检测技术
单片机·嵌入式硬件·音视频·音响·电动工具·散热风扇·电脑散热风扇
FIT2CLOUD飞致云12 小时前
里程碑 | 1Panel开源面板GitHub Star数量突破30,000个!
运维·开源
月阳羊12 小时前
【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)
笔记·嵌入式硬件·面试·职场和发展
FIT2CLOUD飞致云12 小时前
七月月报丨MaxKB在企业环境中实现AI落地的具体场景盘点
人工智能·开源·deepseek
FIT2CLOUD飞致云12 小时前
支持MySQL、PostgreSQL和Redis集群部署,1Panel开源面板v2.0.5版本发布
运维·开源