研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录。
正文
System tick Timer是Cotex-M内核的24位计数的系统定时器。它的自动重载值可被随时配置更改,并且如果配置了系统定时器,那么它的中断也即被跟着使能。需要强调的是,在STM3210xxx的用户手册里,基本上找不到关于系统定时器的信息,所以想要深入了解配置该定时器,得去看内核相关文档,不过好在有了库函数,可以暂时不去深究内核文档,即可利用ST提供的库函数来进行配置。本文即记录了利用ST的库函数将该定时器的时钟配置为“AHB Clock”8分频并实现微妙(us)延时的方法。
首先是配置系统定时器的时钟源,库函数如下:
/** * @brief Configures the SysTick clock source. * @param SysTick_CLKSource: specifies the SysTick clock source. * This parameter can be one of the following values: * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. * @retval None */void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) { /* Check the parameters */ assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); if (SysTick_CLKSource == SysTick_CLKSource_HCLK) { SysTick->CTRL |= SysTick_CLKSource_HCLK; } else { SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; } }
从以上的说明可以看出,系统定时器可被选择为AHB时钟或者AHB 8分频。本例则配置为 AHB 8分频:
/** * SysTick时钟源由HCLK/8提供,当系统频率为72MHz时,最小计数周期为1/9MHz,计满9次为1us, * tick_us以9为单位,在此为基础实现us延时。 */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); tick_us = sysclk/8; // sysyclk = 72 tick_ms=(u16)tick_us*1000;
接着实现Delay_us(uint us)函数
void Delay_us(uint us) { uint temp; SysTick->LOAD = us * tick_us; // 滴答9次就是1us SysTick->VAL = 0x00; // 赋初值为"0" SysTick->CTRL = 0x01 ; // 开启定时器 do { temp = SysTick->CTRL; } while( (temp&0x01) && (!(temp&(1<<16))) ); SysTick->CTRL = 0x00; // 停止计数器 SysTick->VAL = 0x00; // 清空计数器}
以上函数则实现了us定时。
当然也可以使用它的中断函数:
/** * @brief This function handles SysTick Handler. * @param None * @retval None */void SysTick_Handler(void){ // 要做什么,自行发挥。}
参考链接
此文章参考借鉴了"ARM KEIL"官方文档:"System Tick Timer" 。
至此,记录完毕