欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 關(guān)于CortexM3/M4 SysTick定時(shí)器的理解(STM32F4例子) [打印本頁(yè)]

作者: saytheme    時(shí)間: 2020-2-22 13:33
標(biāo)題: 關(guān)于CortexM3/M4 SysTick定時(shí)器的理解(STM32F4例子)

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


(51過(guò)來(lái)的同學(xué),systick定時(shí)器和51的定時(shí)0差不多的理解  (The counter inside the SysTick is a 24-bit decrement counter)SysTick內(nèi)部的計(jì)數(shù)器是一個(gè)24位遞減計(jì)數(shù)器 。只需要將SysTick從一數(shù)到零需要多少時(shí)間弄明白即可。
systick定時(shí)器初始化
  1. static u8  time_us=0;    //用來(lái)存儲(chǔ)定時(shí)1us需要計(jì)數(shù)個(gè)數(shù)     
  2. static u16 time_ms=0;                                                        //用來(lái)存儲(chǔ)定時(shí)1ms需要計(jì)數(shù)個(gè)數(shù)     
  3.         
  4. void systick_init(void)
  5. {
  6.          SysTick->CTRL &=~(1<<2);    // 8分頻     選擇將系統(tǒng)時(shí)鐘進(jìn)行8分頻  168M/8 = 21M 這個(gè)意思就是systick定時(shí)器從1->0數(shù)一下需要1/21us
  7.         time_us=21;                             //168/8      延時(shí)1us需要計(jì)數(shù)21次               
  8.         time_ms=(u16)time_us*1000;                //        延時(shí)1ms需要計(jì)數(shù)21*1000次                        
  9. }
復(fù)制代碼
舉個(gè)例子,如果我們想要延時(shí)100us  那么 以systick_init();  進(jìn)行初始化 我們只需要將計(jì)數(shù)次數(shù)計(jì)算出來(lái) count =  time_us * 100us  再將count裝載進(jìn)如systick->load 寄存器里面就可以,然后開(kāi)啟定時(shí)器 ,判斷是否從count數(shù)到0,如果沒(méi)有,繼續(xù)檢測(cè),反之,則退出,并關(guān)閉定時(shí)器。即可以完成定時(shí)的功能。(不需要systick定時(shí)中斷)
延時(shí)1us代碼
  1. //最小延時(shí)1us
復(fù)制代碼






延時(shí)1ms代碼

  1. /*
  2.         u16 t_ms 最大為65535  
  3.                 65535 * 2100  = 1376235000 >> 16777216超出24位寄存器的值
  4.         在不超出 24位寄存器的前提下 t_ms最大為 16777216/2100 = 798.9150476
  5.         也就是最大延時(shí) 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;                        //打開(kāi)滴答定時(shí)器
  12.         SysTick->VAL = 0;
  13.         do { res = (u8)(SysTick->CTRL>>16); }while(!(res&1)); //判斷延時(shí)是否結(jié)束的標(biāo)志
  14.         SysTick->CTRL &= ~(1<<0);      //關(guān)閉滴答定時(shí)器
  15. }
復(fù)制代碼






systick_delay_ms這個(gè)函數(shù)最大只能延時(shí)
798.9150476ms,如果我們想要延時(shí)更多的時(shí)間,我們?cè)趺崔k? 最通俗的辦法就是systick_delay_ms(500);systick_delay_ms(500);這樣即可。請(qǐng)看代碼

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

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




作者: 夜空之巔    時(shí)間: 2021-4-3 17:39
你這個(gè)示波器是什么軟件啊
作者: saytheme    時(shí)間: 2021-6-28 09:48
夜空之巔 發(fā)表于 2021-4-3 17:39
你這個(gè)示波器是什么軟件啊

這是邏輯分析儀,上位機(jī)軟件。某一個(gè)寶幾十塊錢(qián)的。。不好意思,好久沒(méi)上這個(gè)帳號(hào)了




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1