日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

發布時間:2024/9/27 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天我們來說說SysTick定時器。SysTick定時器在從參考手冊中根本沒有介紹。我費了九牛二虎之力才在一個犄角格拉里找到SysTick定時器的英文版的說明。在Cotex-M3有介紹,為什么要找STM32的介紹,是因為功能設置上還有點區別。首先看一下SysTick定時器的作用,下面是Cotex-M3里的一段話:SysTick定時器被捆綁在NVIC中,用于產生SYSTICK異常(異常號:15)。在以前,大多操作系統需要一個硬件定時器來產生操作系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有一個任務能霸占系統;或者把每個定時器周期的某個時間范圍賜予特定的任務等,還有操作系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產生周期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統“心跳”的節律。Cortex‐M3處理器內部包含了一個簡單的定時器。因為所有的CM3芯片都帶有這個定時器,軟件在不同CM3器件間的移植工作得以化簡。該定時器的時鐘源可以是內部時鐘(FCLK,CM3上的自由運行時鐘),或者是外部時鐘(CM3處理器上的STCLK信號)。不過,STCLK的具體來源則由芯片設計者決定,因此不同產品之間的時鐘頻率可能會大不相同,你需要檢視芯片的器件手冊來決定選擇什么作為時鐘源。知道我為什么找ST關于SysTick的說明了吧SysTick介紹下面介紹STM32中的SysTick。SysTick部分內容屬于NVIC控制部分,一共有4個寄存器,名稱和地址分別是:
  • STK_CSR,0xE000E010—控制寄存器

  • STK_LOAD,0xE000E014—重載寄存器

  • STK_VAL,0xE000E018—當前值寄存器

  • STK_CALRB,0xE000E01C—校準值寄存器

1STK_CSR控制寄存器首先看STK_CSR控制寄存器:寄存器內有4個位具有意義
  • 第0位:ENABLE,SysTick使能位(0:關閉Systick功能;1:開啟Systick功能)。

  • 第1位:TICKINT,SysTick中斷使能位(0:關閉Systick中斷;1:開啟Systick中斷)。

  • 第2位:CLKSOURCE,SysTick時鐘源選擇(0:使用HCLK/8 作為Systick時鐘;1:使用HCLK作為Systick時鐘)。

  • 第3位:COUNTFLAG,SysTick計數比較標志,如果在上次讀取本寄存器后,SysTick 已經數到了0,則該位為1。如果讀取該位,該位將自動清零。

2STK_LOAD重載寄存器SysTick是一個遞減的定時器。當定時器遞減至0時,重載寄存器中的值就會被重裝載,繼續開始遞減。STK_LOAD重載寄存器是個24位的寄存器,最大計數0xFFFFFF。3STK_VAL當前值寄存器STK_VAL當前值寄存器也是個24位的寄存器。讀取時返回當前倒計數的值,寫它則使之清零,同時還會清除在SysTick控制及狀態寄存器中的COUNTFLAG標志。4STK_CALRB校準值寄存器這個寄存器以我目前的水平還用不到,大體意思明白點,把英文說明放這吧。
  • 位31 NOREF:1=沒有外部參考時鐘(STCLK不可用),0=外部參考時鐘可用。

  • 位30 SKEW:1=校準值不是準確的1ms,0=校準值是準確的1ms。

  • 位[23:0] :Calibration value。

英文說明Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.SysTick定時器除了能服務于操作系統之外,還能用于其它目的:如作為一個鬧鈴,用于測量時間等。要注意的是,當處理器在調試期間被喊停(halt)時,則SysTick定時器亦將暫停運作。SysTick定時器跑程序下面我們就應用SysTick定時器來裸奔,把它作為一個定時器來用,還是老一套,在寄存器頭文件中添加定義寄存器。//*****************************************************************//*???????????????????????????????SystemTick-Register?????????????????????????????????//*******************************************************************#define SYSTICK_TENMS????(*((volatile unsigned long *)0xE000E01C))#define SYSTICK_CURRENT??(*((volatile unsigned long *)0xE000E018))#define SYSTICK_RELOAD???(*((volatile unsigned long *)0xE000E014))#define SYSTICK_CSR???????(*((volatile unsigned long *)0xE000E010))配置SysTick寄存器:void SysTick_Configuration(void){SYSTICK_CURRENT=0; //當前值寄存器SYSTICK_RELOAD=20000; //重裝載寄存器,系統時鐘20M中斷一次1mSSYSTICK_CSR|=0x06;//?HCLK作為Systick時鐘,Systick中斷使能位}中斷處理:void SysTick_Handler(void) //中斷函數{extern unsigned long TimingDelay;?// 延時時間,注意定義為全局變量SYSTICK_CURRENT=0;if (TimingDelay != 0x00)TimingDelay--;}利用SysTick的延時函數:unsigned long TimingDelay;??// 延時時間,注意定義為全局變量void Delay(unsigned long nTime)??//延時函數{SYSTICK_CSR|=0x07;???//?使能SysTick計數器TimingDelay = nTime; //?讀取延時時間while(TimingDelay != 0); //?判斷延時是否結束SYSTICK_CSR|=0x06;//?關閉SysTick計數器}int main(){SystemInit0();????//系統(時鐘)初始化stm32_GpioSetup (); //GPIO初始化SysTick_Configuration(); //配置systick定時器while(1){GPIO_PORTB_ODR|=(1<<5);Delay(1000); //1SGPIO_PORTB_ODR&=~(1<<5);Delay(1000); //1S}}完成!Delay(1000);實現了1S的精確延時。利用Delay(unsigned long nTime);配合SysTick定時器,可以實現任意時間的精確延時。當然,通過定時器TIMx也是可以這樣做的,我只是用它來說明SysTick定時器的用法。

總結

以上是生活随笔為你收集整理的滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。