【RTT驱动框架分析02】-串口驱动分析

串口驱动学习

0.串口驱动的使用方法

//定义一个时间
struct rt_event system_event;
#define SYS_EVENT_UART_RX_FINISH    0x00000001 /* UART receive data finish event *//*串口接收回调函数 Receive data callback function */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{//有数据到来,通知读取数据rt_event_send(&system_event, SYS_EVENT_UART_RX_FINISH);return RT_EOK;
}static void test1_thread_entry(void* parameter)
{rt_device_t uart_dev;uint8_t data[30] = {0};uint8_t data1[30] = {0};uint16_t i = 0;uint16_t data_length = 0;rt_uint32_t sys_event_recv = 0;rt_err_t result = rt_event_init(&system_event, "event", RT_IPC_FLAG_FIFO);//查找设备uart_dev = rt_device_find("usart3");//打开设备rt_device_open(uart_dev, RT_DEVICE_FLAG_INT_RX);//打开接收/* 注册一个数据接收回调函数*/rt_device_set_rx_indicate(uart_dev, uart_input);for(i=0;i<sizeof(data);i++){data[i]=i+1;}if(RT_EOK == rt_device_open(uart_dev, RT_DEVICE_FLAG_INT_RX))//打开中断{//串口发送数据rt_device_write(uart_dev, RT_NULL, data, sizeof(data)); }while(1){rt_thread_delay(50);/* 等待数据到来事件 */if(RT_EOK == rt_event_recv(&system_event, SYS_EVENT_UART_RX_FINISH, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 10, &sys_event_recv)){data_length = rt_device_read(uart_dev, RT_NULL, data1, RT_SERIAL_RB_BUFSZ);rt_device_write(uart_dev, RT_NULL, data1, data_length); }   }
}

串口驱动抽象层

1.串口配置

struct serial_configure
{rt_uint32_t baud_rate;rt_uint32_t data_bits               :4;rt_uint32_t stop_bits               :2;rt_uint32_t parity                  :2;rt_uint32_t hardwareflow_control    :2;rt_uint32_t mode                    :2;rt_uint32_t bufsz                   :16;rt_uint32_t reserved                :6;
};

2.串口抽象操作

/*** uart operators*/
struct rt_uart_ops
{	//配置函数rt_err_t (*configure)(struct rt_serial_device *serial, struct serial_configure *cfg);//控制函数rt_err_t (*control)(struct rt_serial_device *serial, int cmd, void *arg);//发送一个字符int (*putc)(struct rt_serial_device *serial, char c);//接收一个字符int (*getc)(struct rt_serial_device *serial);//dma数据发送rt_size_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
};

3.串口驱动抽象

    struct rt_serial_device
{struct rt_device          parent;//RTT设备驱动抽象const struct rt_uart_ops *ops;//串口抽象层操作函数struct serial_configure   config;//串口配置void *serial_rx;void *serial_tx;
};
typedef struct rt_serial_device rt_serial_t;

串口驱动硬件层

这个结构体封装N32L40x相关的串口硬件参数

struct n32l40x_uart
{USART_Module* uart_periph;       // Todo: 3bits串口号IRQn_Type irqn;                  // Todo: 7bits 串口中断号  uint32_t per_clk;                // Todo: 5bits串口时钟uint32_t tx_gpio_clk;            // Todo: 5bits发送引脚时钟uint32_t rx_gpio_clk;            // Todo: 5bits接收引脚时钟GPIO_Module* tx_port;            // Todo: 4bits发送引脚分gpio分组uint32_t tx_af;                  // Todo: 4bits发送引脚的复用uint16_t tx_pin;                 // Todo: 4bits发送引脚pinGPIO_Module* rx_port;            // Todo: 4bits接收引脚分gpio分组uint32_t rx_af;                  // Todo: 4bits接收引脚的复用uint16_t rx_pin;                 // Todo: 4bits接收引脚pinstruct rt_serial_device * serial;    	//串口驱动抽象父类char *device_name;						//串口名字
};

分析已经有的串口设备驱动程序

  1. 定义一个串口配置函数
  2. 定义一个串口控制函数
  3. 定义一个串口的单字符发送函数
  4. 定义一个串口的单字符接收函数
  5. 定义一个统一的串口中断处理函数
  6. 在同一的串口处理函数内部,清楚中断标志后,调用父类的中断处理函数 rt_hw_serial_isr
  7. 定义一个struct rt_uart_ops 对象分别赋值内部的,configure,control,putc,getc,dma_transmit(dma发送非必须)
  8. 注册串口设备对象 rt_hw_serial_register

如何自己添加或更改一个串口设备

文件在drv_usart.c 文件中修改

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握Python的X篇_16_list的切片、len和in操作

接上篇掌握Python的X篇_15_list容器的基本使用&#xff0c;本篇进行进一步的介绍。 文章目录 1. list的索引下标可以是负数2. 切片&#xff08;slice&#xff09;2.1 切片基础知识2.2 如何“取到尽头”2.3 按照步长取元素2.4 逆序取值 3. len函数获取lis的元素个数4. in操作符…

rocketmq客户端本地日志文件过大调整配置(导致pod缓存cache过高)

