stm32 利用链表和定时器动态实现led等器件周期性控制

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闪烁。其他器件和控制行为可以自行扩展。

环境介绍

硬件

  1. stm32F103C8t6系列板子;

软件

app 程序

动态led周期控制程序

具体实现思路

单链表功能实现

说明:引入单链表主要是方便动态的删除和添加器件,达到动态目的。

请参考单链表的实现博文,感谢博主分享;

周期控制实现

结构体和枚举定义

image-20230112152221100

初始化文件内的静态全局单链表指针
static SingleList_t* periodControlHeader;
初始化控制设备,尾插方式加入链表

image-20230112155124187

开启定时器,周期性调用periodControlLoop函数(主要完成控制频率、运行时间检测和行为切换)

注:定时器怎么配置和使用,请参考 STM32配置TIM定时器计数 博文,感谢博主分享;

本文使用了tim1定时器,设置为了10ms触发一次中断。

periodControlLoop函数,主要完成控制频率、运行时间检测和行为切换。关键代码:

image-20230112153344481

给器件设置控制频率和持续时间

控制函数定义

/**
  * @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等闪烁效果。

链表方便动态的删除和添加器件,达到动态目的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之雅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值