STM32的TIM1和TIM8是两个高级定时器,TIM8_CH1N和TIM8_CH1如果两路都需要输出PWM则不能独立输出不同的占空比,他们只能输出可以带死区控制的互补波形。这里只讨论如何在TIM8_CH1N上输出PWM波形。
STM32F407 100引脚的Pin30 => PA5 => TIM8_CH1N
//Pin30 PA5 TIM8_CH1N
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); //TIM8时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟
RCC_GetClocksFreq(&freqInfo);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM8); //PA5复用为定时器TIM8_CH1N功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //Pin5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //使用复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5
TIM_TimeBaseStructure.TIM_Prescaler = X_PRESCALER - 1;//预分频后频率为1MHz
TIM_TimeBaseStructure.TIM_Period = X_MIN_US_PER_PULSE - 1;//自动重装载值,确定pwm周期为多少
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//初始化TIM8定时器
//初始化TIM8_CH1N PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;//禁用TIM8_CH1输出
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//使能TIM8_CH1N输出
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//设置TIM8_CH1空闲电频状态
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//设置TIM8_CH1N空闲电频状态
//只要TIM的 计数器值<比较器值 都是有效电频,否则为无效。但是可以设置PWM的有效电频是低电频还是高电频。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//设置TIM8_CH1有效电频状态
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//设置TIM8_CH1N有效电频状态
TIM_CtrlPWMOutputs(TIM8 , ENABLE);//高级定时器TIM1和TIM8必须使能这一句否则无法输出pwm
TIM_Cmd(TIM8 , ENABLE);//使能TIM8
TIM_SetAutoreload(TIM8 , 1000);//设置自动重载值
TIM_SetCompare1(TIM8 , (TIM8->ARR + 1) / 2);//设置TIM8_CH1N输出50%占空比
需要特别注意的是3个地方
1. TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
注意这里使用的不是TIM_OutputState_Enable而是TIM_OutputNState_Enable
2. TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
注意这里使用的不是TIM_OCIdleState_Reset而是TIM_OCNIdleState_Reset
3. TIM_CtrlPWMOutputs(TIM8 , ENABLE);
高级定时器TIM1和TIM8必须使能这一句否则无法输出pwm