一、项目目标:让外设真正“协作起来”
这个小项目要实现的功能非常明确:
- 读取温度传感器数据(ADC)
- 显示温度在 OLED 上(I2C)
- 温度超限时蜂鸣器报警(PWM/定时器)
- 通过按键调整报警阈值(GPIO 输入)
- 通过串口输出调试信息(UART)
- 后台定时刷新显示(定时中断 + DMA)
这一个项目,几乎覆盖了 STM32 的全部核心外设模块,是最适合系统学习的实践框架。
二、外设初始化思路
1. RCC 时钟系统
所有外设都依赖时钟。先开启 GPIO、USART、ADC、TIM、I2C 等模块的时钟。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_I2C1,ENABLE);
2. GPIO 配置
三、ADC 模块:采集温度数据
- 选择通道(如 ADC1_IN0)
- 配置采样时间
- 启动转换并读取结果
- ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);
- while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
- tempValue=ADC_GetConversionValue(ADC1);
可通过分压电路接 NTC 热敏电阻,将电压转换为温度值。
四、I2C 模块:驱动 OLED 显示
OLED 显示模块常用 SSD1306 芯片,通过 I2C 与 MCU 通信。
- 初始化 I2C(SCL/SDA)
- 发送初始化命令
- 周期刷新显示缓冲区
- I2C_Start();
- I2C_SendByte(0x78);// 设备地址
- I2C_SendByte(0x00);// 命令模式
- I2C_SendByte(0xAF);// 开启显示
- I2C_Stop();
在循环中刷新数据显示:
- 温度:26.5℃
- 阈值:30℃
- 状态:正常
五、PWM + 定时器:控制蜂鸣器报警
PWM 信号可由定时器输出,通过占空比控制蜂鸣器响度。
- 配置定时器周期、分频系数
- 配置 PWM 模式
- 当温度超出阈值时,开启 PWM 输出
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse=500;
- TIM_OC1Init(TIM3,&TIM_OCInitStructure);
六、UART 串口输出调试信息
在嵌入式开发中,UART 是最常用的调试工具。
我们可以定期输出温度、阈值、报警状态,用于监控系统状态。
- printf("Temp=%.2f, Th=%.2f, Status=%s\r\n",temp,threshold,status);
七、按键输入:阈值动态调整
按键检测需要消抖处理,推荐使用定时中断周期采样。
- 按下 “+”:阈值上调
- 按下 “-”:阈值下降
- if(KEY_UP==0)threshold+=1;
- if(KEY_DOWN==0)threshold-=1;
八、DMA + 定时中断:后台刷新机制
为了让系统持续工作但不占用主循环,可使用 DMA 结合定时中断实现后台任务:
- 定时器中断周期触发一次数据刷新
- DMA 自动搬运显示数据到 I2C 缓冲区
- 主循环只负责逻辑判断
九、系统主循环逻辑
综合以上外设,主循环的结构大致如下:
- while(1)
- {
- temp=Read_Temperature();
- if(temp>threshold)
- Buzzer_On();
- else
- Buzzer_Off();
- OLED_ShowTemperature(temp);
- UART_PrintStatus(temp,threshold);
- }
这一小段循环,几乎串起了 STM32 的所有关键模块:
ADC 采集 → 数据逻辑判断 → PWM 控制输出 → I2C 显示 → UART 调试。
十、扩展与总结
通过这个小项目,你会发现 STM32 的外设并不是孤立存在的,而是围绕数据流与控制流相互协作:
- 数据从ADC进入系统;
- 经由定时器与中断机制组织逻辑;
- 由I2C、UART、PWM将结果输出到外部世界。
理解这条链路,你就真正迈过了 STM32 的学习门槛。
结语
很多人学习 STM32 时陷在细节:一个寄存器、一段 HAL 库函数、一个外设例程。
但当你通过一个完整的系统去理解它们的协作关系,外设就不再是孤立的模块,而是系统的一部分。
从这个小项目开始,把“每个外设单独跑通”变成“让它们一起工作”,你就能真正读懂 STM32。
-
传感器
+关注
关注
2578文章
55821浏览量
795472 -
STM32
+关注
关注
2313文章
11206浏览量
375258 -
RCC
+关注
关注
0文章
96浏览量
28758
发布评论请先 登录
一个小项目看懂 STM32 全部外设
评论