准备
在理解它的工作原理之前,先了解一些关于频率和周期的基本知识吧
周期 = 1/频率 1Mhz = 1000Khz = 1000000Hz
1秒(s)=1000毫秒(ms) 1秒(s)=1000000 微秒(μs)。
即72Mhz频率的周期则为1/72000000秒
SysTick特性介绍
SysTick是Cortex-M内核中的一个外设,内嵌在NVIC中
计数宽度为24bit,那么最大储存为2^24 = 16777216
计数器工作周期为 1/CLKSourec,CLKSourec可配置为72Mhz
工作模式为向下递减,即最大可从2^24 = 16777216递减到0并调用中断,递减的速度为一周期的速度即 1/CLKSourec,那么 递减次数 * 周期速度 = 定时时间
代码及详解
SysTick配置
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
if (HAL_SYSTICK_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
}
/*
HAL_SYSTICK_Config() 这个函数的值最终会传递给 LOAD重装数值寄存器中
SystemCoreClock 为时钟频率,当前配置为72Mhz/100000 = 720,即将720传到LOAD中
那么从720递减到0则需要1/720Mhz*720 = 0.00001秒 = 10us
*/
那么怎么将这个延时应用起来呢,可以通过以下方法
/*
大概思路,利用递减到0就会调用中断的特性,那么可以定义一个数作为目标延时时间,然后每中断一次定义的数就减一,即TimingDelay * 10us * 720 = 需要的延时时间
*/
uint32_t TimingDelay;//定义一个无符号数作为延时时间
void Delay_us(uint32_t nTime)
{
TimingDelay = nTime; //给延时时间赋值
while(TimingDelay != 0);//TimingDelay到0的时候退出循环即达到了延时作用
}
/*这个函数在中断函数SysTick_Handler()中调用,即每次从720递减到0一次每次10us,就让定义的TimingDelay减去1,TimingDelay到0的时候Delay_us()函数中的循环即可退出
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
中断函数部分
void SysTick_Handler(void)
{
HAL_IncTick();
TimingDelay_Decrement();//调用函数让上面定义的TimingDelay 减一
}
Comments NOTHING