RTT设备驱动框架学习(UART)

在serial.h中

struct rt_serial_device
{struct rt_device parent;const struct rt_uart_ops *ops;struct serial_configure config;void *serial_rx;void *serial_tx;struct rt_spinlock spinlock;struct rt_device_notify rx_notify;
}
typedef struct rt_serial_device rt_serial_t;
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);rt_ssize_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
};
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 bit_order               :1;rt_uint32_t invert                  :1;rt_uint32_t bufsz                   :16;rt_uint32_t flowcontrol             :1;rt_uint32_t reserved                :5;
};

在drv_usart.h中

struct stm32_uart
{UART_HandleTypeDef handle;struct stm32_uart_config *config;rt_uint32_t DR_mask;rt_uint16_t uart_dma_flag;struct rt_serial_device serial;
};
struct stm32_uart_config
{const char *name;USART_TypeDef *Instance;IRQn_Type irq_type;struct dma_config *dma_rx;struct dma_config *dma_tx;
}

在drv_usart.c中要实现串口驱动框架层定义的接口

static const struct rt_uart_ops stm32_uart_ops =
{.configure = stm32_configure,.control = stm32_control,.putc = stm32_putc,.getc = stm32_getc,.dma_transmit = stm32_dma_transmit
};

然后在初始化函数里去注册设备驱动程序

int rt_hw_usart_init(void)
{struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;rt_err_t result = 0;stm32_uart_get_dma_config();for(rt_size_t i=0; i<sizeof(uart_obj)/sizeof(struct stm32_uart); i++){/* init UART object */uart_obj[i].config = &uart_config[i];uart_obj[i].serial.ops    = &stm32_uart_ops;uart_obj[i].serial.config = config;/* register UART device */result = rt_hw_serial_register(&uart_obj[i].serialm uart_obj[i].config->name,  RT_DEVICE_FLAG_RDWR| RT_DEVICE_FLAG_INT_RX| RT_DEVICE_FLAG_INT_TX| uart_obj[i].uart_dma_flag, NULL);RT_ASSERT(result == RT_EOK);}return result;
}
static struct stm32_uart uart_objt[sizeof(uart_config)/sizeof(uart_config[0])] = {0};
static struct stm32_uart_config uart_config[] =
{
#ifdef BSP_USING_UART1UART1_CONFIG,
#endif
#ifdef BSP_USING_UART2UART2_CONFIG,
#endif
#ifdef BSP_USING_UART3UART3_CONFIG,
#endif
#ifdef BSP_USING_UART4UART4_CONFIG,
#endif
#ifdef BSP_USING_UART5UART5_CONFIG,
#endif
#ifdef BSP_USING_UART6UART6_CONFIG,
#endif
#ifdef BSP_USING_UART7UART7_CONFIG,
#endif
#ifdef BSP_USING_UART8UART8_CONFIG,
#endif
#ifdef BSP_USING_LPUART1LPUART1_CONFIG,
#endif
};
#ifndef LPUART1_CONFIG
#define LPUART1_CONFIG                                              \{                                                               \.name = "lpuart1",                                          \.Instance = LPUART1,                                        \.irq_type = LPUART1_IRQn,                                   \}
#endif /* LPUART1_CONFIG */

在serial.c中

rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,const char              *name,rt_uint32_t              flag,void                    *data)
{rt_err_t ret;struct rt_device *device;RT_ASSERT(serial != RT_NULL);rt_spin_lock_init(&(serial->spinlock));device = &(serial->parent);device->type        = RT_Device_Class_Char;device->rx_indicate = RT_NULL;device->tx_complete = RT_NULL;#ifdef RT_USING_DEVICE_OPSdevice->ops         = &serial_ops;
#elsedevice->init        = rt_serial_init;device->open        = rt_serial_open;device->close       = rt_serial_close;device->read        = rt_serial_read;device->write       = rt_serial_write;device->control     = rt_serial_control;
#endifdevice->user_data   = data;/* register a character device */ret = rt_device_register(device, name, flag);#ifdef RT_USING_POSIX_STDIO/* set fops */device->fops        = &_serial_fops;
#endifreturn ret;
}

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

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

相关文章

C语言 分支控制语句之 if

然后 我们来说 流程控制语句之 if 选择控制结构 是通过 分支语句来实现的 其中 包括 单分支选择语句通过 (if) 来实现 双分支语句通过 (if) 和 (else) 实现 多分支语句通过 (if) (else if) (else) 实现 对于单分支来讲 它控制的语句就是 要嘛做 要嘛不做 好比如 放假了 你是…

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1&#xff1a;不是所有的token都是必须的 论文地址&#xff1a;https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等&#xff1a;token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B&#xff0c;每1B token保存一个che…

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程 今天为大家带来的是《夜鸦》这款游戏&#xff0c;游戏背景是基于13世纪欧洲背景的MMORPG游戏&#xff0c;这款游戏以其沉浸式的游戏体验和流畅的打斗为特色。玩家可以选择战士、剑士、猎人或女巫等角色&#xff0c;体验…

