嵌入式筆記5.1 定時器詳解

一只心耳發表於2024-06-06

目錄
  • 一、SysTick——系統節拍定時器
    • 1. 資訊介紹
    • 2. 功能介紹(工作模式)
    • 3. 暫存器介紹
    • 4. 使用方式
    • 5. 其他資訊
  • 二、RTC——實時時鐘
    • 1. 資訊介紹
    • 2. 暫存器詳解
      • 0. 暫存器地址
      • 1. RTC 時間暫存器(RTC_TR)
      • 2. RTC 日期暫存器(RTC_DR)
      • 3. RTC 亞秒暫存器(RTC_SSR)
      • 4. RTC 初始化控制和狀態暫存器(RTC_ICSR)
      • 5. RTC 預分頻器暫存器(RTC_PRER)
      • 6. RTC 喚醒定時器暫存器(RTC_WUTR)
      • 7. RTC 控制暫存器(RTC_CR)
      • 8. RTC 防寫暫存器(RTC_WPR)
      • 9. RTC 校準暫存器(RTC_CALR)
      • 10. RTC 移位控制暫存器(RTC_SHIFTR)
      • 11. RTC 時間戳時間暫存器(RTC_TSTR)
      • 12. RTC 時間戳日期暫存器(RTC_TSDR)
      • 13. RTC時間戳亞秒暫存器(RTC_TSSSR)
      • 14. RTC 鬧鐘 A 暫存器(RTC_ALRMAR)
      • 15. RTC 鬧鐘 A 亞秒暫存器(RTC_ALRMASSR)
      • 16. RTC 鬧鐘 B 暫存器(RTC_ALRMBR)
      • 17. RTC 鬧鐘 B 亞秒暫存器(RTC_ALRMBSSR)
      • 18. RTC 狀態暫存器(RTC_SR)
      • 19. RTC 遮蔽中斷狀態暫存器(RTC_MISR)
      • 20. RTC 狀態清除暫存器(RTC_SCR)
    • 3. RTC 中斷
      • RTC_WKUP_IRQHandler - 實時時鐘 (RTC) 喚醒中斷
      • RTC_Alarm_IRQHandler - RTC 鬧鐘事件中斷
      • 配置示例
  • 三、TIM——定時器
    • TIM 地址
    • 基本定時器資訊(TIM6/TIM7)
      • 功能框圖
      • 功能特性
    • 通用定時器資訊(TIM2/TIM3/TIM15/TIM16)
      • TIM2/TIM3
        • 功能框圖
        • 功能特性
      • TIM15
        • 功能框圖
        • 功能特性
      • TIM16
        • 功能框圖
        • 功能特性
    • 高階定時器資訊(TIM1)
      • 功能框圖
      • 功能:
    • 常用功能介紹
      • 定時器同步或級聯
      • 輸出比較
        • 計算公式
        • 輸出比較模式
        • 輸出極性:
      • 輸入捕獲

一、SysTick——系統節拍定時器

1. 資訊介紹

