系统滴答定时器

  • SysTick是一个24位定时器,属于Corte-M4内核中的一个外设,类似NVIC。
  • 一个周期定时器,用于提供时间基准,多为操作系统所使用,常用于对时间要求严格的情况。
  • SysTick定时器一次最多可以计数2^24(24bit)个时钟脉冲,这个脉冲计数值保存在当前计数值寄存器STK_VAL(Systick current value register)中,只能向下计数,也就是倒计数,每接收到一个时钟脉冲(CPU主频),STK_VAL的值就会向下-1,当减到0时,硬件会自动将重装载寄存器STK_LOAD(可以设定,和STK_VAL初始值相等)中保存的数值加载到STK_VAL,使其重新计数。并且,系统滴答定时器就产生一次中断,以此循环往复,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SysTick相关寄存器

寄存器名称

寄存器描述

CTRL

SysTick控制及状态寄存器

LOAD

SysTick重装载数值寄存器

VAL

SysTick当前数值寄存器

CALIB

SysTick校准数值寄存器

不过还是得重相应的代码中去看看,一层一层把它扒开来的去看。

 

这就是它底层的东西了,假如SystemCoreClock为80Mhz,那么TicksNumb = 80000,则 LOAD的值为80000,那么,根据前面说的,VAL的值为 80000,主频为80Mhz,1/80M*80000 = 1ms,所以每1ms进入滴答定时器中。

再看看stm32g4xx_it.c中的SystTick_Handler函数

 

所以那个滴答定时器就会让一个变量每一毫秒+1,也就是uwTick

再看看HAL_Delay函数 

Tickstart = uwTick

假如延时500ms,那么wait = 500

while ((HAL_GetTick() - tickstart) < wait)

  {

  }

这个函数就一直去查当前的滴答值,然后减去刚一进来的滴答值tickstart,现在距离刚进来时到现在过了多久,在main函数中的while(1)里不仅只执行里面的语句,其内核还在干其他的事,就是让uwTick每秒+1 

所以,这个变量(uwTick)还是有点子用,而且可以在主函数中调用。

看看主函数中,因为它包含了stm32g4xx_hal.h头文件,

 而在stm32g4xx_hal.h这个头文件中,ctrl+f,可以看到uwTick这个变量在这声明了

 

下面可以用这个变量来控制LED的闪烁

//led函数
void led_disp(unsigned char ucled)
{
	//将所有的灯熄灭
//	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_SET);
	
	HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

在主函数定义一个和uwTick类型一样的变量

__IO uint32_t uwTick_Set_Point = 0;
unsigned char i = 0;
void Led_Proc(void)
{
	if((uwTick - uwTick_Set_Point) < 500)  //0.5s亮灭
		return;
	uwTick_Set_Point = uwTick;
	i++;
	if(i % 2)
		led_disp(0xff);
	else
		led_disp(0x00);
	
}

然后在while(1)中调用。

以上学完之后的个人见解。。(嘿嘿)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wu小燕呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值