您的位置:首页 > 其它

STM32 SysTick定时器

2013-12-21 21:07 239 查看

1、Cortex-M3 SysTick定时器

Cortex-M3处理器内部包含了一个简单的定时器SysTick。它是一个24位的倒计数定时器,当计到0时,将从Reload寄存器中自动重新装载定时初值,只要不把它在SysTick Control & Status R中的使能位清除,就永不停息。因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作就得以化简。SysTick定时器能产生中断,CM3为它专门开出一个异常类型,异常号为15。有4个与SysTick相关的寄存器,它们都位于NVIC空间,如下图(细节请参考《Cortex-M3
NVIC》一章):
SysTick Control & Status R(系统时钟控制与状态寄存器)



SysTick Reload Value R(系统时钟重装值寄存器)



SysTick Current Value R(系统时钟当前值寄存器)



SysTick Calibration Value R(系统时钟校准值寄存器)



校准值寄存器使系统即使在不同的CM3产品上运行,也能产生恒定的SysTick中断频率。

2、STM32中使用SysTick实现延时

下面在STM32中使用SysTick实现延时功能,它的好处是既不占用中断,也不系统定时器。

库函数中SysTick->CTRL、SysTick->LOAD、SysTick->VAL分别对应以上三个寄存器。

u32 fac_us;
u32 fac_ms;

// From the Clock Tree, we can know the SysTick's clock is 1/8 of HCLK if the STCLK selected.
// And SysTick's clock equals with HCLK if FCLK selected.
void Delay_Init() {
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// Could add this line or not, because the default Clock is STCLK
fac_us = SystemCoreClock / 8000000; // the value of SystemCoreClock is 72MHz
fac_ms = fac_us * 1000;
}

// nus <= (2^24) / fac_us, (nus <= 1,864,135.111us)
void Delay_us(u32 nus) {
u32 temp;
SysTick->LOAD = nus * fac_us;
SysTick->VAL = 0x0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
do {
temp = SysTick->CTRL;
} while (temp & 0x1 && !(temp & (1 << 16)));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x0;
}

// nms <= (2^24) / fac_ms, (nms <= 1,864.135s)
void Delay_ms(u32 nms) {
u32 temp;
SysTick->LOAD = nms * fac_ms;
SysTick->VAL = 0x0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
do {
temp = SysTick->CTRL;
} while (temp & 0x1 && !(temp & (1 << 16)));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x0;
}

int main() {
    Delay_Init();
    LED0 = 1;
    Delay_ms(1000);
    LED0 = 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: