<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        使用STM32的SysTick實現精準延遲

        作者:liuzhangchao   來源:liuzhangchao的空間   點擊數:  更新時間:2014年05月23日   【字體:

        使用SysTick的普通計數模式對延遲進行管理.

        static u8  fac_us=0;//us延時倍乘數
        static u16 fac_ms=0;//ms延時倍乘數

         

        //初始化延遲函數
        void delay_init(u8 SYSCLK)
        {
         SysTick->CTRL&=0xfffffffb;  //bit2清空,選擇外部時鐘*/  
         fac_us = SYSCLK/8;          
         fac_ms = (u16)fac_us*1000;
         

                 
        //延時nms

        //SysTick->LOAD為24位寄存器,所以,最大延時為:
        //nms<=0xffffff*8*1000/SYSCLK
        //對72M條件下,nms<=1864
        void delay_ms(u16 nms)
              
         u32 temp; 
         SysTick->LOAD=(u32)nms*fac_ms;      // 當倒數至零時,將被重裝載的值 */
         SysTick->VAL =0x00;                 // VAL寄存器中存放著當前倒計數的值  */
         SysTick->CTRL=0x01 ;                // Systick定時器的使能位   開始計時 */
         do
         {
          temp=SysTick->CTRL;
         }
         
         while(temp&0x01&&!(temp&(1<<16)));   //首先檢查定時器使能位是否為1 
                                              //Systick定時器倒數至零后  位16被置1 被讀取后該位置0
                                                //  等待時間到達或定時器關閉  */ 
         SysTick->CTRL=0x00;       //關閉計數器
         SysTick->VAL =0X00;       //清空計數器       
        }

         


        //延時nus
        //nus為要延時的us數.
        void delay_us(u32 nus)
         
         u32 temp;
         SysTick->LOAD=nus*fac_us; //時間加載     
         SysTick->VAL=0x00;        //清空計數器
         SysTick->CTRL=0x01 ;      //開始倒數  
         do
         {
          temp=SysTick->CTRL;
         }
         while(temp&0x01&&!(temp&(1<<16)));//等待時間到達  
         SysTick->CTRL=0x00;       //關閉計數器
         SysTick->VAL =0X00;       //清空計數器 
         
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