久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5261|回復: 2
打印 上一主題 下一主題
收起左側

關于CortexM3/M4 SysTick定時器的理解(STM32F4例子)

[復制鏈接]
跳轉到指定樓層
樓主

     stm32內核里面有一個很棒的定時器,可以在不占用CPU資源呢的前提下,完成定時的功能。從51單片機過來的時候,使用延時的辦法就是CPU一直進行空語句的執行,即for(i=100;i>0;i--)。這樣進行延時的辦法,在初學階段是比較好用的,但是深入學習到UCOSII/III這種操作系統之后,這種簡單的延時,就只會占用CPU。讓該運轉的指令得不到及時的執行。(定時器也可以解決這個問題,但是CortexM3/M4內核里面有這個玩意,自然要用上)為了解決這種問題,SysTick定時器應運而生。
    SysTick定時器的內容在《Cortex M3與M4權威指南》里面才被提到,而《STM32F4xx英文參考手冊》里面卻沒有。作者也是看《Cortex M3與M4權威指南》學習的。只需要掌握關于 SysTick里面的3個寄存器,即可隨心所欲的使用延時功能啦。
我先將這幾個定時器貼出來:


  • SysTick->CTRL  :  SysTick Control and Status Register(systick控制與狀態寄存器)
  • SysTick->LOAD SysTick Reload Value Register (systick 重裝裝載值寄存器)
  • SysTick->VAL SysTick Current Value Register(systick當前值寄存器)
(51過來的同學,systick定時器和51的定時0差不多的理解  (The counter inside the SysTick is a 24-bit decrement counter)SysTick內部的計數器是一個24位遞減計數器 。只需要將SysTick從一數到零需要多少時間弄明白即可。
systick定時器初始化
  1. static u8  time_us=0;    //用來存儲定時1us需要計數個數     
  2. static u16 time_ms=0;                                                        //用來存儲定時1ms需要計數個數     
  3.         
  4. void systick_init(void)
  5. {
  6.          SysTick->CTRL &=~(1<<2);    // 8分頻     選擇將系統時鐘進行8分頻  168M/8 = 21M 這個意思就是systick定時器從1->0數一下需要1/21us
  7.         time_us=21;                             //168/8      延時1us需要計數21次               
  8.         time_ms=(u16)time_us*1000;                //        延時1ms需要計數21*1000次                        
  9. }
復制代碼
舉個例子,如果我們想要延時100us  那么 以systick_init();  進行初始化 我們只需要將計數次數計算出來 count =  time_us * 100us  再將count裝載進如systick->load 寄存器里面就可以,然后開啟定時器 ,判斷是否從count數到0,如果沒有,繼續檢測,反之,則退出,并關閉定時器。即可以完成定時的功能。(不需要systick定時中斷)
延時1us代碼
  1. //最小延時1us
復制代碼






延時1ms代碼

  1. /*
  2.         u16 t_ms 最大為65535  
  3.                 65535 * 2100  = 1376235000 >> 16777216超出24位寄存器的值
  4.         在不超出 24位寄存器的前提下 t_ms最大為 16777216/2100 = 798.9150476
  5.         也就是最大延時 798.9150476ms
  6. */
  7. void systick_delay_ms(u16 t_ms)
  8. {
  9.         u8 res = 0;
  10.         SysTick->LOAD = t_ms * time_ms; //SysTick->LOAD 24位的寄存器 最大值是16777216
  11.         SysTick->CTRL |= 1<<0;                        //打開滴答定時器
  12.         SysTick->VAL = 0;
  13.         do { res = (u8)(SysTick->CTRL>>16); }while(!(res&1)); //判斷延時是否結束的標志
  14.         SysTick->CTRL &= ~(1<<0);      //關閉滴答定時器
  15. }
復制代碼






systick_delay_ms這個函數最大只能延時
798.9150476ms,如果我們想要延時更多的時間,我們怎么辦? 最通俗的辦法就是systick_delay_ms(500);systick_delay_ms(500);這樣即可。請看代碼

  1. /*獲取更多延時
  2. 思想就是:重復幾次 systick_delay_ms這個函數(最大延時 798.9150476ms)
  3.   獲取更多延時*/        
  4. void delay_100ms(u8 t_100ms)
  5. {
  6.         u8 res = 0;
  7.         while(t_100ms--)
  8.         {
  9.                 SysTick->LOAD = time_ms * 100; //100ms需要的節拍數
  10.                 SysTick->CTRL |= 1<<0;                        //打開滴答定時器
  11.                 SysTick->VAL = 0;
  12.                 do { res = (u8)(SysTick->CTRL>>16); }while(!(res&1)); //判斷延時是否結束的標志
  13.         }
  14. }
復制代碼
void delay_100ms(u8 t_100ms)  這個函數還是有問題的,就是我們想要延時更長時間,同時也想要把這個函數延時時間降到100ms以內,這樣的話,那么這個函數就做不到啦,于是繼續改唄,怎么才能延時更長的時間,而減小間隔呢?
  1. void delay_ms(u16 t_ms)
  2. {
  3.         u8 t_l = t_ms%255;
  4.         u8 t_h = t_ms/255;
  5.         while (t_h--)
  6.         {
  7.                 systick_delay_ms(255);
  8.         }
  9.         if(t_l)  systick_delay_ms(t_l);
  10. }
復制代碼
關于systick定時器的學習,就到這里啦。我自己本身還是有很多不足的,其實關于STM32F4的時鐘頻率是需要配置的,才能為168M。如果沒有將這些宏定義改為下面的,時鐘頻率不為168Mhz,就達不到你想要的延時時間了。
system_stm32f4xx.c  文件     宏定義PLL_M  改為8   即: #define PLL_M      8  uint32_t SystemCoreClock = 168000000;
stm32f4xx.c 文件                                                  即: #define HSE_VALUE    ((uint32_t)8000000)
學無止境,繼續努力
代碼工程奉上!

全部資料51hei下載地址:
STM32F407 systick 定時器延時.zip (454.94 KB, 下載次數: 32)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:256945 發表于 2021-4-3 17:39 | 只看該作者
你這個示波器是什么軟件啊
回復

使用道具 舉報

板凳
ID:245784 發表于 2021-6-28 09:48 | 只看該作者
夜空之巔 發表于 2021-4-3 17:39
你這個示波器是什么軟件啊

這是邏輯分析儀,上位機軟件。某一個寶幾十塊錢的。。不好意思,好久沒上這個帳號了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区二区三区四区五区 | 福利视频一区二区三区 | 黄视频欧美 | 精品区 | 一级a性色生活片久久毛片波多野 | 国产一区二区三区精品久久久 | 亚洲第一av网站 | 黄色一级片aaa | 国产高清精品在线 | 免费国产一区二区视频 | 四虎成人免费视频 | 亚洲天堂男人的天堂 | 久久久久国 | 国产情侣一区 | 欧美在线一区二区三区 | www.com久久久 | 97操操| 欧美一级在线观看 | 天天成人综合网 | 五月婷婷导航 | 成人在线观看免费 | 99久久精品一区二区毛片吞精 | 日韩久久网| 欧美女优在线观看 | 中文字幕精品一区二区三区在线 | 亚洲精品久久久久国产 | 免费视频一区二区 | 视频一区在线观看 | 一区视频在线免费观看 | 欧美一级在线观看 | 色网站在线免费观看 | 日韩在线小视频 | 成人免费视频 | 99成人精品| 欧美一级全黄 | 99一级毛片| 欧美 日韩 亚洲91麻豆精品 | 欧美午夜一区二区三区免费大片 | 天堂一区在线 | www.青娱乐 | 色姑娘av|