当前位置:网站首页>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
边栏推荐
- gpio analog serial communication
- 【每日一题】1161. 最大层内元素和
- ECCV 2022|R2L: 用数据蒸馏加速NeRF
- ABC260 E - At Least One(双指针)
- D - I Hate Non-integer Number(背包dp)
- 模型运营是做什么的(概念模型数据库)
- 重磅!国内首个开放式在线绘图平台Figdraw突破10万用户!发布《奖学金激励计划》:最高5000元!...
- Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders
- Multithreading Case - Timer
- 大佬们,datax同步数据,同步过程中要新增一个uuid,请问column 怎么写pgsql,uu
猜你喜欢

台积电认清了形势,新的建厂计划没有美国,中国芯片也得到重视

iPhone难卖,被欧洲反垄断的服务业务也难赚钱了,苹果的日子艰难

PAT 1163 Dijkstra Sequence(30)

有限合伙人与普通合伙人的区别

final关键字的作用 final和基本类型、引用类型

207.数组序号转换

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

预防和制止家庭暴力 人身安全保护令司法解释今起施行

Qt实战案例(55)——利用QDir删除选定文件目录下的空文件夹

Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders
随机推荐
RGB系列开发稳定响应快速灯带拾音灯氛围灯等应用定制方案
易优压双驱挖掘机压路机器类网站源码 v1.5.8
台积电认清了形势,新的建厂计划没有美国,中国芯片也得到重视
Multithreading Case - Timer
datetime64[ns] converted to datetime
Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders
final关键字的作用 final和基本类型、引用类型
The role of the final keyword final and basic types, reference types
207.数组序号转换
openEuler 社区12位开发者荣获年度开源贡献之星
Istio投入生产的障碍以及如何解决这些问题
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
【无标题】
CCS软件安装教程(超级详细)「建议收藏」
What is a closure?
开放原子全球开源峰会原圆满结束,openEuler模式得到参会者高度认可
2022-07-25 网工进阶(二十一)BGP-路由反射器、联盟、聚合
Efficiency tools to let programmers get off work earlier
fh511小风扇主控芯片 便携式小风扇专用8脚IC 三档小风扇升压芯片sop8
The default database main key, foreign key, and the only key index