4.看門狗、定時器、觸控電容

阿Q熊發表於2024-08-29

IWDG簡介 :獨立看門狗
本質:能產生系統復位訊號的計數器
特性:遞減的計數器;時鐘由獨立的RC振盪器提供(可在待機和停止模式下執行);看門狗被啟用後,當遞減計數器計數到0x000時產生復位
餵狗:在計數器計數到0之前,重灌載計數器的值,防止復位:IWDG有什麼作用
作用:主要用於檢測外界電磁干擾,或硬體異常導致的程式跑飛問題
獨立看門狗是異常處理的最後手段,不可依賴,應在設計時儘量避免異常的發生

IWDG溢位時間計算:
IWDG溢位時間計算公式(HAL庫):Tout =(psc∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
  Tout:溢位時間
  f𝐼𝑊𝐷𝐺:時鐘源頻率
  psc:預分頻係數
  rlr:重灌載值
暫存器設定分頻係數的方法:"psc" =4∗2^prer
  prer是IWDG_PR 的值
IWDG溢位時間計算公式(暫存器):Tout =((4∗2^prer)∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺

IWDG配置步驟:
1,使能IWDG,設定預分頻係數和重灌載值等(IWDG_PR/RL/KR):HAL_IWDG_Init()

typedef struct 
{ 
   IWDG_TypeDef *Instance; /* IWDG 暫存器基地址 */
   IWDG_InitTypeDef Init;       /* IWDG 初始化引數 */
}IWDG_HandleTypeDef;


2,把重灌載暫存器的值過載到計數器中,餵狗(IWDG_KR):HAL_IWDG_Refresh()

typedef struct
{ 
    uint32_t Prescaler;  /* 預分頻係數 */ 
    uint32_t Reload;       /* 重灌載值 */ 
} IWDG_InitTypeDef;

WWDG簡介 :視窗看門狗
本質:能產生系統復位訊號和提前喚醒中斷的計數器
特性:遞減的計數器;視窗期,可以餵狗,非視窗期,餵狗則會復位(W[6:0] ≥視窗期>0x3F)
餵狗:在視窗期內重灌載計數器的值,防止復位
作用:用於監測微控制器程式執行時效是否精準,主要檢測軟體異常

WWDG超時時間計算:T𝑜𝑢𝑡 =(4096∗2^WDGTB∗(T[5:0]+1))/Fwwdg

T𝑜𝑢𝑡:超時時間(沒餵狗)
Fwwdg:時鐘源頻率
4096:固定的預分頻係數
2^𝑊𝐷𝐺𝑇𝐵:WWDG_CFR暫存器設定的預分頻係數值
T[5:0]:計數器低6位

WWDG配置步驟:
1,使能WWDG,設定預分頻係數和視窗值等(WWDG_CR/WWDG_CFR):HAL_WWDG_Init()

typedef struct 
{
  WWDG_TypeDef *Instance; /* WWDG 暫存器基地址 */ 
  WWDG_InitTypeDef Init;      /* WWDG 初始化引數 */
}WWDG_HandleTypeDef;

2,WWDG Msp初始化:HAL_WWDG_MspInit() 配置NVIC、CLOCK等
3,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4,編寫中斷服務函式:WWDG_IRQHandler() HAL_WWDG_IRQHandler
5,重定義提前喚醒回撥函式:HAL_WWDG_EarlyWakeupCallback()
6,在視窗期內餵狗,重灌載計數器(WWDG_CR):HAL_WWDG_Refresh()

typedef struct 
{
  uint32_t Prescaler; /* 預分頻係數 */
  uint32_t Window;    /* 視窗值 */
  uint32_t Counter;    /* 計數器值 */
  uint32_t EWIMode;  /* 提前喚醒中斷使能 */ 
}WWDG_InitTypeDef;

軟體定時原理:使用純軟體(CPU死等)的方式實現定時(延時)功能
缺點:1,延時不精準;2,CPU死等
定時器定時原理:使用精準的時基,透過硬體的方式,實現定時功能
定時器核心就是計數器

STM32定時器分類:
常規定時器:
基本定時器
通用定時器
高階定時器
專用定時器:
獨立看門狗
視窗看門狗
實時時鐘
低功耗定時器
核心定時器:
SysTick定時器

定時器型別:
基本定時器:沒有輸入輸出通道,常用作時基,即定時功能
通用定時器:具有多路獨立通道,可用於輸入捕獲/輸出比較,也可用作時基
高階定時器:除具備通用定時器所有功能外,還具備帶死區控制的互補訊號輸出、剎車輸入等功能(可用於電機控制、數字電源設計等)

基本定時器:TIM6/TIM7
主要特性:16位遞增計數器(計數值:0~65535)
  16位預分頻器(分頻係數:1~65536)
  可用於觸發DAC
  在更新事件(計數器溢位)時,會產生中斷/DMA請求

定時器溢位時間計算方法:𝑇out =((𝐴𝑅𝑅+1)∗(𝑃𝑆𝐶+1))/𝐹𝑡
𝑇out:溢位時間
𝐹𝑡:時鐘源頻率
𝐴𝑅𝑅:自動重灌載暫存器的值
𝑃𝑆𝐶:預分頻器暫存器的值

定時器中斷實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_Base_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_Base_MspInit() 配置NVIC、CLOCK等
3,使能更新中斷並啟動計數器(DIER、CR1):HAL_TIM_Base_Start_IT()
4,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,定時器中斷處理公用函式,處理各種中斷(SR):TIMx_IRQHandler()等  HAL_TIM_IRQHandler()
6,定時器更新中斷回撥函式,由使用者重定義:HAL_TIM_PeriodElapsedCallback()

通用定時器:
TIM2/TIM3 /TIM4 /TIM5
主要特性:16位遞增、遞減、中心對齊計數器(計數值:0~65535)
16位預分頻器(分頻係數:1~65536)
可用於觸發DAC、ADC
在更新事件、觸發事件、輸入捕獲、輸出比較時,會產生中斷/DMA請求
4個獨立通道,可用於:輸入捕獲、輸出比較、輸出PWM、單脈衝模式
使用外部訊號控制定時器且可實現多個定時器互連的同步電路
支援編碼器和霍爾感測器電路等

通用定時器PWM輸出實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_PWM_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置PWM模式、比較值、輸出極性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
4,使能輸出比較並啟動計數器(CCER、CR1):HAL_TIM_PWM_Start()
5,修改比較值控制佔空比(CCRx可選):__HAL_TIM_SET_COMPARE()
6,使能通道預裝載(CCER可選):__HAL_TIM_ENABLE_OCxPRELOAD()

通用定時器輸入捕獲實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_IC_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置通道對映、捕獲邊沿、分頻、濾波等(CCMRx、CCER):HAL_TIM_IC_ConfigChannel()
4,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,使能更新中斷等(DIER):__HAL_TIM_ENABLE_IT()
6,使能輸入捕獲、捕獲中斷並啟動計數器(CCER、DIER、CR1):HAL_TIM_IC_Start_IT()
7,定時器中斷處理公用函式,處理各種中斷(SR):TIMx_IRQHandler()等  HAL_TIM_IRQHandler()
8,編寫更新中斷和捕獲回撥函式:
  定時器更新中斷回撥函式,由使用者重定義:HAL_TIM_PeriodElapsedCallback() 、
  定時器輸入捕獲回撥函式,由使用者重定義:HAL_TIM_IC_CaptureCallback()

通用定時器脈衝計數實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_IC_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置定時器從模式、觸發選擇、分頻、濾波等(SMCR、CCMRx、CCER):HAL_TIM_SlaveConfigSynchro()
4,使能輸入捕獲、啟動計數器(CCER、CR1):HAL_TIM_IC_Start()
5,獲取計數器當前值(CNT):__HAL_TIM_GET_COUNTER()
6,設定計數器的值(CNT):__HAL_TIM_SET_COUNTER()

高階定時器:TIM1/TIM8
主要特性:
16位遞增、遞減、中心對齊計數器(計數值:0~65535)
16位預分頻器(分頻係數:1~65536)
可用於觸發DAC、ADC
在更新事件、觸發事件、輸入捕獲、輸出比較時,會產生中斷/DMA請求
4個獨立通道,可用於:輸入捕獲、輸出比較、輸出PWM、單脈衝模式
使用外部訊號控制定時器且可實現多個定時器互連的同步電路
支援編碼器和霍爾感測器電路等
重複計數器
死區時間帶可程式設計的互補輸出
斷路輸入,用於將定時器的輸出訊號置於使用者可選的安全配置中

高階定時器輸出指定個數PWM實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_PWM_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_PWM_MspInit()
3,配置PWM模式、比較值、輸出極性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
4,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,使能更新中斷等(CCER):__HAL_TIM_ENABLE_IT()
6,使能輸出、主輸出、啟動計數器(CCER、CR1):HAL_TIM_PWM_Start()
7,定時器中斷處理公用函式,處理各種中斷(SR):TIMx_IRQHandler()等->HAL_TIM_IRQHandler()
8,定時器更新中斷回撥函式,由使用者重定義:HAL_TIM_PeriodElapsedCallback()

透過軟體產生事件(EGR):HAL_TIM_GenerateEvent()
啟動計數器(CR1):__HAL_TIM_ENABLE()

高階定時器輸出比較模式實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_OC_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等
3,設定輸出比較模式、比較值、輸出極性等(CCMRx、CCRx、CCER):HAL_TIM_OC_ConfigChannel()
4,使能通道預裝載(CCMRx):__HAL_TIM_ENABLE_OCxPRELOAD()
5,使能輸出比較、主輸出、啟動計數器(CR1、CCER、BDTR):HAL_TIM_OC_Start()
6,修改捕獲/比較暫存器的值(CCRx):__HAL_TIM_SET_COMPARE()

死區時間計算:
1,確定t𝐷𝑇𝑆的值:𝑓𝐷𝑇𝑆=Ft/(2^𝐶𝐾𝐷[1:0])
2,判斷DTG[7:5],選擇計算公式
3,代入選擇的公式計算

高階定時器互補輸出帶死區控制實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_PWM_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_PWM_MspInit()
3,配置PWM模式、比較值、輸出極性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
4,配置剎車功能、死區時間等(BDTR):HAL_TIMEx_ConfigBreakDeadTime()
5,使能輸出、主輸出、啟動計數器(CCER、CR1):HAL_TIM_PWM_Start()
6,使能互補輸出、主輸出、啟動計數器(CCER、CR1):HAL_TIMEx_PWMN_Start()

高階定時器PWM輸入模式實驗配置步驟:
1,初始化定時器基礎引數(CR1、ARR、PSC):HAL_TIM_IC_Init()
2,存放NVIC、CLOCK、GPIO初始化程式碼:HAL_TIM_IC_MspInit()
3,配置通道對映、捕獲邊沿、分頻、濾波等(CCMRx、CCER):HAL_TIM_IC_ConfigChannel()
4,配置從模式、觸發源、觸發邊沿等(SMCR、CCER):HAL_TIM_SlaveConfigSynchro()
5,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
6,使能輸入捕獲、捕獲中斷並啟動計數器(CCER、DIER、CR1):HAL_TIM_IC_Start_IT()、 HAL_TIM_IC_Start()
7,定時器中斷處理公用函式,處理各種中斷(SR):TIMx_IRQHandler()等-> HAL_TIM_IRQHandler()
8,定時器輸入捕獲回撥函式,由使用者重定義:HAL_TIM_IC_CaptureCallback()

檢測電容觸控按鍵過程:
1、TPAD引腳設定為推輓輸出,輸出低電平,實現電容放電到地
2、TPAD引腳設定為浮空輸入(IO復位後的狀態),電容開始充電
3、同時開啟TPAD引腳的輸入捕獲功能,開始捕獲高電平
4、等待充電過程中,上升沿觸發(充電到Vth(上升沿的電壓值))
5、計算充電時間(定時器捕獲/比較暫存器獲取)

--





相關文章