STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。


一、模块化 UART 的设计目标

我们开发 UART 模块,不只是“能收发数据”那么简单,更希望实现以下目标:

  • ✅ 代码结构清晰、功能解耦、职责分明

  • ✅ 支持中断或 DMA,提高效率

  • ✅ 配合 RingBuffer 实现非阻塞收发

  • ✅ 封装接口,隐藏底层硬件差异

  • ✅ 可被其他项目直接复用,无需改动


二、模块目录结构与文件命名

推荐将 UART 模块单独划分为 src/drivers/uart.cinc/uart.h,并通过 RingBuffer 模块(middleware/ring_buffer.c)协作完成非阻塞收发:

project_root/
├── inc/
│   └── uart.h
├── src/
│   └── drivers/
│       └── uart.c
├── middleware/
│   └── ring_buffer.c/.h

三、uart.h:UART 模块接口定义

#ifndef UART_H
#define UART_H#include <stdint.h>
#include <stddef.h>void uart_init(void);
void uart_send_blocking(uint8_t byte);
int  uart_read_byte(uint8_t *data);  // 非阻塞读
void uart_irq_handler(void);         // 中断入口#endif
  • uart_init():初始化串口

  • uart_send_blocking():阻塞发送一个字节

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

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

相关文章

【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录 一、词表的构造问题 二、bpe(byte pair encoding) 压缩算法 算法步骤 示例&#xff1a; 步骤 1&#xff1a;初始化符号表和频率统计 步骤 2&#xff1a;统计相邻符号对的频率 步骤 3&#xff1a;合并最高频的符号对 步骤 4&#xff1a;重复合并直至终止条件 三、bpe在NLP中…

TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式&#xff0c;用结构体寄存器的方式编程 文章提供完整工程下载、测试效果图 我的单片机平台是这个&#xff1a; LIN通信引脚&#xff1a; LIN通信PIE中断&#xff1a; 这个 PIE Vector Table 表在手册111页&#xff1a; 这是提到LINa的PI…

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…

matlab求和∑函数方程编程?

matlab求和∑函数方程编程&#xff1f; 一 题目&#xff1a;求下列函数方程式的和 二&#xff1a;代码如下&#xff1a; >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…

electron桌面端开发-打开指定软件和文件

electron桌面端开发 现在越来越多的软件开发已经趋向于简单化&#xff0c;桌面端开发已经不在依赖之前的java、c等主流技术&#xff0c;目前基于node的开发越来越广泛。功能点也越来越多元化。 文章目录 electron桌面端开发前言一、打开文件的方式&#xff1f;二、exec使用步骤…

ShenNiusModularity项目源码学习(17:ShenNius.Admin.Mvc项目分析-2)

ShenNiusModularity项目的后台管理主页面如下图所示&#xff0c;该页面为ShenNius.Admin.Mvc项目的Views\Home\Index.cshtml&#xff0c;使用的是layuimini后台模板&#xff08;参考文献2&#xff09;&#xff0c;在layuimini的GitHub主页中提供有不同样式的页面模版链接&#…

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代&#xff0c;前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目&#xff0c;展示两者如何通过 RESTful API 实现无缝通信&#xff0c;让读者了解从环境搭建、代码实…

portainer.io篇

Portainer‌是一个轻量级的容器管理工具&#xff0c;支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多种平台。它提供了一个直观的Web界面&#xff0c;使用户能够轻松地管理和监控容器&#xff0c;包括创建、启动、停止、删除容器&#xff0c;以及查看容器的日志和配置信…

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句&#xff0c;用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续的操作都将基于该镜像进行。例如&#xff0c;FROM python:3.9-slim-buster 表示使用 Pyt…

Android Studio开发知识:从基础到进阶

引言 Android开发作为移动应用开发的主流方向之一&#xff0c;曾吸引了无数开发者投身其中。然而&#xff0c;随着市场饱和和技术迭代&#xff0c;当前的Android开发就业形势并不乐观&#xff0c;竞争日益激烈。尽管如此&#xff0c;掌握扎实的开发技能仍然是脱颖而出的关键。本…

大表查询的优化方案

‌单表优化‌&#xff1a; ‌字段选择‌&#xff1a;尽量使用TINYINT、SMALLINT、MEDIUMINT作为整数类型&#xff0c;而非INT&#xff1b;如果字段值非负&#xff0c;可以使用UNSIGNED。对于字符串字段&#xff0c;使用枚举或整数代替字符串类型&#xff0c;使用TIMESTAMP而非D…

常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ

常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点&#xff1a; Redis Pub/Sub 适合简单实时消息&#xff0c;但不持久化&#xff0c;消息可能丢失。Redis Stream 提供持久化&#xff0c;适合需要消息历史的场景&#xff0c;但…

DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额

本系列目录 专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读400次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你…

库magnet使用指南

Magnet 多线程控制库使用指南 目录 库功能概述环境配置核心类与接口基础使用示例代码生成工具高级功能与改进建议完整示例代码常见问题解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 库功能概述 Magnet 库提供以下核心功能&#xff1a; 多线程…

SpringCloud-快速通关(三)

SpringCloud-快速通关(一) SpringCloud-快速通关(二) SpringCloud-快速通关(三) SpringCloud-快速通关(三) 七、Seata - 分布式事务7.1、环境搭建7.1.1、简介7.1.2、环境搭建7.1.3、seata-server7.1.4、微服务配置7.1.5、测试7.2、事务模式7.2.1、AT模式7.2.2、XA模式…

STM32 TDS+温度补偿

#define POLAR_CONSTANT (513385) /* 电导池常数&#xff0c;可通过与标准TDS测量仪对比计算反推 */ #define TDS_COEFFICIENT (55U) /* TDS 0.55 * 电子传导率*/void TDS_Value_Conversion() {u32 ad0;u8 i;float compensationCoefficient;float compens…

数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水

原创 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文将使用 Matplotlib 及 Seaborn 进行数据可视化。探索如何清理数据、计算月度用水量并生成有价值的统计图表&#xff0c;以便更好地理解居民的用水情况。 数据处理与清理 读取 Excel 文件 首先&#xff0c;我们使用 pan…

离线环境下docker启动springboot项目

Docker linux 离线部署springboot 搭建dcoker环境 1. 首先在有网络的机器上下载Docker的离线安装包&#xff1a; - 访问 https://download.docker.com/linux/static/stable/x86_64/ - 下载对应版本的 docker-<version>.tgz 文件 2. 将下载的安装包传输到目标Linux机器上…

分布式专题-Redis Cluster集群运维与核心原理剖析

一. 哨兵集群与Redis Cluster 架构异同&#xff1a; redis单机内存不会超过10g&#xff0c;如果太大的话bgsave命令的话对单节点压力过大。 节点多了&#xff0c;之间的通信也会非常缓慢。 redis集群模式下对从节点是没有读取操作的&#xff0c;只在主节点进行读取操作。 哨…

使用 Node.js、Express 和 React 构建强大的 API

了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始&#xff0c;到集成 React 前端&#xff0c;并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者&#xff0c;这篇文章都适合你。 今天&#…