📍 本文为嵌入式学习系列第二篇,基于 GitHub 开源项目:0voice/EmbeddedSoftwareLearn
💬 作者:0voice
👀 适合对象:嵌入式初学者、STM32学习者、想搞明白外设驱动开发的C语言学习者


一、驱动是什么?为什么你必须学会写驱动?

在嵌入式系统中,驱动是连接 MCU 与外部世界的桥梁
你写的所有控制代码(点灯、收发数据、读取温度传感器等),最终都会通过底层驱动转换为硬件动作。

✅ 换句话说,驱动 = 让硬件动起来的 C 语言代码。


二、常用外设驱动概览

外设功能常见场景
GPIO通用输入输出点灯、按键、继电器
UART串口通信串口调试、模块通信
I2C双线通信OLED、EEPROM、MPU6050
SPI高速通信Flash、ADC、屏幕
ADC模拟转数字电压/光强/温度检测
TIM定时/计数/PWM电机控制、呼吸灯

这些模块几乎构成了嵌入式开发的大部分控制面。
在这里插入图片描述


三、GPIO 点灯裸机驱动代码(STM32为例)

下面是一个最经典的 GPIO 控制示例:点亮 LED 灯。

🔧 初始化流程

#define RCC_APB2ENR   (*(volatile unsigned int *)0x40021018)
#define GPIOC_CRH     (*(volatile unsigned int *)0x40011004)
#define GPIOC_ODR     (*(volatile unsigned int *)0x4001100C)void gpio_init() {RCC_APB2ENR |= (1 << 4);        // 开启 GPIOC 时钟GPIOC_CRH &= ~(0xF << 20);      // 配置 PC13 为推挽输出GPIOC_CRH |= (0x1 << 20);       
}

💡 控制 LED 灯亮灭

void led_on() {GPIOC_ODR &= ~(1 << 13);  // 输出低电平
}void led_off() {GPIOC_ODR |= (1 << 13);   // 输出高电平
}

四、UART 串口通信核心代码

串口通信是调试、通信、日志输出的核心。

✍️ 简化裸机收发过程

void uart_send_char(char data) {while (!(USART1->SR & 0x80));  // 等待发送完成USART1->DR = data;
}char uart_recv_char() {while (!(USART1->SR & 0x20));  // 等待接收完成return USART1->DR;
}

串口需要配置波特率、停止位、奇偶校验、GPIO复用等。

✅ 初学建议配合串口助手查看收发数据。


五、I2C 与 SPI:该如何选择?

比较项SPII2C
通信线数42
通信速度相对较慢
通信方式全双工半双工
应用场景Flash、LCD、音频OLED、温湿度传感器

💡 I2C 驱动 OLED 屏幕是一个非常好的练手项目!


六、驱动开发常见 Bug 与调试建议

问题原因解决建议
外设无响应没开时钟检查 RCC 设置
串口乱码波特率不匹配确认 MCU 与串口助手波特率一致
SPI 全是 0xFF主从设置/时序错误检查主设备 CS 管脚、电平时序
按键无效引脚配置错误检查 GPIO 模式是否为输入

✅ 调试技巧:善用 printf + 示波器 + 逻辑分析仪


七、推荐练习项目(从入门到进阶)

项目涉及外设难度
LED 跑马灯GPIO
串口温度输出UART + 模拟传感器⭐⭐
OLED 屏显示I2C + 显存缓冲⭐⭐⭐
SPI 驱动 FlashSPI + 读写校验⭐⭐⭐⭐
电压采集与显示ADC + OLED⭐⭐⭐⭐

这些项目可作为你学习每个驱动模块的实战切入点。


八、学习建议与驱动能力成长路线

阶段技能
入门点灯、串口收发
提升独立驱动 OLED、EEPROM
实战多外设交互 + 数据逻辑
系统模块化驱动架构 + RTOS驱动层封装

📌 建议配合芯片手册与 CubeMX 使用,逐步掌握寄存器与中间抽象层之间的转换。


九、结语与项目推荐

驱动开发不仅是连接软件和硬件的桥梁,也是你从“写代码”走向“做系统”的第一步。

💼 本文基于项目:0voice/EmbeddedSoftwareLearn
📂 项目内容涵盖:C语言基础、外设驱动、RTOS调度、系统移植等,适合系统性学习
在这里插入图片描述

欢迎点赞 👍、收藏 ⭐、评论区留言 📮 交流,持续更新「嵌入式系列实战」内容!

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

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

相关文章

常用 Linux 命令和 shell 脚本语言整理

目录 一、Linux 命令大全 1、文件和目录操作 &#xff08;1&#xff09;ls 列出目录内容 &#xff08;2&#xff09;pwd 查看当前目录 &#xff08;3&#xff09;cd 切换目录 &#xff08;4&#xff09;mkdir 创建目录 &#xff08;5&#xff09;cp 复制文件或目录 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目录 autobackend.py 1.所需的库和模块 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…

【MySQL基础】MySQL索引全面解析:从原理到实践

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我们基本上已经把MySQL的基础知识都进行了学习&#xff0c;但是我们之前处理的数据都是十分少的&#xff0c;但是如果当我们的数据量很大…

第三十五章 I2S——音频传输接口

第三十五章 I2S——音频传输接口 目录 第三十五章 I2S——音频传输接口 1 I2S概述 1.1 简介 1.2 功能特点 1.3 工作原理 1.4 利用DMA通信的I2S 1.4.1 I2S配合DMA通信工作原理 1.4.2 配置要点 2 应用场景 2.1 消费类音频设备 2.2 专业音频设备 2.3 通信设备 2.4 汽车电子 2.5 嵌…

产品-Figma(英文版),图像的布尔类型图例说明

