rtt的io设备框架面向对象学习-电阻屏LCD设备
目录
- 1.8080通信的电阻屏LCD设备
- 1.1 构造流程
- 1.2 使用
- 2.i2c和spi通信的电阻屏LCD
电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。
1.8080通信的电阻屏LCD设备
lcd这块不像其他设备类,rtt没有实现的设备驱动框架层,那么是在驱动层直接实现的。
以stm32f407-atk-explorer为例,该bsp支持电阻触摸屏LCD,在/bsp / stm32 / stm32f407-atk-explorer / board / ports /drv_lcd.c中定义了该设备类:
struct drv_lcd_device
{struct rt_device parent;struct rt_device_graphic_info lcd_info;
};
其中struct rt_device_graphic_info是在/ components / drivers / include / drivers /classes/graphic.h定义的:
struct rt_device_graphic_info
{rt_uint8_t pixel_format; /**< graphic format */rt_uint8_t bits_per_pixel; /**< bits per pixel */rt_uint16_t pitch; /**< bytes per line */rt_uint16_t width; /**< width of graphic device */rt_uint16_t height; /**< height of graphic device */rt_uint8_t *framebuffer; /**< frame buffer */rt_uint32_t smem_len; /**< allocated frame buffer size */
};
然后实例化了该设备类
static struct drv_lcd_device _lcd;
1.1 构造流程
并实现了其构造函数drv_lcd_hw_init:
int drv_lcd_hw_init(void)
{rt_err_t result = RT_EOK;struct rt_device *device = &_lcd.parent;/* memset _lcd to zero */memset(&_lcd, 0x00, sizeof(_lcd));_lcd.lcd_info.bits_per_pixel = 16;_lcd.lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565;device->type = RT_Device_Class_Graphic;
#ifdef RT_USING_DEVICE_OPSdevice->ops = &lcd_ops;
#elsedevice->init = drv_lcd_init;device->control = drv_lcd_control;
#endifdevice->user_data = &fsmc_lcd_ops;/* register lcd device */rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);return result;
}
INIT_DEVICE_EXPORT(drv_lcd_hw_init);
可以看到其重写了父类——设备基类的方法——但是只是重写了init方法和control方法。
其对象图如下
然后它就调用设备基类的构造函数rt_device_register,将电阻屏LCD设备对象放到对象容器里管理。
详细参见io设备管理层。
https://blog.csdn.net/yhb1206/article/details/136440373
1.2 使用
在/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /drv_xpt2046_init.c中,
static int touch_xpt2046_init(void)
{xpt2046_init_hw();rt_thread_t tid = rt_thread_create("xpt2046", xpt2046_entry, RT_NULL, 1024, 8, 20);RT_ASSERT(tid != RT_NULL);rt_thread_startup(tid);return RT_EOK;
}
INIT_COMPONENT_EXPORT(touch_xpt2046_init);
void xpt2046_init_hw(void)
{……lcd = rt_device_find("lcd");rt_device_init(lcd);
}
在rtt的io设备框架面向对象学习-touch设备中说过,因为此bsp的LCD是电阻触摸LCD屏,所以在xpt2046_init_hw中初始化触摸设备,最后也初始化了LCD。
在xpt2046_entry线程中,读取到触摸坐标点,若开启了lvgl绘图,则通知lvgl绘图,否则直接调用rt_graphix_ops(lcd)->set_pixel在LCD上绘制点的轨迹。
void xpt2046_entry(void *parameter)
{…… while (1){ …… #ifdef PKG_USING_LVGL lv_port_indev_input(read_data.x_coordinate, read_data.y_coordinate, ((read_data.event == RT_TOUCH_EVENT_DOWN) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL));#else /* PKG_USING_LVGL */ const rt_uint32_t black = 0x0; rt_graphix_ops(lcd)->set_pixel((const char *)(&black), read_data.x_coordinate, read_data.y_coordinate);#endif rt_thread_mdelay(1); } }
如上线程,若是lvgl读到触摸坐标则调用lv_port_indev_input通知lvgl事件,/bsp / stm32 / stm32f407-atk-explorer / board / ports/drv_lcd.c中的函数lcd_fill_array作为对接lvgl的绘图回调函数:
void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor)
{
rt_uint16_t *pixel = RT_NULL;
rt_uint16_t cycle_y, x_offset = 0;
pixel = (rt_uint16_t *)pcolor;
for(cycle_y = y_start; cycle_y <= y_end; ) {
LCD_SetCursor(x_start, cycle_y); LCD_WriteRAM_Prepare();
for(x_offset = 0;x_start + x_offset <= x_end; x_offset++)
{
LCD->RAM = *pixel++; } cycle_y++; }
}
可以看到通过绘点来实现显示刷新。
但是如果没有开启lvgl,则直接调用rt_graphix_ops(lcd)->set_pixel,它是/ components / drivers / include / drivers /classes/graphic.h定义的lcd操作接口:
struct rt_device_graphic_ops
{void (*set_pixel) (const char *pixel, int x, int y);void (*get_pixel) (char *pixel, int x, int y);void (*draw_hline)(const char *pixel, int x1, int x2, int y);void (*draw_vline)(const char *pixel, int x, int y1, int y2);void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
};
#define rt_graphix_ops(device) ((struct rt_device_graphic_ops *)(device->user_data))
而之前drv_lcd.c中实现了该接口:
struct rt_device_graphic_ops fsmc_lcd_ops ={LCD_Fast_DrawPoint,LCD_ReadPoint,LCD_HLine,LCD_VLine,LCD_BlitLine,
};
并在构造函数drv_lcd_hw_init中赋给了设备基类的user_data 成员
device->user_data = &fsmc_lcd_ops;
这样就能直接操作lcd绘图。
2.i2c和spi通信的电阻屏LCD
至于i2c和spi通信的电阻屏LCD是怎么操作的,通过查找,是没有新的对象的,都是直接对i2c总线和spi设备关联,直接包装发送数据即可,没有上面8080通信口那样子的新的设备框架对象。
spi的LCD屏可以参照官方开发板麻雀一号开发板。
i2c未找到参照物,但是应该是spi一样。
相关文章:

rtt的io设备框架面向对象学习-电阻屏LCD设备
目录 1.8080通信的电阻屏LCD设备1.1 构造流程1.2 使用2.i2c和spi通信的电阻屏LCD 电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。 1.8080通信的电阻屏LCD设备 lcd这块不像其他设备类,rtt没有实现的设备驱动框架层,那么是在驱动层直接实现的。 以…...

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景
1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…...
蓝桥杯刷题--python-16
562. 壁画 - AcWing题库 Tint(input()) j1 while(j<T): N int(input()) ainput() s [0]*(N1) # 求前戳和 for i in range(1, N 1): s[i] int(a[i-1]) s[i - 1] # 枚举 # 区间 max_ float(-inf) k (N 2 - 1) // 2 for i in …...
闰年计算中的计算机Bug
不知道你有没有看过凯瑟琳泽塔琼斯主演的《偷天陷阱》,里面主题思想是用银行结算系统的千年虫bug,精心设计,盗取银行几十亿的精彩动作片。所谓2000 年千禧年的千年虫,其实就是计算机计算闰年的bug。 这个闰年计算的历史源远流长&…...

python水表识别图像识别深度学习 CNN
python水表识别,图像识别深度学习 CNN,Opencv,Keras 重点:项目和文档是本人近期原创所作!程序可以将水表图片里面的数据进行深度学习,提取相关信息训练,lw1.3万字重复15%,可以直接上交那种&…...

Java对接快递100实时快递单号查询API接口
目录 1.引入依赖 2.定义配置信息 3.模块结构 4.Controller 5.Service实现类 6.返回数据dto以及dto中的数据dto 7.测试运行 今天也是接到了这个任务,官网有小demo,可以下载下来参考test中代码 官方文档地址: 实时快递查询接口技术文档…...

Redis常见的15个【坑】,避坑指南
一、常见命令 1.1 过期时间意外丢失 原因: SET命令如果不设置过期时间,那么Redis会自动【擦除】这个key的过期时间 1.2 DEL命令阻塞redis key是String类型时,DEL时间复杂度是O(1)key是List/Hash/Set/ZSet类型,DEL时间复杂度是…...

04. Nginx入门-Nginx WEB模块
测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…...
Python在信息安全领域中具有重要的作用
Python在信息安全领域中具有重要的作用。下面是几个方面的说明: 网络安全:Python提供了一系列用于网络安全的库和工具,例如Scapy、Nmap等。这些工具可以应用于漏洞扫描、网络流量分析、数据包嗅探等操作,帮助检测和防御网络攻击。…...
Linux 定时备份文件到另一台服务器
1. 需求 用户要求将 Tomcat 的日志文件定时备份到另一台服务器。同事给我提供了一个写好的 java 框架,但实在不想给用户再维护另一个服务了,所以另寻他法。 2. 问题 使用 scp 等跨服务器传输命令时需要手动输入用户名的密码才可进行文件传输ÿ…...

C++输入输出(I\O)
我们知道C是由C语言发展而来的,几乎完全兼容C语言,换句话说,你可以在C里面编译C语言代码。如下图: C语言是面向过程的语言,C在C语言之上增加了面向对象以及泛型编程机制,因此C更适合中大型程序的开发,然而C…...

基本设计模式
单例模式 ES5 function Duck1(name:string){this.namenamethis.instancenull }Duck1.prototype.getNamefunction(){console.log(this.name) }Duck1.getInstancefunction(name:string){if(!this.instance){this.instance new Duck1(name)} } const aDuck1.getInstance(a) const…...

双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025
D2025 为立体声音频功率放大集成电路,适用于各类袖珍或便携式立体声 收录机中作功率放放大器。 D2025 采用 DIP16 封装形式。 主要特点: 适用于立体声或 BTL 工作模式 外接元件少 通道分离性好 电源电压范围宽(3V~12V ÿ…...
Linux 内核获取函数size
方式一:通过objdump -t直接从目标文件中获取函数size #objdump -t file_unread.o | grep hook 0000000000000030 l F .text 000000000000012f hook_vfs_read0000000000000030 l F .text 000000000000012f hook_vfs_read各个字段说明 0000000000000030&#x…...

Python+neo4j构建豆瓣电影知识图谱
文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系多标签实体和实体去重数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集,OpenKG(Open Knowledge Graph),可供研究人员使用研究。 数据整理导入 impor…...

DolphinScheduler——介绍及架构设计
目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…...
【Python】约瑟夫环问题
任务描述 据说著名历史学家 Josephus有过以下的故事:Josephus及他的朋友共41人围成一个圆圈,由第1个人开始报数,每数到3该人就必须出去,然后再由下一个人重新报数,直到圆圈上少于3人为止。Josephus 将朋友与自己安排在…...

Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘
Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…...

基于springboot+vue的医院药品管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

Python爬虫——Urllib库-1
这几天都在为了蓝桥杯做准备,一直在刷算法题,确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来,那么Python的爬虫就这样开始学习了。 注:文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...