娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32片內RTC亞秒特性以及應用演示的分享

發布者:WhisperingRain最新更新時間:2024-09-04 來源: elecfans關鍵字:STM32 手機看文章 掃描二維碼
隨時隨地手機看文章

絕大多數STM32系列里的RTC都具有亞秒【或稱子秒】計數單元。為了了解亞秒特性及功能,不妨先看RTC的功能框圖。本文中的有關截圖若無特別說明均來自STM32L4系列參考手冊。

poYBAGQ6GieAQOEaAAFB4__3keE403.jpg
pYYBAGQ6Gi-AE1UnAAFCexBdT7M099.jpg

RTC的時鐘源【RTCCLK】可以是LSE、LSI或者HSE/32,由RTCCLK最終變成日歷的秒脈沖驅動信號經過了2次分頻。先經過上圖中A處的異步分頻單元,默認分頻系數是128,形成ck_apre時鐘,默認情況下該時鐘頻率為256Hz;然后該時鐘脈沖來到圖中B處的同步分頻單元,默認分頻系數為256,最終形成1Hz的秒脈沖【ck_spre】到日歷單元。關于兩分頻單元分頻系數的配置,通過對RTC_PRER寄存器的相關位編程實現。

poYBAGQ6GkKAK6boAACiM741gNw674.jpg

其中異步分頻系數配置位【PREDIV_A】有7位,同步分頻系數【PREDIV_S】有15位。另外,同步分頻單元還包括采用向下計數方式的亞秒計數器,它基于異步分頻后的時鐘ck_apre進行計數,溢出時的重裝值等于PREDIV_S。一般來講,它的一個計數周期就是1s,其計數分辨率或精度為【1/(PREDIV_S+1)】秒。與之配套的亞秒寄存器,實時記錄亞秒計數器的計數值,有效數據位乃16位,比PREDIV_S多1位,多出的1位另有它用,此處不表。

pYYBAGQ6GlaAc5OrAAEKYCvNCrM211.jpg

顯然,當有了這個亞秒計數器后,我們就可以獲得少于1秒的時間,或說秒的小數部分---亞秒,其精度由同步分頻系數PREDIV_S決定,某時刻的亞秒數通過亞秒寄存器獲取,對應的亞秒時間可以通過上圖中第2個紅色方框內的算式求得【提醒:亞秒計數器采用向下計數方式】。

關于RTC的亞秒概念及基本特性就介紹到這里。稍微小結下:

1、亞秒是對少于1秒的時間稱謂,范圍在0到1秒,并非固定的值;

2、亞秒精度【分辨率】可調,由PREDIV_S參數決定,即【1/(PREDIV_S+1)】秒;

3、亞秒寄存器【RTC_SSR】實時記錄亞秒計數器的值,具體由SS[15:0]體現;

3、亞秒時間通過算式(PREDIV_S-SS)/(PREDIV_S+1)求得;

我們知道RTC除了提供基本的日歷功能外,還有很好的低功耗特性,常用于低功耗的喚醒。有些低功耗應用場合,雖然系統需要周期性的喚醒,但對喚醒周期的一致性要求往往并不嚴格、很多時候的周期值往往遠達不到秒級,比方在10個毫秒上下、幾十個毫秒左右、100毫秒量級不等。像這種場合,我們可以考慮使用RTC的亞秒特性和ALARM功能實現周期性喚醒。

假設某STM32用戶有這樣的需求,他的系統涉及低功耗,需要周期性地做休眠與喚醒的切換。他希望系統進入休眠后每隔50±20ms的時間范圍內被喚醒,喚醒后做些基本的檢測處理后又進入休眠。要實現這個需求,對于很多帶LPTIM的STM32系列也很方便實現。

不過,今天主要想聊聊如何通過RTC來實現該需求。了解STM32的RTC的人可能知道,RTC模塊往往還自帶一個專門的16位向下計數的喚醒定時器,即下面RTC局部框圖中紅框所在單元。我這里要分享的也不是這個專用喚醒定時器,而是想基于ALARM事件和亞秒特性來實現上面需求。

