RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32片內(nèi)RTC亞秒特性的應(yīng)用示例(下)

麥辣雞腿堡 ? 來(lái)源:茶話MCU ? 作者:茶話MCU ? 2023-04-30 16:32 ? 次閱讀

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

wKgaomRGPgKAAKq1AAFdkegNFDI859.png

對(duì)于RTC的ALARM功能我們都不陌生,即先預(yù)設(shè)需要ALARM的時(shí)間點(diǎn),當(dāng)日歷時(shí)間跟設(shè)定的ALARM時(shí)間匹配時(shí)就可以觸發(fā)ALARM事件及中斷。對(duì)于ALARM時(shí)間點(diǎn)的報(bào)警條件可以有很多靈活的組合配置,比方我們可以設(shè)置在某月某日某時(shí)某分某秒ALARM,也可以設(shè)置在某分某秒ALARM,其它不關(guān)心,或者僅設(shè)置在某個(gè)亞秒時(shí)刻ALARM,其它不關(guān)心。

wKgZomRGPjaANn7HAAEenu_w_gM115.png

上圖中四種ALARM設(shè)置,灰色部分表示不關(guān)心項(xiàng),即不參與日歷值與ALARM設(shè)定值相關(guān)項(xiàng)的比較。這里分別表示的警情時(shí)刻是:

第一種,只要日歷中跟ALARM設(shè)置的時(shí)、分、秒匹配時(shí)報(bào)警,其它不關(guān)心;

第二種,只要日歷中跟ALARM設(shè)置的分值、秒值匹配時(shí)報(bào)警,其它不關(guān)心;

第三種,只要日歷中跟ALARM設(shè)置的秒值和亞秒低3位值匹配時(shí)報(bào)警,其它不關(guān)心;

第四種,只要日歷中跟ALARM設(shè)置的亞秒的低4位值匹配時(shí)報(bào)警,其它不關(guān)心;

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

這樣操作也是可以的,即每次在ALARM中斷里修改新的ALARM時(shí)間點(diǎn)。下圖是對(duì)ALARM值進(jìn)行編程的流程【設(shè)置時(shí)先要關(guān)閉ALARM,修改ALARM值后再手動(dòng)開(kāi)啟ALARM單元】:

不過(guò),結(jié)合眼前的應(yīng)用需求,我們可以不使用上面的做法,而是巧妙地使用RTC亞秒特性來(lái)實(shí)現(xiàn)周期性的ALARM以滿足需求。怎么個(gè)巧法呢?一起來(lái)看看。

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

PREDIV_A=127,PREDIV_S=255。

依據(jù)現(xiàn)有的分頻配置,則亞秒的時(shí)間精度或者說(shuō)分辨率為(1/256)秒,3.9ms的樣子,即亞秒計(jì)數(shù)器每計(jì)1個(gè)脈沖所對(duì)應(yīng)的時(shí)間就是3.9ms,算4ms吧?!居涀∵@個(gè)數(shù)據(jù)后面要用】

談到這里,我們跳躍一下思路,換個(gè)數(shù)學(xué)話題聊聊?!咀ⅲ哼@個(gè)地方可能有點(diǎn)突兀。突兀的突悟往往離不開(kāi)艱辛的修行?!?/p>

這里有從0開(kāi)始按照從小到大排列的一批足夠多的自然數(shù)列,按10進(jìn)制展現(xiàn)。我們來(lái)看看幾種情形:

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

2、如果找出只要個(gè)位數(shù)與十位數(shù)都相同的數(shù)據(jù),仍然按照從小到大排列,每相鄰兩個(gè)數(shù)的差值一定是100。沒(méi)錯(cuò)吧。

3、如果找出只要個(gè)位數(shù)與十位數(shù)以及百位數(shù)都相同的數(shù)據(jù) 仍然按照從小到大排列,每相鄰兩個(gè)數(shù)的差值一定是1000。結(jié)論也沒(méi)問(wèn)題。

。。。。。。

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

wKgaomRGPlGAXl4vAAGJR1WuUlI005.png

好,我們不妨改變下數(shù)據(jù)的進(jìn)制看看。還是從0開(kāi)始按照從小到大排列的一批足夠多的自然數(shù)列,按2進(jìn)制展現(xiàn)。依然看看幾種情形并得出相應(yīng)結(jié)論。

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

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

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

其它我們可以依次類推。

同樣,我們也發(fā)現(xiàn)規(guī)律,通過(guò)關(guān)注二進(jìn)制數(shù)的低幾位相同而重新有序排列而成的相鄰數(shù)據(jù)之差即為2的幾次方。我們可以基于下圖的一批二進(jìn)制數(shù)據(jù)表格做些直觀的觀察?!境壬淼?位相同的數(shù)據(jù),綠色代表低3位相同的數(shù)據(jù),紅色代表低4位相同的數(shù)據(jù)】

wKgaomRGPmuAe-GuAAE3dai9Eoo329.png

