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

蓝桥杯—SysTick中断精准定时实现闪烁灯

在嵌入式系统中,SysTick_Handler 是一个中断服务例程(Interrupt Service Routine, ISR),用于处理 SysTick 定时器的中断。SysTick 定时器通常用于提供一个周期性的定时中断,可以用来实现延时或者周期性任务。

SysTick_Handler中断的周期不一定是固定的1毫秒,它的周期取决于你对系统定时器配置的时钟源和计数器 reload 值。系统定时器通常使用微控制器的主时钟(Core Clock)作为时钟源,并且可以设置为任意时钟周期的N倍来决定中断频率。

但在蓝桥杯中,通常我们的时钟树配置都是一样的,时钟主频为80MHz,此时的SysTick_Handler 为每1ms触发一次中断。

利用这个特性,我们可以实现精准延时。

我们可以在stm32g4xx_it.c的最后找到SysTick_Handler 这个函数。在其中加入一些标志位可实现不少定时的功能。

注意:在中断中不能执行耗时过长的程序,中断通常用于处理需要立即响应的事件,如外部信号变化、定时器到期等。如果中断处理时间过长,会延迟对后续中断事件的响应,从而影响系统的实时性能。因此,中断处理程序应该设计得尽可能短小精悍,只执行必要的、时间关键的操作,如状态保存、事件标记、简单计算等。如果有需要执行耗时较长的程序,应该在中断处理程序中设置一个标志位,然后放在主函数的while(1)里执行。

SysTick_Handler中的程序

u8 led_cnt =0;
void SysTick_Handler(void)
{led_cnt++;if(led_cnt>100){//用了简单的逻辑,可以改进led_flag=1;}if(led_cnt>200){led_flag=0;led_cnt=0;}HAL_IncTick();
}

使LED1以0.1s闪烁。

LED.c

#include "led.h"_Bool led_flag=0;
void LED_Control(u8 led_ctrl)
{//先熄灭所有LED灯HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);		//让PC8~PC15输出高电平,熄灭LEDHAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	//打开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//关闭锁存器//根据led_ctrl来点亮对应的LEDHAL_GPIO_WritePin(GPIOC,led_ctrl<<8,GPIO_PIN_RESET);//根据led_ctrl输出低电平,点亮LEDHAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	//打开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//关闭锁存器
}
u8 led_ctrl=0x00;
void LED_Process(void){if(led_flag==1){led_ctrl |= 0x01;LED_Control(led_ctrl);}else {led_ctrl &= ~0x01;LED_Control(0x00);}
}

LD1-LD8分别对应0xff中从低到高的每一位,十六进制转换为四位二进制后更加清晰:

0xff  ----> 1111 1111 (由高到低依次为 LD8 LD7...LD2 LD1)

想点亮哪个灯只需要将那一位置1,然后换算为16进制即可。 

点亮LED1

led_ctrl |= 0x01;

熄灭LED1

led_ctrl &= ~0x01;

使LED1闪烁

led_ctrl ^= 0x01;//^=是按位异或,可以切换LED的状态,如果是亮则熄灭,如果是熄灭则亮

led.h

#ifndef __LED_H
#define __LED_H
#include "main.h"
extern _Bool led_flag;
void LED_Control(u8 led_ctrl);
void LED_Process(void);
extern u8 led_ctrl;
#endif
while (1){LED_Process();}

将LED_Process()放入while(1)中即可实现led以0.1s闪烁。

QQ视频20240528205900

相关文章:

  • Transformer模型的简单学习
  • 前端 webSocket配置代理
  • Android9.0 MTK平台如何增加一个系统应用
  • 【React】Ant Design 5.x版本table scroll滚动条样式自定义
  • 【MySQL精通之路】InnoDB(4)-架构图
  • Vue 组件生命周期:探索钩子
  • JVM学习-彻底搞懂Java自增++
  • 2024年上半年软件设计师试题及答案(回忆版)--选择题
  • 多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?
  • C语言:创建简单的流媒体服务器来播放.flv文件
  • 怎么排查问题
  • 数据集005:螺丝螺母目标检测数据集(含数据集下载链接)
  • GDAL读取波段数据1
  • 怎么看智慧城市的发展?
  • springboot实现多开发环境匹配置
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 10个确保微服务与容器安全的最佳实践
  • If…else
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Python连接Oracle
  • vue脚手架vue-cli
  • vue数据传递--我有特殊的实现技巧
  • Web标准制定过程
  • 测试如何在敏捷团队中工作?
  • 大型网站性能监测、分析与优化常见问题QA
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4)STL算法之比较
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)一个美国文科博士的YardLife
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)Unity3DUnity3D在android下调试
  • (转)甲方乙方——赵民谈找工作
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @WebServiceClient注解,wsdlLocation 可配置
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C/C++随笔] char与unsigned char区别
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [ESP32 IDF]web server
  • [LeetCode] Sort List
  • [LeetCode]--61. Rotate List
  • [leetcode刷题]面试经典150题之6轮转数字(简单)
  • [linux 驱动]i2c总线设备驱动详解与实战
  • [Linux内核驱动]模块参数
  • [MQTT]服务器EMQX搭建SSL/TLS连接过程(wss://)
  • [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
  • [one_demo_14]一个简单的easyui的demo
  • [Phoenix] 七、如何使用自增ID
  • [PHP]加密解密函数