文章目录 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多个形状合并成一个新的完整形状&#xff0c;保留所有外部轮廓&#xff0c;内部不被切割。由于红色的长方形在外面的一层&#xff0c;所以切割后&#x…

Windows CMD命令分类大全

⚙️ ‌一、系统与磁盘管理‌ ‌系统信息‌ systeminfo&#xff1a;查看详细硬件及系统配置&#xff08;版本/内存/补丁&#xff09;211 winver&#xff1a;快速检查Windows版本11 msinfo32&#xff1a;图形化系统信息面板811‌磁盘工具‌ chkdsk /f&#xff1a;修复磁盘错误&…

【Dify系列】【Dify1.4.2 升级到Dify1.5.0】

1. 升级前准备工作 1.1 数据备份&#xff1a; 进入原安装包 docker 目录&#xff0c;备份“volumes”文件夹&#xff0c;此文件夹包含了 Dify 数据库数据&#xff1a; rootjoe:/usr/local/dify/docker/volumes# pwd /usr/local/dify/docker/volumesrootjoe:/usr/local/dify/…

DeepSeek网页版随机点名器

用DeepSeek帮我们生成了一个基于html5的随机点名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…

前后端分离实战2----后端

戳我抵达前端 项目描述&#xff1a;用Vscode创建Spring Bootmybatis项目&#xff0c;用maven进行管理。创建一个User表&#xff0c;对其内容进行表的基本操作&#xff08;增删改查&#xff09;&#xff0c;显示在前端。 项目地址&#xff1a;戳我一键下载项目 运行效果如下&…

深入 ARM-Linux 的系统调用世界

1、引言 本篇文章以 ARM 架构为例&#xff0c;进行讲解。需要读者有一定的 ARM 架构基础 在操作系统的世界中&#xff0c;系统调用&#xff08;System Call&#xff09;是用户空间与内核空间沟通的桥梁。用户态程序如 ls、cp 或你的 C 程序&#xff0c;无权直接操作硬件、访问文…

LabVIEW键盘鼠标监测控制

通过Input Device Control VIs&#xff0c;实现对键盘和鼠标活动的监测。通过AcquireInput Data VI 在循环中持续获取输入数据&#xff0c;InitializeKeyboard与InitializeMouse VIs 先获取设备ID 引用&#xff0c;用于循环内监测操作&#xff1b;运行时可输出按键信息&#xf…

Linux 系统管理:自动化运维与容器化部署

在现代 IT 基础设施中&#xff0c;自动化运维和容器化部署是提高系统管理效率和可维护性的关键。Linux 系统因其稳定性和灵活性而被广泛应用于服务器和数据中心。本文将深入探讨 Linux 系统管理中的自动化运维和容器化部署技术&#xff0c;帮助系统管理员实现高效运维和快速部署…

直播 APP 开发需要多少成本

直播行业的火爆催生了大量直播 APP 开发需求&#xff0c;而开发成本是开发者最关注的问题之一。其成本构成复杂&#xff0c;受功能需求、开发方式、技术难度等多种因素影响。​ 基础功能开发是成本的重要组成部分。用户注册登录、直播间创建与管理、视频播放、聊天互动等功能开…

Reactor操作符的共享与复用

在 Reactor 中&#xff0c;transform 和 transformDeferred 是两个用于代码复用和操作符链封装的高级操作符。它们允许你将一组操作符封装成一个函数&#xff0c;并在适当的时候应用到响应式流中。以下是它们的详细总结&#xff1a; 1. transform 操作符 作用&#xff1a;tran…

C#中的Converter详解

Converter是C#中一个非常有用的概念&#xff0c;主要用于类型转换。它通常以委托或接口的形式出现&#xff0c;允许开发者定义如何将一种类型转换为另一种类型。下面我将详细介绍Converter的概念、使用场景&#xff0c;并以布尔型转换为例展示具体应用。 Converter的基本概念 …

LabVIEW荧光微管图像模拟

利用LabVIEW平台&#xff0c;集成 PI 压电平台、Nikon 荧光显微镜及Andor sCMOS 相机等硬件&#xff0c;构建荧光微管滑行实验图像序列模拟系统。通过程序化模拟微管运动轨迹、荧光标记分布及显微成像过程&#xff0c;为生物医学领域微管跟踪算法测试、运动特性分析提供标准化仿…

CentOS下Nginx服务器搭建全攻略

Nginx 安装与配置完整指南 一、安装 Nginx 1.1 添加 Nginx 官方仓库 在 CentOS 系统中&#xff0c;默认仓库的 Nginx 版本可能较旧&#xff08;通常为 1.12 或更早版本&#xff09;&#xff0c;建议添加官方仓库来安装最新稳定版本&#xff08;目前为 1.25.x&#xff09;&am…

网络拓扑图绘制全流程:从架构解析到工具实战

在数据呈现与系统管理中&#xff0c;清晰展示设备间的逻辑关系至关重要。网络拓扑图正是这样一种有效的可视化工具。它通过节点设备和连接线路&#xff0c;直观呈现网络结构或项目流程中各元素的布局与交互关系&#xff0c;帮助理解系统运作、诊断问题并确保项目顺利进行。 1. …

Git 简介安装教程

&#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 目录 一、Git 的安装1.1 Git 的下载1.2 Git 的安装1.2.1 使用许可声明1.2.2 选择安装目录1.2.3 选择安装组件1.2.4 选择开始菜单文件夹1.2.5 选择 Git 默认编辑器1.2.6 决定初始化新项…

鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)

在上一小节我们已经完成了关于三层架构的搭建&#xff0c;接下来我们来实现在三层架构中的导入依赖&#xff0c;将他们相互联系起来。 第一步&#xff1a;在features产品定制层中&#xff0c;对其中所有的动态共享包导入依赖&#xff0c;示例features>my>oh-package.jso…