楼主是新手,而且第一次发帖,分享一下自己遇到的一个小问题。
我用的是战舰开发板,想用tim1输出pwm。于是根据例程里面的 实验9 PWM输出实验 修改成TIM1的配置。
使用TIM1 的channel2输出,为PA.9管脚,因为同时也是USART1_TX管脚,所以我拔下了串口1的跳帽,用电线接到PB.5管脚(控制led0的),并把PB.5 IO口配置成了输入。
改好程序后,发现led0一直亮,并没有明暗的渐变过程,说明channel2即PA.9一直输出高电平,pwm没有正常输出。
我就去百度,了解到使用高级定时器输出pwm时必须加上这样一个配置 TIMx->BDTR |= 1<<15; 它是在把TIM1 的 BDTR寄存器的MOE位置位(第15位)
技术手册里如此描述:
MOE: 主输出使能 (Main output enable) 位15
一旦刹车输入有效,该位被硬件异步清’0’。根据AOE位的设置值,该位可以由软件清’0’或被自
动置1。它仅对配置为输出的通道有效。
0:禁止OC和OCN输出或强制为空闲状态;
1 :如果设置了相应的使能位(TIMx_CCER 寄存器的CCxE、CCxNE位) ,则开启OC和OCN输
出。
我增加了这样一行代码,果然好使了。
接下来
因为我在使用库函数版本的例程来学习stm32,所以我又去找到了执行这个功能的 库函数,并加到程序里面,同样是好用的。
TIM_CtrlPWMOutputs(TIM1,ENABLE);
下面是配置TIM1的代码。
[mw_shl_code=c,true]void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //?????¨?±?÷3?±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //????GPIO???è??AFIO???????????é?±??
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3??·??????? TIM3_CH2->  B5
//?è??????????????????????,????TIM1 CH2??PWM?????¨?? GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//??????GPIO
//??????TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷????????
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·?????
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò??????????
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //?ù??TIM_TimeBaseInitStruct?????¨????????????TIMx???±???ù??????
//??????TIM1 Channel2 PWM????
//TIM1->BDTR |= 1<<15; //????BDTR?????÷??MOE(?÷??????????),TIM1,TIM8?????¨?±?÷±???
// ?????????????ò???????ó????????????????????
TIM_CtrlPWMOutputs(TIM1,ENABLE); // ???????????ù??????????°?±???
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨?±?÷????:TIM?????í???÷??????2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±???????????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //????????:TIM????±?????????
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //?ù??T???¨???????????????èTIM1 OC2
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //????TIM1??CCR2?????¤×°???????÷
TIM_Cmd(TIM1, ENABLE); //????TIM1
}[/mw_shl_code]
|