pYYBAGQ6Gm2AGG9FAAFQYQ7Jhxo979.jpg

對于RTC的ALARM功能我們都不陌生,即先預設需要ALARM的時間點,當日歷時間跟設定的ALARM時間匹配時就可以觸發ALARM事件及中斷。對于ALARM時間點的報警條件可以有很多靈活的組合配置,比方我們可以設置在某月某日某時某分某秒ALARM,也可以設置在某分某秒ALARM,其它不關心,或者僅設置在某個亞秒時刻ALARM,其它不關心。

poYBAGQ6Gn-AFrXwAAFnNfyYHn4504.jpg

上圖中四種ALARM設置,灰色部分表示不關心項,即不參與日歷值與ALARM設定值相關項的比較。這里分別表示的警情時刻是:

第一種,只要日歷中跟ALARM設置的時、分、秒匹配時報警,其它不關心;

第二種,只要日歷中跟ALARM設置的分值、秒值匹配時報警,其它不關心;

第三種,只要日歷中跟ALARM設置的秒值和亞秒低3位值匹配時報警,其它不關心;

第四種,只要日歷中跟ALARM設置的亞秒的低4位值匹配時報警,其它不關心;

我們回到前面提到的需求,每隔50±20ms做喚醒,即30ms~70ms范圍內實現喚醒都可以接受。如果說使用ALARM中斷,相信很多人自然會想到,先設定一個ALARM點,等喚醒后再修改新的ALARM值,就這樣延續下去。

poYBAGQ6GpKAJVyOAAAmdBjRTOo485.jpg

這樣操作也是可以的,即每次在ALARM中斷里修改新的ALARM時間點。下圖是對ALARM值進行編程的流程【設置時先要關閉ALARM,修改ALARM值后再手動開啟ALARM單元】:

poYBAGQ6GqKAG4t2AAD1LaORre0332.jpg

不過,結合眼前的應用需求,我們可以不使用上面的做法,而是巧妙地使用RTC亞秒特性來實現周期性的ALARM以滿足需求。怎么個巧法呢?一起來看看。

先假定RTCCLK為32768Hz,RTC同步分頻系數和異步分頻系數分別為如下參數:

PREDIV_A=127,PREDIV_S=255。

pYYBAGQ6GriAFZimAACLksb3lOQ608.jpg

依據現有的分頻配置,則亞秒的時間精度或者說分辨率為(1/256)秒,3.9ms的樣子,即亞秒計數器每計1個脈沖所對應的時間就是3.9ms,算4ms吧。【記住這個數據后面要用】

談到這里,我們跳躍一下思路,換個數學話題聊聊。【注:這個地方可能有點突兀。突兀的突悟往往離不開艱辛的修行。】

這里有從0開始按照從小到大排列的一批足夠多的自然數列,按10進制展現。我們來看看幾種情形:

1、如果找出只要個位數相同的數據,仍然按照從小到大排列,每相鄰兩個數的差值一定是10。對不對?

2、如果找出只要個位數與十位數都相同的數據,仍然按照從小到大排列,每相鄰兩個數的差值一定是100。沒錯吧。

3、如果找出只要個位數與十位數以及百位數都相同的數據 仍然按照從小到大排列,每相鄰兩個數的差值一定是1000。結論也沒問題。

。。。。。。

到此,我們應該發現規律了,通過關注低幾位數相同而重新有序排列而成的相鄰數據之差即為10的幾次方,其實這里相鄰數的差值也就是原自然數列中兩個數的位置間隔。【注意關鍵詞:位數,數據,相鄰】我們可以基于下圖的一批十進制數據表格做些直觀的觀察。

pYYBAGQ6GsmAXsOSAAGRHjqhMi4969.jpg

好,我們不妨改變下數據的進制看看。還是從0開始按照從小到大排列的一批足夠多的自然數列,按2進制展現。依然看看幾種情形并得出相應結論。

1、若找出只要低1位數相同的數據,仍按照從小到大排列,每相鄰兩個數的差值一定是2;

