当前位置:网站首页>stm32l476芯片介绍(nvidia驱动无法找到兼容的图形硬件)
stm32l476芯片介绍(nvidia驱动无法找到兼容的图形硬件)
2022-08-01 14:06:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
前言
最近购买了IoT Board 潘多拉开发板来研究,学习使用STM32CubeMX工具配置SPI,然后驱动了TFTLCD。潘多拉开发板的TFTLCD驱动IC是ST7789V2,结合原子哥的TFTLCD代码,分享自己的硬件SPI+软件SPI驱动ST7789V2+中文显示。关于STM32CubeMX的使用可以参考微雪课堂STM32CubeMX系列教程。
STM32L475 硬件SPI+软件SPI驱动ST7789V2代码:
/*
如果使用软件SPI,只需把硬件SPI的宏开关去掉即可
*/
//#define __LCD_HW_SPI_DRIVE__
#define __LCD_SW_SPI_DRIVE__
/*
LCD_PWR:PB7
LCD_RST:PB6
LCD_WR: PB4
LCD_CS: PD7
*/
#define LCD_PWR(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET))
#define LCD_RST(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET))
#define LCD_WR(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET))
#define LCD_CS(n) (n ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET))
#define LCD_WIDTH 240
#define LCD_HEIHGT 240
/* 默认LCD的画笔颜色和背景色 */
u16 POINT_COLOR = 0x0000; /* 画笔颜色 */
u16 BACK_COLOR = 0xFFFF; /* 背景色 */
#if defined(__LCD_HW_SPI_DRIVE__) /* 硬件SPI驱动 */
SPI_HandleTypeDef hspi3;
/**************************************************************
函数名称 : spi3_init
函数功能 : 硬件sp3初始化
输入参数 : 无
返回值 : 无
备注 : 配置成主机模式
**************************************************************/
void spi3_init(void)
{
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
if(HAL_SPI_Init(&hspi3) != HAL_OK)
{
printf("spi3 init failed\r\n");
}
__HAL_SPI_ENABLE(&hspi3); /* 使能硬件SPI3 */
}
/**************************************************************
函数名称 : HAL_SPI_MspInit
函数功能 : 硬件SPI3底层驱动,时钟使能,引脚配置
输入参数 : hspi:硬件SPI3句柄
返回值 : 无
备注 : PB3 ------> SPI3_SCK
PB5 ------> SPI3_MOSI
**************************************************************/
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI3)
{
__HAL_RCC_SPI3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
/**************************************************************
函数名称 : sp3_write_byte
函数功能 : SPI3 写一个字节
输入参数 : w_data:要写入的字节,size:写入字节大小
返回值 : 0 --> 写入成功,其他 --> 写入失败
备注 : 无
**************************************************************/
u8 sp3_write_byte(u8 *r_data, u16 size)
{
return HAL_SPI_Transmit(&hspi3, r_data, size, 1000);
}
/**************************************************************
函数名称 : lcd_gpio_init
函数功能 : lcd gpio初始化
输入参数 : 无
返回值 : 无
备注 : 无
**************************************************************/
void lcd_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin : PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PB4 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_RESET);
spi3_init(); /* spi3初始化 */
}
/**************************************************************
函数名称 : lcd_write_reg
函数功能 : 向lcd驱动芯片写一个命令
输入参数 : reg:要写入的命令
返回值 : 无
备注 : LCD_WR为0时表示写命令
**************************************************************/
void lcd_write_reg(u8 reg)
{
LCD_CS(0);
LCD_WR(0);
sp3_write_byte(®, 1);
}
/**************************************************************
函数名称 : lcd_write_data
函数功能 : 向lcd驱动芯片写一个数据
输入参数 : data:要写入的数据
返回值 : 无
备注 : LCD_WR为1时表示写数据
**************************************************************/
void lcd_write_data(u8 data)
{
LCD_CS(0);
LCD_WR(1);
sp3_write_byte(&data, 1);
}
#elif defined(__LCD_SW_SPI_DRIVE__) /* 软件SPI驱动 */
/*
LCD_SDA:PB5
LCD_SCK:PB3
*/
#define LCD_SDA(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET))
#define LCD_SCK(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET))
/**************************************************************
函数名称 : lcd_gpio_init
函数功能 : lcd gpio初始化
输入参数 : 无
返回值 : 无
备注 : 无
**************************************************************/
void lcd_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin : PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PB3 PB4 PB5 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_SET);
}
/**************************************************************
函数名称 : lcd_write_reg
函数功能 : 向lcd驱动芯片写一个命令
输入参数 : reg:要写入的命令
返回值 : 无
备注 : LCD_WR为0时表示写命令
**************************************************************/
void lcd_write_reg(u8 reg)
{
u8 i;
LCD_CS(0);
LCD_WR(0);
for(i = 0; i < 8; i++)
{
LCD_SCK(0);
if(reg & 0x80)
LCD_SDA(1);
else
LCD_SDA(0);
LCD_SCK(1);
reg <<= 1;
}
LCD_CS(1);
LCD_WR(1);
}
/**************************************************************
函数名称 : lcd_write_reg
函数功能 : 向lcd驱动芯片写一个数据
输入参数 : data:要写入的数据
返回值 : 无
备注 : LCD_WR为1时表示写数据
**************************************************************/
void lcd_write_data(u8 data)
{
u8 i;
LCD_CS(0);
LCD_WR(1);
for(i = 0; i < 8; i++)
{
LCD_SCK(0);
if(data & 0x80)
LCD_SDA(1);
else
LCD_SDA(0);
LCD_SCK(1);
data <<= 1;
}
LCD_CS(1);
LCD_WR(1);
}
#endifST7789V2初始化代码:
/**************************************************************
函数名称 : lcd_init
函数功能 : lcd初始化
输入参数 : 无
返回值 : 无
备注 : 无
**************************************************************/
void lcd_init(void)
{
lcd_gpio_init();
LCD_RST(0);
delay_ms(120);
LCD_RST(1);
delay_ms(120);
/* Sleep Out */
lcd_write_reg(0x11);
/* wait for power stability */
delay_ms(120);
/* Memory Data Access Control */
lcd_write_reg(0x36);
lcd_write_data(0x00);
/* RGB 5-6-5-bit */
lcd_write_reg(0x3A);
lcd_write_data(0x65);
/* Porch Setting */
lcd_write_reg(0xB2);
lcd_write_data(0x0C);
lcd_write_data(0x0C);
lcd_write_data(0x00);
lcd_write_data(0x33);
lcd_write_data(0x33);
/* Gate Control */
lcd_write_reg(0xB7);
lcd_write_data(0x72);
/* VCOM Setting */
lcd_write_reg(0xBB);
lcd_write_data(0x3D); //Vcom=1.625V
/* LCM Control */
lcd_write_reg(0xC0);
lcd_write_data(0x2C);
/* VDV and VRH Command Enable */
lcd_write_reg(0xC2);
lcd_write_data(0x01);
/* VRH Set */
lcd_write_reg(0xC3);
lcd_write_data(0x19);
/* VDV Set */
lcd_write_reg(0xC4);
lcd_write_data(0x20);
/* Frame Rate Control in Normal Mode */
lcd_write_reg(0xC6);
lcd_write_data(0x0F); //60MHZ
/* Power Control 1 */
lcd_write_reg(0xD0);
lcd_write_data(0xA4);
lcd_write_data(0xA1);
/* Positive Voltage Gamma Control */
lcd_write_reg(0xE0);
lcd_write_data(0xD0);
lcd_write_data(0x04);
lcd_write_data(0x0D);
lcd_write_data(0x11);
lcd_write_data(0x13);
lcd_write_data(0x2B);
lcd_write_data(0x3F);
lcd_write_data(0x54);
lcd_write_data(0x4C);
lcd_write_data(0x18);
lcd_write_data(0x0D);
lcd_write_data(0x0B);
lcd_write_data(0x1F);
lcd_write_data(0x23);
/* Negative Voltage Gamma Control */
lcd_write_reg(0xE1);
lcd_write_data(0xD0);
lcd_write_data(0x04);
lcd_write_data(0x0C);
lcd_write_data(0x11);
lcd_write_data(0x13);
lcd_write_data(0x2C);
lcd_write_data(0x3F);
lcd_write_data(0x44);
lcd_write_data(0x51);
lcd_write_data(0x2F);
lcd_write_data(0x1F);
lcd_write_data(0x1F);
lcd_write_data(0x20);
lcd_write_data(0x23);
/* Display Inversion On */
lcd_write_reg(0x21);
lcd_write_reg(0x29);
lcd_clear(BACK_COLOR);
/*打开显示*/
LCD_PWR(1);
}main函数:
int main(void)
{
hardware_init();
printf("IoT Board PANDORA\r\n");
lcd_clear(YELLOW);
while(1)
{
lcd_show_string(66, 0, 108, 12, "IoT Board", 24, 1);
lcd_show_chinese(72, 32, pandora_ch, 32, 3, 1);
delay_ms(1000);
}
}取模软件我使用的是PCtoLCD2002,原子论坛的资料有这个工具,取汉字配置和效果如下:
详细的ST7789V2完整驱动代码请点击如下链接,到我在原子论坛的帖子下载:【分享】}STM32L475潘多拉IoT Board开发板TFTLCD ST7789V2 硬件SPI+软件SPI驱动+中文字符显示
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126407.html原文链接:https://javaforall.cn
边栏推荐
- AD单片机九齐单片机NY8B062D SOP16九齐
- How does the SAP ABAP OData service support the Create operation trial version
- sql中常用到的正则表达
- 对标丰田!蔚来又一新品牌披露:产品价格低于20万
- 什么是混合元编程
- Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders
- 重磅!国内首个开放式在线绘图平台Figdraw突破10万用户!发布《奖学金激励计划》:最高5000元!...
- 【5GC】5G网络切片与5G QoS的区别?
- 又拿三个大奖?!多力就是要让你吃的更营养更健康
- D - Draw Your Cards (Simulation)
猜你喜欢
随机推荐
2022图片在线加水印源码
the direction i'm looking for
拥抱NFV,Istio 1.1 将支持多网络平面
[Binary Tree] Path Sum II
台积电认清了形势,新的建厂计划没有美国,中国芯片也得到重视
搭建LNMT架构
什么是混合元编程
AtCoder Beginner Contest 261 D - Flipping and Bonus
JMP Pro 16.0 software installation package download and installation tutorial
「计算复杂性」理论奠基人Juris Hartmanis逝世,曾获93年图灵奖
OpenSSL SSL_read: Connection was reset, errno 10054
Based on 10 years of experience in stability assurance, what are the three key questions to be answered in failure recovery?|TakinTalks big coffee sharing
HTB-Shocker
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
The basic knowledge of scripting language Lua summary
微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
pd groupby后列变索引以及聚合列无列名的问题
什么是闭包?
【5GC】5G网络切片与5G QoS的区别?
VIP的实现原理