上面專門聊了一段純數(shù)學(xué)話題,繼續(xù)回到我們的亞秒應(yīng)用問(wèn)題。

我們知道,包括亞秒在內(nèi)的整個(gè)日歷數(shù)據(jù)實(shí)質(zhì)上是個(gè)具有高低順序和進(jìn)位關(guān)系的數(shù)據(jù),其中,亞秒是整個(gè)日歷數(shù)據(jù)里的最低端。當(dāng)我們?cè)O(shè)置ALARM參數(shù)時(shí),如果說(shuō)只關(guān)注亞秒的低1位,其它都不關(guān)心?;谇懊娴臄?shù)學(xué)話題鋪墊可知,每當(dāng)出現(xiàn)低1位數(shù)據(jù)相同的兩個(gè)相鄰數(shù),總是相差2個(gè)計(jì)數(shù)單位,這里就是2個(gè)計(jì)數(shù)脈沖。換言之,每隔2個(gè)計(jì)數(shù)脈沖,結(jié)合前面分析,即每隔8ms都會(huì)觸發(fā)ALARM事件。

如果說(shuō)只關(guān)注亞秒的低2位,其它都不關(guān)心,那么每當(dāng)出現(xiàn)低2位數(shù)據(jù)相同的相鄰數(shù),總是相差4個(gè)計(jì)數(shù)單位,即4個(gè)計(jì)數(shù)脈沖。換言之,每隔4個(gè)計(jì)數(shù)脈沖,即16ms都會(huì)觸發(fā)ALARM事件。

如果只關(guān)注亞秒的低3位,其它參數(shù)都不關(guān)心,每當(dāng)出現(xiàn)低3位數(shù)據(jù)相同的相鄰數(shù),總是相差8個(gè)計(jì)數(shù)單位,即8個(gè)計(jì)數(shù)脈沖,每隔32ms都會(huì)觸發(fā)ALARM事件。

其它依此類推。

談到這里,設(shè)置的只關(guān)心亞秒的位數(shù)跟ALARM周期的關(guān)系應(yīng)該說(shuō)很清晰了。我在下面簡(jiǎn)單羅列了基于前面條件下亞秒的關(guān)心位數(shù)與ALARM周期的對(duì)應(yīng)表:【灰色表示不關(guān)心,不參與日歷值與ALARM設(shè)定值的比較,只有綠色位參與比較】

現(xiàn)在期望的喚醒周期是50±20ms,我們配置亞秒計(jì)數(shù)器的低3位或者低4位作為ALARM的比較位【說(shuō)關(guān)心位、參與位什么的都可以】,其它設(shè)置為不關(guān)心就可以滿足要求。我們不妨選擇亞秒計(jì)數(shù)值的低4位參與比較,即每?jī)纱蜗噜廇LARM相差16個(gè)計(jì)數(shù)脈沖,周期約為64ms。

下面是我使用CubeMx進(jìn)行的日歷和ALARM A的配置,重點(diǎn)看下ALARM配置。

wKgaomRGPoOADowbAAJnSgIJbb0007.png

這里的ALARM配置只選擇亞秒的低4位參與比較,既然這樣其它參數(shù)就無(wú)所謂了。其中那個(gè)用于比較的亞秒值我這里寫的12,這個(gè)值寫多少并不影響ALARM周期的擬定,只會(huì)影響每次發(fā)生ALARM事件時(shí)的亞秒計(jì)數(shù)器的低4位的值。其實(shí),當(dāng)我們選定只關(guān)心亞秒計(jì)數(shù)器的低4位時(shí),重復(fù)ALARM的周期就已經(jīng)定了。

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

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

若在每次的ALARM中斷里把發(fā)生ALARM的時(shí)間點(diǎn)實(shí)時(shí)打印出來(lái),可以清晰地看到相鄰兩次ALARM事件的時(shí)間間隔固定在63ms左右,這個(gè)值跟前面規(guī)劃的基本一致。

