STM32系列第11篇--定時(shí)器
STM32共有8個(gè)定時(shí)器:
通用定時(shí)器功能:
位于低速的APB1總線上(APB1)
16 位向上、向下、向上/向下(中心對(duì)齊)計(jì)數(shù)模式,自動(dòng)裝載計(jì)數(shù)器(TIMx_CNT)。
16 位可編程(可以實(shí)時(shí)修改)預(yù)分頻器(TIMx_PSC),計(jì)數(shù)器時(shí)鐘分頻。
4 個(gè)獨(dú)立通道(TIMx_CH1~4),這些通道可以用來作為:輸入捕獲、輸出比較、PWM 生成(邊緣或中間對(duì)齊模式)、單脈沖模式輸出 。
可使用外部信號(hào)(TIMx_ETR)控制定時(shí)器和定時(shí)器互連(可以用 1 個(gè)定時(shí)器控制另外一個(gè)定時(shí)器)的同步電路。
如下事件發(fā)生時(shí)產(chǎn)生中斷/DMA(6個(gè)獨(dú)立的IRQ/DMA請(qǐng)求生成器): 更新:計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā)) 、觸發(fā)事件(計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù)) 、輸入捕獲 、輸出比較 等。
通用定時(shí)器時(shí)鐘CK_INT=2*36M=72M
向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR),然后重新從0開始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。
程序要求:
通過定時(shí)器中斷配置,每500ms中斷一次,然后中斷服務(wù)函數(shù)中控制LED實(shí)現(xiàn)LED1狀態(tài)取反(閃爍)。
Tout(溢出時(shí)間)=(ARR+1)(PSC+1)/Tclk
timer.c
#include"timer.h"#include"led.h"http://通用定時(shí)器3中斷初始化//這里時(shí)鐘選擇為APB1的2倍,而APB1為36M//arr:自動(dòng)重裝值。//psc:時(shí)鐘預(yù)分頻數(shù)//這里使用的是定時(shí)器3!voidTIM3_Int_Init(u16arr,u16psc){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//時(shí)鐘使能//定時(shí)器TIM3初始化TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設(shè)置時(shí)鐘分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計(jì)數(shù)模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能指定的TIM3中斷,允許更新中斷//中斷優(yōu)先級(jí)NVIC設(shè)置NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//TIM3中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占優(yōu)先級(jí)0級(jí)NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//從優(yōu)先級(jí)3級(jí)NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能NVIC_Init(&NVIC_InitStructure);//初始化NVIC寄存器TIM_Cmd(TIM3,ENABLE);//使能TIMx}//定時(shí)器3中斷服務(wù)程序voidTIM3_IRQHandler(void)//TIM3中斷{if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//檢查TIM3更新中斷發(fā)生與否{TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中斷標(biāo)志LED1=!LED1;}}12345678910111213141516171819202122232425262728293031323334353637PWM輸出
工作過程:
CCR1:捕獲比較(值)寄存器(x=1,2,3,4):設(shè)置比較值。
CCMR1: OC1M[2:0]位:
對(duì)于PWM方式下,用于設(shè)置PWM模式1【110】或者PWM模式2【111】
模式1:計(jì)數(shù)值小于CCR1值為有效電平
模式2:計(jì)數(shù)值大于CCR1值為有效電平
CCER:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平有效。
CCER:CC1E位:輸入/捕獲1輸出使能。0:關(guān)閉,1:打開。
PWM輸出配置步驟:
1、使能定時(shí)器3和相關(guān)IO口時(shí)鐘。
使能定時(shí)器3時(shí)鐘:RCC_APB1PeriphClockCmd();
使能GPIOB時(shí)鐘:RCC_APB2PeriphClockCmd();
2、初始化IO口為復(fù)用功能輸出。函數(shù):GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
3、這里我們是要把PB5用作定時(shí)器的PWM輸出引腳,所以要重映射配置,
所以需要開啟AFIO時(shí)鐘。同時(shí)設(shè)置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
4、初始化定時(shí)器:ARR,PSC等:TIM_TimeBaseInit();
5、初始化輸出比較參數(shù):TIM_OC2Init();
6、使能預(yù)裝載寄存器:
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
7、使能定時(shí)器。TIM_Cmd();
8、不斷改變比較值CCRx,達(dá)到不同的占空比效果:TIM_SetCompare2();
程序要求:
使用定時(shí)器3的PWM功能,輸出占空比可變的PWM波,用來驅(qū)動(dòng)LED燈,從而達(dá)到LED【PB5]亮度由暗變亮,又從亮變暗,如此循環(huán)。
timer.c
voidTIM3_PWM_Init(u16arr,u16psc){//定義結(jié)構(gòu)體變量GPIO_InitTypeDefGPIO_InitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定時(shí)器3時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB"RCC_APB2Periph_AFIO,ENABLE);//使能GPIO時(shí)鐘和AFIO復(fù)用功能模塊時(shí)鐘GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//Timer3部分重映射TIM3_CH2->PB5//GPIO初始化,設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3CH2的PWM脈沖波形GPIOB.5GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//TIM_CH2GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化TIM3TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時(shí)鐘分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計(jì)數(shù)模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位//初始化TIM3Channel2PWM模式TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//設(shè)置PWM模式2TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//高電平有效TIM_OC2Init(TIM3,&TIM_OCInitStructure);//根據(jù)T指定的參數(shù)初始化外設(shè)TIM3OC2TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIM3在CCR2上的預(yù)裝載寄存器TIM_Cmd(TIM3,ENABLE);//使能TIM3}123456789101112131415161718192021222324252627282930
main.c
intmain(void){u16led0pwmval=0;u8dir=1;delay_init();//延時(shí)函數(shù)初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)uart_init(115200);//串口初始化為115200LED_Init();//LED端口初始化TIM3_PWM_Init(899,0);//不分頻。PWM頻率=72000000/900=80Khzwhile(1){delay_ms(10);if(dir)led0pwmval++;elseled0pwmval--;if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1;TIM_SetCompare2(TIM3,led0pwmval);//設(shè)置占空比}}12345678910111213141516171819輸入捕獲:
輸入捕獲的一般配置步驟:
① 初始化定時(shí)器和通道對(duì)應(yīng)IO的時(shí)鐘。
② 初始化IO口,模式為輸入:GPIO_Init();