stm32 esp8266 ota系列文章:
stm32 esp8266 ota-快速搭建web服务器之docker安装openresty
stm32 esp8266 ota升级-tcp模拟http
stm32 esp8266 ota升级-hex合并-烧录-bin生成
stm32 esp8266 ota升级-qt bin文件处理工具
stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面方式
stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级
stm32 利用链表和定时器动态实现led等器件周期性控制
文章目录
本文主要介绍利用链表和定时器动态实现led等器件周期性控制,文章以led灯为例,周期性控制led闪烁。其他器件和控制行为可以自行扩展。
环境介绍
硬件
- stm32F103C8t6系列板子;
软件
app 程序
动态led周期控制程序
具体实现思路
单链表功能实现
说明:引入单链表主要是方便动态的删除和添加器件,达到动态目的。
请参考单链表的实现博文,感谢博主分享;
周期控制实现
结构体和枚举定义
初始化文件内的静态全局单链表指针
static SingleList_t* periodControlHeader;
初始化控制设备,尾插方式加入链表
开启定时器,周期性调用periodControlLoop函数(主要完成控制频率、运行时间检测和行为切换)
注:定时器怎么配置和使用,请参考 STM32配置TIM定时器计数 博文,感谢博主分享;
本文使用了tim1定时器,设置为了10ms触发一次中断。
periodControlLoop函数,主要完成控制频率、运行时间检测和行为切换。关键代码:
给器件设置控制频率和持续时间
控制函数定义
/**
* @brief periodControlSet
* @param(in) deviceName 设备名字
* @param(in) frequency 运行频率
* @param(in) duration 持续时间,如果是0,则一直运行;非0则按时间值运行;
* @param(in) isEnable 是否开启使能
* @retval bool
* @note
*/
bool periodControlSet(DeviceName_e deviceName, float frequency, uint32_t duration, bool isEnable){
......
p->periodControl.frequency = frequency;
p->periodControl.duration = duration;
p->periodControl.enableFlag= isEnable;
......
}
使用例子:控制led 蓝色灯,以4hz频率,一直闪烁,开启使能
periodControlSet(LEDB, 4, 0, true);
说明:这里测4HZ,是1s中变换4次,对于led来说,开是一次,关是一次,即完整的一次开关行为计2次。
测试
运行程序
在main函数中:
periodControlInit(); HAL_TIM_Base_Start_IT(&htim1); //这里开启了两个led periodControlInit(); HAL_TIM_Base_Start_IT(&htim1); //黄色1hz->2s亮1次 periodControlSet(LEDY, 1, 0, true); //蓝色4hz->1s亮2次 periodControlSet(LEDB, 4, 0, true); //红色10hz->1s亮5次; //periodControlSet(LEDR, 10, 0, true); 灯光闪烁影响拍摄,所以去的中红色灯
在tim1定时器中断中:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim1)
{
periodControlLoop();
}
}
运行现象
动图
总结
链表配合定时器,周期的调用periodControlLoop函数,完成频率控制、运行时间检测和行为切换,实现指定频率led等闪烁效果。
链表方便动态的删除和添加器件,达到动态目的。