【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;例如最大值、最小值…

从苏宁电器到卡巴斯基(第二部)第32篇:我当高校教师的这几年 VIII

目录 我的评教排名竟然这么高 合约结束X无法转正X原来都没有编 寻求出路

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

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

有关bind一些困惑解答

先看如下代码&#xff1a; double my_divide (double x, double y) {return x/y;}class A { public:void fun_3(int k,int m) {std::cout << "print: k "<< k << ", m " << m << std::endl;} }; int main() {A a;//f5的类…

【每日一题Day280】LC141环形链表 | 快慢指针 哈希表

环形链表【LC141】 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的…

【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…

torch使用GPU加速

下载cuda 下载torch 下载与python版本适配的GPU版torch 使用GPU加速 将模型&#xff0c;函数&#xff0c;数据都放入GPU中 将模型加入GPU# 自定义模型要继承torch.nn.Module才能使用GPU加速 # 在模型后加cuda函数 model TransE(num_nodes, num_relations, hidden_channel…

【低代码专题方案】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;系列…

Kotlin线程的基本用法

线程的基本用法 新建一个类继承自Thread&#xff0c;然后重写父类的run()方法 class MyThread : Thread() {override fun run() {// 编写具体的逻辑} }// 使用 MyThread().start()实现Runnable接口 class MyThread : Runnable {override fun run() {// 编写具体的逻辑} }// …

es报错[FORBIDDEN/12/index read-only / allow delete (api)]

报错 [FORBIDDEN/12/index read-only / allow delete (api)] es磁盘满了 postman请求 put 请求 http://loclahost:9200/_settings {"settings": {"index": {"blocks": {"read_only_allow_delete": "false"}}} }

某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 […