????????这段时间忙着各种考试和各种论文报告,手上一堆项目的事都搁在那了,好在这种情况最晚也就持续到30号。
????????抽空整理了一下关于STM32F4的通用定时器9~14的PWM输出配置步骤,为了后面的整体项目做个准备,磨刀不误砍柴工嘛!我干啥都讲究个应用为王,里面具体的寄存器的作用就不赘述了。
1、PWM原理
?????????PWM生成原理很简单,在定时器的一个计算周期内,当计数值大于ccr时,从此刻开始到周期结束产生一个高电平的脉冲。
2、通用定时器9~14的引脚
? ? ? ? 通用定时器9~14的每个定时器都有多达4个通道,且有些通道在芯片外观引脚上的反应也有很多,但基于后面要做的项目,这6个通用定时器都只选用通道1(还有个理由是,我在原理图上有些通道的引脚没找到,还希望大家指正,嘤嘤嘤)。对应的管脚为:
TIM9_CH1 | PA2/PE5 | TIM10_CH1 | PB8/PF6 | TIM11_CH1 | PB9/PF7 | TIM12_CH1 | PB14 | TIM13_CH1 | PA6/PF8 | TIM14_CH1 | PA7/PF9 |
?3、PWM输出配置步骤
? ? ? ? (1):使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12,ENABLE); //TIM12时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE); //TIM13时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM9,ENABLE); //TIM9时钟使能
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM10,ENABLE); //TIM10时钟使能
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM11,ENABLE); //TIM11时钟使能
? ? ? ? ? ? ? ? ? ? ?TIM9~11挂接在APB2总线,而TIM12~14挂接在APB1总线。? ?? ? ? ?
????????(2):使能IO口时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
? ? ? ? (3):IO口复用为定时器
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_TIM9); //GPIOA2复用为定时器9
GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM10); //GPIOB8复用为定时器10
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM11); //GPIOB9复用为定时器11
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_TIM12);//GPIOB14复用为定时器12
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM13); //GPIOA6复用为定时器13
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM14); //GPIOA7复用为定时器14
? ? ? ? (4):初始化GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
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); //初始化GPIOA2
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
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(GPIOB,&GPIO_InitStructure); //初始化GPIOB8
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
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(GPIOB,&GPIO_InitStructure); //初始化GPIOB9
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
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(GPIOB,&GPIO_InitStructure); //初始化GPIOB14
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
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); //初始化GPIOA6
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
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); //初始化GPIOA7
? ? ? ? (5):初始化定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseStructure); //x=9~14
?????????从stm32f4的内部时钟树可知,(1)当APB1和APB2分频数为1的时候,TIM9~TIM11的时钟为APB2的时钟,TIM12~TIM14的时钟为APB1的时钟;(2)如果APB1和APB2分频数不为1,那么TIM9~TIM11的时钟为APB2的时钟的两倍,TIM12~TIM14的时钟为APB1的时钟的两倍。因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,APB2总线时钟为2分频即84M,所以TIM9~TIM11的时钟为APB2时钟的两倍即168M,TIM12~TIM14的时钟为APB1的时钟的两倍即84M。所以定时器的周期便可通过公式得出:周期=((psc-1)*(arr-1))/对应定时器的时钟。一般psc=84或168不变,通过改变arr来改变周期。
? ? ? ? (6):初始化定时器的通道
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低
TIM_OC1Init(TIMx, &TIM_OCInitStructure); //初始化定时器x通道1,x=9~14
? ? ? ? (7):使能定时器在ccr1上的预装载寄存器
TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable); //使能定时器x在CCR1上的预装载寄存器,x=9~14
? ? ? ? (8):ARPE使能
TIM_ARRPreloadConfig(TIMx,ENABLE);//定时器x的ARPE使能,x=9~14
? ? ? ? (9):使能定时器
TIM_Cmd(TIMx, ENABLE); //使能定时器x,x=9~14
4、高电平脉冲持续时间设置
TIM_SetCompare1(TIMx,ccr); //修改ccr,修改高电平脉冲持续时间
|