RT-Thread开发之路— 通过TFTLCD液晶屏幕显示数据(atk-Pandora)

本文在RT-Thread开发之路(8)— 通过TFTLCD液晶屏幕显示数据的原文上进行了局部的小修改,感谢原作者的文章,让自己学到了新的知识。

RT-Thread开发之路(1)— 通过TFTLCD液晶屏幕显示数据

一、硬件连接

BearPi上和正点原子的潘多拉开发板上一样,安装了一个1.3寸,分辨率240*240,色彩深度16bit 的SPI通信接口的TFTLCD液晶彩屏,其驱动芯片为ST7789V2,且连接方式都一样采用4线SPI,如下所示,左边是BearPi,右边是atk-pandora的连接图。
在这里插入图片描述

二、开启SPI设备

打开board.h文件,找到SPI的配置处,按照其提示配置:
在这里插入图片描述
首先,打开【RT-Thread Settings】,找到SPI设备驱动程序,将其选中,然后保存使之生效
在这里插入图片描述
通过查看原理图,可以知道,其连接到的引脚如下所示:(对应Pandora的SPI3)
在这里插入图片描述
将board.h的SPI3的注释打开,
在这里插入图片描述
接下来使用CubeMx生成HAL_SPI_MspInit()函数,将SPI以及LCD需要的控制引脚设置为如图所示:
请添加图片描述
HAL_SPI_MspInit()复制到board.c

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hspi->Instance==SPI3)
  {
  /* USER CODE BEGIN SPI3_MspInit 0 */

  /* USER CODE END SPI3_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI3_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**SPI3 GPIO Configuration
    PB3 (JTDO-TRACESWO)     ------> SPI3_SCK
    PB5     ------> SPI3_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI3_MspInit 1 */

  /* USER CODE END SPI3_MspInit 1 */
  }

}

然后打开stm32xxxx_hal_config.h文件,将#define HAL_SPI_MODULE_ENABLED的注释去掉:
在这里插入图片描述
然后编译下载运行,在msh下输入list_device,可以看到,spi3已经注册上去了
请添加图片描述

三、移植LCD代码

packages文件夹下新建lcd_st7789v2文件夹,并将并将潘多拉开发板IoT_Boarddrv_lcd.cdrv_lcd.hdrv_lcd_font.h三个文件放入其中,获取方式为:从 Github 获取从 Gitee 获取。也可以从正点原子官网下载Pandora的IOT_Board中获取
在这里插入图片描述
然后我们需要对drv_lcd.c做一些修改,首先,去掉gpio.h头文件:
在这里插入图片描述
然后修改LCD_PWR_PINLCD_DC_PINLCD_RES_PIN引脚定义:

#define LCD_PWR_PIN           GET_PIN(B, 7)
#define LCD_DC_PIN            GET_PIN(B, 4)
#define LCD_RES_PIN           GET_PIN(B, 6)

接下来,在rt_hw_lcd_config()函数修改两行代码,添加一行代码:

spi_dev_lcd = (struct rt_spi_device *)rt_device_find("spi30"); //修改
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;			//修改
spi_dev_lcd->bus->owner = spi_dev_lcd;							//添加

请添加图片描述
然后,我们对rt_hw_lcd_init()需要做比较大的修改,就直接贴上修改完成的代码:

static int rt_hw_lcd_init(void)
{
    rt_hw_spi_device_attach("spi3", "spi30", GPIOD, GPIO_PIN_7);
    lcd_gpio_init();
    rt_thread_mdelay(50);

    rt_pin_write(LCD_PWR_PIN, PIN_LOW);
    rt_pin_write(LCD_RES_PIN, PIN_LOW);
    rt_thread_mdelay(12);
    rt_pin_write(LCD_RES_PIN, PIN_HIGH);
    rt_pin_write(LCD_PWR_PIN, PIN_LOW);
    rt_pin_write(LCD_RES_PIN, PIN_LOW);
    rt_thread_mdelay(12);
    rt_pin_write(LCD_RES_PIN, PIN_HIGH);
    rt_thread_mdelay(12);
    /* Sleep Out */
    lcd_write_cmd(0x11);
    /* wait for power stability */
    rt_thread_mdelay(12);

    /* Memory Data Access Control */
    lcd_write_cmd(0x36);
    lcd_write_data(0x00);
    /* RGB 5-6-5-bit  */
    lcd_write_cmd(0x3A);
    lcd_write_data(0x65);
    /* Porch Setting */
    lcd_write_cmd(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_cmd(0xB7);
    lcd_write_data(0x72);
    /* VCOM Setting */
    lcd_write_cmd(0xBB);
    lcd_write_data(0x3D);
    /* LCM Control */
    lcd_write_cmd(0xC0);
    lcd_write_data(0x2C);
    /* VDV and VRH Command Enable */
    lcd_write_cmd(0xC2);
    lcd_write_data(0x01);
    /* VRH Set */
    lcd_write_cmd(0xC3);
    lcd_write_data(0x19);
    /* VDV Set */
    lcd_write_cmd(0xC4);
    lcd_write_data(0x20);
    /* Frame Rate Control in Normal Mode */
    lcd_write_cmd(0xC6);
    lcd_write_data(0x0F);
    /* Power Control 1 */
    lcd_write_cmd(0xD0);
    lcd_write_data(0xA4);
    lcd_write_data(0xA1);
    /* Positive Voltage Gamma Control */
    lcd_write_cmd(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_cmd(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_cmd(0x21);

    lcd_write_cmd(0x29);

    lcd_address_set(0, 0, 240 - 1, 240 - 1);

    lcd_clear(WHITE);

    /* display on */
    rt_pin_write(LCD_PWR_PIN, PIN_HIGH);

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_lcd_init);

接下来添加头文件,在工具设置配置页,点击GNU ARM Cross C Compiler下的Includes配置项即可打开头文件路径配置参数,点击Inlucde paths(-I)配置栏的添加按钮即将lcd_st7789v2目录添加进来,如下图所示:
在这里插入图片描述

四、编写代码,在LCD上显示

main.c里添加头文件,

#include "drv_lcd.h"

然后测试几个函数:

    /* 设置背景色和前景色 */
    lcd_set_color(WHITE, BLACK);

    /* 在 LCD 上显示字符 */
    lcd_show_string(10, 60, 32, "Hello!");
    lcd_show_string(10, 100, 32, "RT-Thread");

    /* 在 LCD 上画线 */
    lcd_draw_line(0, 69+16+24+32, 240, 69+16+24+32);

    /* 在 LCD 上画一个同心圆 */
    lcd_draw_point(120, 194);
    for (int i = 0; i < 46; i += 4)
    {
        lcd_draw_circle(120, 194, i);
    }

编译下载运行,可以看到:
请添加图片描述

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread作品秀】OLED显示演示作者:谢博翔 概述初步体验 RT-Thread出的RTT核心版 ART-Pi,使用RTT用OLED显示 开发环境硬件:ART-Pi RT-Thread版本:4.0.3 开发工具及版本:RT-Thread Studio 2.0 RT-Thread使用情况概述软件包:使用u8g2 U8g2是嵌入式设备的单色图形库,目前支持单色OLED和LCD,包括以下控制器:SSD1305,SSD1306等 选用u8g2的原因: U8g2库平台支持性好,基本上支持绝大部分开发板,并且RTT已经有对应的软件包 U8g2库显示控制器支持性好,基本上市面上的OLED都完美支持; U8g2库API众多,特别支持了中文,支持了不同字体,这是一个对于开发者俩说不小的福利 硬件框架软件框架说明添加u8g2软件包,修改I2C接口和显示文字,编译、烧录。运行程序,打开监视串口:输入shell:u8g2_ssd1306_12864_sw_i2c_example 软件模块说明修改I2C接口 输入显示的内容 定义 RT_USINF_PIN 演示效果视频地址比赛感悟应改要多学习,多认真思考,多动手实践,不应该只停留在基础的实践,应该多coding,而且掌握好时间; 未来应该是RTOS和Linux的天下,现在 RT-Thread开源,是一件很好的事情;虽然国内开源的RTOS的已经好几家, 但现在看来,生态做的又好,软件又好用的,可能 RT-Thread 是最好的! 也感谢电路城这次的活动,以前对电路城并不是很了解,这次上传资料,简单看了下,感觉收获多多,也希望 后面能在这里学到和提供一些东西~ 加油

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值