嵌入式软件
未读volatilevolatile关键字作用
禁止编译器优化告知编译器该变量可能被“外部因素”修改(如硬件、中断、多线程等),每次访问必须直接读写内存,而非依赖寄存器缓存或优化掉“冗余”操作。
确保内存可见性强制程序按代码顺序执行对变量的读写操作,避免因编译器重排指令导致的意外行为。
volatile使用场景
直接访问硬件寄存器(某个外设等)
12345volatile uint32_t *status_reg = (volatile uint32_t*)0x40021000; while (*status_reg & 0x01) { // 必须每次从内存读取状态位 // 等待硬件完成操作 }
如果不适用volatile编译器的优化:
缓存到寄存器编译器发现 status_reg 的值在循环中没有被修改(代码中未显式修改),于是将 *status_reg 第一次读取的值缓存到寄存器中,后续循环直接复用寄存器值,不再从内存读取。
优化结果:生成的汇编代码可能如下:
1234567; 第一次读取 *status_reg 到寄存器 eax ...
嵌入式软件
未读背景在嵌入式图形界面开发中,STM32微控制器常用来驱动各类显示屏(如 TFT LCD、OLED),实现丰富的用户交互。随着用户体验要求提升,显示界面的刷新帧率成为评价系统性能的重要指标之一。特别是在使用LVGL这类高性能 GUI 库时,全屏或局部刷新数据量大,对数据搬运速度提出了更高的要求。
最简单的SPI屏幕驱动方式是:CPU逐个将像素将数据通过 SPI 总线写入屏幕。这种方式在低分辨率或静态界面下尚可满足需求,但在高分辨率、频繁刷新的场景下,CPU负载会迅速升高,导致帧率下降,界面卡顿,影响用户体验。
所以我们就需要在原有通讯协议(I2C/SPI)协议的DMA来帮助我们搬运数据
为什么使用DMA?不使用DMA:MCU在整个数据搬运过程中都需要亲自参与,CPU会被大量堵塞在像素数据的发送上,导致刷新期间其它任务处理变慢,严重影响系统的实时性和整体性能。
使用DMA:由于CPU和DMA是一个并行的关系,CPU发起DMA请求后,DMA硬件能批量、高速搬运数据到外设(SPI)。
在DMA传输期间,CPU可以专注于准备下一帧的像素数据,或处理其他任务。等DMA搬运完成后,CPU只需在中断中 ...
嵌入式软件
未读软件模拟I2C在通过软件模拟I2C时,我们是选定任意引脚作为I2C的SDA和SCL,这个时候需要配置GPIO使其既能输入又能输出,这,推挽输出和开漏输出都是可以的,以下将会对两者的配置进行详细介绍
开漏输出引脚配置这是最推荐的做法,也是I2C协议的要求将SDA和SCL引脚配置为上拉电阻(弱) + 开漏输出的模式,这样可以使主机只能输出低电平,避免了总线上一高一低造成的短路问题。
1.开漏输出:
保证IO只具备输出低电平的能力,完全避免电源短路的发生
2.上拉电阻:
通常使用外接4.7K上拉电阻,I2C通信的需要输出高电平的能力,由于开漏模式下不具备输出高电平的能力,需要外部加一个上拉电阻,使其具备输出高电平的能力
这样设计电路的好处:
1.避免电源短路,安全
2.避免推挽模式下的引脚频繁切换,同时具备输入和输出功能
3.这样的硬件设计,使开漏模式具备线与特性:任意设备输出低电平,总线就是低电平,所有设备高电平,总线才是高电平。利用这个特性执行多主机下的总线仲裁机制,始终同步
硬件原理开漏模式的特性是由于硬件上决定的STM32的手册上对开漏输出的描述:
开漏输出:
GPIO写入’ ...
LCD显示屏介绍什么是LCD?LCD(Liquid Crystal Display,液晶显示屏)是一种利用液晶材料的光电效应实现显示内容的平面显示设备。LCD广泛应用于嵌入式系统,如智能家居、工业控制、手持设备等。
LCD基本结构LCD主要由以下几部分组成:
液晶层:夹在两片玻璃基板之间,负责成像。
偏光片:用于控制光线的通过与偏振。
电极层:通过电信号控制液晶分子的排列。
驱动电路:实现信号传递,控制显示内容。
背光源:提供照明,使显示内容可见
LCD显示原理LCD的显示原理是通过控制液晶分子的排列方式,改变光线的透射与反射,从而实现不同的显示效果。常见的显示方式有:
静态驱动:每个像素单独控制,适用于小尺寸LCD。
动态驱动:通过扫描方式控制行列,适用于大尺寸LCD。
常见屏幕型号字符型LCD(Character LCD)
特点:只能显示固定字符(如字母、数字),部分支持自定义简易符号。
常见型号:1602(16列2行)、2004(20列4行)等。
接口:并口(HD44780)、部分带I2C/SPI扩展板。
用途:仪表、家电、简单菜单等。
段码屏(Segment ...
触摸屏介绍什么是触摸屏?触摸屏(Touch Panel)是一种能够感知用户手指或触控笔在屏幕表面的操作位置,并将这些触摸信息以坐标数据的形式反馈给主控设备(如MCU、单板计算机等)的输入设备。触摸屏广泛应用于手机、平板、工业控制、人机交互界面等场合。
触摸屏的基本结构触摸屏通常由以下几部分组成:
触摸感应层:通过电容、电阻、红外等方式感应位置变化。
基板(玻璃/塑料):为感应层提供机械支撑。
FPC柔性排线:连接触摸层与主板,传输信号。
触摸控制芯片:如CST816T、GT911等,负责扫描感应层、处理触摸信号、输出触摸坐标。
触摸屏本身只负责采集触摸信息,不负责显示内容。显示内容由LCD、OLED等显示屏负责。
触摸屏类型
电阻式触摸屏
通过两层导电薄膜压接判断坐标,受力即可响应。
优点:支持手指、手套、触控笔,成本低。
缺点:精度有限,寿命短,透光率低。
常见型号:XPT2046、ADS7846、TP4056(控制IC);用于1602、12864等老式LCD的电阻触摸层
电容式触摸屏(主流)
依靠人体导电特性,检测电极阵列的电容变化推算位置。
优点:高透光率,灵敏度 ...
DMA介绍什么是DMADMA,全称Direct Memory Access,即直接存储器访问。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作,实现并行的功能
我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,
CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?
因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B不经过CPU的处理。
DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题,有了DMA使CPU更专注于更加实用的操作、计算、控制等。
DMA传输方式DMA的作用就是实现数据的直接传输,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区 ...
嵌入式操作系统
未读遇到的问题只执行某个任务,其他任务不执行如果某个任务空跑,没有延时让出CPU的话,其他同等优先级和更低优先级的任务就不会执行,这是典型的 FreeRTOS任务饿死问题
嵌入式操作系统
未读手动移植非常麻烦,上网查
快速移植使用STM32CubeMX快速移植,下面主要讲需要注意的地方:
内核版本选择STM32CubeMX使用的接口并不是原生的FreeRTOS的接口,而是在此基础上进行封装的过后的通用的RTOS的API。具体区别如下:
特点
FreeRTOS原生接口
CMSIS-RTOS接口(V1/V2)
设计者
FreeRTOS作者
ARM公司
可移植性
只能用在FreeRTOS
只要有适配层,可换RTOS
API名称
xTaskCreate, vTaskDelay
osThreadNew, osDelay
文档参考
FreeRTOS官方文档
ARM CMSIS-RTOS文档
CubeMX生成
原生接口不生成适配层
CubeMX自动生成适配层代码
生态适配
多数FreeRTOS例程
适合中间件/跨平台通用库
在中间件中可以找到FREERTOS,但是此时有内核版本CMSIS_V1和CMSIS_V2
CMSIS_V1:大多数情况下V1就够用了
CMSIS_V2:V2比V1其实就是内核版本更高,功能更多了而已
TimeB ...
嵌入式操作系统
未读下面为最基础的用法,其余用法请:看文档学习
RTOS 基础知识 - FreeRTOS™
FreeRTOS介绍基本概念实时操作系统 (RTOS) 是一种体积小巧、确定性强的计算机操作系统。RTOS 通常用于需要在严格时间限制内对外部事件做出反应的嵌入式系统。
RTOS 通常比通用操作系统体积更小、重量更轻,因此 RTOS 非常适用于 内存、计算和功率受限的设备
裸机开发与操作系统裸机开发:一般由一个main函数中的while死循环和各种中断服务程序组成,平时CPU执行while循环中的代码,出现其他事件时,跳转到中断服务程序进行处理,没有多任务、线程的概念。
操作系统(FreeRTOS等):引入操作系统后,程序执行时可以把一个应用程序分割为多个任务,每个任务完成一部分工作,并且每个任务都可以写成死循环。操作系统根据任务的优先级,通过调度器在不同任务见快速切换, 使所有任务看起来像是同时在执行。这就是我们的分时复用
内核内核是操作系统中最底层、最基础的部分
它负责管理硬件资源(比如CPU、内存、外设)和提供系统服务(比如多任务调度、内存分配、进程通信等)。所有应用程序都需要通过内核才能访问 ...
CMSIS什么是CMSISCMSIS全称是 Cortex Microcontroller Software Interface Standard,由ARM公司推出,是专门为ARM Cortex-M、Cortex-A、Cortex-R 微控制器系列设计的一套软件接口标准。
CMSIS 是 ARM Cortex 系列 MCU 软件开发的标准基石,让软件更易移植、更高效、更易用。
我们使用的各种MCU:STM32、GD32、NXP等 Cortex-M 芯片,实际工程中总会用到 CMSIS 的头文件、API 或库。
核心作用
标准化底层驱动和外设访问接口让不同芯片厂家(ST、NXP、GD、兆易创新等)的底层驱动代码更加统一,便于移植和复用。
提供统一的外设寄存器定义和访问方式通过结构体/宏定义等方式描述 Cortex-M 内核和外设寄存器,让开发者用标准方式操作硬件,无需查找手册每个寄存器地址。
支持RTOS和DSP库接口标准化包含CMSIS-RTOS(RTOS抽象标准)、CMSIS-DSP(数字信号处理库)、CMSIS-NN(神经网络库)等。
主要内容
CMSIS-CoreCor ...








