【STM32】定时器中断实验代码详解
生活随笔
收集整理的這篇文章主要介紹了
【STM32】定时器中断实验代码详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- main.c
- timer.c
- timer.h
STM32 的通用定時器是一個通過可編程預分頻器(PSC)驅動的 16 位自動裝載計數器(CNT)構成。
STM32 的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等。
高級定時器:TIME1、TIME8
通用定時器:TIME2~TIME5
基本定時器:TIME6、TIME7
定時器相關的庫函數主要集中在固件庫文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中。
| 1. TIM3 時鐘使能 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能 |
| 2. 初始化定時器參數,設置自動重裝值,分頻系數,記數方式等 | voidTIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); |
| 3. 設置 TIM3_DIER 允許更新中斷 | void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); |
| 使能 TIM3 的更新中斷 | TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); |
| 4. TIM3 中斷優先級設置 | |
| 5. 允許 TIM3 工作,也就是使能 TIM3 | void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) |
| 使能定時器 3 | TIM_Cmd(TIM3, ENABLE); //使能 TIMx 外設 |
| 6. 編寫中斷服務函數 | ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t) |
| 比如,判斷定時器 3 是否發生更新(溢出)中斷 | if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){} |
| void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) | |
| TIM_ClearITPendingBit(TIM3, TIM_IT_Update); |
控制寄存器 1(TIMx_CR1)。本實驗我們只用到了 TIMx_CR1 的最低位,也就是計數器使能位,該位必須置 1,才能讓定時器開始計數。
DMA/中斷使能寄存器(TIMx_DIER)。這里我們同樣只關心它的第 0 位,該位是更新中斷允許位,本章用到的是定時器的更新中斷,所以該位要設置為 1,來允許由于更新事件所產生的中斷。
預分頻寄存器(TIMx_PSC)。該寄存器用設置對時鐘進行分頻,然后提供給計數器,作為計數器的時鐘。
TIMx_CNT 寄存器
自動重裝載寄存器(TIMx_ARR)。
狀態寄存器(TIMx_SR)。
本章將通過 TIM3 的中斷來控制 DS1 的亮滅,DS0 和 DS1 的電路在之前已經介紹過。而 TIM3 屬于 STM32 的內部資源,只需要軟件設置即可正常工作。
main.c
#include "led.h" #include "delay.h" #include "sys.h" #include "timer.h"int main(void) { delay_init(); // 延時函數初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 設置中斷優先級分組2LED_Init(); // 初始化與LED連接的硬件接口TIM3_Int_Init(4999,7199); // 10Khz的計數頻率,計數到5000為500ms while(1){LED0=!LED0;delay_ms(200); } }timer.c
#include "timer.h" #include "led.h"//通用定時器中斷初始化 //這里時鐘選擇為APB1的2倍,而APB1為36M //arr:自動重裝值。 //psc:時鐘預分頻數 //這里使用的是定時器3! void TIM3_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 時鐘使能// 定時器 TIM3 初始化TIM_TimeBaseStructure.TIM_Prescaler = psc; // 設置用來作為TIMx時鐘頻率除數的預分頻值 10Khz的計數頻率 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上計數模式TIM_TimeBaseStructure.TIM_Period = arr; // 設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數到5000為500msTIM_TimeBaseStructure.TIM_ClockDivision = 0; // 設置時鐘分割:TDTS = Tck_timTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能或者失能指定的TIM中斷// 中斷優先級 NVIC 設置NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // TIM3中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 先占優先級0級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 從優先級3級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道被使能NVIC_Init(&NVIC_InitStructure); // 根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器TIM_Cmd(TIM3, ENABLE); // 使能TIMx外設 }// 定時器 3 中斷服務程序 void TIM3_IRQHandler(void) //TIM3中斷 {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) // 檢查指定的TIM中斷發生與否:TIM 中斷源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除TIMx的中斷待處理位:TIM 中斷源 LED1=!LED1;} }timer.h
#ifndef __TIMER_H #define __TIMER_H #include "sys.h"void TIM3_Int_Init(u16 arr,u16 psc); #endif總結
以上是生活随笔為你收集整理的【STM32】定时器中断实验代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】窗口看门狗 WWDG 实验
- 下一篇: 【STM32】PWM 输出实验代码详解