​ SysTick 是 Cortex 核心外設,內嵌在在 NVIC 中,屬於 NVIC 的一部分,且可以產生 SysTick 異常(異常型別 #15)。

​ SysTick 為簡單的 24bit 向下遞減的計數器,可以使用處理器時鐘或外部參考時鐘(通常是片上時鐘源)。

​ SysTick 主要用於週期性的定期觸發 OS 核心,如用於任務管理和上下文切換,處理器也可以在不同時間片內處理不同任務。處理器設計還需要確保執行在非特權等級的應用任務無法禁止該定時器。之所以在處理器內增加一個定時器,是為了提高軟體的可移植性,便於使用 SysTick 的作業系統在不同具有 MCU 中應用。

2. 功能介紹(工作模式)

SysTick 定時器簡單框圖:

嵌入式筆記5.1 定時器詳解

​ SysTick 內部包含一個 24 位向下計數器,它會根據處理器時鐘或一個參考時鐘訊號來減小計數。

​ 在設定控制和狀態暫存器的第 0 位使能該計數器後,當前值暫存器在每個處理器時鐘週期或參考時鐘的上升沿都會減小。若計數減至 0,它會從重載入暫存器中載入數值並繼續執行。

​ SysTick 校準值暫存器為軟體提供了校準資訊。由於 CMSIS-Core 提供了一個名為 SystemCoreCIock 的軟體變數,因此就未使用 SysTick 校準值暫存器。系統初始化函式 Systemlnit() 函式設定了該變數,而且每次系統時鐘配置改變時都要對其進行更新。這種軟體手段比利用 SysTick 校準值暫存器的硬體方式更靈活。

3. 暫存器介紹

SysTick 定時器只有 4 個暫存器(還有一個沒用,結構十分簡單),都位於系統控制空間(SCS)中,具體地址見下表:

地址 CMSIS-Core 符號 暫存器
0xE000E010 SysTick->CTRL SysTick 控制和狀態暫存器
0xE000E014 SysTick->LOAD SysTick 重灌載值暫存器
0xE000E018 SysTick->VAL SysTick 當前值暫存器
0xE000E01C SysTick->CALIB SysTick 校準值暫存器
  • SYSTICK 控制和狀態暫存器(0xE000E010)
名稱 型別 復位值 描述
16 COUNTFLAG RO 0 當 SYSTICK 定時器計數到 0 時,該位變為 1,讀取暫存器或清除計數器當前值時會被清零
2 CLKSOURCE R/W 0 0 = 外部參考時鐘(STCLK)
1 = 使用核心時鐘
1 TICKINT R/W 0 1 = SYSTICK 定時器計數減至 0 時產生異常
0 = 不產生異常(NVIC)(異常使能)
0 ENABLE R/W 0 SYSTICK 定時器使能
嵌入式筆記5.1 定時器詳解
  • SYSTICK 重灌載值暫存器(0xE000E014)
名稱 型別 復位值 描述
23:0 RELOAD R/W 未定義 定時器計數位 0 時的重灌載值
嵌入式筆記5.1 定時器詳解
  • SYSTICK 當前值暫存器(0xE000E018)
名稱 型別 復位值 描述
23:0 CURRENT R/Wc 0 讀出值為 SYSTICK 定時器的當前數值。寫入任何值都會清除暫存器,SYSTICK 控制和狀態暫存器中的 COUNTFLAG 也會清零
嵌入式筆記5.1 定時器詳解
  • SYSTICK 校準值暫存器(0xE000E01C)
名稱 型別 復位值 描述
31 NOREF R - 1 = 沒有外部參考時鐘(STCLK 不可用)
0 = 有外部參考時鐘可供使用
30 SKEW R - 1 = 校準值並非精確的 10ms
0 = 校準值準確
23:0 TENMS R/W 0 10 毫秒校準值。晶片設計者應透過 Cortex-M3 的輸入訊號提供該數值 ,若讀出為 0,則表示校準值不可用
嵌入式筆記5.1 定時器詳解

4. 使用方式

  • 使用函式

​ 若只想產生週期性的 SysTick 中斷,最簡單的方法就是使用 CMSIS-Core 函式 SysTick_ Config

uint32_t SysTick_Config(uint32_t ticks);

​ 該函式將 SysTick 中斷間隔設定為 ticks,使能計數器使用處理器時鐘,然後設定 SysTick 異常為最低優先順序

若要在 30MHz 的時脈頻率下產生 1kHz 的 SysTick 異常,則可以使用:

SysTick_Config(SystemCoreClock / 1000);

變數 SystemCoreClock 應該存放正 確的時脈頻率數值,也就是 30 X 106 另外,亦可使用:

SysTick_Config(30000);		//30MHz/1000 = 30000

異常處理函式 SysTick_Handler(void) 的觸發頻率就變成了 1kHz。

​ 若 SysTick_Config 函式的輸入引數不滿足 24 位重載入數值暫存器(大於 0xFFFFFF),SysTick_Config 函式返回 1,否則會返回 0。

  • 直接操作暫存器(使用參考時鐘或者不想使能 SysTick 中斷

步驟:

  1. 將 0 寫入 SysTick->CTRL 禁止 SysTick 定時器。這個操作是可選的。若重用了其他程式碼,則由於 SysTick 之前可能已經使能過了,因此本操作是推薦使用的。
  2. 將新的重載入值寫入 SysTick->LOAD,重載入值應該為週期數減 1。
  3. 將任何數值寫人 SysTick 當前值暫存器 SysTick->VAL,該暫存器會被清零。(正確的,經過測試)
  4. 寫入 SysTick 控制和狀態暫存器 SysTick->CTRL 啟動 SysTick 定時器。

由於 SysTick 定時器向下計數到 0,因此,若要設定 SysTick 週期為 1000,則應該將重載入值(SysTick->LOAD)設定為 999。

​ 若要在輪詢模式中使用 SysTick 定時器,則可以利用 SysTick 控制和狀態暫存器(SysTick->CTRL)中的計數標誌來確定定時器何時變為 0。

SysTick->CTRL = 0;							//禁止 SysTick
SysTick->LOAD = OxFF;						//計數範圍 255~0 (256個週期)
SysTick->VAL = 0;							//清除當前值和計數標誌
SysTick->CTRL = 5;							//使能 SysTick 定時器並使用處理器時鐘
while((SysTick->CTRL & 0x00010000) == 0);	//等待計數標誌置位
SysTick->CTRL = 0;							//禁止 SysTick

​ 若要將 SysTick 中斷用作在一定時間後觸發的單發操作(異常處理實現),則可以將重載入值減小 12 個週期,以補償中斷等待時間。例如,要使 SysTick 定時器在 300 個時鐘週期後執行:

volatile int SysTickFired;   //全域性軟體標誌,表示 SysTickAlarm 已執行
...
SysTick->CTRL = 0;			//禁止 SysTick
SysTick->LOAD = (300- 12);	//設定重載入值,由於異常等待減去 12
SysTick->VAL = 0;			//將當前值清為 0
SysTickFired = 0;			//將軟體標誌設為 0
SysTick->CTRL = 0x7;		//使能 SysTick, 使能 SysTick 異常且使用處理器時鐘
while(SysTickFired == 0);	//等待 SysTick 處理將軟體標誌置位

在單發 SysTick 處理中,需要禁止 SysTick,以防 SysTick 異常再次產生。若由於所需的處理任務花費的時間太長而導致掛起狀態再次置位,則可能還需要清除 SysTick 的掛起狀態:

void SysTick_Handler(void)		//SYSTlCK 異常處理
{
    SysTick-> CTRL = 0x0;		//禁止 SysTick
    ...,						//執行所需任務
    SCB->ICSR |= 1<<25;			//清除 SYSTICK 掛起位,防止再次掛起
    SysTickFired++;				//更新軟體標誌,主程式據此可以知道 SysTick 定時任務已執行
    return;
}

若同時產生了另一個異常,則 SysTick 異常可能會延遲。

​ SysTick 定時器可用於時間測量。例如,可以用下面的程式碼測量一個短函式的持續時間:

unsigned int start_timez, stop_time, cycle_count;
SysTick->CTRL = 0;				//禁止 SysTick
SysTick->LOAD = OxFFFFFFFF;		//將重載入值設定為最大
SysTick->VAL = 0;				//將當前值清為 0
SysTick->CTRL = 0x5;			//使能 SysTick, 使用處理器時鐘
while(SysTick->VAL != 0);		//等待 SysTick 重載入
start_time = SysTick->VAL;		//獲取開始時間
function();						//執行要測量的函式
stop_time = SysTick->VAL;		//獲取停止時間
cycle_count = start_time — stop_time;

由於 SysTick 定時器向下計數,start_ime 的數值比 stop_time 要大。可能還需要在時間測量的結尾檢查一下 count_flago 若 count_flag 置位時測試的時間大於 0xFFFFFF,還得使能 SysTick 異常且在 SysTick 處理中計算 SysTick 計數器溢位的次數。時鐘週期的總數還要考慮 SysTick 異常。

5. 其他資訊

  • SysTick 定時器中的暫存器只能在特權狀態下訪問。
  • 參考時鐘在一些微控制器設計中可能會不存在。
  • 若應用中存在嵌入式 OS,SysTick 定時器會被 OS 使用,因此就不能再被應用任務使用了。
  • 當處理器在除錯期間暫停時,SysTick 定時器會停止計數。
  • 根據微控制器的實際設計,SysTick 定時器可能會在某些休眠模式中停止計數。

二、RTC——實時時鐘

1. 資訊介紹

RTC(real time clock)實時時鐘,主要包含日曆、鬧鐘和自動喚醒這三部分的功能,其中的日曆功能使用的最多。

只要電源電壓保持在工作範圍內,RTC 就不會停止,無論裝置狀態如何(執行模式、低功耗模式或復位不足)。

RTC 主要功能:

  • 具有秒、秒、分鐘、小時(12 或 24 格式)、周、日、月、年的日曆,採用 BCD(二進位制編碼的十進位制)格式。

  • 兩個具有中斷功能的可程式設計鬧鐘

  • 自動喚醒單元,可週期性地生成標誌以觸發自動喚醒中斷。

  • 用於事件儲存的時間戳功能(1 個事件)

RTC 時鐘源可以是:

  • 外部低速晶振(LSE)
  • 外部高速晶振(HSE)
  • 內部低速晶振(LSI)

其中使用最多的是LSE,LSE由一個外部的32.768KHZ(6PF負載)的晶振提供,精度高,穩定, RTC首選。

LSI 是晶片內部的30KHZ晶體,精度較低,會有溫漂,一般不建議使用。

HSE_RTC由HSE分頻得到,最高是4M,使用的也較少。

stm32L431RCT6 的 RTC 引腳:

  • RTC_REFIN:參考時鐘輸入

  • RTC_OUT:RTC 時鐘輸出

    RTC_OUT1 和 RTC_OUT2 可以選擇以下兩種輸出之一:

    • CALIB:512 Hz 或 1 Hz 時鐘輸出(LSE 頻率為 32.768 kHz 時)。透過設定 RTC_CR 暫存器中的 COE 位來啟用此輸出。
    • TAMPALRM:此輸出是 TAMP 和 ALARM 輸出的邏輯或(OR)。
  • RTC_TS:RTC 時間戳輸入

  • RTC_TAMP1:TAMPER1 事件檢測

  • RTC_TAMP2:TAMPER2 事件檢測

2. 暫存器詳解

0. 暫存器地址

嵌入式筆記5.1 定時器詳解

1. RTC 時間暫存器(RTC_TR)

RTC_TR 是日曆時間影子暫存器。這個暫存器只能在初始化模式下寫入。該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x00

  • 備份域復位值:0x0000 0000

  • 系統復位:

    • 當 BYPSHAD = 0 時,復位值為 0x0000 0000
    • 當 BYPSHAD = 1 時,不受影響
  • 位 31:23 保留,必須保持復位值。

  • 位 22 PM:AM/PM 記號

    • 0:AM 或 24 小時制
    • 1:PM
  • 位 21:20 HT[1:0]:小時的十位,以 BCD 格式表示

  • 位 19:16 HU[3:0]:小時的個位,以 BCD 格式表示

  • 位 15 保留,必須保持復位值。

  • 位 14:12 MNT[2:0]:分鐘的十位,以 BCD 格式表示

  • 位 11:8 MNU[3:0]:分鐘的個位,以 BCD 格式表示

  • 位 7 保留,必須保持復位值。

  • 位 6:4 ST[2:0]:秒的十位,以 BCD 格式表示

  • 位 3:0 SU[3:0]:秒的個位,以 BCD 格式表示

2. RTC 日期暫存器(RTC_DR)

RTC_DR 是日曆日期影子暫存器。這個暫存器只能在初始化模式下寫入。該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x04
  • 備份域復位值:0x0000 2101
  • 系統復位:
    • 當 BYPSHAD = 0 時,復位值為 0x0000 2101
    • 當 BYPSHAD = 1 時,不受影響。
  • 位 31:24 保留,必須保持復位值。
  • 位 23:20 YT[3:0]:年份的十位,以 BCD 格式表示
  • 位 19:16 YU[3:0]:年份的個位,以 BCD 格式表示
  • 位 15:13 WDU[2:0]:星期幾的單位
    • 000:禁止
    • 001:星期一
    • ...
    • 111:星期天
  • 位 12 MT:月份的十位,以 BCD 格式表示
  • 位 11:8 MU[3:0]:月份的個位,以 BCD 格式表示
  • 位 7:6 保留,必須保持復位值。
  • 位 5:4 DT[1:0]:日期的十位,以 BCD 格式表示
  • 位 3:0 DU[3:0]:日期的個位,以 BCD 格式表示

注意:日曆在達到最大值時會凍結,並且不能滾動翻轉。

3. RTC 亞秒暫存器(RTC_SSR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x08

  • 備份域復位值:0x0000 0000

  • 系統復位:

    • 當 BYPSHAD = 0 時,復位值為 0x0000 0000
    • 當 BYPSHAD = 1 時,不受影響
  • 位 31:16 保留,必須保持復位值。

  • 位 15:0 SS[15:0]:亞秒值

SS[15:0] 是同步預分頻計數器中的值。秒的分數由以下公式給出:

秒的分數 = (PREDIV_S - SS) / (PREDIV_S + 1)

注意:只有在移位操作之後,SS 才能大於 PREDIV_S。在這種情況下,正確的時間/日期比 RTC_TR/RTC_DR 所指示的少一秒。

4. RTC 初始化控制和狀態暫存器(RTC_ICSR)

該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x0C
  • 備份域復位值:0x0000 0007
  • 系統復位:除了INIT、INITF和RSF位被清零外,不受影響
  • 位 31:17 保留,必須保持復位值。
  • 位 16 RECALPF:重新校準待處理標誌
    • 當軟體寫入 RTC_CALR 暫存器時,RECALPF 狀態標誌會自動置為1,表示 RTC_CALR 暫存器被阻塞。
    • 當新的校準設定生效時,該位恢復為 0。
  • 位 15:8 保留,必須保持復位值。
  • 位 7 INIT:初始化模式
    • 0:自由執行模式
    • 1:初始化模式,用於程式設計時間和日期暫存器(RTC_TR 和 RTC_DR),以及預分頻器暫存器(RTC_PRER)。當 INIT 被複位時,計數器停止並從新值開始計數。
  • 位 6 INITF:初始化標誌
    • 當該位被置為1時,RTC 處於初始化狀態,可以更新時間、日期和預分頻器暫存器。
    • 0:不允許更新日曆暫存器
    • 1:允許更新日曆暫存器
  • 位 5 RSF:暫存器同步標誌
    • 每次日曆暫存器被複制到影子暫存器(RTC_SSRx、RTC_TRx 和 RTC_DRx)時,硬體會設定該位。該位在初始化模式下,在移位操作掛起(SHPF=1)時,或在旁路影子暫存器模式(BYPSHAD=1)時由硬體清除。軟體也可以清除此位。
    • 0:日曆影子暫存器尚未同步
    • 1:日曆影子暫存器已同步
  • 位 4 INITS:初始化狀態標誌
    • 當日歷年份欄位不為 0(備份域復位狀態)時,該位由硬體設定。
    • 0:日曆尚未初始化
    • 1:日曆已初始化
  • 位 3 SHPF:移位操作掛起
    • 當透過寫入 RTC_SHIFTR 暫存器啟動移位操作時,該標誌由硬體設定。當相應的移位操作執行完畢時,由硬體清除。寫入 SHPF 位無效。
    • 0:無移位操作掛起
    • 1:有移位操作掛起
  • 位 2 WUTWF:喚醒定時器寫入標誌
    • 當 WUTE 位在 RTC_CR 中被置為0後,硬體設定該位,此時可以更改 WUT 值。在初始化模式下,該位被硬體清除。
    • 0:不允許更新喚醒定時器配置,初始化模式除外
    • 1:允許更新喚醒定時器配置
  • 位 1:0 保留,必須保持復位值。

5. RTC 預分頻器暫存器(RTC_PRER)

這個暫存器只能在初始化模式下寫入。初始化必須透過兩個單獨的寫入操作來完成。該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x10

  • 備份域復位值:0x007F 00FF

  • 系統復位:不受影響

  • 位 31:23 保留,必須保持復位值。

  • 位 22:16 PREDIV_A[6:0]:非同步預分頻因子

    • 這是非同步分頻因子:ck_apre 頻率 = RTCCLK 頻率 / (PREDIV_A + 1)
  • 位 15 保留,必須保持復位值。

  • 位 14:0 PREDIV_S[14:0]:同步預分頻因子

    • 這是同步分頻因子:ck_spre 頻率 = ck_apre 頻率 / (PREDIV_S + 1)

6. RTC 喚醒定時器暫存器(RTC_WUTR)

這個暫存器只能在 RTC_ICSR 中的 WUTWF 設定為 1 時寫入。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x14

  • 備份域復位值:0x0000 FFFF

  • 系統復位:不受影響

  • 位 31:16 WUTOCLR[15:0]:喚醒自動過載輸出清除值

    • 當 WUTOCLR[15:0] 不等於 0x0000 時,當自動過載倒計數器達到 0 時,WUTF 由硬體設定;當自動過載倒計數器達到WUTOCLR[15:0] 時,WUTF 由硬體清除。
    • 當 WUTOCLR[15:0] = 0x0000 時,當 WUT 倒數計時器達到 0 時,WUTF 由硬體設定,並由軟體清除。
  • 位 15:0 WUT[15:0]:喚醒自動過載值位

    • 當喚醒定時器啟用(WUTE 置為 1)時,每 (WUT[15:0] + 1) 個 ck_wut 週期設定一次 WUTF 標誌。ck_wut 週期透過 RTC_CR 暫存器的 WUCKSEL[2:0] 位選擇。
    • 當 WUCKSEL[2] = 1 時,喚醒定時器變為 17 位,WUCKSEL[1] 實際上變為 WUT[16],即定時器要重新載入的最高有效位。
    • 在設定 WUTE 後,WUTF 的第一次斷言發生在 WUT 和 (WUT + 2) 個 ck_wut 週期之間。將 WUT[15:0] 設定為 0x0000 並且 WUCKSEL[2:0] = 011 (RTCCLK/2) 是禁止的。

7. RTC 控制暫存器(RTC_CR)

該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x18

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31 OUT2EN:RTC_OUT2 輸出使能

    • 設定此位可以將 RTC 輸出重新對映到 RTC_OUT2,如下所示:
      • OUT2EN = 0:禁用 RTC 輸出 2
        • 如果 OSEL ≠ 00 或 TAMPOE = 1:TAMPALRM 輸出到 RTC_OUT1
        • 如果 OSEL = 00 且 TAMPOE = 0 且 COE = 1:CALIB 輸出到 RTC_OUT1
      • OUT2EN = 1:啟用 RTC 輸出 2
        • 如果 (OSEL ≠ 00 或 TAMPOE = 1) 且 COE = 0:TAMPALRM 輸出到 RTC_OUT2
        • 如果 OSEL = 00 且 TAMPOE = 0 且 COE = 1:CALIB 輸出到 RTC_OUT2
        • 如果 (OSEL ≠ 00 或 TAMPOE = 1) 且 COE = 1:CALIB 輸出到 RTC_OUT2,TAMPALRM 輸出到 RTC_OUT1
  • 位 30 TAMPALRM_TYPE:TAMPALRM 輸出型別

    • 0:TAMPALRM 為推輓輸出
    • 1:TAMPALRM 為開漏輸出
  • 位 29 TAMPALRM_PU:TAMPALRM 上拉使能

    • 0:TAMPALRM 輸出無上拉
    • 1:TAMPALRM 輸出有上拉
  • 位 28:27 保留,必須保持復位值。

  • 位 26 TAMPOE:篡改檢測輸出使能到 TAMPALRM

    • 0:篡改標誌不透過 TAMPALRM 輸出
    • 1:篡改標誌透過 TAMPALRM 輸出,並與 OSEL 提供的訊號和 POL 提供的極性結合
  • 位 25 TAMPTS:篡改檢測事件時啟用時間戳

    • 0:篡改檢測事件不會儲存 RTC 時間戳
    • 1:篡改檢測事件時儲存 RTC 時間戳
    • 即使 RTC_CR 暫存器中的 TSE = 0,TAMPTS 也有效。在篡改標誌之後設定時間戳標誌,因此如果設定了 TAMPTS 和 TSIE,建議禁用篡改中斷以避免處理兩個中斷。
  • 位 24 ITSE:內部事件時間戳使能

    • 0:內部事件時間戳禁用
    • 1:內部事件時間戳啟用
  • 位 23 COE:校準輸出使能

    • 此位啟用 CALIB 輸出
    • 0:校準輸出禁用
    • 1:校準輸出啟用
  • 位 22:21 OSEL[1:0]:輸出選擇

    • 這些位用於選擇路由到 TAMPALRM 輸出的標誌。
    • 00:輸出禁用
    • 01:啟用報警 A 輸出
    • 10:啟用報警 B 輸出
    • 11:啟用喚醒輸出
  • 位 20 POL:輸出極性

    • 此位用於配置 TAMPALRM 輸出的極性。
    • 0:當 ALRAF/ALRBF/WUTF 斷言時(取決於 OSEL[1:0]),或當 TAMPxF/ITAMPxF 斷言時(如果 TAMPOE = 1),引腳為高電平
    • 1:當 ALRAF/ALRBF/WUTF 斷言時(取決於 OSEL[1:0]),或當 TAMPxF/ITAMPxF 斷言時(如果 TAMPOE = 1),引腳為低電平
  • 位 19 COSEL:校準輸出選擇

    • 當 COE = 1 時,此位選擇在 CALIB 上輸出的訊號。
    • 0:校準輸出為 512 Hz
    • 1:校準輸出為 1 Hz
    • 這些頻率對 RTCCLK 為 32.768 kHz 且預分頻器為預設值(PREDIV_A = 127 和 PREDIV_S = 255)時有效。參見第 34.3.16 節:校準時鐘輸出。
  • 位 18 BKP:備份

    • 使用者可以寫入此位以記錄是否已進行夏令時更改。
  • 位 17 SUB1H:減去 1 小時(冬令時更改)

    • 當在初始化模式之外設定此位時,如果當前小時不為 0,則日曆時間減去 1 小時。此位總是讀作 0。
    • 當前小時為 0 時,設定此位無效。
    • 0:無效
    • 1:當前時間減去 1 小時。可用於冬令時更改。
  • 位 16 ADD1H:加 1 小時(夏令時更改)

    • 當在初始化模式之外設定此位時,日曆時間加 1 小時。此位總是讀作 0。
    • 0:無效
    • 1:當前時間加 1 小時。可用於夏令時更改
  • 位 15 TSIE:時間戳中斷使能

    • 0:時間戳中斷禁用
    • 1:時間戳中斷使能
  • 位 14 WUTIE:喚醒定時器中斷使能

    • 0:喚醒定時器中斷禁用
    • 1:喚醒定時器中斷使能
  • 位 13 ALRBIE:報警 B 中斷使能

    • 0:報警 B 中斷禁用
    • 1:報警 B 中斷使能
  • 位 12 ALRAIE:報警 A 中斷使能

    • 0:報警 A 中斷禁用
    • 1:報警 A 中斷使能
  • 位 11 TSE:時間戳使能

    • 0:時間戳禁用
    • 1:時間戳使能
  • 位 10 WUTE:喚醒定時器使能

    • 0:喚醒定時器禁用
    • 1:喚醒定時器使能
  • 位 9 ALRBE:報警 B 使能

    • 0:報警 B 禁用
    • 1:報警 B 使能
  • 位 8 ALRAE:報警 A 使能

    • 0:報警 A 禁用
    • 1:報警 A 使能
  • 位 7 保留,必須保持復位值。

  • 位 6 FMT:小時格式

    • 0:24 小時/天格式
    • 1:AM/PM 小時格式
  • 位 5 BYPSHAD:繞過影子暫存器

    • 0:日曆值(從 RTC_SSR、RTC_TR 和 RTC_DR 讀取時)來自影子暫存器,這些暫存器每兩個 RTCCLK 週期更新一次。
    • 1:日曆值(從 RTC_SSR、RTC_TR 和 RTC_DR 讀取時)直接來自日曆計數器。
    • 注意:如果 APB1 時鐘的頻率小於 RTCCLK 頻率的七倍,必須將 BYPSHAD 設定為 1。
  • 位 4 REFCKON:RTC_REFIN 參考時鐘檢測使能(50 或 60 Hz)

    • 0:RTC_REFIN 檢測禁用
    • 1:RTC_REFIN 檢測使能
    • 注意:PREDIV_S 必須為 0x00FF。
  • 位 3 TSEDGE:時間戳事件有效邊緣

    • 0:RTC_TS 輸入上升沿生成時間戳事件
    • 1:RTC_TS 輸入下降沿生成時間戳事件
    • 在更改 TSEDGE 時必須重置 TSE 以避免不需要的 TSF 設定。
  • 位 2:0 WUCKSEL[2:0]:ck_wut 喚醒時鐘選擇

    • 000:選擇 RTC/16 時鐘
    • 001:選擇 RTC/8 時鐘
    • 010:選擇 RTC/4 時鐘
    • 011:選擇 RTC/2 時鐘
    • 10x:選擇 ck_spre(通常為 1 Hz)時鐘
    • 11x:選擇 ck_spre(通常為 1 Hz)時鐘。此外,WUT 計數器值增加 216

注意:此暫存器的位 6 和位 4 只能在初始化模式下寫入(RTC_ICSR/INITF = 1)。
WUT = 喚醒單元計數值。WUT = (0x0000 到 0xFFFF),當 WUCKSEL[2:1] = 11 時加上 0x10000。
此暫存器的位 2 到位 0 只能在 RTC_CR 暫存器的 WUTE 位 = 0 且 RTC_ICSR 暫存器的 WUTWF 位 = 1 時寫入。
建議不要在日曆小時增量期間更改小時,因為這可能會掩蓋日曆小時的增量。
ADD1H 和 SUB1H 的更改在下一秒生效。

8. RTC 防寫暫存器(RTC_WPR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x24

  • 復位值:0x0000 0000

  • 位 31:8 保留,必須保持復位值。

  • 位 7:0 KEY:防寫金鑰

    • 此位元組由軟體寫入。
    • 讀取此位元組總是返回 0x00。
    • 有關如何解鎖 RTC 暫存器防寫的說明,請參閱 RTC 暫存器防寫。

9. RTC 校準暫存器(RTC_CALR)

嵌入式筆記5.1 定時器詳解

該暫存器受防寫。

  • 地址偏移量:0x28

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:16 保留,必須保持復位值。

  • 位 15 CALP:將 RTC 頻率增加 488.5 ppm

    • 0:不增加 RTCCLK 脈衝。
    • 1:每 211 個脈衝有效插入一個 RTCCLK 脈衝(頻率增加 488.5 ppm)。
    • 注意:此功能旨在與 CALM 一起使用,以細分降低日曆頻率。如果輸入頻率為 32768 Hz,則在 32 秒視窗期間新增的 RTCCLK 脈衝數計算如下:(512 × CALP) - CALM。
  • 位 14 CALW8:使用 8 秒校準週期

    • 當 CALW8 設定為 1 時,選擇 8 秒校準週期。
    • 注意:當 CALW8 = 1 時,CALM[1:0] 固定為 00。
  • 位 13 CALW16:使用 16 秒校準週期

    • 當 CALW16 設定為 1 時,選擇 16 秒校準週期。如果 CALW8 = 1,則此位不得設定為 1。
    • 注意:當 CALW16 = 1 時,CALM[0] 固定為 0。
  • 位 12 LPCAL:校準低功耗模式

    • 0:校準視窗為 220 RTCCLK,這是高功耗模式。僅當需要小於 32 秒的校準視窗時才應設定此模式。
    • 1:校準視窗為 220 ck_apre,這是超低功耗模式所需的配置。
  • 位 11:9 保留,必須保持復位值。

  • 位 8:0 CALM[8:0]:校準減

    • 透過遮蔽 220 RTCCLK 脈衝中的 CALM 來降低日曆的頻率(如果輸入頻率為 32768 Hz,則為 32 秒)。這以 0.9537 ppm 的解析度降低日曆頻率。
    • 為了增加日曆的頻率,此功能應與 CALP 一起使用。

10. RTC 移位控制暫存器(RTC_SHIFTR)

該暫存器受防寫。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x2C

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31 ADD1S:增加一秒

    • 0:無效
    • 1:在時鐘/日曆上增加一秒
    • 此位為只寫,總是讀取為零。當移位操作正在進行時(當 RTC_ICSR 中的 SHPF = 1 時),寫入此位無效。
      此功能旨在與 SUBFS 一起使用,以便在原子操作中有效地為時鐘增加一秒的分數。
  • 位 30:15 保留,必須保持復位值。

  • 位 14:0 SUBFS[14:0]:減去一秒的分數

    • 這些位為只寫,總是讀取為零。當移位操作正在進行時(當 RTC_ICSR 中的 SHPF = 1 時),寫入這些位無效。
    • 寫入 SUBFS 的值將被加到同步預分頻器計數器中。由於該計數器向下計數,此操作實際上會從時鐘中減去(延遲):延遲(秒)= SUBFS / (PREDIV_S + 1)
    • 當 ADD1S 功能與 SUBFS 一起使用時,可以有效地在時鐘上增加一秒的分數(提前時鐘):提前(秒)= (1 - (SUBFS / (PREDIV_S + 1)))

注意:寫入 SUBFS 會導致 RSF 被清除。然後,軟體可以等待直到 RSF = 1,以確保影子暫存器已經用移位後的時間更新。

11. RTC 時間戳時間暫存器(RTC_TSTR)

這個暫存器的內容僅在RTC_SR中的TSF設定為1時有效。當TSF位被重置時,它會清除。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x30

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:23 保留,必須保持復位值。

  • 位 22 PM:AM/PM 表示法

    • 0:AM 或 24 小時格式
    • 1:PM
  • 位 21:20 HT[1:0]:小時十位,BCD 格式。

  • 位 19:16 HU[3:0]:小時個位,BCD 格式。

  • 位 15 保留,必須保持復位值。

  • 位 14:12 MNT[2:0]:分鐘十位,BCD 格式。

  • 位 11:8 MNU[3:0]:分鐘個位,BCD 格式。

  • 位 7 保留,必須保持復位值。

  • 位 6:4 ST[2:0]:秒鐘十位,BCD 格式。

  • 位 3:0 SU[3:0]:秒鐘個位,BCD 格式。

12. RTC 時間戳日期暫存器(RTC_TSDR)

這個暫存器的內容僅在RTC_SR中的TSF設定為1時有效。當TSF位被重置時,它會清除。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x34

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:16 保留,必須保持復位值。

  • 位 15:13 WDU[2:0]:星期幾單位

  • 位 12 MT:月份十位,BCD 格式

  • 位 11:8 MU[3:0]:月份個位,BCD 格式

  • 位 7:6 保留,必須保持復位值。

  • 位 5:4 DT[1:0]:日期十位,BCD 格式

  • 位 3:0 DU[3:0]:日期個位,BCD 格式

13. RTC時間戳亞秒暫存器(RTC_TSSSR)

這個暫存器的內容僅在RTC_SR中的TSF設定為1時有效。當TSF位被重置時,它會清除。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x38

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:16 保留,必須保持復位值。

  • 位 15:0 SS[15:0]:毫秒值

    • SS[15:0] 是時間戳事件發生時同步預分頻器計數器的值。

14. RTC 鬧鐘 A 暫存器(RTC_ALRMAR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x40

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31 MSK4:鬧鐘A日期掩碼

    • 0:如果日期/天匹配,則設定鬧鐘A
    • 1:在鬧鐘A比較中,日期/天不予考慮
  • 位 30 WDSEL:星期天選擇

    • 0:DU[3:0]代表日期單位
    • 1:DU[3:0]代表星期天。DT[1:0]不予考慮。
  • 位 29:28 DT[1:0]:BCD格式中的日期十位

  • 位 27:24 DU[3:0]:BCD格式中的日期單位或天

  • 位 23 MSK3:鬧鐘A小時掩碼

    • 0:如果小時匹配,則設定鬧鐘A
    • 1:在鬧鐘A比較中,小時不予考慮
  • 位 22 PM:上午/下午標記

    • 0:上午或24小時格式
    • 1:下午
  • 位 21:20 HT[1:0]:BCD格式中的小時十位

  • 位 19:16 HU[3:0]:BCD格式中的小時單位

  • 位 15 MSK2:鬧鐘A分鐘掩碼

    • 0:如果分鐘匹配,則設定鬧鐘A
    • 1:在鬧鐘A比較中,分鐘不予考慮
  • 位 14:12 MNT[2:0]:BCD格式中的分鐘十位

  • 位 11:8 MNU[3:0]:BCD格式中的分鐘單位

  • 位 7 MSK1:鬧鐘A秒掩碼

    • 0:如果秒匹配,則設定鬧鐘A
    • 1:在鬧鐘A比較中,秒不予考慮
  • 位 6:4 ST[2:0]:BCD格式中的秒十位

  • 位 3:0 SU[3:0]:BCD格式中的秒單位

15. RTC 鬧鐘 A 亞秒暫存器(RTC_ALRMASSR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x44

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:28 保留,必須保持復位值。

  • 位 27:24 MASKSS[3:0]:從該位開始遮蔽最高有效位

    • 0:不對鬧鐘A的亞秒進行比較。當秒單位遞增時設定鬧鐘(假設其他欄位匹配)。
      1:在鬧鐘A比較中,SS[14:1]不予考慮。僅比較SS[0]。
      2:在鬧鐘A比較中,SS[14:2]不予考慮。僅比較SS[1:0]。
      3:在鬧鐘A比較中,SS[14:3]不予考慮。僅比較SS[2:0]。
      ...
      12:在鬧鐘A比較中,SS[14:12]不予考慮。比較SS[11:0]。
      13:在鬧鐘A比較中,SS[14:13]不予考慮。比較SS[12:0]。
      14:在鬧鐘A比較中,SS[14]不予考慮。比較SS[13:0]。
      15:比較所有15個SS位,必須匹配才能啟用鬧鐘。
    • 同步計數器的溢位位(位15)永遠不會進行比較。只有在移位操作後,這個位才能不同於0。
    • 注意:同步計數器的溢位位(位15)永遠不會進行比較。只有在移位操作後,這個位才能不同於0。
  • 位 23:15 保留,必須保持復位值。

  • 位 14:0 SS[14:0]:亞秒值

    • 這個值與同步預分頻器計數器的內容進行比較,以確定是否啟用鬧鐘A。只有位0到MASKSS-1進行比較。

16. RTC 鬧鐘 B 暫存器(RTC_ALRMBR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x48

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31 MSK4:鬧鐘B日期掩碼

    • 0:如果日期和天匹配,則設定鬧鐘B
    • 1:在鬧鐘B比較中,日期和天不予考慮
  • 位 30 WDSEL:星期天選擇

    • 0:DU[3:0]代表日期單位
    • 1:DU[3:0]代表星期天。DT[1:0]不予考慮。
  • 位 29:28 DT[1:0]:BCD格式中的日期十位

  • 位 27:24 DU[3:0]:BCD格式中的日期單位或天

  • 位 23 MSK3:鬧鐘B小時掩碼

    • 0:如果小時匹配,則設定鬧鐘B
    • 1:在鬧鐘B比較中,小時不予考慮
  • 位 22 PM:上午/下午標記

  • 0:上午或24小時格式

  • 1:下午

  • 位 21:20 HT[1:0]:BCD格式中的小時十位

  • 位 19:16 HU[3:0]:BCD格式中的小時單位

  • 位 15 MSK2:鬧鐘B分鐘掩碼

    • 0:如果分鐘匹配,則設定鬧鐘B
    • 1:在鬧鐘B比較中,分鐘不予考慮
  • 位 14:12 MNT[2:0]:BCD格式中的分鐘十位

  • 位 11:8 MNU[3:0]:BCD格式中的分鐘單位

  • 位 7 MSK1:鬧鐘B秒掩碼

    • 0:如果秒匹配,則設定鬧鐘B
    • 1:在鬧鐘B比較中,秒不予考慮
  • 位 6:4 ST[2:0]:BCD格式中的秒十位

  • 位 3:0 SU[3:0]:BCD格式中的秒單位

17. RTC 鬧鐘 B 亞秒暫存器(RTC_ALRMBSSR)

這個暫存器只能在RTC_CR暫存器中的ALRBE被重置時,或者處於初始化模式下寫入。

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x4C

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:28 保留,必須保持復位值。

  • 位 27:24 MASKSS[3:0]:從該位開始遮蔽最高有效位

    • 0x0:不對鬧鐘B的亞秒進行比較。當秒單位遞增時設定鬧鐘(假設其他欄位匹配)。
      0x1:在鬧鐘B比較中,SS[14:1]不予考慮。僅比較SS[0]。
      0x2:在鬧鐘B比較中,SS[14:2]不予考慮。僅比較SS[1:0]。
      0x3:在鬧鐘B比較中,SS[14:3]不予考慮。僅比較SS[2:0]。
      ...
      0xC:在鬧鐘B比較中,SS[14:12]不予考慮。比較SS[11:0]。
      0xD:在鬧鐘B比較中,SS[14:13]不予考慮。比較SS[12:0]。
      0xE:在鬧鐘B比較中,SS[14]不予考慮。比較SS[13:0]。
      0xF:比較所有15個SS位,必須匹配才能啟用鬧鐘。
    • 同步計數器的溢位位(位15)永遠不會進行比較。只有在移位操作後,這個位才能不同於0。
  • 位 23:15 保留,必須保持復位值。

  • 位 14:0 SS[14:0]:亞秒值

    • 這個值與同步預分頻器計數器的內容進行比較,以確定是否啟用鬧鐘B。只有位0到MASKSS-1進行比較。

18. RTC 狀態暫存器(RTC_SR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x50

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:6 保留,必須保持復位值。

  • 位 5 ITSF:內部時間戳標誌

    • 當發生內部事件的時間戳時,硬體會設定這個標誌。
  • 位 4 TSOVF:時間戳溢位標誌

    • 當 TSF 已經設定且發生時間戳事件時,硬體會設定這個標誌。
    • 建議在清除 TSF 位之後檢查並清除 TSOVF。否則,如果在 TSF 位被清除之前立即發生時間戳事件,可能會忽略溢位。
  • 位 3 TSF:時間戳標誌

    • 當發生時間戳事件時,硬體會設定這個標誌。
    • 如果 ITSF 標誌被設定,TSF 必須與 ITSF 一起清除。
  • 位 2 WUTF:喚醒定時器標誌

    • 當喚醒自動過載計數器達到0時,硬體會設定這個標誌。
    • 如果 WUTOCLR[15:0] 與 0x0000 不同,當喚醒自動過載計數器達到 WUTOCLR 值時,硬體會清除 WUTF。
    • 如果 WUTOCLR[15:0] 為 0x0000,WUTF 必須由軟體清除。
    • 這個標誌必須在 WUTF 再次被設定為 1 之前至少 1.5 個 RTCCLK 週期內由軟體清除。
  • 位 1 ALRBF:鬧鐘B標誌

    • 當時間/日期暫存器(RTC_TR和RTC_DR)與鬧鐘 B 暫存器(RTC_ALRMBR)匹配時,硬體會設定這個標誌。
  • 位 0 ALRAF:鬧鐘A標誌

    • 當時間/日期暫存器(RTC_TR和RTC_DR)與鬧鐘 A 暫存器(RTC_ALRMAR)匹配時,硬體會設定這個標誌。

注意:在 RTC_SCR 暫存器中設定相應的清除位後,這個暫存器的位將在 2 個 APB 時鐘週期後被清除。

19. RTC 遮蔽中斷狀態暫存器(RTC_MISR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x54

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:6 保留,必須保持復位值。

  • 位 5 ITSMF:內部時間戳遮蔽標誌

    • 當發生內部事件的時間戳且時間戳中斷被觸發時,硬體會設定這個標誌。
  • 位 4 TSOVMF:時間戳溢位遮蔽標誌

    • 當時間戳中斷髮生且TSMF已經設定時,硬體會設定這個標誌。
    • 建議在清除TSF位之後檢查並清除TSOVF。否則,如果在TSF位被清除之前立即發生時間戳事件,可能會忽略溢位。
  • 位 3 TSMF:時間戳遮蔽標誌

    • 當時間戳中斷髮生時,硬體會設定這個標誌。
    • 如果ITSF標誌被設定,TSF必須與ITSF一起清除。
  • 位 2 WUTMF:喚醒定時器遮蔽標誌

    • 當喚醒定時器中斷髮生時,硬體會設定這個標誌。
    • 這個標誌必須在WUTF再次被設定為1之前至少1.5個RTCCLK週期內由軟體清除。
  • 位 1 ALRBMF:鬧鐘B遮蔽標誌

    • 當鬧鐘B中斷髮生時,硬體會設定這個標誌。
  • 位 0 ALRAMF:鬧鐘A遮蔽標誌

    • 當鬧鐘A中斷髮生時,硬體會設定這個標誌。

20. RTC 狀態清除暫存器(RTC_SCR)

嵌入式筆記5.1 定時器詳解
  • 地址偏移量:0x5C

  • 備份域復位值:0x0000 0000

  • 系統復位:不受影響

  • 位 31:6 保留,必須保持復位值。

  • 位 5 CITSF:清除內部時間戳標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的ITSF位。
  • 位 4 CTSOVF:清除時間戳溢位標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的TSOVF位。
    • 建議在清除TSF位之後檢查並清除TSOVF。否則,如果在TSF位被清除之前立即發生時間戳事件,可能會忽略溢位。
  • 位 3 CTSF:清除時間戳標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的TSF位。
    • 如果ITSF標誌被設定,TSF必須與ITSF一起清除,透過設定CRSF和CITSF。
  • 位 2 CWUTF:清除喚醒定時器標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的WUTF位。
  • 位 1 CALRBF:清除鬧鐘B標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的ALRBF位。
  • 位 0 CALRAF:清除鬧鐘A標誌

    • 向這個位寫入1可以清除RTC_SR暫存器中的ALRBF位。

3. RTC 中斷

在 stm32L4 中 RTC 共有兩個中斷:

RTC_WKUP_IRQHandler - 實時時鐘 (RTC) 喚醒中斷

觸發條件

  • RTC 喚醒定時器 (Wakeup Timer) 溢位時觸發。

詳細介紹

  • RTC 喚醒定時器可以配置為一個週期性的定時器,產生定時中斷,用於低功耗模式下喚醒 MCU。
  • 喚醒定時器可以在各種低功耗模式下執行,比如待機模式 (Standby Mode) 和停止模式 (Stop Mode),以確保 MCU 能夠定時喚醒進行任務。
  • 配置時需要設定 RTC 暫存器,包括喚醒定時器的預分頻器和自動重灌值,以確定喚醒週期。
  • 典型應用包括定時任務排程、低功耗資料採集等。

配置步驟

  1. 使能 RTC 外設:通常在電源控制暫存器中使能 RTC 時鐘。
  2. 配置 RTC 喚醒定時器
    • 設定喚醒定時器的預分頻器和計數值。
    • 使能喚醒定時器。
  3. 使能喚醒中斷
    • 在 NVIC 中使能 RTC 喚醒中斷。
    • 在 RTC 控制暫存器中使能喚醒中斷。
  4. 編寫中斷處理程式
    • RTC_WKUP_IRQHandler 中實現喚醒後需要執行的任務。
    • 清除中斷標誌,以防止重複中斷。

RTC_Alarm_IRQHandler - RTC 鬧鐘事件中斷

觸發條件

  • RTC 鬧鐘達到設定時間時觸發。

詳細介紹

  • RTC 鬧鐘用於在指定的日期和時間觸發中斷,可以用於計時和事件提醒。
  • STM32 的 RTC 通常有兩個鬧鐘:Alarm A 和 Alarm B,可以分別設定不同的時間和日期。
  • 鬧鐘可以配置為一次性觸發或者週期性觸發,例如每天固定時間觸發。
  • 典型應用包括定時事件提醒、時間戳記錄等。

配置步驟

  1. 使能 RTC 外設:同樣需要在電源控制暫存器中使能 RTC 時鐘。
  2. 配置 RTC 鬧鐘
    • 設定鬧鐘的時間和日期,包括小時、分鐘、秒,以及可選的日期和星期幾。
    • 設定鬧鐘的掩碼暫存器以確定哪部分時間生效(如僅小時和分鐘)。
    • 使能鬧鐘。
  3. 使能鬧鐘中斷
    • 在 NVIC 中使能 RTC 鬧鐘中斷。
    • 在 RTC 控制暫存器中使能鬧鐘中斷。
  4. 編寫中斷處理程式
    • RTC_Alarm_IRQHandler 中實現鬧鐘時間到達後需要執行的任務。
    • 清除中斷標誌,以防止重複中斷。

配置示例

以下是配置 RTC 喚醒中斷和鬧鐘中斷的示例程式碼(基於 HAL 庫):

// 配置 RTC 喚醒中斷
void RTC_Wakeup_Init(void) {
    // 使能 RTC 時鐘
    __HAL_RCC_RTC_ENABLE();

    // 設定 RTC 喚醒定時器(例如每秒喚醒一次)
    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x7FFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

    // 配置 NVIC
    HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
}

// RTC 喚醒中斷處理程式
void RTC_WKUP_IRQHandler(void) {
    // 檢查並清除中斷標誌
    HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
    // 使用者程式碼
}

// 配置 RTC 鬧鐘中斷
void RTC_AlarmA_Init(void) {
    // 使能 RTC 時鐘
    __HAL_RCC_RTC_ENABLE();

    // 設定鬧鐘時間(例如每天上午8:00)
    RTC_AlarmTypeDef sAlarm = {0};
    sAlarm.AlarmTime.Hours = 8;
    sAlarm.AlarmTime.Minutes = 0;
    sAlarm.AlarmTime.Seconds = 0;
    sAlarm.Alarm = RTC_ALARM_A;
    HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

    // 配置 NVIC
    HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}

// RTC 鬧鐘中斷處理程式
void RTC_Alarm_IRQHandler(void) {
    // 檢查並清除中斷標誌
    HAL_RTC_AlarmIRQHandler(&hrtc);
    // 使用者程式碼
}

這個配置示例展示瞭如何初始化 RTC 喚醒定時器和鬧鐘,並編寫相應的中斷處理程式。根據具體應用需求,可以在中斷處理程式中新增需要執行的任務。

三、TIM——定時器

定時器的大部分資訊都可在參考手冊中有。

TIM 地址

嵌入式筆記5.1 定時器詳解
嵌入式筆記5.1 定時器詳解
嵌入式筆記5.1 定時器詳解

基本定時器資訊(TIM6/TIM7)

功能框圖

嵌入式筆記5.1 定時器詳解

功能特性

基本特性

  • 16位自動過載向上計數器:用於實現基本的計數和週期性事件。(只能向上計數)
  • 16位可程式設計預分頻器:用於將計數器時脈頻率按任意因子分頻,範圍在1到65535之間,並支援“動態”更改分頻比。

同步電路

  • 同步電路 (Synchronization Circuit):用於觸發數模轉換器 (DAC)。

中斷/DMA生成

  • 中斷/DMA生成 (Interrupt/DMA Generation):在更新事件(如計數器溢位)時產生中斷或DMA請求。

通用定時器資訊(TIM2/TIM3/TIM15/TIM16)

TIM2/TIM3

功能框圖
嵌入式筆記5.1 定時器詳解
功能特性

基本特性

  • 計數器型別:
    • TIM2:32位向上、向下、向上/向下自動過載計數器
    • TIM3:16位向上、向下、向上/向下自動過載計數器
  • 16位可程式設計預分頻器:可以將計數器時脈頻率按任意因子分頻,範圍在1到65535之間,並支援“動態”更改分頻比。

獨立通道功能

  • 最多支援4個獨立通道:
    • 輸入捕獲 (Input Capture)
    • 輸出比較 (Output Compare)
    • PWM 生成(邊沿和中心對齊模式)(PWM Generation, Edge- and Center-Aligned Modes)
    • 單脈衝模式輸出 (One-Pulse Mode Output)

同步電路

  • 同步電路:用於透過外部訊號控制定時器,並將多個定時器互連。

中斷/DMA生成

  • 中斷/DMA生成:在以下事件發生時產生中斷或DMA請求:
    • 更新事件:計數器溢位/下溢、計數器初始化(透過軟體或內部/外部觸發器)
    • 觸發事件:計數器啟動、停止、初始化或透過內部/外部觸發器計數
    • 輸入捕獲事件
    • 輸出比較事件

增量編碼器和霍爾感測器支援

  • 支援增量(正交)編碼器和霍爾感測器電路:用於定位目的。

觸發輸入

  • 觸發輸入:用於外部時鐘或週期性電流管理。

TIM15

功能框圖
嵌入式筆記5.1 定時器詳解
功能特性

基本特性

  • 16位自動過載向上計數器:實現計數和週期性事件的基礎。(只能向上計數)
  • 16位可程式設計預分頻器:用於將計數器時脈頻率按任意因子分頻,範圍在1到65535之間,並且支援“動態”更改分頻比。

獨立通道

TIM15擁有最多2個獨立通道,可以配置為以下模式:

  • 輸入捕獲 (Input Capture):用於捕獲外部事件的時間戳。
  • 輸出比較 (Output Compare):用於產生精確定時的輸出事件。
  • PWM生成 (PWM Generation):邊沿模式下產生脈寬調製訊號。
  • 單脈衝模式輸出 (One-Pulse Mode Output):在觸發事件後產生單個脈衝。

補充功能

  • 補充輸出及可程式設計死區時間 (Complementary Outputs with Programmable Dead-Time):僅適用於通道1,用於控制驅動器的死區時間以避免短路。

同步電路

  • 同步電路 (Synchronization Circuit):用於透過外部訊號控制定時器,並將多個定時器互連。

重複計數器

  • 重複計數器 (Repetition Counter):在計數器經過指定週期數後才更新定時器暫存器,提高操作效率。

斷點輸入

  • 斷點輸入 (Break Input):在特定條件下將定時器的輸出訊號置於復位狀態或已知狀態,提供安全保護機制。

中斷/DMA生成

TIM15支援在以下事件中產生中斷或DMA請求:

  • 更新事件 (Update Event):包括計數器溢位和計數器初始化(透過軟體或內部/外部觸發)。
  • 觸發事件 (Trigger Event):計數器啟動、停止、初始化或透過內部/外部觸發進行計數。
  • 輸入捕獲事件 (Input Capture Event)
  • 輸出比較事件 (Output Compare Event)
  • 斷點輸入事件 (Break Input Event):產生中斷請求。

TIM16

功能框圖
嵌入式筆記5.1 定時器詳解
功能特性

基本特性

  • 16位自動過載向上計數器:用於基本的計數和週期性事件。
  • 16位可程式設計預分頻器:可以將計數器時脈頻率按任意因子分頻,範圍在1到65535之間,並支援“動態”更改分頻比。

單通道功能

  • 單通道支援:
    • 輸入捕獲 (Input Capture)
    • 輸出比較 (Output Compare)
    • PWM 生成(邊沿對齊模式)(PWM Generation, Edge-Aligned Mode)
    • 單脈衝模式輸出 (One-Pulse Mode Output)

其他特性

  • 互補輸出及可程式設計死區時間:支援互補輸出,並可以程式設計設定死區時間。
  • 重複計數器:僅在計數器經過一定週期後更新定時器暫存器。
  • 斷點輸入:將定時器輸出訊號置於復位狀態或已知狀態。

中斷/DMA生成

  • 中斷/DMA生成:在以下事件發生時產生中斷或DMA請求:
    • 更新事件(計數器溢位)
    • 輸入捕獲事件
    • 輸出比較事件
    • 斷點輸入事件

高階定時器資訊(TIM1)

stm32L4只有一個高階定時器——TIM1。

功能框圖

嵌入式筆記5.1 定時器詳解

功能:

基本特性

  • 計數器型別:16位向上、向下、向上/向下自動過載計數器。
  • 16位可程式設計預分頻器:支援將計數器時脈頻率按任意因子分頻,範圍在1到65536之間,並支援“動態”更改分頻比。

獨立通道功能

  • 最多支援 6 個獨立通道:
    • 輸入捕獲(不包括通道5和6)
    • 輸出比較
    • PWM生成(邊沿和中心對齊模式)
    • 單脈衝模式輸出

其他特性

  • 互補輸出:帶可程式設計死區時間。
  • 同步電路:用於透過外部訊號控制定時器,並將多個定時器互連。
  • 重複計數器:在計數器經過指定數量的週期後更新定時器暫存器。
  • 2個斷點輸入:用於將定時器的輸出訊號置於安全的使用者可選配置中。
  • 中斷/DMA生成:在以下事件發生時產生中斷或DMA請求:
    • 更新事件:計數器溢位/下溢、計數器初始化(透過軟體或內部/外部觸發器)
    • 觸發事件:計數器啟動、停止、初始化或透過內部/外部觸發器計數
    • 輸入捕獲事件
    • 輸出比較事件
  • 支援增量(正交)編碼器和霍爾感測器電路:用於定位目的。
  • 觸發輸入:用於外部時鐘或週期性電流管理。

常用功能介紹

定時器同步或級聯

輸出比較

計算公式
嵌入式筆記5.1 定時器詳解

上圖是 TIM 輸出比較功能的主要硬體部分,不難看出時基單元(預分頻器時鐘 CK_PSC、預分頻器 PSC、自動重灌器 ARR)決定輸出 PWM 波形的頻率,自動重灌器 ARR 和 捕獲/比較器 CCR 決定 PWM 佔空比。計算公式有:

  • PWM 頻率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  • PWM佔空比:Duty = CCR / (ARR + 1)
  • PWM解析度:Reso = 1 / (ARR + 1)

當然佔空比還與輸出比較模式和輸出極性有關。

輸出比較模式
模式 描述
凍結 CNT=CCR時,REF保持為原狀態
匹配時置有效電平 CNT=CCR時,REF置有效電平
匹配時置無效電平 CNT=CCR時,REF置無效電平
匹配時電平翻轉 CNT=CCR時,REF電平翻轉
強制為無效電平 CNT與CCR無效,REF強制為無效電平
強制為有效電平 CNT與CCR無效,REF強制為有效電平
PWM模式1 向上計數:CNT<CCR時,REF置有效電平,CNT≥CCR時,REF置無效電平 向下計數:CNT>CCR時,REF置無效電平,CNT≤CCR時,REF置有效電平
PWM模式2 向上計數:CNT<CCR時,REF置無效電平,CNT≥CCR時,REF置有效電平 向下計數:CNT>CCR時,REF置有效電平,CNT≤CCR時,REF置無效電平

輸出比較模式透過 TIMx_CCMR 暫存器中 OC1M:輸出比較 1 模式 (Output compare 1 mode) 項進行設定。

輸出極性:

輸出極透過捕獲/比較使能暫存器 (TIMx_CCER) 中的 CCxP 項進行設定:

位 1 CC1P: 捕獲/比較 1 輸出極性 (Capture/Compare 1 output Polarity)。

CC1 通道配置為輸出:

0: OC1 高電平有效1: OC1 低電平有效

輸入捕獲

使用STM32定時器(TIM)進行輸入捕捉(Input Capture)可以測量外部訊號的週期、頻率或其他時間特性。其主要使用方法是透過輸入波形產生的中斷(上升沿或下降沿觸發),(在中斷服務函式)讀取中斷髮生時的計數器值(記錄在 CCR 暫存器中),並進行所需計算,得出想要結果(輸入波形的頻率、週期、佔空比等)。

使用步驟

  1. 初始化定時器和GPIO引腳:配置定時器和對應的GPIO引腳,以接收外部訊號。
  2. 配置捕捉/比較通道:設定輸入捕捉通道及其引數。
  3. 使能定時器中斷:以處理捕捉事件。
  4. 編寫中斷服務函式:在捕捉事件發生時,讀取捕捉值並進行處理。

相關文章