AQS(AbstractQueuedSynchronizer)队列同步器源码解读

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. AOS、AQS、AQLS的区别 3. AQS的底层原理 3.1. 核心思想 3.2. 数…

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求&#xff0c;很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是&#xff0c;不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%&#xff0c;在美联储降息导致收益率开始下降之前&#xff0c;这仍…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的&#xff0c;绝不多废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux创始人Linus的名言&#xff1a;Talk is cheap&#xff0c;show me the code ! &#xff0c;博主技术博文会精心给出能说明问题的范例代码&#xff01;…

JMeter--监听器--聚合报告

聚合报告&#xff08;Aggregate Report&#xff09; 可以查看事务或者取样器在某个时间范围内执行的汇总结果 右键 >>> 添加 >>> 监听器 >>> 聚合报告&#xff08;Aggregate Report&#xff09; Label 样本平均值中位数90% 百分位95% 百分位99% …

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

35K的鸿蒙音视频开发岗位面经分享~

一个月前&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面…

lazarus-ide简介

Lazarus是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使用Free Pascal编译器的Pascal语言设计。它支持快速应用开发&#xff08;RAD&#xff09;&#xff0c;允许开发者创建跨平台的图形用户界面&#xff08;GUI&#xff09;应用程序。以下是关于Lazarus的来…

面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

文章目录 门面模式代理模式中介模式 之所以把这几个模式放到一起写&#xff0c;是因为它们的界限比较模糊&#xff0c;结构上没有明显的差别&#xff0c;差别只是语义上。 这几种模式在结构上都类似&#xff1a; 代理将原本A–>C的直接调用变成&#xff1a; A–>B–>…

负采样重要吗?它的理论与应用综述

Does Negative Sampling Matter? A Review with Insights into its Theory and Applications 负采样重要吗&#xff1f;它的理论与应用综述 Does Negative Sampling Matter? A Review with Insights into its Theory and Applications Zhen Yang, Ming Ding, Tinglin Huang,…

工作与生活的平衡术:顶尖专家的十大建议

在快速变化的现代社会中&#xff0c;维持工作与生活的平衡是许多人的追求。以下是顶尖专家根据心理学、管理学和自身经验总结出的十大建议&#xff0c;帮助您找到工作与生活之间的平衡点。 1. 设定清晰的界限 现代工作环境常常要求我们随时在线&#xff0c;但顶尖专家建议&…

Deepin中安装Golang1.22

为支持一下国产Deepin系统,出此文助新用户快速切换到国产系统的大家庭中。 go语言虽然不漂亮,但很值得用,因为它搭环境省事,编码难度中等,部署快捷省事,值得拿来用一用。 1.打开Linux的浏览器进入网址All releases - The Go Programming Language下载“go1.22.2.linux-a…

Android组件化、模块化、插件化

Android 组件化、模块化、插件化区别详解 - 掘金 组件化&#xff1a; 组件化就是基于可重用为目的的&#xff0c;将一个大的软件系统按照分离关注点的形式&#xff0c;拆分多个独立的组件&#xff0c;减少耦合。 就是“基础库”或者“基础组件"&#xff0c;意思是把代码重…

基于python实现web漏洞挖掘技术的研究(django)

基于python实现web漏洞挖掘技术的研究(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;网络爬虫&#xff0c;SQL注入&#xff0c;XSS漏洞工具&#xff1a;pycharm、Navicat、Maven 系统的实现与漏洞挖掘 系统的首页面 此次的系统首页面是登录的页…

BootstrapAdmin Net7:基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录

BootstrapAdmin Net7&#xff1a;基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录 摘要 随着企业信息化建设的不断深入&#xff0c;后台管理系统在企业运营中扮演着越来越重要的角色。本文介绍了一款基于RBAC&#xff08;Role-Based Access Control&#xff09;的…

std::tuple介绍和使用

基本概念 std::tuple 是 C11 中引入的一个标准库类型&#xff0c;它代表了一个固定大小的不同类型值的集合。元组可以被看作是 std::pair 的泛化形式&#xff0c;std::pair 只能保存两个元素&#xff0c;而 std::tuple 可以保存任意数量的元素。 从概念上讲&#xff0c;它们类…

291个地级市资源错配指数、劳动和资本相对扭曲指数(2006-2021年)

01、数据介绍 资源错配指数&#xff08;Misallocation Index&#xff09;是一个用于衡量资源配置效率的指标&#xff0c;它衡量的是生产要素的配置是否合理&#xff0c;是否达到了最优的状态。资源错配指数越高&#xff0c;资源的利用效率越低。资源错配指数主要用于衡量各种生…

PWM波型-脉冲宽度调制

一、什么是PWM信号 PWM&#xff0c;英文全称Pulse Width Modulation&#xff0c;是脉冲宽度调制的缩写&#xff1b;简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用于测量&#xff0c;通信&#xff0c;功率控制与变换等…