stm32l476芯片介绍(nvidia驱动无法找到兼容的图形硬件)

前言最近购买了IoTBoard潘多拉开发板来研究,学习使用STM32CubeMX工具配置SPI,然后驱动了TFTLCD。潘多拉开发板的TFTLCD驱动IC是ST7789V2,结合原子哥的TFTLCD代码,分享自己的硬件SPI+软件SPI驱动ST7789V2+中文显示。关于STM32CubeMX的使用可以参考微雪课堂STM32CubeMX系列教程。STM32L475硬件SPI+软…

大家好,又见面了,我是你们的朋友全栈君。

前言

最近购买了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(&reg, 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,原子论坛的资料有这个工具,取汉字配置和效果如下:

stm32l476芯片介绍(nvidia驱动无法找到兼容的图形硬件)

stm32l476芯片介绍(nvidia驱动无法找到兼容的图形硬件)

详细的ST7789V2完整驱动代码请点击如下链接,到我在原子论坛的帖子下载:
【分享】}STM32L475潘多拉IoT Board开发板TFTLCD ST7789V2 硬件SPI+软件SPI驱动+中文字符显示

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126407.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 交流转直流降压、稳压电路「建议收藏」

    交流转直流降压、稳压电路「建议收藏」目录目录降压稳压原理图设计思路电路图及原件原理图理解成果展示降压稳压原理图桥式整流电容滤波电路(最常用电路,本博客电路):全波整流电容滤波电路:-二倍压整流电容滤波电路:设计思路电路图及原件原件:PCB洞洞板、220V~12V变压器、7805稳压管、二极管*4、1000uF电解电容、10uF电解电容*2、…

  • win10下使用anaconda安装pytorch和torchvision

    win10下使用anaconda安装pytorch和torchvision一、系统配置以及软件版本1、操作系统:win102、显卡:NVIDIAGeForceGTX1070Ti3、cuda_9.0.176_win10链接:https://pan.baidu.com/s/1f9MowahErE9u60LO1MOcPw提取码:5k2c4、cudnn-9.0-windows10-x64-v7.1链接:https://pan.baidu.com/s/1MGe…

  • phpstorm激活码注册码序列号_最新在线免费激活

    (phpstorm激活码注册码序列号)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • phpstorm2021.4.4激活码_通用破解码

    phpstorm2021.4.4激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 钓鱼网站盗QQ_qq看别人的空间一定会被别人知道吗

    钓鱼网站盗QQ_qq看别人的空间一定会被别人知道吗刚刚打开手机tim看到QQ空间有留言下面一个截图的东西(别扫进去输自己的账号密码哈,看看就得了,典型的钓鱼网站)貌似在前几年就有此类网站,不过现在高级了些,下面就由图图来分析一下原理是什么鬼(毫无技术含量)大神快点绕道!!!首先看到这个图片而写是熟人给你留言的,并且还是以好友备注的名字进行留言“XXX,我们合影的照片都在这里了你太好笑了照片呆呆的,长摁识别”会有这么一句话,好奇心强的都会点进去看~【为什么要搞这种二维码呢?就是为了不让一些在线解码的网站轻易识别反而只有QQ、微信可…

  • 语义分割代码一步步实现_语义分割应用

    语义分割代码一步步实现_语义分割应用语义分割的整体实现代码大致思路很简单,但是具体到细节,就有很多可说的东西。之前写过一篇文章,可能有些地方现在又有了新的思路或者感受,或者说之前没有突出重点。作为一个小白,这里把自己知道的知识写一下,事无巨细,希望看到的人能有所收获。一、文件思路总的来说,语义分割代码可以分为如下几个部分:data:图像数据 data/train:训练集数据 data/train/img:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号