日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

定时器--STM32f4--HAL

發(fā)布時(shí)間:2023/12/1 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定时器--STM32f4--HAL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本概念

STM32中有三種定時(shí)器,高級(jí)定時(shí)器,通用定時(shí)器,基本定時(shí)器,具體如下圖:

發(fā)生如下事件將產(chǎn)生中斷/DMA

  • 更新:計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化
  • 觸發(fā)事件:計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù)
  • 輸入捕獲
  • 輸出比較
  • 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
  • 觸發(fā)事件作為外部時(shí)鐘或者按周期的電流管理

計(jì)數(shù)器模式

  • 向上計(jì)數(shù):計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值A(chǔ)RR,然后重新沖0開始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件
  • 向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值A(chǔ)RR開始向下計(jì)數(shù)到0,然后從自動(dòng)裝載值重新開始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件
  • 終于對齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開始計(jì)數(shù)到自動(dòng)裝載值的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后再從0開始重新計(jì)數(shù)
  • 定時(shí)器中斷實(shí)現(xiàn)步驟

  • 使能定時(shí)器
  • __HAL_RCC_TIM3_CLK_ENABLE();
  • 初始化定時(shí)器,配置ARR,PSC
  • HAL_TIM_Base_Init();
  • 開啟定時(shí)器中斷
  • HAL_TIM_Base_Start(); HAL_TIM_Base_Start_IT();
  • 設(shè)置中斷優(yōu)先級(jí)
  • HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();
  • 編寫中斷服務(wù)函數(shù)
  • TIMx_IRQHandler();//中斷服務(wù)函數(shù) HAL_TIM_IRQHandler(); //HAL庫定時(shí)器中斷通用處理函數(shù) HAL_TIM_PeriodElapsedCallback(); //定時(shí)器更新中斷回調(diào)函數(shù)

    具體代碼

    使用TIM3讓LED1每500ms亮一次

  • 使能定時(shí)器,我們放在第二步
  • 初始化定時(shí)器,配置ARR,PSC
  • TIM_HandleTypeDef time_handler; void time_init(void) {time_handler.Instance = TIM3; //可以取TIM1-TIM14time_handler.Init.CounterMode = TIM_COUNTERMODE_UP; //計(jì)數(shù)模式,向上/下time_handler.Init.Period = 5000-1; //自動(dòng)裝載值,即ARR的值time_handler.Init.Prescaler = 9000-1;//預(yù)分配系數(shù),即PSC的值 //定時(shí)時(shí)間=(Period+1)(Prescaler+1)/Tclk=90000000(9Mhz)//time_handler.Init.ClockDivision= 時(shí)鐘分頻因子:定時(shí)器時(shí)鐘與數(shù)字濾波器分頻比//time_handler.Init.RepetitionCounter= 重復(fù)計(jì)數(shù)次數(shù):高級(jí)定時(shí)器使用HAL_TIM_Base_Init(&time_handler); }void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM3){__HAL_RCC_TIM3_CLK_ENABLE();HAL_NVIC_EnableIRQ(TIM3_IRQn);HAL_NVIC_SetPriority(TIM3_IRQn,3,3);HAL_TIM_Base_Start_IT(&time_handler); //開啟定時(shí)器并更新中斷,以后每次更新中斷,都會(huì)調(diào)用TIM3_IRQHandler}}

    HAL_TIM_Base_Init初始化定時(shí)器后,會(huì)調(diào)用HAL_TIM_Base_MspInit函數(shù),我們可以在HAL_TIM_Base_MspInit中使能TIM3,HAL_TIM_Base_MspInit還開啟TIM3中斷以及設(shè)置中斷優(yōu)先級(jí)

    對于Init參數(shù)

    • Instance 可以取值TIM1到TIM14,表示使用哪個(gè)定時(shí)器
    • CounterMode :計(jì)數(shù)模式,向上/下
    • Period :自動(dòng)裝載值,即ARR的值
    • Prescaler :預(yù)分配系數(shù),即PSC的值
    • ClockDivision: 時(shí)鐘分頻因子,定時(shí)器時(shí)鐘與數(shù)字濾波器分頻比
    • RepetitionCounter:重復(fù)計(jì)數(shù)次數(shù),高級(jí)定時(shí)器使用

    定時(shí)時(shí)間=(Period+1)(Prescaler+1)/Tclk
    Tclk:輸入時(shí)鐘頻率,TIM3為90M,計(jì)算得出定時(shí)時(shí)間=0.5s

  • 開啟定時(shí)器中斷,在步驟2中完成
  • 設(shè)置中斷優(yōu)先級(jí),在步驟2中完成
  • 步驟1-4是配置TIM3定時(shí)器中斷,步驟5是來處理TIM3定時(shí)器中斷

  • 編寫中斷服務(wù)函數(shù)
  • void TIM3_IRQHandler(void) {HAL_TIM_IRQHandler(&time_handler); //HAL定時(shí)器中斷通用函數(shù) }//定時(shí)器通用更新中斷回調(diào)函數(shù) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM3){LED1 = !LED1;}}

    當(dāng)定時(shí)器TIM3時(shí)間到了時(shí),會(huì)調(diào)用TIM3_IRQHandler函數(shù),每個(gè)定時(shí)器都用一個(gè)中斷服務(wù)處理函數(shù),在TIM3_IRQHandler中,我們使用了HAL庫定時(shí)器通用處理函數(shù)HAL_TIM_IRQHandler,HAL_TIM_IRQHandler內(nèi)部會(huì)調(diào)用HAL_TIM_PeriodElapsedCallback更新回調(diào)函數(shù),我們在HAL_TIM_PeriodElapsedCallback寫邏輯處理就可以了

    main函數(shù)調(diào)用time_init即可,具體代碼

    int main(void) {//u8 press;HAL_Init();Stm32_Clock_Init(360,25,2,8);delay_init(180);Rcc_Init();LED_Init();KEY_Init();time_init();while(1){}}

    總結(jié)

    以上是生活随笔為你收集整理的定时器--STM32f4--HAL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。