2、若找出只要低2位數都相同的數據,仍按照從小到大排列,每相鄰兩個數的差值一定是4;

3、若找出只要低3位數都相同的數據 仍按照從小到大排列,每相鄰兩個數的差值一定是8;

其它我們可以依次類推。

同樣,我們也發現規律,通過關注二進制數的低幾位相同而重新有序排列而成的相鄰數據之差即為2的幾次方。我們可以基于下圖的一批二進制數據表格做些直觀的觀察。【橙色代表低2位相同的數據,綠色代表低3位相同的數據,紅色代表低4位相同的數據】

pYYBAGQ6GtiAKrSvAADfP5g64SY156.jpg

上面專門聊了一段純數學話題,繼續回到我們的亞秒應用問題。

我們知道,包括亞秒在內的整個日歷數據實質上是個具有高低順序和進位關系的數據,其中,亞秒是整個日歷數據里的最低端。當我們設置ALARM參數時,如果說只關注亞秒的低1位,其它都不關心。基于前面的數學話題鋪墊可知,每當出現低1位數據相同的兩個相鄰數,總是相差2個計數單位,這里就是2個計數脈沖。換言之,每隔2個計數脈沖,結合前面分析,即每隔8ms都會觸發ALARM事件。

如果說只關注亞秒的低2位,其它都不關心,那么每當出現低2位數據相同的相鄰數,總是相差4個計數單位,即4個計數脈沖。換言之,每隔4個計數脈沖,即16ms都會觸發ALARM事件。

如果只關注亞秒的低3位,其它參數都不關心,每當出現低3位數據相同的相鄰數,總是相差8個計數單位,即8個計數脈沖,每隔32ms都會觸發ALARM事件。

其它依此類推。

談到這里,設置的只關心亞秒的位數跟ALARM周期的關系應該說很清晰了。我在下面簡單羅列了基于前面條件下亞秒的關心位數與ALARM周期的對應表:【灰色表示不關心,不參與日歷值與ALARM設定值的比較,只有綠色位參與比較】

poYBAGQ6GumAAbIRAAGMq6uz57k185.jpg

現在期望的喚醒周期是50±20ms,我們配置亞秒計數器的低3位或者低4位作為ALARM的比較位【說關心位、參與位什么的都可以】,其它設置為不關心就可以滿足要求。我們不妨選擇亞秒計數值的低4位參與比較,即每兩次相鄰ALARM相差16個計數脈沖,周期約為64ms。

下面是我使用CubeMx進行的日歷和ALARMA的配置,重點看下ALARM配置。

poYBAGQ6GwCATEdvAAFCKou9yKM926.jpg

這里的ALARM配置只選擇亞秒的低4位參與比較,既然這樣其它參數就無所謂了。其中那個用于比較的亞秒值我這里寫的12,這個值寫多少并不影響ALARM周期的擬定,只會影響每次發生ALARM事件時的亞秒計數器的低4位的值。其實,當我們選定只關心亞秒計數器的低4位時,重復ALARM的周期就已經定了。

完成配置、建立工程、組織測試代碼。

我在ALARM中斷里讀取每次發生ALARM事件時的亞秒值。我截取幾個連續ALARM事件的相關信息在如下幾幅圖。其中變量Sub_Value和stime1.SubSeconds是一個東西,表示發生ALARM事件時亞秒計數器的值。比如下面各截圖中的236、220、204、188、172、156幾個數,顯然兩相鄰數的間隔保持準確的16個計數脈沖,若把這幾個數轉成2進制,他們的低4位都是1100B,即我在前面ALARM設置的亞秒比較值12。

poYBAGQ6Gy2AJPXXAAErzREEWzI139.jpg
pYYBAGQ6GzSAL8MeAAET6ayDZpM703.jpg
poYBAGQ6GzqANsmWAAEeb2LIODY396.jpg
pYYBAGQ6G0GAb1T-AAEfbe0Wdz8748.jpg
pYYBAGQ6G1OASzzRAAGKE8MZMLY567.jpg

