stm32hal庫–定時器
任務(wù)一:串口發(fā)送計數(shù)器的值
一.Cube MX配置
1.打開串口2及其中斷,用于發(fā)送數(shù)據(jù)
2.將高速外部時鐘源設(shè)置為晶振,提高定時精度
3.將HCLK改為72MHz
4.開啟定時器
TIM4–勾選 Internal Clock(內(nèi)部時鐘)/
TIM2–將Clock Source選擇為Internal Clock
5.設(shè)置預(yù)分頻器
Prescaler–n(想要實現(xiàn)的分頻)-1
Counter Period(自動重裝載寄存器)m-1
[即每數(shù)到m次計數(shù)器清零)
二.代碼部分
-
定時器啟動函數(shù) HAL_TIM_Base_Start
(接收tim4句柄的指針)
1.啟動定時器
Base定時器基本用法 調(diào)用此函數(shù)后TIM4開始計時工作
2.打印計數(shù)器的計數(shù)值
定義counter存儲計數(shù)器的值
定義char數(shù)組message用以拼接字符串 -
宏定義-獲取計數(shù)器值函數(shù)__HAL_TIM_GET_COUNTER(參數(shù)為htim4的指針)
tips:hal庫中宏定義函數(shù)比較偏底層,傾向于直接對寄存器進(jìn)行操作
3.循環(huán)中
(1) 使用counter變量接受獲取到的計數(shù)器值
(2) 使用sprintf進(jìn)行字符串拼接
(用于儲存字符串的message變量,
(3) 想用串口發(fā)出的字符串"counter:%d",counter); -
串口中斷發(fā)送函數(shù) HAL_UART_Transmit_IT
(用來發(fā)送的串口的指針,要發(fā)送數(shù)據(jù)的指針,發(fā)送數(shù)據(jù)的長度)
(4) 防止發(fā)送過快 HAL_Delay
tips:HAL_Delay函數(shù)精確延時 每次延時都比填入數(shù)字多1ms
(5)sprintf–頭文件stdio
strlen–頭文件string
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
...
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim4);
int counter=0;
char message[20];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
counter=__HAL_TIM_GET_COUNTER(&htim4);
sprintf(message,"counter: %d",counter);
HAL_UART_Transmit_IT(&huart2,(uint8_t*)message,strlen(message));
HAL_Delay(99);
/* USER CODE END WHILE */
三.實現(xiàn)效果
tips:開始時按KRST鍵(reset復(fù)位按鈕)
從0開始計數(shù) 每100毫秒數(shù)1000個數(shù)
到10000個數(shù)(即9999)時計數(shù)器清零
函數(shù)補(bǔ)充
- __HAL_TIM_GET_COUNTER 獲取計數(shù)器的值
- HAL_TIM_SET_COUNTER 用于設(shè)置計數(shù)器的值
- HAL_TIM_GET_AUTORELOAD 獲取重裝載寄存器的值
- HAL_TIM_SET_AUTIRELOAD 設(shè)置重裝載寄存器的值
- HAL_TIM_SET_PRESCALER 設(shè)置預(yù)分頻器的值
任務(wù)二:定時
一.Cube MX配置
二.代碼部分
1.啟動定時器(+_IT 使其清零時觸發(fā)更新中斷)
- HAL_TIM_Base_Start_IT
2.重寫中斷回調(diào)函數(shù)
1.找到中斷回調(diào)函數(shù) - HAL_TIM_PeriodElapsedCallback 中斷回調(diào)函數(shù)
/* USER CODE BEGIN 0 */
char data[]="????????";
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==&htim4){
HAL_UART_Transmit_IT(&huart2,(uint8_t*)data,strlen(data));
}
}
/* USER CODE END 0 */
tips:Transmi_IT是非阻塞發(fā)送,若中斷中的Transmi_IT和while循環(huán)中的Transmit_IT發(fā)送間隔太小,會導(dǎo)致上次的數(shù)據(jù)沒發(fā)完就被下次發(fā)送的數(shù)據(jù)覆蓋
所以這里要注釋掉while循環(huán)中的發(fā)送
三.實現(xiàn)效果
每隔1ms發(fā)送數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-788565.html
補(bǔ)充
- 預(yù)分頻器和重裝載寄存器都存在影子寄存器,重裝載寄存器的影子寄存器可手動調(diào)整是否開啟
開啟重裝載寄存器的影子寄存器,使新設(shè)置的清零值等到下個周期生效,防止更改數(shù)值后錯過
Core:定時器就是計數(shù)器
原理部分后續(xù)補(bǔ)充…文章來源地址http://www.zghlxwxcb.cn/news/detail-788565.html
到了這里,關(guān)于keysking 【stm32】hal庫學(xué)習(xí)筆記--定時器(超詳細(xì)!)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!