打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SysTick 定时器的应用
通常实现Delay(N)函数的方法为:

for(i = 0; i <= x; i ++);

      x   ---   对应于 对应于N 毫秒的循环值



对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。


Cortex-M3的内核中包含一个SysTick时钟。SysTick 为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。

在STM32的应用中,使用Cortex-M3 内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数
   里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。


注: 全局变量TimingDelay 必须定义为volatile

      延迟时间将不随系统时钟频率改变。

外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9000,将SysTick 时钟设置为9MHz, 就能够产生1ms的时间基值,即SysTick产生1ms的中断。


使用ST的函数库使用systick的方法
1、调用SysTick_CounterCmd() 失能SysTick计数器
2、调用SysTick_ITConfig () 失能SysTick中断
3、调用SysTick_CLKSourceConfig() 设置SysTick时钟源。
4、调用SysTick_SetReload() 设置SysTick重装载值。
5、调用SysTick_ITConfig ()     使能SysTick中断
6、调用SysTick_CounterCmd() 开启SysTick计数器

SysTick 配置函数

/*******************************************************************************
* Function Name   : SysTick_Config
* Description : Configures SysTick
* Input       : None
* Output       : None
* Return       : None
*******************************************************************************/
//SysTick设置
void SysTick_Config(void)
{
/* Disable SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Disable);
  
/* Disable the SysTick Interrupt */
SysTick_ITConfig(DISABLE);
  
/* Configure HCLK clock as SysTick clock source */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
/* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */
SysTick_SetReload(9000);
/* Enable the SysTick Interrupt */
SysTick_ITConfig(ENABLE);
}


Delay_Ms   延迟一毫秒函数

/*******************************************************************************
* Function Name   : Delay_Ms
* Description : Inserts a delay time.
* Input       : nTime: specifies the delay time length, in milliseconds.
* Output       : None
* Return       : None
*******************************************************************************/
void Delay_Ms(u32 nTime)
{
/* Enable the SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Enable);
  
TimingDelay = nTime;
while(TimingDelay != 0);
/* Disable SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* Clear SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Clear);
}


TimingDelayMs_Decrement 中断调用函数

/*******************************************************************************
* Function Name   : TimingDelayMs_Decrement
* Description : Decrements the TimingDelay variable.
* Input       : None
* Output       : TimingDelay
* Return       : None
*******************************************************************************/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
   TimingDelay--;
}
}


SysTickHandler   中断进入函数

/*******************************************************************************
* Function Name   : SysTickHandler
* Description : This function handles SysTick Handler.
* Input       : None
* Output       : None
* Return       : None
*******************************************************************************/
void SysTickHandler(void)
{
   TimingDelay_Decrement();
}


NVIC_Configuration 中断向量表配置

/*******************************************************************************
* Function Name   : NVIC_Configuration
* Description : Configures NVIC and Vector Table base location.
* Input       : None
* Output       : None
* Return       : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef   VECT_TAB_RAM
   /* Set the Vector Table base location at 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   /* VECT_TAB_FLASH   */
   /* Set the Vector Table base location at 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
STM32 入门教程 系统时钟 SysTick
关于STM32的systick定时器的详细说明
STM32菜鸟成长记录
STM32入门学习之systick定时器
FreeRTOS一线通
使用SysTick作为HAL的基础时钟
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服