偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[390601]]

本文主要來(lái)填坑,更正之前文章的錯(cuò)誤。也進(jìn)一步加深了我對(duì)SysTick定時(shí)器的理解,希望對(duì)你有幫助。

01坑的由來(lái)

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

  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;//清空計(jì)數(shù)器 
  5.   SysTick->CTRL=0X01;//使能,減到零是無(wú)動(dòng)作,采用外部時(shí)鐘源 
  6.   do 
  7.   { 
  8.     temp=SysTick->CTRL;//讀取當(dāng)前倒計(jì)數(shù)值 
  9.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時(shí)間到達(dá) 
  10.   SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器 
  11.   SysTick->VAL =0X00; //清空計(jì)數(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;//清空計(jì)數(shù)器 
  16.   SysTick->CTRL=0X01;//使能,減到零是無(wú)動(dòng)作,采用外部時(shí)鐘源 
  17.   do 
  18.   { 
  19.     temp=SysTick->CTRL;//讀取當(dāng)前倒計(jì)數(shù)值 
  20.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時(shí)間到達(dá) 
  21.   SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器 
  22.   SysTick->VAL =0X00; //清空計(jì)數(shù)器 

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

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

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

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

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

我在學(xué)習(xí)RTThread的時(shí)候,看到配置SysTick定制器代碼如下

我心里一堆問(wèn)號(hào),STM32官方手冊(cè),明明寫(xiě)了SYSTICK的時(shí)鐘固定為HCLK時(shí)鐘的1/8。我使用示波器測(cè)量,RTThread的配置是沒(méi)有問(wèn)題,可以正常延時(shí)的。

02填坑

這個(gè)坑其實(shí)很簡(jiǎn)單,在《STM32延時(shí)的四種方法》也提到了,只是自己沒(méi)有注意這個(gè)細(xì)節(jié)。

位2置1,表示時(shí)鐘頻率為AHB,也就是默認(rèn)的120000000Hz。

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

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

之前的文章配置為外部時(shí)鐘源


這個(gè)細(xì)節(jié)我沒(méi)有留意,導(dǎo)致我看RTThread代碼時(shí)有點(diǎn)懵逼。在這里我更正《STM32延時(shí)的四種方法》中的錯(cuò)誤描述

準(zhǔn)確的描述是:

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

特此更正。

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

  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í)鐘源的選擇,除了操作寄存器外,還有庫(kù)函數(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ù)來(lái)說(shuō)明,SYSTICK的時(shí)鐘可以為HCLK時(shí)鐘的1分頻或8分頻。

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

03修改代碼驗(yàn)證

把《STM32延時(shí)的四種方法》文中涉及的代碼修改成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;//清空計(jì)數(shù)器 
  5.   SysTick->CTRL=0X01; 
  6.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 
  7.   do 
  8.   { 
  9.     temp=SysTick->CTRL;//讀取當(dāng)前倒計(jì)數(shù)值 
  10.   }while((temp&0x01)&&(!(temp&(1<<16))));//等待時(shí)間到達(dá) 
  11.   SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器 
  12.   SysTick->VAL =0X00; //清空計(jì)數(shù)器 

然后調(diào)用

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

就踩到另一個(gè)坑,延時(shí)不準(zhǔn)。

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

這里再更正之前的一個(gè)錯(cuò)誤,如下圖

這個(gè)計(jì)數(shù)器的值,我們減去了1,這樣才更準(zhǔn)確。需要減1的具體原因在定時(shí)器講解的文章中講解過(guò)了,不明白的同學(xué)請(qǐng)看《STM32基礎(chǔ)定時(shí)器講解》。

04總結(jié)

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

 

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

2022-09-26 08:26:38

軟件定時(shí)器函數(shù)

2009-11-11 10:14:10

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

2010-07-28 15:56:22

FlexTimer定時(shí)

2009-04-12 08:51:50

Symbian諾基亞移動(dòng)OS

2011-02-23 10:20:45

2013-07-29 10:10:40

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

2023-01-10 13:53:21

Linux定時(shí)器

2022-11-02 11:40:16

Flowable定時(shí)器流程

2023-08-02 09:26:03

軟件定時(shí)器鴻蒙

2025-06-27 09:11:08

2023-02-28 18:09:53

Javascript定時(shí)器

2014-12-09 16:30:18

TCP定時(shí)器

2021-06-28 06:00:11

systemd定時(shí)器系統(tǒng)運(yùn)維

2009-06-18 11:07:17

Spring fram

2021-04-18 12:12:29

systemd定時(shí)器系統(tǒng)運(yùn)維

2017-03-06 14:08:38

JavaScript單線程setTimeout

2023-12-11 09:50:35

Linux定時(shí)器

2018-11-02 08:10:58

Linuxsystemd定時(shí)器

2012-08-07 09:27:40

JavaScript

2011-09-05 17:40:40

MTK定時(shí)器
點(diǎn)贊
收藏

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