赞
踩
- 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)中调用。
以上学完之后的个人见解。。(嘿嘿)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。