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

文章介绍了如何使用STM32和ESP8266进行OTA升级,包括通过Docker安装OpenResty搭建Web服务器,TCP模拟HTTP,以及MQTT服务器的自建。同时,文章详细阐述了利用链表和定时器动态实现LED等器件的周期性控制,如LED灯的闪烁,并提供了实现思路、结构体定义和控制函数的示例代码。
摘要由CSDN通过智能技术生成

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

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

STM32菜单链表程序是一种用于嵌入式系统的程序设计结构。它利用链表数据结构来管理不同的菜单选项,并提供用户界面以方便用户进行选择和操作。 该程序的主要目的是实现一个可扩展的菜单系统,用户可以通过按键或触摸屏等输入设备来浏览不同的菜单选项,并选择相应的操作或子菜单。 在STM32菜单链表程序中,每个菜单选项都被定义为一个菜单节点,节点中包含菜单的名称、标识符、父菜单节点、子菜单节点以及操作函数等信息。这些节点之间通过链表的方式连接起来,形成一个菜单链表。 程序的运行流程如下:首先,程序初始化时会构建整个菜单链表,将所有的菜单选项按照一定的顺序连接起来。然后,程序会进入一个主循环中,在主循环中通过读取用户输入来判断用户的操作,并根据用户选择的菜单节点进行相应的操作。 用户输入的方式可以根据具体的应用场景进行设定,比如可以通过外部按键、触摸屏、串口或者无线通信等方式实现。程序会根据用户的操作来判断下一步应该显示哪个菜单节点,并调用相应的操作函数来执行相应的操作。 通过这种方式,STM32菜单链表程序可以灵活地管理和扩展菜单选项,方便用户进行各种操作和功能的选择。同时,菜单链表实现也使得程序的结构清晰、易于维护和扩展。 总的来说,STM32菜单链表程序是一种基于链表数据结构的嵌入式系统程序设计结构,它能够提供灵活的菜单系统,方便用户进行选择和操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心之雅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值