蓝桥杯 STM32G431RBT6 SysTick定时器详解
一、CubeMx配置
(1)基础配置
(2)LED配置
(3)TIM配置
选用最基础的定时器
(4)注意
每次把单片机连上电脑之后都要记得打开魔术棒,点击Debug选择合适的型号,就相当于是打开下载的路径
二、知识点讲解(其实没懂)
2.1
注意:1ms=1000Hz
若要产生1000Hz的中断,我们要在reload寄存器里面写值,因为计数器是从reload寄存器里面填的值往0减,减到0之后再从reload这个值再往0减,这样周期性的工作。
现在SysTicktimer里面的时钟频率是170兆(170MHz=170 000 000),也就是里面的计数器是按照170兆的频率在递减
若把170 000 000 / 1000=170 000这个值填到reload里面,则SysTicktimer工作起来产生的中断就是1000Hz
reload寄存器是24位,所以写入里面的值不能大于(2的24次方-1=16777215)
这个图就相当于,系统的内核时钟除以1000 得到的就是1000Hz的频率
2.2
当我们选择SysTick之后,系统就自动的配好了 HAL_Init(); SystemClock_Config();。在 HAL_Init();中自动的把SysTicktimer里面的中断周期配置成了1ms,自动的往reload里面填了相应的值
真正的系统时钟是在SystemClock_Config();这个里面完成的。所以HAL_Init();里面用的是单片机内部的高速时钟,用其也可以产生1ms的中断
所以如果我们要自己修改SysTick的中断频率的话,要在SystemClock_Config();这个下面修改
2.3
HAL_SYSTICK_Config(170000000/10000);
2.4
每过1ms就会进入到中断SysTick_Handler()里面去,每过1ms就会调用HAL_IncTick ();这个函数会把一个变量的值(uwTick)+1,这个变量会累加。我们可以去获取这个变量的值,然后把当前获取的跟先前获取的相减,就知道过了几个设定的中断时间
通过HAL_GetTick()这个来获取
三、代码
首先要定义一下,后面要用这个数据
uint32_t temCnt=0;
HAL_SYSTICK_Config(170000000/10000);
if(HAL_GetTick()-temCnt>1000)
{
HAL_GPIO_TogglePin (LED1_GPIO_Port,LED1_Pin);
temCnt=HAL_GetTick();
}
用170000000/10000表示的是10KHz也就相当于0.1ms,下面的>1000,.也就相当于要经历1000次0.1ms,也就相当于0.1s,所以我的LED1灯是以0.1s的频率闪烁
如果用的是170000000/1000,也就相当于一次中断定时是1ms,下面的>1000就相当于是经历1000次的1ms,也就是定时1s来实现LED1灯的电平翻转
总的逻辑就是,每过你设定的一个频率(170000000/1000)就要进入中断,然后加一次数,要等到过1000次这个加一,才能进行翻转
总结:
SysTick就相当于每过1ms(默认状态下)就进入一次中断函数 ,进入一次中断函数就开始+1,不断地累加得到一个值,累加得到的这个值其实也就相当于过了多少ms,然后通过一个函数来获取现在过了多少ms的值,用这个值减去一个我们设定的变量,当这个差值>某一个数之后就去执行它的程序,而这个算式就相当于是定时,定一个时间;SysTick就是计数,看过了多少的时间。
作者:学习日记hhh