若在每次的ALARM中斷里把發生ALARM的時間點實時打印出來,可以清晰地看到相鄰兩次ALARM事件的時間間隔固定在63ms左右,這個值跟前面規劃的基本一致。

pYYBAGQ6G2KADofaAAFBYky29_E202.jpg

有人或許會問,相鄰ALARM事件的時間差為什么沒有計數脈沖數差值那樣穩定精準。我認為主要有兩點原因,一是我測試時并沒有使用標準的32768外部時鐘,而是選擇的內部LSI,它的頻率一般在31Khz到33KHz之間,不像LSE那么精準。還有一個原因,在做亞秒時間計算時,因為無法整除原因肯定會帶來計算偏差。

利用上面方法可以省去每次修改ALARM配置的操作,類似這種具有周期性且周期不大于1秒的應用都可以嘗試考慮上述方法,必要的時候可以考慮調整同步分頻系數即亞秒計數器的重裝值以滿足具體的時間精度要求。當然,調整同步分頻系數的同時往往要調整異步分頻系數,原則上異步分頻系數要盡量大以充分降低RTC模塊帶來的功耗,具體應用時我們可以綜合考慮后再做調整。


關鍵字:STM32 引用地址:STM32片內RTC亞秒特性以及應用演示的分享

上一篇:基于STM32單片機的酒精濃度檢測系統設計
下一篇:按鍵控制串口發送數據的STM32實例

推薦閱讀最新更新時間:2025-04-15 21:03

