prettyprint

2020年12月3日 星期四

STM32F103C8T6 Blue Pill and Black Pill開發板RTC模組精準度與校正探討

 本實驗主要探討STM32F103C8T6 RTC模組在使用不同Clock source精準度探討,並比較兩種常用開發版(Blue Pill 與 Black Pill)的差異。

參考資料AN2604 Application note: STM32F101xx and STM32F103xx RTC calibration

使用元件:

  1. STM32F103C8T6 Blue Pill x1
  2. STM32F103C8T6 Black Pill x1
測量模組:
  1. 使用STM32F103C8T6 TIMER Input Capture 偵測輸入方波的頻率與寬度(https://rfwumcu.blogspot.com/2020/11/stm32f103c8t6-timer-input-capture.html)
實作影片:




實驗步驟:
  • 測量兩種開發板不同RTC Clock Source(LSE, HSE, LSI)的頻率。
        RTC可使用三種時鐘來源:外部震盪器RTC_HSE(8M Hz/128=62.5K Hz)、LSE(32.768K Hz)與內部RC震盪器LSI(40K Hz)。



STM32CubeIDE RCC設定畫面要開啟HSE與LSE



RTC開啟RTC OUT,把PC13接到測量模組。此時測得的頻率為除64的值。

因為Blue Pill開發板,PC13接到板子內建的LED,因此當選用LSE clock source測量數值一直大幅飄動,當把板子上的LED移除掉,則可測到穩定值。

實驗數值影片
Blue Pill
HSE clock source



LSE clock source
未移除PC13 LED


移除PC13 LED


LSI  clock source




Black Pill
HSE clock source


LSE clock source





LSI  clock source



實驗結果
Blue Pill:
  • HSE clock source:平均為976.63525,HSE clock frequency = 976.63525x64=62504.656,推算每天約快6.4秒。
  • LSE clock source: 如影片平均值為511.9952,所以LSE clock 頻率為5111.9952x64=32767.6928,推算每天約慢0.81秒。
  • LSI clock source:平均為598.9092,LSI clock frequency=598.9092x64=38330.1888,推算每天約慢3606秒。

Black Pill:
  • HSE clock source:平均為976.62185,HSE clock frequency = 976.62185x64=62503.7984,推算每天約快5.2秒。
  • LSE clock source: 如影片平均值為512.0005,所以LSE clock 頻率為512.0005x64=32768.032,推算每天約慢0.08秒。
  • LSI clock source:平均為624.6267,LSI clock frequency=624.6267x64=40104.1088,推算每天約快224秒。
由以上結果RTC Clock Source以LSE最精確(獨立32.768KHz震盪器),其次HSE,再其次LSI。本次實驗用的開發板Black Pill也比Blue Pill較精確。分別以兩塊開發板在「使用STM32F103C8T6 RTC 實作時鐘、鬧鐘」文章中實作也驗證以上結果。但特別聲明並不代表所有black pill開發版RTC clock就比Blue pill 精確,只是針對本次實驗用的這兩塊板子的比較

時間校正
STM32F10xxx使用數位校正線路,在每2^20 clock cycles移除0~127cycles,以達到正確的clock cycles,因此只能調慢,像本實驗的Blue pill clock(32,767.6928)就比較慢(32,768),因此必須使用prescale將時間變快後,再移除一些clock cycles。

Blue Pill調整參數,選用LSE clock source,


prescale為32767,因此
hrtc.Init.AsynchPrediv = 32767-1;
計算每30天快幾秒:
((32767.6928/32767)-1)*86400*30=54.79
或假設需移除的cycles為C,每秒需移除32767.6928-32767=0.6928 cycles。
所以(C/2^20)*32767=0.6928,所以C=22.17


因此Calibration value為22,在RTC_Init()加入HAL_RTCEx_SetSmoothCalib(&hrtc, 0, 0, 22);指令。

Black Pill調整參數,選用LSE clock source,
hrtc.Init.AsynchPrediv =RTC_AUTO_1_SECOND
((32768.032/32768)-1)*86400*30=2.5,Calibration value為1,在RTC_Init()加入HAL_RTCEx_SetSmoothCalib(&hrtc, 0, 0, 1);指令。

簡易時間校正規則:
前述方法測量RTC OUT的頻率,可能因為所使用自製測量模組本身震盪器精確度或所使用的杜邦線線材品質可能會有誤差。簡易的方法以觀察一段時間記錄總時間誤差,再設定hrtc.Init.AsynchPrediv與查AN2604 Application note table 1設定Calibration value來做校正。
例如,30天38秒,查表最接近為37秒,Calibration value=15。
若30天60秒,推算LSE頻率f`, ((f/32768)-1)*86400*30=-60, f=32767.234,
設定hrtc.Init.AsynchPrediv=32767-1,則30天就會快((32767.234/32767)-1)*86400*30=18.50,查表Calibration value=7。