STM32F407的PWM基本介绍与注意事项

前言:最近在用STM32F407单片机,结果到了PWM输出的时候,死活不能正常输出,例程可以正常用,但是我修改例程,改成其他定时器的其他通道就不行了,这让我百思不得其解。后来我不得不去来了解关于定时器底层,与引脚复用的知识后,还有高级与通用定时器的区别后我才找到问题所在。

先贴上代码

void TIM1_PWM_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	//TIM1时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); //GPIOA8复用为定时器1
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;           //GPIOA8
	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);              //初始化PF9
	  
	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(TIM1,&TIM_TimeBaseStructure);//初始化定时器14
	
	//初始化TIM1 Channel1 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式PWM1当计数值比ARR小,算有效电平
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:有效输出为高电平
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC1

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM1,ENABLE);//ARPE使能 
	
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//高级定时器TIM1就要写这个使能
										  
}  

先讲解复用引脚这方面的知识

GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); //GPIOA8复用为定时器1

这个函数就是用来进行引脚复用的,

那为什么需要引脚复用呢?  因为单片机每一个引脚都用不同的硬件功能,如TIM定时器,UART,ADC等等,具体哪个引脚有什么功能要参考芯片的原理图,这边给大家放上。

STM32F407的PWM基本介绍与注意事项_第1张图片

既然每个引脚对应这么多功能,那要让单片机知道我们想要调用的是哪个功能就需要这个复用函数了。GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); 其中第一个参数是GPIO类型,第二个参数是该GPIO的第几个引脚,第三个参数就是你想要将这个引脚复用为它对应的哪个功能,比如上面那个函数就是对PA8引脚复用为TIM1。

下面的三个结构体分别是,初始化GPIO,初始化TIM定时器,初始化TIM定时器的某一个通道,最后是各种的使能。这些只要修改结构体里面的参数就行,这与STM32F103基本一致,这里不再赘述。

其中最后的这个使能特别重要

TIM_CtrlPWMOutputs(TIM1,ENABLE);//高级定时器TIM1就要写这个使能

这个是高级定时器必须要有的使能函数,不然就不能正常输出PWM波。

你可能感兴趣的:(stm32,嵌入式硬件,单片机)