成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

填坑-關(guān)于SysTick定時器

開發(fā) 前端
本文主要介紹關(guān)于SysTick定時器的相關(guān)知識,希望對你有幫助。

[[390601]]

本文主要來填坑,更正之前文章的錯誤。也進一步加深了我對SysTick定時器的理解,希望對你有幫助。

01坑的由來

在之前的推文中《STM32延時的四種方法》介紹了使用查詢定時器精確延時,使用的就是systick定時器,具體代碼如下

  1. void delay_us(uint32_t nus) 
  2.   uint32_t temp
  3.   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus; 
  4.   SysTick->VAL=0X00;//清空計數(shù)器 
  5.   SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鐘源 
  6.   do 
  7.   { 
  8.     temp=SysTick->CTRL;//讀取當前倒計數(shù)值 
  9.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
  10.   SysTick->CTRL=0x00; //關(guān)閉計數(shù)器 
  11.   SysTick->VAL =0X00; //清空計數(shù)器 
  12. void delay_ms(uint16_t nms) 
  13.   uint32_t temp
  14.   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms; 
  15.   SysTick->VAL=0X00;//清空計數(shù)器 
  16.   SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鐘源 
  17.   do 
  18.   { 
  19.     temp=SysTick->CTRL;//讀取當前倒計數(shù)值 
  20.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
  21.   SysTick->CTRL=0x00; //關(guān)閉計數(shù)器 
  22.   SysTick->VAL =0X00; //清空計數(shù)器 

對于《STM32延時的四種方法》文中所說的內(nèi)容如下

也就是下面代碼中/8的原因。

  1. SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms; 

我對此深信不疑,并在STM32F207參考手冊(RM0033)上找到“證據(jù)”。

上圖①處直接是8分頻,而不像②出的1/2/4/8分頻。所以我確信是SYSTICK的時鐘固定為HCLK時鐘的1/8。

我在學習RTThread的時候,看到配置SysTick定制器代碼如下

我心里一堆問號,STM32官方手冊,明明寫了SYSTICK的時鐘固定為HCLK時鐘的1/8。我使用示波器測量,RTThread的配置是沒有問題,可以正常延時的。

02填坑

這個坑其實很簡單,在《STM32延時的四種方法》也提到了,只是自己沒有注意這個細節(jié)。

位2置1,表示時鐘頻率為AHB,也就是默認的120000000Hz。

位2清0,表示時鐘頻率為AHB/8,也就是120000000/8Hz。

RTThread配置為內(nèi)部時鐘

之前的文章配置為外部時鐘源


這個細節(jié)我沒有留意,導致我看RTThread代碼時有點懵逼。在這里我更正《STM32延時的四種方法》中的錯誤描述

準確的描述是:

SYSTICK的時鐘可以為HCLK時鐘的1分頻或8分頻,在這里我們選用外部時鐘源120M,所以SYSTICK的時鐘為(120/8)M。

特此更正。

關(guān)于這點,STM32的標準外設庫提供的SysTick_Config函數(shù),也是使用內(nèi)部時鐘的

  1. /** \brief  System Tick Configuration 
  2.  
  3.     This function initialises the system tick timer and its interrupt and start the system tick timer. 
  4.     Counter is in free running mode to generate periodical interrupts. 
  5.  
  6.     \param [in]  ticks  Number of ticks between two interrupts 
  7.     \return          0  Function succeeded 
  8.     \return          1  Function failed 
  9.  */ 
  10. static __INLINE uint32_t SysTick_Config(uint32_t ticks) 
  11.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */ 
  12.  
  13.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */ 
  14.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */ 
  15.   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */ 
  16.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
  17.                    SysTick_CTRL_TICKINT_Msk   | 
  18.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */ 
  19.   return (0);                                                  /* Function successful */ 

調(diào)用方法,產(chǎn)生1ms中斷調(diào)用方法

  1. SysTick_Config(SystemCoreClock / 1000); 

關(guān)于時鐘源的選擇,除了操作寄存器外,還有庫函數(shù)可以選擇。

  1. /** 
  2.   * @brief  Configures the SysTick clock source. 
  3.   * @param  SysTick_CLKSource: specifies the SysTick clock source. 
  4.   *   This parameter can be one of the following values
  5.   *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. 
  6.   *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. 
  7.   * @retval None 
  8.   */ 
  9. void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) 
  10.   /* Check the parameters */ 
  11.   assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); 
  12.   if (SysTick_CLKSource == SysTick_CLKSource_HCLK) 
  13.   { 
  14.     SysTick->CTRL |= SysTick_CLKSource_HCLK; 
  15.   } 
  16.   else 
  17.   { 
  18.     SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; 
  19.   } 

