日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

STM32下SysTick的一个容易发生的错误,时钟频率设置

發(fā)布時(shí)間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32下SysTick的一个容易发生的错误,时钟频率设置 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天同事測(cè)試我之前寫(xiě)的一個(gè)小程序,發(fā)生了奇怪的錯(cuò)誤,先是Uart通訊接收操作,出現(xiàn)了接收數(shù)據(jù)不全的問(wèn)題:2個(gè)字節(jié)的應(yīng)答幀,在實(shí)際運(yùn)行中只能收到1個(gè)字節(jié),導(dǎo)致程序死循環(huán)。檢查后發(fā)現(xiàn),是接收部分代碼留的延時(shí)太短,造成了芯片誤以為通訊已結(jié)束,但實(shí)際應(yīng)答幀尚未傳輸完畢。(此處接收代碼的工作模式是:當(dāng)Uart接收到1個(gè)字節(jié)后,即開(kāi)始一個(gè)定長(zhǎng)的延時(shí),該延時(shí)長(zhǎng)度與通訊波特率相關(guān),當(dāng)正常通訊還在繼續(xù)時(shí),則應(yīng)在延時(shí)結(jié)束前收到下一個(gè)字節(jié)數(shù)據(jù),如延時(shí)結(jié)束仍未收到下一個(gè)字節(jié)數(shù)據(jù),說(shuō)明當(dāng)前一幀數(shù)據(jù)已完成,可開(kāi)始對(duì)已接收數(shù)據(jù)進(jìn)行處理)

發(fā)現(xiàn)了問(wèn)題后,進(jìn)行相應(yīng)的針對(duì)性操作,對(duì)延時(shí)長(zhǎng)度進(jìn)行了增加,即解決了此問(wèn)題。但仍然覺(jué)得疑惑,因此段程序是已經(jīng)通過(guò)測(cè)試的,運(yùn)行正常,不應(yīng)突然出現(xiàn)這種奇怪的錯(cuò)誤,因此懷疑芯片自身的延時(shí)程序存在問(wèn)題。

而后此程序繼續(xù)出現(xiàn)的錯(cuò)誤證實(shí)了之前的懷疑:新出現(xiàn)的錯(cuò)誤是顯示部分程序的延時(shí)明顯不夠,因此可以斷定是延時(shí)部分出了問(wèn)題。此程序的延時(shí)功能由滴答定時(shí)器的1ms延時(shí)函數(shù)來(lái)實(shí)現(xiàn),對(duì)該函數(shù)進(jìn)行排查,果然發(fā)現(xiàn)了問(wèn)題根源。

stm32的滴答定時(shí)器設(shè)置主要有以下寄存器:

其中SysTick->CTRL寄存器包含了對(duì)滴答定時(shí)器的時(shí)鐘頻率來(lái)源設(shè)置和分頻設(shè)置。前述小程序中,采用的是STM32F107芯片,外部時(shí)鐘,工作頻率為72MHz,在此程序中,為了讓滴答定時(shí)器的工作壓力稍減,使用了8分頻的時(shí)鐘設(shè)置,計(jì)數(shù)(72000000/8000)=9000,時(shí)長(zhǎng)為1ms。代碼如下:

?

  • void SystemTick_Configuration(void)

  • {

  • RCC_ClocksTypeDef RCC_Clocks;

  • ?
  • SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

  • RCC_GetClocksFreq(&RCC_Clocks);

  • // SystTick configuration: an interrupt every 1 ms

  • if(SysTick_Config(RCC_Clocks.SYSCLK_Frequency / 8000))

  • {

  • while(1) FEED_WWDG;

  • }

  • }

  • 此程序在我的電腦編譯下是正常工作的,但在同事電腦編譯下出了問(wèn)題,滴答定時(shí)器的延時(shí)明顯縮短,原因在于core_cm3.h文件。此文件位置在C:\Keil\ARM\CMSIS\Include文件夾下,此文件中的SysTick_Config函數(shù)包含以下操作:

    ?

    ?

  • static __INLINE uint32_t SysTick_Config(uint32_t ticks)

  • {

  • if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */

  • ?
  • SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */

  • NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */

  • SysTick->VAL = 0; /* Load the SysTick Counter Value */

  • SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk |

  • SysTick_CTRL_TICKINT_Msk |

  • SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */

  • return (0); /* Function successful */

  • }


  • 此處對(duì)滴答定時(shí)器的時(shí)鐘來(lái)源進(jìn)行了操作,使其恢復(fù)了最高頻率(72MHz),不分頻:

    <pre name="code" class="cpp">SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk |

    ?

    在我的電腦上,因?yàn)閷?duì)core_cm3.h文件做了以下修改,屏蔽了其對(duì)滴答定時(shí)器時(shí)鐘的操作,所以可以正常運(yùn)行:

    SysTick->CTRL |= //SysTick_CTRL_CLKSOURCE_Msk |

    但在同事的電腦上沒(méi)有做此操作,從而導(dǎo)致了1ms延時(shí)實(shí)際只有0.125ms,于是出現(xiàn)了前述的種種錯(cuò)誤。

    ?

    解決辦法:

    1、使用滴答定時(shí)器時(shí),不再考慮減輕芯片負(fù)擔(dān),直接采用原始頻率,可以保證不會(huì)出現(xiàn)此問(wèn)題。

    2、修改文件調(diào)用指向,不調(diào)用工程外的相關(guān)頭文件,防止出現(xiàn)移植時(shí),不同電腦間,工程外文件的不同導(dǎo)致的錯(cuò)誤。

    總結(jié)

    以上是生活随笔為你收集整理的STM32下SysTick的一个容易发生的错误,时钟频率设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。