当前位置: 首页 > news >正文

(四)Proteus仿真STM32单片机使用定时器控制LED

(四)Protues仿真STM32单片机使用定时器控制LED – ARMFUN

定时器在单片机中具有重要的作用,它可以提供精确的时间控制和事件触发功能。相比之下,使用延时函数(delay function)来实现时间控制存在以下一些坏处:

  1. 阻塞程序执行:使用延时函数会导致程序在延时期间无法执行其他任务,因为延时函数通常是通过循环等待一段时间来实现的。这会浪费处理器的计算资源,并且可能导致程序响应变慢或失去实时性。
  2. 不精确的时间控制:延时函数的延时时间通常是通过估算或试错来确定的,而不是精确的时间控制。这意味着延时函数的实际延时时间可能会受到许多因素的影响,如处理器速度、其他任务的执行等。这样就无法保证在不同的环境下延时时间的准确性和一致性。
  3. 无法处理并发事件:延时函数只能提供固定的延时时间,无法根据实际情况处理并发事件。例如,在需要同时处理多个事件或任务的情况下,延时函数无法灵活地调整延时时间以适应不同的事件触发。

相比之下,定时器可以解决上述问题,并提供更灵活和精确的时间控制。定时器可以设置特定的时间间隔,并在达到指定时间间隔时触发相应的事件或任务。它可以在后台运行,不会阻塞程序的执行,并且可以处理并发事件。定时器还可以提供更高的精度和稳定性,以满足实时性要求。

因此,使用定时器而不是延时函数可以提供更好的时间控制和任务调度能力,提高程序的效率和可靠性。

再上一篇文章中,我们使用HAL_Delay()函数实现延时切换灯的状态,是非常糟糕的代码设计模式,在CubeMX生成的代码中,默认已经启动了系统定时器,定时中断1毫秒。我们只需要重写定时器中断回调函数即可。下面的代码重新实现了led灯的控制,由于使用了定时器计时模式,不会造成主循环CPU空转不能处理其它任务的问题了。

在main.c文件中增加一个变量led_delay和 HAL_IncTick函数如下,可以在keil项目中搜索这个函数,这样函数原来定义的地方有__weak前缀,代表函数可以重写,HAL_Delay()用到了uwTick,所以重新时保留原来的代码,增加led_delay++;

int led_delay=0;
void HAL_IncTick(void)
{uwTick += uwTickFreq;led_delay++;
}

while循环中改成如下代码:

while(1)
{if(led_delay==500){HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);}else if(led_delay==1000){HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);led_delay=0;}
}

这里注意主循环内没有耗时的任务,所以每毫秒内会循环多次,所以在led_delay==500时会多次调用HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);虽然目前看起来正常,但最好避免这种情况,修改后的代码如下

while(1)
{static char led_on_flag=0;if(led_delay>=500){if(led_on_flag==0){       HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET); led_on_flag=1;        }else{HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);led_on_flag=0;}led_delay=0;}
}
http://www.lryc.cn/news/457673.html

相关文章:

  • Python快速编程小案例——打印蚂蚁森林植树证书
  • Cherno游戏引擎笔记(61~72)
  • FWA(固定无线接入),CPE(客户终端设备)简介
  • 使用IDEA启动项目build时,解决Java编译时内存溢出问题:OutOfMemoryError深入解析
  • Kafka如何实现高可用
  • 高级java每日一道面试题-2024年10月1日-服务器篇[Redis篇]-Redis数据结构压缩列表和跳跃表的区别?
  • 使用 ElLoading 组件来实现加载(loading)功能
  • Win10 IDEA连接虚拟机中的Hadoop(HDFS)
  • tp8自带的文件缓存如何配置
  • 【环境搭建】MAC M1安装ElasticSearch
  • [linux 驱动]网络设备驱动详解
  • 【ShuQiHere】 重新定义搜索:本体搜索引擎的时代
  • Ruby脚本:自动化网页图像下载的实践案例
  • ArcGIS中分区统计栅格值前需要进行投影吗(在投影坐标系下进行吗),为什么?
  • 怎么将视频原声提出来?视频原声提取,让创作更自由
  • 在IDEA里用XDebug调试PHP,断点....
  • 如何设置 GitLab 密码过期时间?
  • 重学SpringBoot3-集成Redis(十二)之点赞功能实现
  • Django-rest-framework(DRF)怎么实现Excel文件导出
  • 零基础MySQL数据库入门一天学完
  • 【CSS Tricks】鼠标滚轮驱动css动画播放,使用js还是css?
  • 《Electron 基础知识》设置 Vue 中引用的文件路径别名
  • day 20 二叉树 part05
  • 003 Springboot操作RabbitMQ
  • 小猿口算脚本
  • 从 Reno TCP 到 Scalable TCP,HighSpeed TCP
  • 使用Java调用OpenAI API并解析响应:详细教程
  • 深入学习并发编程中的 synchronized
  • AMD R9-9950X相比较I9-14900K有哪些提升
  • 计算机毕业设计 基于Python的个性化旅游线路推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档