您好,登錄后才能下訂單哦!
本篇文章為大家展示了stm32通用定時器怎么使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
stm32的定時器又多又復雜,但復雜意味著強大吧。我用的是stm32f103ZET6,有2個基本定時器TIM6和TIM7可以用來觸發DAC,4個通用定時器TIM2,TIM3,TIM4,TIM5,兩個高級定時器TIM1和TIM8,還有兩個專用定時器SysTick和RTC。
TIM2,3,4,5,6掛在APB1總線上,TIM1,8掛在APB2總線上,V3.5固件庫默認時鐘為APB1=36MHz,APB2=72MHz。不過由于對于定時器來說APB1預分頻系數為1時頻率*2,所以定時器計數時鐘TIMXCLK都為72MHz。
通用定時器功能:1、基本時基功能計時。2、輸入捕獲(可用于測量脈沖周期和占空比)。3、輸出比較(四個通道可以當做四個定時器使用)。4、PWM功能。5、正交編碼器。
基本定時器:首先也是最重要的當然是定時器的時鐘配置了,如果TIMXCLK是72MHz,根據你的需要對時鐘進行分頻,分頻就是對結構體中的兩個成員進行賦值,
.TIM_Prescaler //這個成員是預分頻,對應一個16位的分頻寄存器,也就是說你可以進行1-65536分頻。這個分頻一般都能滿足需求。 .TIM_ClockDivision //這個是分頻可能會對,定時器外部計數時的濾波器有影響,所以不用它就行,直接賦值為TIM_CKD_DIV1一分頻,就是不分頻。因為.TIM_Prescaler這個分頻就夠用了。
簡單定時功能配置方式如下:
void tim2Config(void) //簡單定時功能 { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能時鐘 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數 TIM_TimeBaseInitStructure.TIM_Prescaler = 71; //71+1分頻,1MHz周期1us TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//時鐘不分頻 TIM_TimeBaseInitStructure.TIM_Period = 1000-1; //溢出周期1000 = 1ms TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //開啟溢出中斷計數到TIM_Period時,發生中斷 TIM_Cmd(TIM2, ENABLE); //使能TIM2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //配置中斷向量 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
關于中斷向量可以看一下這個博客:http://www.cnblogs.com/dyllove98/archive/2013/08/01/3230973.html
中斷函數:
void TIM2_IRQHandler(void) { if( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) //是否為溢出中斷 { TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); //清除中斷掛起位 } }
這里注意一定要清除中斷掛起位,不然會一直中斷。
2、PWM模式:
PWM模式理解起來簡單其實就是有兩個寄存器,一個是周期寄存器,另一個是比較寄存器。周期寄存器控制周期,比較寄存器控制有效電平(是高電平還是低電平由.TIM_OCPolarity_High的值決定)時間。假如向上計數時,計數器寄存器從零計數,計數到達比較寄存器中的值之前一直為有效電平,之后為另一個電平。計數到周期寄存器中的值時,一個周期完成。這樣就成了PWM了。
1、配置GPIO模式。2、配置TIM_TimeBaseInitTypeDef結構體。3、配置TIM_OCInitTypeDef結構體。
static void TIM3_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* TIM3 clock enable */ //PCLK1經過2倍頻后作為TIM3的時鐘源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOA and GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* * 函數名:TIM3_Mode_Config * 描述 :配置TIM3輸出的PWM信號的模式,如周期、極性、占空比 * 輸入 :無 * 輸出 :無 * 調用 :內部調用 */ static void TIM3_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM信號電平跳變值 */ u16 CCR1_Val = 500; u16 CCR2_Val = 375; u16 CCR3_Val = 250; u16 CCR4_Val = 125; /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles: TIM3CLK = 72 MHz, Prescaler = 0x0, TIM3 counter clock = 72 MHz TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1) TIM3 Frequency = 72 KHz. TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% ----------------------------------------------------------------------- */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 999; //當定時器從0計數到999,即為1000次,為一個定時周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; //設置預分頻:不預分頻,即為72MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分頻系數:不分頻 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置為PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //設置跳變值,當計數器計數到這個值時,電平發生跳變 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //當定時器計數值小于CCR1_Val時為高電平 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //設置通道2的電平跳變值,輸出另外一個占空比的PWM TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //設置通道3的電平跳變值,輸出另外一個占空比的PWM TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道3 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //設置通道4的電平跳變值,輸出另外一個占空比的PWM TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4 TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重載寄存器ARR /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); //使能定時器3 } /* * 函數名:TIM3_PWM_Init * 描述 :TIM3 輸出PWM信號初始化,只要調用這個函數 * TIM3的四個通道就會有PWM信號輸出 * 輸入 :無 * 輸出 :無 * 調用 :外部調用 */ void TIM3_PWM_Init(void) { TIM3_GPIO_Config(); TIM3_Mode_Config(); }
改變PWM占空比,即是改變比較寄存器的值。使用這個函數
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
使用方法簡單例如要改變,TIM3通道1的占空比就這樣,TIM_SetCompare1(TIM3, 900); 900為新的比較寄存器的值。
上述內容就是stm32通用定時器怎么使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。