STM32F1 定时器TIM3 4路PWM波输出

STM32F1 定时器TIM3 4路PWM波输出 ,部分复用IO口 ,由于TIM3PWM输出引脚与JTAG 引脚冲突

所以要先禁用JTAG 。才会有4路PWM输出。

main.c

/*   使用为正点原子精英板   */
/*   接上LED等可以看到效果  */

#include 
//#include "myusart.h"
#include "timer.h"
#include "oled.h"
#include "delay.h"




int main()
{
	u16 pwm;
	delay_init();
	LED_init();
	OLED_init();
//	USART3_Init();
	MOTOR_TIME3_Init(999,719);
	OLED_ShowCharString(10,10,"XXXXXXXX:",16);
	OLED_RESET_Gram();
	while(1)
	{
		pwm++;
		if(pwm>600) {pwm = 0;}
		TIM_SetCompare1(TIM3,pwm);
		TIM_SetCompare2(TIM3,pwm);
		TIM_SetCompare3(TIM3,pwm);
		TIM_SetCompare4(TIM3,pwm);
		OLED_ShowNum(48,45,pwm,3,16);
		OLED_RESET_Gram();
	};
}

tim3.h

//输出通道设置PWM占空比
// ************************************************************************************************* //
// ************************************************************************************************* //
//TIM3初始化设置 **此函数部分映射输出通道**
// Period   :自动重装在值
// Prescaler:分频系数
//CH1\CH2 ->> PB4\PB5;
//CH3\CH4 ->> PB0\PB1;
void MOTOR_TIME3_Init(u16 Period,u16 Prescaler) //此处设置为 *(999,71)*
{
	GPIO_InitTypeDef  GPIO_Inittim3;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInittim3;
	TIM_OCInitTypeDef  TIM_OCInittim3;
//	NVIC_InitTypeDef  NVIC_Initpwm;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //定时器3时钟
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);   //TIM3部分冲映射
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //关闭JTAG-DP
	
	
	TIM_DeInit(TIM3);
	GPIO_Inittim3.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Inittim3.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_Inittim3.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Inittim3);//初始化GPIO
	
	TIM_TimeBaseInittim3.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
	TIM_TimeBaseInittim3.TIM_CounterMode=TIM_CounterMode_Up;  //向上计数模式
	TIM_TimeBaseInittim3.TIM_Period=Period;   //自动重装载值
	TIM_TimeBaseInittim3.TIM_Prescaler=Prescaler;   //预分频值
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInittim3);
	
	TIM_OCInittim3.TIM_OCMode=TIM_OCMode_PWM2;  //选择我PWM2模式输出
	TIM_OCInittim3.TIM_OCPolarity=TIM_OCPolarity_High;  //高电平有效
	TIM_OCInittim3.TIM_Pulse = 0;         //设置初始比较值为0
	TIM_OCInittim3.TIM_OutputState=TIM_OutputState_Enable; //使能输出状态
	TIM_OC1Init(TIM3,&TIM_OCInittim3);   //初始化以上参数
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能输出比较
	
	TIM_OCInittim3.TIM_OCMode=TIM_OCMode_PWM2;  //选择我PWM2模式输出
	TIM_OCInittim3.TIM_OCPolarity=TIM_OCPolarity_High;  //高电平有效
	TIM_OCInittim3.TIM_Pulse = 0;         //设置初始比较值为0
	TIM_OCInittim3.TIM_OutputState=TIM_OutputState_Enable; //使能输出状态
	TIM_OC2Init(TIM3,&TIM_OCInittim3);   //初始化以上参数
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能输出比较
	
	TIM_OCInittim3.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInittim3.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInittim3.TIM_Pulse = 0;
	TIM_OCInittim3.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC3Init(TIM3,&TIM_OCInittim3);
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OCInittim3.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInittim3.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInittim3.TIM_Pulse = 0;
	TIM_OCInittim3.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC4Init(TIM3,&TIM_OCInittim3);
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	TIM_Cmd(TIM3,ENABLE);
}

个人见解,感谢阅读。

你可能感兴趣的:(STM32)