STM32 Cubemx 定時器介紹以及應用

本篇文章介紹定時器的使用方法,並應用
流水燈,以及秒錶
應用展示:鏈接

定時器的作用

定時器(Timer)最基本的功能就是定時,定時功能與外設結合,可
定時發送 USART 數據
定時採集 AD數據。
將定時器與 GPIO結合起來使用,可以實現非常豐富的功能:
可以產生輸出波形
可以測量輸入信號的脈衝寬度
用定時器產生PWM 控制電機狀態是工業控制的普遍方法

STM32中定時器

STM32中一共有11個定時器:
所有定時器都是彼此獨立的,不共享任何資源

  1. 內核中的SysTick
    SysTick是簡易的週期定時器,存在於控制器內核,其使用涉及的寄存器少,相同內核的器件間移植不需要修改程序。
  2. 常規定時器,共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編寫的程序代碼在相同內核的器件間移植不需要修改。
enter description here
簡單 好用。
使用該功能實現LED燈的亮1s,滅1s。
通過CubeMX實現硬件資源配置。

  1. 使用led燈 PA4 設爲output
  2. RCC 時鐘源 選擇外部高速時鐘
    enter description here
  3. 時鐘配置 使用外部高速時鐘,內部進行9倍頻作爲系統時鐘
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kZVdUwWQ-1581772748534)(https://gitee.com/nie_hen/test/raw/master/小書匠/1567780489150.png)]
    到這裏系統滴答就算是配置好了
    編寫代碼
  4. 編寫中斷服務函數
    在 stm32f1xx_hal_cotex.c 添加一個函數HAL_SYSTICK_IRQHandler
    void HAL_SYSTICK_IRQHandler(void)
    {
    HAL_SYSTICK_Callback();
    }
    enter description here
  5. 將中斷服務函數添加
    在stm32f1xx_it.c 中 SysTick_Handler函數添加一行代碼
    HAL_SYSTICK_IRQHandler();
    enter description here
  6. 編寫中斷函數
/* 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)

enter description here
普通定時器模塊的時鐘爲72MHz,分頻比(PSC)爲7199,那麼我們想要得到一個1秒鐘的定時,定時計數器ARR的值需要設定爲 10000 分頻比設置爲7199
因爲72 000 000 / (7199+1) = 10KHz
時鐘週期T=1/10KHz=100us
100us × 10 000 = 1s

技術模式分爲向上計數模式,向下計數模式,和中央對齊計數模式 。(通過控制寄存器來設置)
enter description here

應用
同樣是使LED燈 亮一秒 滅一秒 循環

CubeMx配置

  1. 設置LED燈的引腳 output 初始化高電平(滅)
    enter description here

  2. 配置時鐘
    RCC 使能外部高速時鐘
    enter description here
    使用外部時鐘9倍頻,對APB1 進行2分頻,Timer2—5的時鐘頻率爲72MHz
    enter description here

  3. 設置定時器
    時鐘源 : 使用內部定時器,預分頻:7200-1 ,計數模式:向上,ARR:10000,預裝載值自動重裝載:使能
    enter description here
    打開中斷 在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的輸出情況
enter description here

應用

使用SysTick(我感覺很好用 )或者普通計時器
實現 流水燈 (多個led燈循環顯示)
實現計時器 (將板子運行時間的秒數顯示到數碼管上)
兩個功能來回切換 (使用按鍵進行切換 )

思路
在CubeMx上的配置其實都一樣,主要是代碼上的設計。

  1. 第一個功能 將LED燈的引腳信息寫入數組 ,使用遍歷 在callback中 時間達到1s就對遍歷到的led燈和上一個led燈進行電位反轉。(這裏就需要注意 第一個led燈和最後一個led燈的時候特殊處理)
  2. 第二個功能 需要一個變量一直計時,然後將獲取到的值使用數碼管的函數進行顯示。
  3. 第三個功能 需要對掃描鍵盤進行處理,設置兩個鍵當獲取到其中一個鍵的時候做響應處理,而按到其他鍵不處理。

代碼鏈接

更多STM32學習教程

  1. STM32 cubemx keil5搭建學習環境
  2. 使用STM32 cubemx keil5實現led燈與數碼管控制
  3. 基於STM32 CubeMx keil5實現鍵盤的應用
  4. 基於STM32 CubeMx keil5實現串口通信 I2C與GPIO綜合應用
  5. 基於STM32 CubeMx keil5實現AD轉換獲取溫度
  6. 基於STM32 CubeMx keil5 學習使用I2C
  7. 基於STM32 CubeMx keil5 學習使用串口通信
  8. 基於STM32 CubeMx keil5應用定時器
  9. 基於STM32 cubemx keil5學習使用中斷
  10. 基於STM32 cubemx keil5綜合應用實現溫度控制系統
發佈了36 篇原創文章 · 獲贊 56 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章