当前位置:网站首页>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
边栏推荐
猜你喜欢

开放原子全球开源峰会原圆满结束,openEuler模式得到参会者高度认可

Wovent Bio IPO: Annual revenue of 480 million pension fund is a shareholder

openEuler 社区12位开发者荣获年度开源贡献之星

PAT 1162 Postfix Expression(25)

经纬信息IPO过会:年营收3.5亿 叶肖华控制46.3%股权

NebulaGraph v3.2.0 Performance Report

倪光南:openEuler已达国际同类社区水准

易优压双驱挖掘机压路机器类网站源码 v1.5.8

长江欧拉生态创新中心成立,武汉数字经济再添坚实底座

iPhone难卖,被欧洲反垄断的服务业务也难赚钱了,苹果的日子艰难
随机推荐
什么是元编程
AtCoder Beginner Contest 261 D - Flipping and Bonus
ECCV 2022|R2L: 用数据蒸馏加速NeRF
final关键字的作用 final和基本类型、引用类型
the direction i'm looking for
性能优化——粒子优化笔记
有谁知道pg12.5版本的数据库驱动在哪里能找到么?
28uA待机8米距离低压保护单片机探头太阳能灯人体PIR定制方案
The role of the final keyword final and basic types, reference types
How does the SAP ABAP OData service support the Create operation trial version
Six Stones Programming: Problems must be faced, methods must be skillful, and functions that cannot be done well must be solved
Pytorch —— 分布式模型训练
E - Red and Blue Graph(组合数学)
datetime64[ns]转化为datetime
Istio Pilot代码深度解析
【每日一题】1331. 数组序号转换
DDL和DML的含义与区别「建议收藏」
8. How does the SAP ABAP OData service support the Create operation
沃文特生物IPO过会:年营收4.8亿 养老基金是股东
2022-07-25 网工进阶(二十一)BGP-路由反射器、联盟、聚合