cortex_m3_stm32嵌入式學習筆記(八):定時器中斷實驗(定時器的更新中斷)

ARM 505瀏覽

STM32 的定時器功能十分強大,有 TIME1 和 TIME8 等高級定時器,也有 TIME2~TIME5 等通用定時器,還有 TIME6 和TIME7 等基本定時器。

本節學習通用定時器 TIM3

STM32 的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等。

STM3 的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定時器功能包括:
1)16 位向上、向下、向上/向下自動裝載計數器( TIMx_CNT)。
2)16 位可編程(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘頻率的分頻系數為 1~
65535 之間的任意數值。
3) 4 個獨立通道( TIMx_CH1~4),這些通道可以用來作為:
A.輸入捕獲
B.輸出比較
C. PWM 生成(邊緣或中間對齊模式)
D.單脈沖模式輸出
4)可使用外部信號( TIMx_ETR)控制定時器和定時器互連(可以用 1 個定時器控制另外
一個定時器)的同步電路。
5)如下事件發生時產生中斷/DMA:
A.更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
B.觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
C.輸入捕獲
D.輸出比較
E.支持針對定位的增量(正交)編碼器和霍爾傳感器電路
F.觸發輸入作為外部時鐘或者按周期的電流管理


本實驗是實現TIM3的更新中斷。

TIM3相關配置文件 timer.c

#include "led.h" #include "timer.h" //arr:自動重裝值。 //psc:時鐘預分頻數 void TIM3_Int_Init(u16 arr,u16 psc) { 	TIM_TimeBaseInitTypeDef TIM_ist; 	NVIC_InitTypeDef NVIC_ist; 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①時鐘 TIM3 使能 	//定時器 TIM3 初始化   TIM_ist.TIM_Period = arr; //設置自動重裝載寄存器周期的值   TIM_ist.TIM_Prescaler =psc; //設置時鐘頻率除數的預分頻值   TIM_ist.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割   TIM_ist.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計數   TIM_TimeBaseInit(TIM3, &TIM_ist);  //②初始化 TIM3 	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );  //③允許更新中斷 	NVIC_ist.NVIC_IRQChannel=TIM3_IRQn; 	NVIC_ist.NVIC_IRQChannelPreemptionPriority=0; 	NVIC_ist.NVIC_IRQChannelSubPriority=3; 	NVIC_ist.NVIC_IRQChannelCmd=ENABLE; 	NVIC_Init(&NVIC_ist); 	 	TIM_Cmd(TIM3, ENABLE);  //⑤使能 TIM3 } //中斷服務程序 void TIM3_IRQHandler(void) { 	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 	{ 		TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中斷標志,(<span style="color:#ff6600;">很重要的</span>) 		LED1=!LED1; 	} } 

定時器的溢出時間計算公式如下:

Tout(溢出時間)= ((arr+1)*(psc+1))/Tclk;

Tclk為TIM3 的輸入時鐘頻率(單位為 Mhz)(72Mhz)。
假如我們傳入的參數為arr=4999 psc=7199 得到的溢出時間為500ms 意味著每500ms變會觸發一次更新中斷(LED1閃爍)當TIM3溢出后就會重新加載0,然后在向上計數(在初始化函數中選了向上計數模式)直到溢出后又會發生更新中斷。。

timer.h

#ifndef _TIMER_ #define _TIMER_ #include "sys.h" void TIM3_Int_Init(u16 arr,u16 psc); void TIM3_IRQHandler(void); #endif

主函數

#include "led.h" #include "sys.h" #include "timer.h" #include "delay.h" #include "usart.h" void init(void) { 	delay_init(); 	LED_Init(); 	NVIC_Configuration(); 	uart_init(9600); 	TIM3_Int_Init(4999,7199);//溢出時間為500ms }  int main(void) { 	init(); 	while(1) 	{ 		LED0=!LED0;	 		delay_ms(250); 	} }

最終會看到LED0和LED1 一直閃爍,但LED0的閃爍頻率比LED1高(一倍)




七星彩走势图2元网官网