1.stm32常用外设
first :GPIO 控制高低电平 读取引脚的电平/电压
secend : 通信接口


2.volatile

动用外部神秘力量
没关系,我用更简单的方式来解释!
什么是 volatile?
想象你有一个**记事本**,上面记着家里灯的开关状态(0表示关,1表示开)。
### 没有volatile的情况(被优化了) int light_on = 0; // 灯关着
// 你写了个程序检查灯是否开了 while (light_on == 0) { // 等待开灯… } ```
**问题:** – 编译器看到 `light_on` 在循环里没被修改过,觉得你太傻了 – 自作聪明地把代码改成了: if (light_on == 0) { while (1) { } // 永远循环!再也不检查了 } ``` – 结果:你去开灯,程序却永远不知道灯已经开了!
### 有volatile的情况(告诉编译器别自作聪明) ```c volatile int light_on = 0; // 告诉编译器:这变量随时可能变化
while (light_on == 0) { // 每次循环都重新检查light_on的值 } ```
## 生活中的比喻
### 场景:等快递 **没有volatile:** – 你问老婆:"快递到了吗?" – 老婆看了一眼说:"没到" – 然后你就坐在那里,再也没问过(以为不会变化) – 结果快递到了你也不知道
**有volatile:** – 你不停地问:"到了吗?到了吗?" – 每次都会重新去看快递状态
## 三个最常用的场景
### 1. 硬件按钮检测 volatile int button_pressed = 0;
// 当按钮被按下(中断里执行) void on_button_press() { button_pressed = 1; // 标记按钮被按了 }
int main() { while (1) { if (button_pressed) { printf("按钮被按下了!\\n"); button_pressed = 0; } } } ```
### 2. 传感器数据读取 ```c // 温度传感器(硬件自动更新数据) volatile int temperature = 25;
void check_temperature() { // 每次都去读真实温度,不用缓存的值 if (temperature > 30) { printf("太热了!\\n"); } } ```
### 3. 多任务共享数据 ```c volatile int message_received = 0;
// 任务1:发送消息 void task1() { send_message(); message_received = 1; // 标记消息已发送 }
// 任务2:检查消息 void task2() { if (message_received) { process_message(); message_received = 0; } } ```
## 简单记法
**用volatile就告诉编译器:** – "这个变量可能会被外部改变" – "不要自作主张帮我优化" – "每次都去内存里读真实的值"
**不用纠结太多**,记住: – 如果变量会被**中断**修改 → 加volatile – 如果变量对应**硬件寄存器** → 加volatile – 如果变量被**多个任务**共享 → 可能需要volatile
简单理解就是:**当变量的值可能在意想不到的时候被改变,就用volatile!**
应用
常见的延时函数
错误写法
void delay(int count) {
while (count–) {
// 空循环
}
}
// 调用
delay(1000000); // 想延时一会儿
目录
1.stm32常用外设
first :GPIO 控制高低电平 读取引脚的电平/电压
secend : 通信接口
2.volatile
应用
常见的延时函数
问题: 编译器看到 count– 啥也没干,可能直接把这个循环优化没了!

我看了一下 关键在于 while(count–){ 这里面是空的 }
建议使用






