stm32系统时钟触发中断时间设置及延时设置
stm32系统时钟触发中断时间设置
以stm32F407ZE为例
系统定时器中断函数SysTick_Handler
在startup_stm32f40_41xxx.s汇编文件中227行
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
如何设置时间呢? 首先了解频率50Hz,时间 t = 1 / f = 1s / 50Hz = 0.02s 系统时钟触发的中断频率为168MHz:1秒的时间内系统时钟进行 168 000 000 次计数 也就是进行 168 000 000 次计数时,时间为 1s 那么进行 168 000 次计数时,时间则为 1ms 以此类推,进行 168 次计数时,时间则为 1μs
//系统时钟触发中断频率设置
//168000000/1000 = 168000,系统定时器进行 168 000 次计数,就代表时间经过 1ms
SysTick_Config(SystemCoreClock/1000);
//168000000/1000000 = 168,系统时钟进行 168 次计数,就代表时间经过 1μs
//SysTick_Config(SystemCoreClock/1000000);
void SysTick_Handler(void)
{
static uint32_t num = 0;
num++;
if(num == 500) //计数500次,每次 1ms,共500毫秒
{
num = 0; //计数清零
void fun(void); //用户自定义内容
}
}
延时函数
如何使用延时函数delay准确进行时间计算呢
//以毫秒为单位进行计时
void delay_ms(uint32_t nms)
{
while(nms--)
{
SysTick->CTRL = 0; // 关闭系统定时器
SysTick->LOAD = 168000; // (根据系统定时器频率设置)配置计数值,计数值就是延时时间1ms,与上部分定时器中的原理相同
SysTick->VAL = 0; // 清空当前计数标志位
SysTick->CTRL = 5; // 让系统定时器开始工作计数,时钟源为系统定时器,频率为168MHz
while ((SysTick->CTRL & 0x00010000)==0);// 等待计数完毕(计数值已经到达0)
SysTick->CTRL = 0; // 关闭定时器
}
}
//以微秒为单位进行计时
void delay_us(uint32_t nus)
{
while(nus--)
{
SysTick->CTRL = 0; // 关闭系统定时器
SysTick->LOAD = 168*nus; // (根据系统定时器频率设置)配置计数值,计数值就是延时时间1ms,与上部分定时器中的原理相同
SysTick->VAL = 0; // 清空当前计数标志位
SysTick->CTRL = 5; // 让系统定时器开始工作计数,时钟源为系统定时器,频率为168MHz
while ((SysTick->CTRL & 0x00010000)==0);// 等待计数完毕(计数值已经到达0)
SysTick->CTRL = 0; // 关闭定时器
}
}
