0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以SPI OLED驱动为例,LCD驱动框架详解

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:RTThread物联网操作 2020-11-26 14:55 次阅读

今天看到大佬肖遥兄分享的一篇文章:【架构篇】嵌入式编程中如何给代码的结构分层提到了高内聚,低耦合,软件分层等等的概念。之前又有小伙伴在后台留言说让我分享一篇这样的文章,所以今天它来了!

废话不多说,理论讲太多没啥感觉,这些条条框框本质就是基于面对对象的设计模式相关的一些理论,设计模式就是前人实践多了发现一些规律然后总结出来的那么一套好用的框架,所以咱们直接出干货,硬肝!以小熊派上的SPI OLED驱动为例,将原来开发包里的LCD驱动做一些简单的改造,然后我们根据需求设计如下的驱动模型框架,分为模型、驱动、设备三个部分,我们先不考虑太细节的东西,也不会把这个东西一开始就做得特别复杂,这样不利于理解,于是我们构建如下的框架思维导图:

1、LCD驱动框架数据结构

框架提供一些什么能力呢?我是这么来做的,非常简单:

这里提供了将驱动框架与驱动进行对接的能力,&lcd_driver拿到的是定义在驱动文件里的一个已经赋值了的结构体lcd_driver,这样,当我在别的地方定义一个LCD_Driver_Model的变量,就可以将这个变量与驱动结构体进行对接,这样就可以通过这个变量来操作驱动结构体里的接口了。

2、LCD驱动数据结构

LCD驱动这个数据结构要做的事情就是提供操作LCD驱动能力的接口,这个接口的设计与硬件无关。

前面1小节说过,驱动框架依赖于驱动接口,这样的话我们需要实现驱动接口里的方法,在对应的方法里,我们要去调用LCD设备相关的接口,进而去操作LCD设备,以下是接口对应的实现:

3、LCD设备数据结构

LCD设备所需要做的事情就是将这个数据结构里的功能函数与真实的LCD驱动接口进行对接。比如我们看LCD_Init这个接口的实现,这个就是真实调用LCD的真实硬件操作了:

4、使用方法

intmain(void) { /*USERCODEBEGIN1*/ LCD_Driver_Modellcd_model; LCD_Ascii_Show_Paraascii_para[]= { {80,100,240-80,"RED",BLACK,RED,32}, {80,100,240-80,"GREEN",BLACK,GREEN,32}, {80,100,240-80,"BLUE",BLACK,BLUE,32}, }; LCD_Fill_Parafill_para[]= { {ascii_para[0].x,ascii_para[0].max_width,ascii_para[0].y,ascii_para[0].y+32}, {ascii_para[1].x,ascii_para[1].max_width,ascii_para[1].y,ascii_para[1].y+32}, {ascii_para[2].x,ascii_para[2].max_width,ascii_para[2].y,ascii_para[2].y+32}, }; /*USERCODEEND1*/ /*MCUConfiguration--------------------------------------------------------*/ /*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/ HAL_Init(); /*USERCODEBEGINInit*/ /*USERCODEENDInit*/ /*Configurethesystemclock*/ SystemClock_Config(); /*USERCODEBEGINSysInit*/ /*USERCODEENDSysInit*/ /*Initializeallconfiguredperipherals*/ MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); MX_SPI2_Init(); /*USERCODEBEGIN2*/ /*串口初始化后加这个延时,防止后面的printf打印乱码*/ HAL_Delay(200); /*注册驱动模型*/ Register_Driver_Model(&lcd_model); /*调用LCD初始化*/ lcd_model.lcd_driver->lcd_init(); /*调用LCD显示ASCII码字符串*/ lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[0]); /*USERCODEEND2*/ /*Infiniteloop*/ /*USERCODEBEGINWHILE*/ while(1) { /*USERCODEENDWHILE*/ /*USERCODEBEGIN3*/ /*循环调用LCD显示ASCII码字符串*/ for(inti=0;i< 3 ; i++)         {             lcd_model.lcd_driver->lcd_fill(fill_para[i]); lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[i]); HAL_Delay(100); } } /*USERCODEEND3*/ }

这样我们就完成了LCD驱动最简单的分层设计了,当然我们的软件框架后续还需要不断的把它做得更健壮,这样以后随便一个LCD,我们都可以设计一套类似这样的固定模板,根据实际的业务需求,定义设计合适的接口,以后但凡换一个项目还是用同一个LCD的话就非常简单了!

5、思考

前面我开源了一个基于TencentOS tiny的气体探测仪项目,你是否能在那个项目上继续进行优化改善呢?

本节代码已同步到码云的代码仓库中,获取方法如下:

1、新建一个文件夹

2、使用git clone远程获取小熊派例程存放的代码仓库

项目开源仓库:

https://gitee.com/morixinguan/bear-pi.git

