【STM32】SysTick定时器
00. 目錄
文章目錄
- 00. 目錄
- 01. SysTick定時器概述
- 02. SysTick定時器寄存器描述
- 03. 相關函數實現
- 04. 延時函數實現
- 05. 應用示例
- 06. 附錄
- 07. 聲明
01. SysTick定時器概述
SysTick定時器被捆綁在NVIC中,用于產生SYSTICK異常(異常號:15)。在以前,大多操作系統需要一個硬件定時器來產生操作系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有一個任務能霸占系統;或者把每個定時器周期的某個時間范圍賜予特定的任務等,還有操作系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產生周期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統“心跳”的節律。
Systick定時器就是系統滴答定時器,一個24 位的倒計數定時器,計到0 時,將從RELOAD 寄存器中自動重裝載定時初值。只要不把它在SysTick 控制及狀態寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
02. SysTick定時器寄存器描述
SysTick控制及狀態寄存器(地址:0xE000_E010)
SysTick重裝載數值寄存器(地址:0xE000_E014)
SysTick當前數值寄存器(地址:0xE000_E018)
SysTick校準數值寄存器(地址:0xE000_E01C)
03. 相關函數實現
core_cm4.h文件
/** \brief System Tick ConfigurationThe function initializes the System Timer and its interrupt, and starts the System Tick Timer.Counter is in free running mode to generate periodic interrupts.\param [in] ticks Number of ticks between two interrupts.\return 0 Function succeeded.\return 1 Function failed.\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then thefunction <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>must contain a vendor-specific implementation of this function.*/ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) {if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */SysTick->VAL = 0UL; /* Load the SysTick Counter Value */SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0UL); /* Function successful */ }misc.c文件
/*** @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;} }04. 延時函數實現
delay.h文件
#ifndef __DELAY_H #define __DELAY_H #include <sys.h> void delay_init(u8 SYSCLK); void delay_ms(u16 nms); void delay_us(u32 nus);#endifdelay.c文件
static u8 fac_us=0; //us延時倍乘數 static u16 fac_ms=0; //ms延時倍乘數,在os下,代表每個節拍的ms數//初始化延遲函數 //當使用OS的時候,此函數會初始化OS的時鐘節拍 //SYSTICK的時鐘固定為AHB時鐘的1/8 //SYSCLK:系統時鐘頻率 void delay_init(u8 SYSCLK) {SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //不論是否使用OS,fac_us都需要使用fac_ms=(u16)fac_us*1000; //非OS下,代表每個ms需要的systick時鐘數 } //延時nus //nus為要延時的us數. //注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21) void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //時間加載 SysTick->VAL=0x00; //清空計數器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器SysTick->VAL =0X00; //清空計數器 }//延時nms //注意nms的范圍 //SysTick->LOAD為24位寄存器,所以,最大延時為: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK單位為Hz,nms單位為ms //對168M條件下,nms<=798ms void delay_xms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //時間加載(SysTick->LOAD為24bit)SysTick->VAL =0x00; //清空計數器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器SysTick->VAL =0X00; //清空計數器 } //延時nms //nms:0~65535 void delay_ms(u16 nms) { u8 repeat=nms/540; //這里用540,是考慮到某些客戶可能超頻使用,//比如超頻到248M的時候,delay_xms最大只能延時541ms左右了u16 remain=nms%540;while(repeat){delay_xms(540);repeat--;}if(remain)delay_xms(remain); }05. 應用示例
用中斷的方式實現delay延時
static __IO uint32_t TimingDelay; void Delay(__IO uint32_t nTime) { TimingDelay = nTime;while(TimingDelay != 0); } void SysTick_Handler(void) {if (TimingDelay != 0x00) { TimingDelay--;} }int main(void){ …if (SysTick_Config(SystemCoreClock / 1000)) //systick時鐘為HCLK,中斷時間間隔1ms{while (1);}while(1){ Delay(200);//2ms… } }06. 附錄
6.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
07. 聲明
該教程參考了正點原子的《STM32 F4 開發指南》
總結
以上是生活随笔為你收集整理的【STM32】SysTick定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】STM32F4时钟系统
- 下一篇: 【IT资讯】阿里新推出“阿里云网盘” 速