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)主循环和定时器中断服务函数入手,理清状态的跳转条件和各状态下执行的任务。所有代码均基于标准库编写,注释较为详细,可作为自己修改和理解的参考。如有特定模块的驱动配置疑问,请结合模块代码及数据手册自行查阅,我们无法提供一对一的编程指导,敬请谅解。
更多推荐

所有评论(0)