本帖最后由 yviihpl 于 2015-12-29 22:11 编辑
各位高手,我用的64引脚的STM32F103,用TIM1生成PWM仿真成功了,因为需要4路PMW,而TIM1的CH2,CH3对应的PA9,PA10检测不到PMW信号,为什么呢?进而我想改成TIM2或者TIM4,我把IO口配置也改了,但是总是不成功,仿真PA0口没有PWM波,百思不得其解,请多多指教。
TIM1复用
引脚图
以下程序是1路PWM的:黄色是由TIM1更改而来。
#include "sys.h" voidTIM3_Int_Init(u16 arr,u16 psc); voidTIM2_PWM_Init(u16 arr,u16 psc); voidTIM3_IRQHandler(void); uint16_t Duty[]={0x7F,0x87,0x8F,0x97,0x9F,0xA6,0xAE,0xB5,0xBC,0xC3,0xCA,0xD0,0xD6,0xDC,0xE1,0xE6 ,0xEB,0xEF,0xF2,0xF6,0xF8,0xFA,0xFC,0xFD,0xFE,0xFE,0xFE,0xFD,0xFC,0xFA,0xF8,0xF6 ,0xF2,0xEF,0xEB,0xE6,0xE1,0xDC,0xD6,0xD0,0xCA,0xC3,0xBC,0xB5,0xAE,0xA6,0x9F,0x97 ,0x8F,0x87,0x7F,0x77,0x6F,0x67,0x5F,0x58,0x50,0x49,0x42,0x3B,0x34,0x2E,0x28,0x22 ,0x1D,0x18,0x13,0x0F,0x0C,0x08,0x06,0x04,0x02,0x01,0x00,0x00,0x00,0x01,0x02,0x04 ,0x06,0x08,0x0C,0x0F,0x13,0x18,0x1D,0x22,0x28,0x2E,0x34,0x3B,0x42,0x49,0x50,0x58 ,0x5F,0x67,0x6F,0x77}; uint16_tcount = 0; uint16_tnum = sizeof(Duty)/(sizeof(Duty[0])); int main(void) { TIM3_Int_Init(299,47);//1Mhz的计数频率, TIM2_PWM_Init(499,47);//不分频。PWM频率=72000/(899+1)=80Khz while(1); } //TIM2 pwm void TIM2_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period= arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision= 0; TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse= 0; TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM2,ENABLE); //MOE 主输出使能 TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); // TIM_Cmd(TIM2, ENABLE);
} //TIM3中断初始化 void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); /
TIM_TimeBaseStructure.TIM_Period= arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision= 0; TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); /
TIM_ITConfig( TIM3, TIM_IT_Update , ENABLE ); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3; NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; NVIC_Init(&NVIC_InitStructure); //
TIM_Cmd(TIM3,ENABLE); // } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 TIM_SetCompare1(TIM2,Duty[count]); count++; if(count==num) { count=0; } } }
|