广州购物商城网站开发,大型旅游网站源码 织梦 2016,成都logo设计公司排名,做简历的网站 知乎在嵌入式系统中#xff0c;SysTick_Handler 是一个中断服务例程#xff08;Interrupt Service Routine, ISR#xff09;#xff0c;用于处理 SysTick 定时器的中断。SysTick 定时器通常用于提供一个周期性的定时中断#xff0c;可以用来实现延时或者周期性任务。
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 这个函数。在其中加入一些标志位可实现不少定时的功能。 注意在中断中不能执行耗时过长的程序中断通常用于处理需要立即响应的事件如外部信号变化、定时器到期等。如果中断处理时间过长会延迟对后续中断事件的响应从而影响系统的实时性能。因此中断处理程序应该设计得尽可能短小精悍只执行必要的、时间关键的操作如状态保存、事件标记、简单计算等。如果有需要执行耗时较长的程序应该在中断处理程序中设置一个标志位然后放在主函数的while1里执行。
SysTick_Handler中的程序
u8 led_cnt 0;
void SysTick_Handler(void)
{led_cnt;if(led_cnt100){//用了简单的逻辑可以改进led_flag1;}if(led_cnt200){led_flag0;led_cnt0;}HAL_IncTick();
}
使LED1以0.1s闪烁。
LED.c
#include led.h_Bool led_flag0;
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_ctrl8,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_ctrl0x00;
void LED_Process(void){if(led_flag1){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放入while1中即可实现led以0.1s闪烁。 QQ视频20240528205900