有人或許會(huì)問(wèn),相鄰ALARM事件的時(shí)間差為什么沒(méi)有計(jì)數(shù)脈沖數(shù)差值那樣穩(wěn)定精準(zhǔn)。我認(rèn)為主要有兩點(diǎn)原因,一是我測(cè)試時(shí)并沒(méi)有使用標(biāo)準(zhǔn)的32768外部時(shí)鐘,而是選擇的內(nèi)部LSI,它的頻率一般在31Khz到33KHz之間,不像LSE那么精準(zhǔn)。還有一個(gè)原因,在做亞秒時(shí)間計(jì)算時(shí),因?yàn)闊o(wú)法整除原因肯定會(huì)帶來(lái)計(jì)算偏差。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

    355731
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    538

    瀏覽量

    66461
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    轉(zhuǎn):XMEGA學(xué)習(xí)記錄——抽筋扒皮徹查內(nèi)RTC32

    _get_time();---------------------------------------------------------------------------------------------------簡(jiǎn)單測(cè)試一,讀到的RTC32計(jì)數(shù)器的值為0xC0
    發(fā)表于 07-28 15:04

    介紹一STM32內(nèi)FLASH

    STM32內(nèi)FLASH可分為哪幾類?STM32內(nèi)FLASH有何功能?
    發(fā)表于 11-03 07:57

    STM32RTC簡(jiǎn)介

    STM32RTC學(xué)習(xí)筆記Mcu:STM32F103RBT61、RTC簡(jiǎn)介RTC(Real Time Clock)實(shí)時(shí)時(shí)鐘,是
    發(fā)表于 03-01 06:47

    具有帶32位喚醒計(jì)數(shù)器的RTC的超低MCU有哪些

    我目前正在使用 STM32WLE5CC MCU,它具有帶 32 位喚醒計(jì)數(shù)器的 RTC 的強(qiáng)大功能,但我的其他非 lorawan 項(xiàng)目需要一個(gè)低成本的 MCU,它也需要這個(gè)“帶 3
    發(fā)表于 12-02 06:14

    如何實(shí)現(xiàn)STM32 RTC時(shí)間之間的差異在10左右?

    我使用評(píng)估板 RTC_timestamp 示例運(yùn)行:en.stm32cubeh7\STM32Cube_FW_H7_V1.3.0\Projects\S
    發(fā)表于 01-11 06:46

    RTC 計(jì)不均勻

    STM32F103RCT6的RTC 計(jì)不均勻
    發(fā)表于 12-07 18:13 ?0次下載

    STM32F10x _RTC中斷

    STM32F10x_RTC中斷
    的頭像 發(fā)表于 03-25 11:39 ?3216次閱讀
    <b class='flag-5'>STM32</b>F10x _<b class='flag-5'>RTC</b><b class='flag-5'>秒</b>中斷

    STM32F1_ 內(nèi)FLASH編程

    STM32F1_內(nèi)FLASH編程
    的頭像 發(fā)表于 04-08 10:28 ?3895次閱讀
    <b class='flag-5'>STM32</b>F1_ <b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>FLASH編程

    STM32開(kāi)發(fā) -- RTC詳解

    RTC實(shí)時(shí)時(shí)鐘部分,之前也是有講到過(guò)的。Hi3516A開(kāi)發(fā)–RTC電路接下來(lái)看一STM32RTC該怎么配置一、
    發(fā)表于 11-30 13:06 ?27次下載
    <b class='flag-5'>STM32</b>開(kāi)發(fā) -- <b class='flag-5'>RTC</b>詳解

    STM32F030低溫RTC不工作

    STM32F030低溫RTC不工作
    發(fā)表于 12-09 09:21 ?19次下載
    <b class='flag-5'>STM32</b>F030低溫<b class='flag-5'>下</b><b class='flag-5'>RTC</b>不工作

    STM32F1 使用easyflash操作內(nèi)flash

    STM32F1 使用easyflash操作內(nèi)flash
    發(fā)表于 12-09 10:06 ?15次下載
    <b class='flag-5'>STM32</b>F1 使用easyflash操作<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>flash

    STM32內(nèi)RTC特性以及應(yīng)用演示的分享

    絕大多數(shù)STM32系列里的RTC都具有【或稱子】計(jì)數(shù)單元。為了了解
    的頭像 發(fā)表于 04-15 11:27 ?2751次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>RTC</b><b class='flag-5'>亞</b><b class='flag-5'>秒</b><b class='flag-5'>特性</b>以及應(yīng)用演示的分享

    STM32內(nèi)RTC特性的應(yīng)用示例(上)

    絕大多數(shù)STM32系列里的RTC都具有【或稱子】計(jì)數(shù)單元。為了了解
    的頭像 發(fā)表于 04-30 16:28 ?944次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>RTC</b><b class='flag-5'>亞</b><b class='flag-5'>秒</b><b class='flag-5'>特性</b>的應(yīng)用<b class='flag-5'>示例</b>(上)

    STM32系列里RTC特性及功能(上)

    絕大多數(shù)STM32系列里的RTC都具有【或稱子】計(jì)數(shù)單元。為了了解
    的頭像 發(fā)表于 06-21 15:53 ?2938次閱讀
    <b class='flag-5'>STM32</b>系列里<b class='flag-5'>RTC</b>的<b class='flag-5'>亞</b><b class='flag-5'>秒</b><b class='flag-5'>特性</b>及功能(上)

    STM32系列里RTC特性及功能(

    ,就這樣延續(xù)下去。 這樣操作也是可以的,即每次在ALARM中斷里修改新的ALARM時(shí)間點(diǎn)。下圖是對(duì)ALARM值進(jìn)行編程的流程【設(shè)置時(shí)先要關(guān)閉ALARM,修改ALARM值后再手動(dòng)開(kāi)啟ALARM單元】: 不過(guò),結(jié)合眼前的應(yīng)用需求,我們可以不使用上面的做法,而是巧妙地使用RTC
    的頭像 發(fā)表于 06-21 15:56 ?1454次閱讀
    RM新时代网站-首页