除上外,我找到了其他證據(jù)來說明,SYSTICK的時鐘可以為HCLK時鐘的1分頻或8分頻。

在STM32CubeMx配置軟件中,可以選擇1分頻或8分頻。

03修改代碼驗證

把《STM32延時的四種方法》文中涉及的代碼修改成1分頻的。

  1. void delay_ms(uint16_t nms) 
  2.   uint32_t temp
  3.   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000*nms-1; 
  4.   SysTick->VAL=0X00;//清空計數(shù)器 
  5.   SysTick->CTRL=0X01; 
  6.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 
  7.   do 
  8.   { 
  9.     temp=SysTick->CTRL;//讀取當前倒計數(shù)值 
  10.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
  11.   SysTick->CTRL=0x00; //關(guān)閉計數(shù)器 
  12.   SysTick->VAL =0X00; //清空計數(shù)器 

然后調(diào)用

  1. GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄滅LED燈                      
  2. delay_ms(500);//延時500ms 
  3. GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點亮LED燈                      
  4. delay_ms(500);//延時500ms 

就踩到另一個坑,延時不準。

原因是:此時SYSTICK時鐘頻率是120MHz的24位的倒計數(shù)定時器,也就是說一個周期,最多定時139.810125ms。不能延時500ms。

這里再更正之前的一個錯誤,如下圖

這個計數(shù)器的值,我們減去了1,這樣才更準確。需要減1的具體原因在定時器講解的文章中講解過了,不明白的同學請看《STM32基礎定時器講解》。

04總結(jié)

總結(jié):STM32官方手冊并不一定是準確的,要親自做實驗,自己動手驗證。這是個老生常談的問題,大家都知道,關(guān)鍵還在于實踐。

 

責任編輯:姜華 來源: 知曉編程
相關(guān)推薦

2022-09-26 08:26:38

軟件定時器函數(shù)

2009-11-11 10:14:10

linux定時器操作系統(tǒng)

2010-07-28 15:56:22

FlexTimer定時

2023-01-10 13:53:21

Linux定時器

2022-11-02 11:40:16

Flowable定時器流程

2009-04-12 08:51:50

Symbian諾基亞移動OS

2011-02-23 10:20:45

2013-07-29 10:10:40

TCP協(xié)議TCP定時器TCP

2023-08-02 09:26:03

軟件定時器鴻蒙

2009-06-18 11:07:17

Spring fram

2017-03-06 14:08:38

JavaScript單線程setTimeout

2021-04-18 12:12:29

systemd定時器系統(tǒng)運維

2021-06-28 06:00:11

systemd定時器系統(tǒng)運維

2023-02-28 18:09:53

Javascript定時器

2014-12-09 16:30:18

TCP定時器

2023-12-11 09:50:35

Linux定時器

2021-08-03 14:33:53

cron定時器Linux命令

2021-07-27 16:01:29

高并發(fā)定時器高性能

2021-08-26 06:29:47

STM32DWT數(shù)據(jù)觀察點觸發(fā)

2021-08-11 10:10:26

Linux定時器數(shù)組
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产96在线| 欧美一二三区 | 久久一 | 天天插天天射天天干 | 亚洲欧美日韩系列 | 国产午夜视频 | 国产精品九九九 | 国产精品久久久久久 | 午夜精品久久久久久久久久久久久 | 欧美精品91| 欧美福利影院 | 99热这里 | 欧美成人h版在线观看 | 亚洲精品电影在线观看 | 99福利视频导航 | 国产精品不卡一区 | 一区二区三区免费 | 久优草 | 久久不卡 | 亚洲一区二区在线视频 | 中文字幕一区二区在线观看 | 成人一区二区三区在线观看 | 国产精品久久久乱弄 | 久久影院一区 | www.99re| yiren22综合网成人 | 欧美影院| 香蕉91| 日本精品一区二区三区四区 | 一级欧美黄色片 | 日韩精品一区二区三区中文在线 | 狠狠综合久久av一区二区老牛 | 四色永久| 久久国产精品视频 | 国产三级 | 国产婷婷在线视频 | 91视频在线观看 | 久久久免费 | 午夜久久av| 91精品国产91久久综合桃花 | 成人在线黄色 |