当前位置:网站首页>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);
}
#endif
ST7789V2初始化代码:
/**************************************************************
函数名称 : 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
边栏推荐
- 2022-07-29 网工进阶(二十二)BGP-其他特性(路由过滤、团体属性、认证、AS欺骗、对等体组、子路由器、路由最大接收数量)
- COPU 陆首群教授在 openEuler 社区首批高级顾问聘任仪式上发言
- E - Red and Blue Graph(组合数学)
- 性能优化——动画优化笔记
- datetime64[ns] converted to datetime
- 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
- 微服务系统架构的演变
- 论文笔记All about Eve: Execute-Verify Replication for Multi-Core Servers
- ABC260 E - At Least One(双指针)
- PIR人体感应AC系列感应器投光灯人体感应开关等应用定制方案
猜你喜欢
微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东
MCU开发是什么?国内MCU产业现状如何
Multi-threaded cases - blocking queue
PAT1165 Block Reversing(25)
论文笔记All about Eve: Execute-Verify Replication for Multi-Core Servers
2022图片在线加水印源码
【码蹄集新手村600题】判断一个数字是否为完全平方数
龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权
Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders
随机推荐
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
微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
HTB-Shocker
The problem that the column becomes indexed after pd groupby and the aggregation column has no column name
NFV迈向云原生时代:Network Service Mesh项目介绍
使用open3d可视化3d人脸
直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
大神们,ODPS用的是MySQL吗?
安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东
【每日一题】593. 有效的正方形
【无标题】
170页6万字智慧能源管理平台建设方案书
分布式中的远程调用
树和二叉树的转换
代理商替代义隆153 Aip4210
win10+Qt5.15.2实现低功耗蓝牙控制
如何降低Istio服务网格中Envoy的内存开销
性能优化——资源优化笔记
沃文特生物IPO过会:年营收4.8亿 养老基金是股东
fh511小风扇主控芯片 便携式小风扇专用8脚IC 三档小风扇升压芯片sop8