STM32 TIM2通道重映射 PWM 無(wú)輸出波形
使用TIM2輸出PWM來(lái)驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng),使用TIM2CH3 (PB11引腳)輸出驅(qū)動(dòng)波形,通過(guò)數(shù)據(jù)手冊(cè)知道,PB10默認(rèn)的復(fù)用功能為USART3_TX,可以通過(guò)重映射作為TIM2_CH3用。
TIM2_CH3按照如下步驟配置為PWM輸出模式:
1、配置時(shí)鐘、管腳模式
開啟GPIOB、TIM2、AFIO時(shí)鐘,配置PB10為復(fù)用功能推挽輸出模式。
//TIM2_CH3管腳重映射
GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE); //PB10 TIM2_CH3
2、配置TIM2相關(guān)參數(shù)
//配置定時(shí)器時(shí)鐘分頻、定時(shí)周期
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//配置CH3比較輸出模式、PWM脈寬
TIM_OC3Init(TIM2,&TIM_OCInitStructure); //PB3PWM輸出
//比較輸出預(yù)裝載使能
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
//定時(shí)器自裝載使能
TIM_ARRPreloadConfig(TIM2, ENABLE);
//開中斷
TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE );
//使能定時(shí)器
TIM_Cmd(TIM2, ENABLE);
//配置中斷優(yōu)先級(jí)
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
3、中斷服務(wù)程序
TIM_ClearITPendingBit(TIM2,TIM_IT_CC3);
TIM_SetCompare3(TIM2,Pulse_value); //改變PWM占空比
按照以上配置好后,編譯下載沒(méi)有看到期望的波形,但先前按照此步驟寫的一個(gè)測(cè)試程序就能夠正常輸出波形。非常郁悶,比較兩套程序,配置步驟一樣,運(yùn)行時(shí)各個(gè)寄存器的配置也完全一樣,但是后來(lái)寫的程序就是沒(méi)有波形。找了一整天的問(wèn)題,也沒(méi)有發(fā)現(xiàn)問(wèn)題的原因,下班后無(wú)意看到一篇文章的一句話,
STM32 某些通道PWM無(wú)法輸出波形解決
如果同時(shí)開啟默認(rèn)的復(fù)用功能(USART3_TX)和重映射后的復(fù)用功能(TIM2_CH3)的時(shí)鐘,外設(shè)功能會(huì)產(chǎn)生沖突,造成工作異常的情況。
檢查工程中與USART3時(shí)鐘初始化的代碼,發(fā)現(xiàn)如下語(yǔ)句,
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3, ENABLE);
刪除后,編譯、下載,波形輸出終于出來(lái)了。