我还将之前做的一些项目以及练习例程在近期内全部上传完毕,与大家一起分享交流:

责任编辑:PSY

原文标题:自己动手撸个简单的LCD驱动框架吧!

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 框架
    +关注

    关注

    0

    文章

    297

    浏览量

    17039
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1610

    浏览量

    89539
  • OLED驱动
    +关注

    关注

    1

    文章

    13

    浏览量

    10179

原文标题:自己动手撸个简单的LCD驱动框架吧!

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全志R128使用SPI驱动ST7789V1.47寸LCD

    Supports software flexible control video frame rate 同时,提供了 SPILCD 驱动框架以供 SPI 屏幕使用。 此次适配的SPI
    发表于 01-02 09:45

    SF1 RISC-V Core 驱动OLED屏幕

    第1章 SF1 RISC-V Core 驱动OLED屏幕本次测评采用安路的SF1 RISC-V内核实现对SPI OLED屏幕的驱动,实
    发表于 12-10 10:26

    全志R128应用开发案例——SPI驱动ST7789V1.3寸LCD

    Supports software flexible control video frame rate 同时,提供了 SPILCD 驱动框架以供 SPI 屏幕使用。 此次适配的SPI
    发表于 11-06 10:16

    全志R128基础组件开发指南——SPI LCD 显示驱动

    lcd_bl_en、lcd_spi_dc_pin以及lcd_gpio_x都是属于GPIO属性类型。 下面lcd_spi_dc_pin
    发表于 10-25 14:36

    全志R128应用开发案例——SPI 驱动 TFT LCD

    SPI 驱动 TFT LCD 屏 R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点: Supports DBI
    发表于 10-23 14:29

    R128实现SPI驱动TFT LCD屏教程

    同时,提供了SPILCD驱动框架以供 SPI 屏幕使用,本次使用的是 Dshan_Display Module。
    的头像 发表于 10-21 16:31 637次阅读
    R128实现<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>TFT <b class='flag-5'>LCD</b>屏教程

    oled0.96寸屏spi和i2c驱动那个刷屏速度快?

    oled0.96寸屏spi和i2c驱动那个刷屏速度快
    发表于 09-25 08:21

    IIO驱动框架创建和相关配置

    IIO驱动框架创建 分析 IIO 子系统的时候大家应该看出了,IIO框架主要用于 ADC 类的传感器,比如陀螺仪、加速度计、磁力计、光强度计等,这些传感器基本都是IIC 或者 SPI
    的头像 发表于 07-30 11:53 774次阅读

    Linux Regmap 驱动框架

    1、regmap 框架结构 regmap 驱动框架如下图所示: regmap 框架分为三层: ①、底层物理总线:regmap 就是对不同的物理总线进行封装,目前 regmap 支持的物
    的头像 发表于 07-06 17:29 725次阅读
    Linux Regmap <b class='flag-5'>驱动</b><b class='flag-5'>框架</b>

    如何驱动I2C接口的OLED屏?

    前面我们介绍了驱动SPI接口LCD5110显示屏的方法,这次介绍一下如何驱动I2C接口的OLED屏,该O
    发表于 06-27 06:37

    基于Linux使用spidev驱动OLED

    如果不想编写spi设备驱动,那么linux内核提供了一个通用的spidev设备驱动,提供统一的字符设备操作,那么只需要在应用层读写和控制即可。以SPI
    发表于 06-16 10:36 2654次阅读
    基于Linux使用spidev<b class='flag-5'>驱动</b><b class='flag-5'>OLED</b>

    实现一个简单的事件驱动处理框架

    事件驱动框架允许程序处理外部事件,如网络连接、文件I/O、超时和信号。事件驱动框架可以让程序通过回调函数处理不同的事件,回调函数可以在事件触发时立即被调用。
    发表于 06-09 09:56 315次阅读
    实现一个简单的事件<b class='flag-5'>驱动</b>处理<b class='flag-5'>框架</b>

    CH32V103基础教程87-硬件SPI驱动OLED

    SPI驱动OLED屏,所用OLED7引脚0.96寸OLED屏。程序中配置PA5作为D0线,P
    发表于 05-10 16:17

    CH32V103基础教程86-模拟SPI驱动OLED

    前面章节有介绍过IIC驱动OLED,使用的4引脚OLED屏,本章教程主要使用模拟SPI驱动
    发表于 05-10 16:16

    STM32系列之LCD驱动接口与驱动程序介绍

    STM32F103系列是没有内置LCD控制器接口的,如果要驱动LCD,需要一颗LCD图形驱动IC。
    的头像 发表于 04-24 17:26 8581次阅读
    STM32系列之<b class='flag-5'>LCD</b><b class='flag-5'>驱动</b>接口与<b class='flag-5'>驱动</b>程序介绍