stm32獲取定時器溢出狀態但不中斷
STM32CubeMX
STM32RCT6核心板
IDE Keil(MDK-ARM)
STM32CubeMX部分
1. 配置時鐘
選擇STM32F103RCTx系列芯片,配置時鐘的同時會自動配置IO口引腳
在這裏插入圖片描述
將HCLK設置為最大頻率72MHz
在這裏插入圖片描述
2.配置TIM
在這裏插入圖片描述
Internal Clock(內部時鐘)
Prtscaler (定時器分頻系數) : 71
Counter Mode(計數模式) Up(向上計數模式)
Counter Period(自動重裝載值) : 999
CKD(時鐘分頻因子) :No Division (不分頻 )
auto-reload-preload(自動重裝載) : Enable (使能)
在這裏插入圖片描述
勾選update interrupt(更新中斷)
1. 定時器溢出時間計算公式:
在這裏插入圖片描述
Tout:中斷溢出的時間
arr:自動重裝載值
psc:定時器分頻系數
Tclk:時鐘頻率
Tout = ((71+1)*(999+1))/72 us
Tout = ( 72 * 1000 ) / 72 us
1000us = 1ms
所以這裏我們的定時時間為:1ms
也就是說單片機1ms進入壹次定時器中斷
2. 定時器計數模式:
向上計數模式:計數器從0計數到自動加載值(TIMx_ARR),然後重新從0開始計數並且產生壹個計數器溢出事件。
向下計數模式:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然後從自動裝入的值重新開始,並產生壹個計數器向下溢出事件。
向上/向下計數模式(中央對齊模式):計數器從0開始計數到自動裝入的值-1,產生壹個計數器溢出事件,然後向下計數到1並且產生壹個計數器溢出事件;然後再從0開始重新計數。
在這裏插入圖片描述
2. 計數時鐘:
內部時鐘(TIMx_CLK):
外部時鐘模式1:外部捕捉比較引腳(TIx)
外部時鐘模式2:外部引腳輸入(TIMx_ETR)
內部觸發輸入(ITRx):使用壹個定時器作為另壹個定時器的預分頻器,如可以配置壹個定時器Timer1而作為另壹個定時器Timer2的預分頻器。
3.配置IO口
在這裏插入圖片描述
將PB0設置為:
低電平
Output模式
既不上拉也不下拉
響應速度低
4. 工程生成
在這裏插入圖片描述
在這裏插入圖片描述
工程管理依舊是這幾個選項,然後GENERATE CODE,STM32CubeMX部分完成。
MDK 5部分
HAL_TIM_IRQHandler(&htim1);//定時器中斷處理函數
此函數的作用是判斷中斷是否正常,是哪壹類定時器中斷(溢出中斷/捕獲中斷/PWM中斷…),然後進入相應的中斷回調函數
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器溢出中斷回調函數
定時器中斷時,每進行完壹個中斷,並不會立刻退出,而是會進入到中斷回調函數中
點開main.c在這裏插入圖片描述
在如圖位置上添加
HAL_TIM_Base_Start_IT(&htim1);//開啟定時器1
1
1
然後再tim.c文件中,添加
/* USER CODE BEGIN 0 */
uint16_t Tim_cnt = 0; //定時器計數
/* USER CODE END 0 */
1
2
3
1
2
3
然後在tim.c文件中重寫
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函數
在這裏插入圖片描述
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim1.Instance)
{
Tim_cnt++;
if(Tim_cnt==500) //0.5s進行壹次下列代碼
{
Tim_cnt=0; //清0
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
}
}
}
/* USER CODE END 1 */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
設壹個全局變量,每進壹次中斷+1,因為1ms進入壹次中斷,所以當Tim_cnt=500的時候(即0.5s)寫入我們需要運行的代碼(不要忘記清0)
編譯下載時需要選擇相對應的下載器,勾選以下
在這裏插入圖片描述
運行即可
本期工程文檔——>Gitee
在這裏插入圖片描述