现象 在使用rocketmq时&#xff0c;发现本地项目中文件越来越大&#xff0c;查找发现在/home/root/logs/rocketmqlog目录下存在大量rocketmq_client.log日志文件。 配置调整 开启slf4j日志模式&#xff0c;在项目启动项中增加-Drocketmq.client.logUseSlf4jtrue因为配置使用的…

手把手教你从0入门线段树~

1. 什么是线段树? 1.1 初探线段树 定义&#xff1a;线段树是一种用于解决区间查询问题的数据结构&#xff0c;是一种广义上的二叉搜索树。 原理&#xff1a;它将一个区间划分为多个较小的子区间&#xff0c;并为每个子区间存储一些有用的信息&#xff0c;例如最大值、最小值…

如何降低TCP在局域网环境下的数据传输延迟

以Ping为例。本案例是一个测试题目&#xff0c;只有现象展示&#xff0c;不含解决方案。 ROS_Kinetic_26 使用rosserial_windows实现windows与ROS master发送与接收消息_windows 接收ros1 消息 什么是ping&#xff1f; AI&#xff1a; ping是互联网控制消息协议&#xff08;…

【Spring Boot】

目录 &#x1f36a;1 Spring Boot 的创建 &#x1f382;2 简单 Spring Boot 程序 &#x1f370;3 Spring Boot 配置文件 &#x1f36e;3.1 properties 基本语法 &#x1fad6;3.2 yml 配置文件说明 &#x1f36d;3.2.1 yml 基本语法 &#x1f369;3.3 配置文件里的配置类…

如何将ubuntu LTS升级为Pro

LTS支持周期是5年&#xff1b; Pro支持周期是10年。 Ubuntu Pro专业版笔记 步骤&#xff1a; 打开“软件和更新” 可以看到最右侧的标签是Ubuntu Pro。 在没有升级之前&#xff0c;如果使用下面两步&#xff1a; sudo apt updatesudo apt upgrade 出现如下提示&#xff…

【低代码专题方案】iPaaS运维方案,助力企业集成平台智能化高效运维

01 场景背景 随着IT行业的发展和各家企业IT建设的需要&#xff0c;信息系统移动化、社交化、大数据、系统互联、数据打通等需求不断增多&#xff0c;企业集成平台占据各个企业领域&#xff0c;成为各业务系统数据传输的中枢。 集成平台承接的业务系统越多&#xff0c;集成平台…

【数据结构】时间复杂度和空间复杂度

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 时间复杂度和空间复杂度 前…

diffusion model(五)stable diffusion底层原理(latent diffusion model, LDM)

LDM: 在隐空间用diffusion model合成高质量的图片&#xff01; [论文地址] High-Resolution Image Synthesis with Latent Diffusion Models [github] https://github.com/compvis/latent-diffusion 文章目录 LDM: 在隐空间用diffusion model合成高质量的图片&#xff01;系列…

某ERP系统信息泄露登录后台

漏洞描述 某ERP前台泄露了某api接口,恶意攻击者可通过调用该接口,对用户的账号和密码进行非授权访问,在获取到账号和密码后,恶意攻击者可接管后台。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事…

时间复杂度介绍及其计算

时间复杂度 1.算法效率 如何衡量一个算法的好坏呢&#xff1f;看这段代码&#xff1a; long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); }这是斐波那契数列的递归代码&#xff0c;非常简洁&#xff0c;那么这就一定说明它好吗&#xff1f;答案显而易…

Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub&#xff1a; Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/s…

【源码解析】SpringBoot循环依赖源码解析II

前言 前面已经写过循环以来的分析&#xff0c;对循环依赖有一些了解&#xff0c;【源码解析】Spring循环依赖和三级缓存。简单回顾一下&#xff1a; Spring可以解决Autowired注入的循环依赖 Spring解决不了构造器注入的循环依赖 使用Aysnc注解会导致循环依赖。提前暴露的Bea…

LeetCode 刷题 数据结构 数组 485 最大连续1的个数

给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3.示例 2: 输入&#xff1a;nums […

C语言中的函数(超详细)

C语言中的函数&#xff08;超详细&#xff09; 一、函数概述二、C语言中函数的分类1.库函数2.自定义函数三、函数的参数1.实际参数&#xff08;实参&#xff09;2.形式参数&#xff08;形参&#xff09;四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调…

大于号在python中怎么打,python大于等于怎么写

大家好&#xff0c;小编为大家解答python中大于并小于一个数代码的问题。很多人还不知道python中大于等于且小于等于&#xff0c;现在让我们一起来看看吧&#xff01; 1、python 中不等于怎么表示 #!/usr/bin/python a1 b2 if ab: print "a 等于 b" if a!b: print &…

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…

图文教程:如何在 3DS Max 中创建3D迷你卡通房屋

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中&#xff0c;我们将学习如何创建一个有趣的、低多边形的迷你动画房子&#xff0c;你可以在自己的插图或视频游戏项目中使用它。您将学习的一些技能将包括创建基本的3D形状和基本的建模技术。让我…

IP网络对讲求助模块

SV-6002 IP网络对讲求助模块是一款壁挂式一键求助对讲模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;实时解码播放&#xff0c;还配置了麦克风输入和扬声器功放输出。SV-6002模块可实现对讲、广播、等功能&#xff0c;作为网络广播对讲系…

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二&#xff1a; Docker Compose 安装 1、Docker Compose…