想要請問各位先進,我利用stm32f103要做PWM輸出,利用timer1 對 GPIO PE8, PE9 做輸出 程式碼如下,當我將PE8,9設定為out_pp時利用示波器可以看到波形輸出,但是一設定成AF_PP時,示波器就看不到任何輸出了! 所以想要請問,我下面的程式碼哪裡出錯了呢? 謝謝 void Time_init(void) { TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE); TIM1_TimeBaseInitStruct.TIM_Prescaler = 999; TIM1_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM1_TimeBaseInitStruct.TIM_Period = 8; TIM1_TimeBaseInitStruct.TIM_ClockDivision = 0x0; TIM1_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct); TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE); TIM_Cmd(TIM1,ENABLE); } void pwm_init(void) { TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 120; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 680; TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 ); TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE); TIM_Cmd(TIM1, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef g; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); g.GPIO_Pin = GPIO_Pin_9 ; g.GPIO_Mode = GPIO_Mode_AF_PP; g.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &g); g.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ; g.GPIO_Mode = GPIO_Mode_AF_PP; g.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &g); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); } int main(void) { RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); Time_init(); pwm_init(); while(1); } void TIM1_CC_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); GPIOE-> ODR ^= GPIO_Pin_9; } } |
是必須要利用另一個pin腳例如PA10,將其設定為OUT_PP,才可以從示波器看到波形變化嗎?
我不知道我這樣理解是否正確呢?
那如果是這樣,我怎麼知道我PWM打出來的波形是否正確呢?
謝謝
我们通常说的PWM输出一般指的是MCU硬件PWM输出,用户只需要配置好参数,启动PWM输出之后,不需要执行任何GPIO的操作语句。比如,配置并启动后,就执行while(1);,什么都不做,也能在相应的引脚输出PWM。
这种PWM输出是有条件的。首先,具有PWM输出功能的引脚是固定的某几个引脚,这些引脚连接到定时器。具体是那些引脚具有PWM功能,要查看所用器件的datasheet。用户通过配置定时器的相关寄存器来得到PWM输出。
要想知道输出波形是否正确,就要用示波器观察器波形,看看周期和占空比是否和理论计算的一致。
至于怎么计算,就要自己看数据手册的TIMER的章节了。
评分
查看全部评分
楼主问题应该出在对PWM输出的理解和REMAP配置应用。
PE9 PE8是对应CH1N\CH1互补输出。不过,你这里没有使能互补输出。那你的输出是在PE9.
要想让PE9输出PWM,使能AF_PP是应该的。out_pp是GPIO非复用输出配置。
然而你做的REMAP是部分REMAP,既然这样,OC1的输出还在PA8脚,而不是PE9脚。非常遗憾的上面代码里似乎连PA的时钟都没开。
但你关于TIMER1的基本配置还是可以用的,从描述来看捕捉中断也发生了。 碰巧的是你在中断里对PE9做了翻转操作,在PE9配置为OUT_PP时能看到IO切换信号,歪打正着的误以为是PWM信号。但如果你把PE9配置为AF_PP时反而什么也看不到了。
呵呵 大致过程和原因就这样。好好理下。上面伙伴也分别给你做了解释。
评分
查看全部评分