本篇文章介紹定時器的使用方法,並應用
流水燈,以及秒錶
應用展示:鏈接
定時器的作用
定時器(Timer)最基本的功能就是定時,定時功能與外設結合,可
定時發送 USART 數據
定時採集 AD數據。
將定時器與 GPIO結合起來使用,可以實現非常豐富的功能:
可以產生輸出波形
可以測量輸入信號的脈衝寬度
用定時器產生PWM 控制電機狀態是工業控制的普遍方法
STM32中定時器
STM32中一共有11個定時器:
所有定時器都是彼此獨立的,不共享任何資源
- 內核中的SysTick
SysTick是簡易的週期定時器,存在於控制器內核,其使用涉及的寄存器少,相同內核的器件間移植不需要修改程序。 - 常規定時器,共8個,分爲三類:
高級定時器2個:TIM1、TIM8 (能夠產生三對PWM互補輸出)
通用定時器4個:TIM2,TIM3, TIM4,TIM5,
基本定時器2個:TIM6、TIM7 (DAC觸發信號 )
TIM1、TIM8的時鐘由APB2的輸出產生,其他6個定時器的時鐘由APB1的輸出產生。
通用定時器可以用來 輸入捕獲 輸出比較 PWM輸出 脈衝計數等等
SysTick 系統滴答
SysTick 位於Cortex-M3核內的NVIC中,使用SysTick編寫的程序代碼在相同內核的器件間移植不需要修改。
簡單 好用。
使用該功能實現LED燈的亮1s,滅1s。
通過CubeMX實現硬件資源配置。
- 使用led燈 PA4 設爲output
- RCC 時鐘源 選擇外部高速時鐘
- 時鐘配置 使用外部高速時鐘,內部進行9倍頻作爲系統時鐘
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kZVdUwWQ-1581772748534)(https://gitee.com/nie_hen/test/raw/master/小書匠/1567780489150.png)]
到這裏系統滴答就算是配置好了
編寫代碼 - 編寫中斷服務函數
在 stm32f1xx_hal_cotex.c 添加一個函數HAL_SYSTICK_IRQHandler
void HAL_SYSTICK_IRQHandler(void)
{
HAL_SYSTICK_Callback();
}
- 將中斷服務函數添加
在stm32f1xx_it.c 中 SysTick_Handler函數添加一行代碼
HAL_SYSTICK_IRQHandler();
- 編寫中斷函數
/* USER CODE BEGIN 4 */
void HAL_SYSTICK_Callback(void)
{
Tick_ms++;
if(Tick_ms%1000==0)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
Tick_ms=0;
}
}
/* USER CODE END 4 */
Tick_ms 是一個int型的,初始值爲0的變量,每一ms調用一次callback,變量加一,直到1000ms即是1s的時候 GPIO電位反轉(高電位變成低電位,低電位的變成高電位)。led燈亮滅變換。變量重新置零
通用定時器
通用定時器的功能是通過操作相應寄存器實現的
每個通用定時器有四類可編程的控制器:
※ 預分頻器寄存器:TIMx_PSC
※ 自動重裝載寄存器, TIMx_ARR
※ 當前值寄存器, TIMx_CNT
※ 比較/捕獲寄存器(4個):TIMx_SR
計算定時器的工作頻率
TIMx_PSC 表示分頻係數
CK_CNT 表示定時器工作頻率
則定時器的工作頻率計算公式爲:
CK_CNT=CK_PSC/ (TIMx_PSC +1)
每一個CK_CNT脈衝,TIMx_CNT值就加1,從CNT=0計數到ARR時產生中斷,這時共經歷ARR個時鐘週期,中斷頻率
F_INT=CK_CNT/ (ARR+1)
普通定時器模塊的時鐘爲72MHz,分頻比(PSC)爲7199,那麼我們想要得到一個1秒鐘的定時,定時計數器ARR的值需要設定爲 10000 分頻比設置爲7199
因爲72 000 000 / (7199+1) = 10KHz
時鐘週期T=1/10KHz=100us
100us × 10 000 = 1s
技術模式分爲向上計數模式,向下計數模式,和中央對齊計數模式 。(通過控制寄存器來設置)
應用
同樣是使LED燈 亮一秒 滅一秒 循環
CubeMx配置
-
設置LED燈的引腳 output 初始化高電平(滅)
-
配置時鐘
RCC 使能外部高速時鐘
使用外部時鐘9倍頻,對APB1 進行2分頻,Timer2—5的時鐘頻率爲72MHz
-
設置定時器
時鐘源 : 使用內部定時器,預分頻:7200-1 ,計數模式:向上,ARR:10000,預裝載值自動重裝載:使能
打開中斷 在NVIC Setting中 選中Enable
軟件編程部分
開啓定時中斷:寫在初始化完成之後,while(1) 之前
HAL_TIM_Base_Start_IT(&htim2);
定時中斷回調函數
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
{
if (htim->Instance == htim2.Instance)
{
/ Toggle LED /
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
}
}
/ USER CODE END 4 */
達到1s的時候 判斷條件成立,對LED燈的電位進行翻轉,實現一秒的亮與滅
程序下載到開發板上可以看到一個led燈一會亮 一會滅
也可以通過示波器來看PA4的輸出情況
應用
使用SysTick(我感覺很好用 )或者普通計時器
實現 流水燈 (多個led燈循環顯示)
實現計時器 (將板子運行時間的秒數顯示到數碼管上)
兩個功能來回切換 (使用按鍵進行切換 )
思路
在CubeMx上的配置其實都一樣,主要是代碼上的設計。
- 第一個功能 將LED燈的引腳信息寫入數組 ,使用遍歷 在callback中 時間達到1s就對遍歷到的led燈和上一個led燈進行電位反轉。(這裏就需要注意 第一個led燈和最後一個led燈的時候特殊處理)
- 第二個功能 需要一個變量一直計時,然後將獲取到的值使用數碼管的函數進行顯示。
- 第三個功能 需要對掃描鍵盤進行處理,設置兩個鍵當獲取到其中一個鍵的時候做響應處理,而按到其他鍵不處理。
更多STM32學習教程
- STM32 cubemx keil5搭建學習環境
- 使用STM32 cubemx keil5實現led燈與數碼管控制
- 基於STM32 CubeMx keil5實現鍵盤的應用
- 基於STM32 CubeMx keil5實現串口通信 I2C與GPIO綜合應用
- 基於STM32 CubeMx keil5實現AD轉換獲取溫度
- 基於STM32 CubeMx keil5 學習使用I2C
- 基於STM32 CubeMx keil5 學習使用串口通信
- 基於STM32 CubeMx keil5應用定時器
- 基於STM32 cubemx keil5學習使用中斷
- 基於STM32 cubemx keil5綜合應用實現溫度控制系統