选择高级定时器TIM1
互补PWM输出模式配置和普通PWM输出配置相似,只是在其基础上增加对互补通道的配置。
PA9 -> TIM1_CH2
PB14 -> TIM1_CH2N
代码
#include "Advance_Tim.h"
void AdTim_Init(u16 fre, u8 duty)
{
u16 arr;
// PA9 -> TIM1_CH2 PB14 -> TIM1_CH2N
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //注意!!!和UART的TX配置相同,但LED配置的GPIO_Mode_Out_PP区分开
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
arr = 1000000 / fre;
TIM_TimeBaseStructure.TIM_Period = arr - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//PWM1模式时,CNT<CRR时,CH通道有效,CNT>CRR时,CH通道无效;
//PWM2模式时,CNT<CRR时,CH通道无效, CNN>CRR时,CH通道有效;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr - 1) * duty / 100;
//输出通道电平极性配置 :和CH通道有效相搭配
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//互补输出通道电平极性配置!!!
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
//输出通道空闲电平极性配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//空闲功能服务于刹车功能
//互补输出通道空闲电平极性配置!!!
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //空闲功能服务于刹车功能
//由输出控制原理,互补输出只需配置原路(CHx)输出即可,互补路(CHxN)不需要再初始化
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
注意:
1.IO模式:GPIO_Mode_AF_PP,和TX相同,但和LED模式:GPIO_Mode_Out_PP区分开
2.板子的PA9,PB14接口在拿掉跳线帽以后,选择靠近LCD显示屏的那一列。
3.没有中断