stm32中主頻的超頻實驗
在正常的32開發板中,一般主頻都是72MHz,這是通過代碼配置好的,下面我們就來學習如何把開發板的主頻配置為72MHz,以及超過72Mhz。 目標:通過本次實驗了解如何通過代碼配置stm32開發板的時鐘主頻。 一、找到配置主頻為72MHz的代碼: 1先打開任意一個工程,然后在該工程的CORE文件夾下下找到.s文件,也就是啟動文件。2在啟動文件中找到SystemInit();這個函數,進入這個函數,然后再這個函數中找到SetSysClock();這個函數,并進入。在SetSysClock();函數中找到SetSysClockTo72();這個函數,并進入。然后就可以看到在SetSysClockTo72()函數下的直接操作
[單片機]
STM32點亮小燈的程序和方法
STM32點亮小燈(庫函數版) 首先解釋以下 #ifndef _LED_H #ifndef _LED_H ...... ...... #endif 避免重復引用頭文件的內容。 一般放在頭文件里面,作用就是以防你在.c文件里面不小心重復包含頭文件的時候不會報錯 搞起來,搞起來。玩32其實點個燈是很難的,不像51,arduino等單片機 首先定義led庫 /******聲明led庫,防止在主函數中被重復調用*****/ #ifndef __LED_H #define __LED_H void LED_Init(void); #endif 定義led.c文件 #include led.h #include stm32f10x.
[單片機]
stm32RTC
1、stm32f10x_it.c文件 /******************************************************************************* * Function Name : RTC_IRQHandler RTC中斷 * Description : * Input : None * Output : None * Return : None *******************************************************************************/ extern volatile bool S
[單片機]
<font color='red'>stm32</font>之<font color='red'>RTC</font>
我的STM32從菜鳥到牛人的學習步驟
1.首先我們先看看與STM32相關的文檔 我們假定大家已經對STM32的書籍或者文檔有一定的理解。如不理解,請立即閱讀STM32的文檔,以獲取最基本的知識點。如果你手上擁有ST官方主推的STM32神舟系列的板子,那么光盤都會配好這些文檔,STM32的學習與ARM9的學習有一個很大的區別。ARM9的學習一般是需要購買書籍的。比如三星的S3C2440,官方的文檔都是英文的,大部分工程師只能去看國內出版的書籍。英文好的同學,請不要以為你很牛,可以只看英文文檔。畢竟你是中國人,你最熟悉的,理解最好的還是中文。看英文的速度還是比看中文慢一些,我們要的是最短的時間,而不是追求短時間內記住所有細節。當然,如果是一篇論文,建議看英文原版還是有好處
[單片機]
STM32 MCU的技術特點和應用前景
引言: 隨著物聯網和智能家居的快速發展,微控制器單元(Microcontroller Unit,MCU)在各種電子產品和系統中扮演著重要角色。作為一種高度集成的芯片,MCU結合了中央處理器(Central Processing Unit,CPU)、隨機存取存儲器(Random Access Memory,RAM)、Flash存儲器以及其他周邊設備。本文將介紹STM32 MCU的技術特點和應用前景。 一、STM32 MCU概述: STM32系列微控制器是由意法半導體(STMicroelectronics)公司開發的。該系列MCU基于ARM Cortex-M內核,具有高性能、低功耗、高集成度和易用性等特點。它們廣泛應用于汽車、醫療
[單片機]
STM32的ADC詳解和代碼設計
01ADC簡介 ADC是Analog-to-DigitalConverter的縮寫。指模/數轉換器或者模擬/數字轉換器。是指將連續變量的模擬信號轉換為離散的數字信號的器件。典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。 從STM32F207的數據手冊中下圖看到,STM32F207VC有3個精度為12bit的ADC控制器,有16個外部通道,而144腳的STM32F207Zx和176腳的STM32F207Ix因為帶PF腳,所以多8個通道,為24個外部通道。各通道的A/D轉換可以單次、連續、掃描或間斷執行,ADC轉換的結果可以左對齊或右對齊儲存在16位數據寄存器中。 02STM32的ADC外設 上面說到,ST
[單片機]
<font color='red'>STM32</font>的ADC詳解和代碼設計
STM32單片機中的獨立看門狗與窗口看門狗有哪些不同之處
1.關于看門狗的解釋不再說明,窗口看門狗簡而言之即只能看某個窗口期即某段時間內才能夠喂狗。32的獨立看門狗是沒有中斷的,而窗口看門狗可根據需要配置中斷 2.關于獨立看門狗和窗口看門狗的應用,手冊p316 即17.1節講的非常清楚。首先獨立看門狗和窗口看門狗都可用來監視軟件程序是否正常運行,而具體而言,因為獨立看門狗獨立于系統時鐘單獨運行,因此其可用來監視是否發生了硬件錯誤,比如說系統時鐘故障,看門狗仍然能夠起到重啟的作用,但是獨立看門狗的計時精度比較差,更多的應用在獨立系統運行之外的對計時要求低的地方。而窗口看門狗是由系統時鐘提供的,因此其計時也會很準確,當然其也就只能用來檢測軟件故障,比如硬件故障系統時鐘壞了,自身也就不動了,也
[單片機]
使用LLVM-embedded-toolchain-for-Arm-17.0.1開發STM32
LLVM-embedded-toolchain-for-Arm 是一個 ARM 公司開源的適用于 32 位ARM芯片的工具鏈,支持多種ARM指令集架構,包括最新的 CM85 內核。由于是基于 LLVM 和 picolibc構建出的工具鏈,因此在代碼體積和執行效率上都很有競爭力,甚至可以和商用閉源的工具鏈進行 PK。 支持的架構 Armv6-M Armv7-M Armv7E-M Armv8-M Mainline Armv8.1-M Mainline Armv4T (experimental) Armv5TE (experimental) Armv6 (experimental, using the Armv5TE library v
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 淅川县| 开平市| 连山| 铜鼓县| 栾川县| 都昌县| 余干县| 琼海市| 临湘市| 上蔡县| 二连浩特市| 阿克陶县| 昆明市| 安化县| 维西| 上饶县| 金溪县| 水富县| 黑山县| 万盛区| 长岭县| 安龙县| 大宁县| 来安县| 延川县| 凌海市| 长寿区| 剑川县| 门源| 永定县| 台江县| 长武县| 通河县| 浠水县| 拉萨市| 香格里拉县| 南和县| 利津县| 武定县| 玛曲县| 库尔勒市|