14-4. 编程框架类定时器、串口、中断等的使用
编程框架类在我们的所有项目中程序均采用 STM32 标准外设库进行开发。标准库提供了对寄存器操作的封装代码可读性高、稳定性好适合初学者理解和二次开发。整个程序的编程框架大体遵循 “定时器中断 状态机” 的主从结构下面分别说明中断、定时器、串口的使用方式以及状态机的设计思路。一、定时器的使用定时器是系统的“心跳”基准。我们通常配置一个基础定时器如TIM2产生1ms的周期中断。在这个中断服务函数中主要完成以下工作按键扫描与去抖每1ms读取一次按键IO口状态通过计数器累加实现软件去抖并判断按键是否有效按下、长按或释放。系统标志位更新设置一些全局标志如“10ms到达”、“100ms到达”供主循环中不同任务使用。超时计数为串口接收、传感器等待等操作提供非阻塞延时。定时器中断保证了系统的时间确定性避免了主循环中使用死等延时造成的卡顿。二、中断的使用除了定时器中断项目中还会用到外部中断如按键边沿触发和串口中断。外部中断用于紧急响应例如手动模式下的物理按键直接触发模式切换。我们配置下降沿或上升沿触发在中断函数中只做最精简的处理如置位一个标志位具体逻辑放在主循环中执行防止中断阻塞过长。串口中断当蓝牙或WiFi模块接收到手机APP发来的指令时串口中断会逐字节接收数据。我们在中断服务函数中将数据存入接收缓冲区并在主循环中解析完整的指令帧。这样既保证不丢数据又避免中断内做复杂解析。三、串口的使用串口USART主要用于与HC‑05蓝牙模块、ESP8266 WiFi模块或机智云模块通信。我们使用标准库的USART_Init()配置波特率通常9600或115200、数据位8位、停止位1位、无校验。开启接收中断和发送完成中断采用环形队列或简单的数组缓存进行数据收发。主循环中定期检查缓冲区一旦收到完整命令如以换行符结尾就执行对应的动作如开关灯、读取传感器等。四、状态机编程框架整个程序的核心逻辑由一个有限状态机实现。状态机通常包含三个主要状态自动模式AUTO系统根据传感器阈值自动控制继电器、电机等执行器。主循环中持续读取温湿度、烟雾浓度等数据并与设定阈值比较自动触发动作。手动模式MANUAL用户通过按键或手机APP直接发送指令控制外设如LED、蜂鸣器、风扇等。此时不自动触发执行器。设置模式SETING用于修改阈值、校准传感器或配置网络参数。通过按键加减调整数值再次短按保存退出。状态之间的跳转由定时器中断中采集到的按键事件或串口收到的APP指令驱动。例如短按模式切换键状态机从AUTO→MANUAL→SET→AUTO循环在AUTO状态下收到APP发来的“切换模式”指令则切换到手动模式。这种“定时器中断 状态机”的编程框架具有结构清晰、实时性好、易于扩展的优点。同学们在阅读代码时可以从main.c中的while(1)主循环和定时器中断服务函数入手理清状态的跳转条件和各状态下执行的任务。所有代码均基于标准库编写注释较为详细可作为自己修改和理解的参考。如有特定模块的驱动配置疑问请结合模块代码及数据手册自行查阅我们无法提供一对一的编程指导敬请谅解。