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

news2024/9/30 3:20:18

串口驱动学习

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发送引脚pin
    GPIO_Module* rx_port;            // Todo: 4bits接收引脚分gpio分组
    uint32_t rx_af;                  // Todo: 4bits接收引脚的复用
    uint16_t rx_pin;                 // Todo: 4bits接收引脚pin

    struct 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.coloradmin.cn/o/807955.html

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

相关文章

centos7安装tomcat

安装tomcat 必须依赖 JDK 环境&#xff0c;一定要提前装好JDK保证可以使用 一、下载安装包 到官网下载 上传到linux 服务器 二、安装tomcat 创建tomcat 文件夹 mkdir -p /usr/local/tomcat设置文件夹权限 chmod 757 tomcat将安装包上传至 新建文件夹 解压安装包 tar zx…

乐划锁屏充分发挥强创新能力,打造内容业新生态

乐划锁屏作为新型内容媒体,在这一市场有着众多独特的优势,不仅能够通过多场景的联动给内容创作者带来了更多可能性,还促进了更多优质作品的诞生,为用户带来更加丰富多彩的锁屏使用体验。 作为OPPO系统原生的OS应用,乐划锁屏一直致力于打造为用户提供至美内容的内容平台,吸引了全…

Echarts入门实例

Echarts是一个基于JavaScript的开源可视化库&#xff0c;用于构建交互式和可定制的图表和图形。它由百度开发并维护&#xff0c;提供了丰富多样的图表类型和强大的功能&#xff0c;使开发者能够简单快速地创建各种各样的数据可视化。 Echarts支持常见的图表类型&#xff0c;如折…

730. 机器人跳跃问题

输入样例1&#xff1a; 5 3 4 3 2 4输出样例1&#xff1a; 4输入样例2&#xff1a; 3 4 4 4输出样例2&#xff1a; 4输入样例3&#xff1a; 3 1 6 4输出样例3&#xff1a; 3代码 //首先我们要分情况讨论 //1.后面的大&#xff1a;EE-(h-E)2E-h //2.后面的小&#xff1a;…

idea插件开发-自定义语言03-Parse and PSI

在 IntelliJ 平台中解析文件是一个两步过程&#xff1a; 首先&#xff0c;构建抽象语法树 (AST)&#xff0c;定义程序的结构。AST 节点由 IDE 在内部创建&#xff0c;具体是由类ASTNode类来创建的。 每个 AST 节点都有一个关联的元素类弄IElementType实例&#xff0c;元素类型…

springboot整合myabtis+mysql

一、pom.xml <!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--springboot与JDBC整合包--><dependency><groupId>org.springframework.b…

Banana Pi BPI-P2 Zero 开源硬件物联网开发板基准测试和评论

Banana Pi P2 Zero 和 P2 Maker 是基于 Allwinner 的 H3 和 H2 芯片组的廉价主板。它们以低廉的价格提供了一些有趣的功能&#xff0c;具有很大的吸引力&#xff0c;但由于其老化的 32 位架构和平庸的软件支持而有些令人失望。BPi-P2 板最适合作为无头边缘平台&#xff0c;具有…

JAVA SE -- 第十一天

&#xff08;全部来自“韩顺平教育”&#xff09; 异常-Exception 一、异常介绍 1、基本介绍 Java语言中&#xff0c;将程序执行中发生的不正常情况为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 2、执行过程中发生的异常事件可分为两大类 …

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…

Windows系统远程桌面访问统信Uos社区版Deepin系统的正确方法

文章目录 0、前言1、安装X11vnc2、安装xrdp3、在Windows中以远程桌面连接3.1、可以以xorg方式远程桌面连接3.2、以vnc方式远程桌面连接黑屏 0、前言 前段时间写了篇博文【UnRaid虚拟机安装Uos家庭版并由Windows远程桌面访问的成功流程】&#xff0c;成功实现远程桌面方式登录U…

用asp.net开发h5网页版视频播放网站,类似优酷,jellyfin,emby

之前用jellyfin开源软件搞了一个视频播放服务器,用来共享给家里人看电影和电视剧,jellyfin虽然各方面功能都很强大,但是界面和使用习惯都很不适合,于是就想着利用下班休息时间做一套自己喜欢的视频网站出来. 本来是打算直接用jellyfin的源码进行修改,源码是用C# netcore 写的服…

安全学习DAY10_HTTP数据包

文章目录 HTTP数据包![请添加图片描述](https://img-blog.csdnimg.cn/32eb72ceb2d6453b94487edb1a940a43.png)Request请求数据包结构Request请求方法&#xff08;方式&#xff09;请求头&#xff08;Header&#xff09;Response响应数据包结构Response响应数据包状态码状态码作…

SQL-每日一题【1050. 合作过至少三次的演员和导演】

题目 ActorDirector 表&#xff1a; 查询合作过至少三次的演员和导演的 id 对 (actor_id, director_id) 示例 1&#xff1a; 解题思路 1.题目要求我们查询出合作过至少三次的演员和导演的 id 对&#xff0c;我们可以 group by 两次来解决这个问题。 2.首先我们按照 actor_id 进…

Pycharm debug程序,跳转至指定循环条件/循环次数

在断点出右键&#xff0c;然后设置条件 示例 for i in range(1,100):a i 1b i 2print(a, b, i) 注意&#xff1a; 1、你应该debug断点在循环后的位置而不是循环上的位置&#xff0c;然后你就可以设置你的条件进入到指定的循环上了 2、设置条件&#xff0c;要使用等于符号…

【C++ 进阶】第 1 章:[C 语言基础] C 语言概述与数据类型

目录 一、C 语言的概述 &#xff08;1&#xff09;计算机结构组成 &#xff08;2&#xff09;计算机系统组成 &#xff08;3&#xff09;ASCII 码 &#xff08;4&#xff09;计算机中的数制及其转换 &#xff08;5&#xff09;程序与指令 &#xff08;6&#xff09;语…

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像&#xff08;图生图&#xff0c;img2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、img2img生成流程1、输入图片编…

Mysql操作多表查询

多表查询是指在关系型数据库中&#xff0c;通过同时查询多个数据表来检索相关数据的操作。这种查询方式通常用于需要在多个数据表中搜索和比较数据的情况&#xff0c;以获取更完整和准确的结果。 在多表查询中&#xff0c;使用联接&#xff08;join&#xff09;操作将多个表连…

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…

day47-SSM分页

SSM分页&#xff08;增删改查登录注册&#xff09; applicationContext.xml中加入mybatis-config.xml路径 mybatis-config.xml Mapper接口 Service接口及其实现类 Mapper.xml page.jsp personDetail.jsp addPerson.jsp updatePerson.jsp login.jsp regist…

DMA传输原理与实现详解(超详细)

DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种计算机数据传输方式&#xff0c;允许外围设备直接访问系统内存&#xff0c;而无需CPU的干预。 文章目录 Part 1: DMA的工作原理配置阶段&#xff1a;数据传输阶段&#xff1a; Part 2: DMA数据…