STM32的PWM波形输出例程调试芯片:STM32F103C8T6外部晶振:8MHz功能介绍:使用Timer3实现两路(可四路)PWM波形的输出代码如下:初始化:系统时钟初始化,GPIO端口初始化,Timer初始化系统时钟初始化:1./*配置系统时钟为72M*/2.SystemInit();GPIO端口初始化:1./****************************************************************2.*函数名:voidGPIO_Config(void)3.*描述:配置复用输出PWM时用到的I/O4.*输入:无5.*输出:无6.*调用:main()调用7.***************************************************************/8.voidGPIO_Config(void)9.{10.GPIO_InitTypeDefGPIO_InitStructure;11.12./*GPIOAandGPIOBclockenable*/13.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);14.15./*GPIOAConfiguration:TIM3channel1and2asalternatefunctionpush-pull*/16.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;17.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出18.GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;19.GPIO_Init(GPIOA,&GPIO_InitStructure);20.}Timer初始化:1./****************************************************************2.*函数名:voidTIM3_Config(void)3.*描述:配置TIM3输出的PWM信号的模式4.*CH1:输出T=2.5ms(f=1/2.5ms=400Hz)D=0.6的PWM波(高电平在前,低电平在后)5.*CH2:输出T=2.5ms(f=1/2.5ms=400Hz)D=0.4的PWM波(高电平在后,低电平在前)6.*步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler7.*T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms8.*因为TIM_Period65535,所以TIM_Prescaler1,即TIM_Prescaler=29.*所以TIM_Period=59999=0xEA5F10.*步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity11.*CH1:因为D=0.6,先高后低;12.*所以CCR1=(TIM_Period+1)*D=36000;TIM_OCPolarity=TIM_OCPolarity_High13.*CH2:因为D=0.4,先高后低;14.*所以CCR1=(TIM_Period+1)*(1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low15.*步骤三:基础寄存器初始化16.*步骤四:通道寄存器初始化17.*步骤五:使能TIM3重载寄存器ARR18.*步骤六:使能TIM319.*输入:无20.*输出:无21.*调用:main()调用22.***************************************************************/23.voidTIM3_Config(void)24.{25.TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;26.TIM_OCInitTypeDefTIM_OCInitStructure;27./*PWM信号电平跳变值*/28.u16CCR1=36000;29.u16CCR2=36000;30./*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/31.RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);32./*Timebaseconfiguration*/33.TIM_TimeBaseStructure.TIM_Period=0xEA5F;34.TIM_TimeBaseStructure.TIM_Prescaler=2;//设置预分频:预分频=2,即为72/3=24MHz35.TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分频系数:不分频36.TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数溢出模式37.TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);38./*PWM1Modeconfiguration:Channel1*/39.TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//配置为PWM模式140.TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;41.TIM_OCInitStructure.TIM_Pulse=CCR1;//设置跳变值,当计数器计数到这个值时,电平发生跳变42.TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//当定时器计数值小于CCR1时为高电平43.TIM_OC1Init(TIM3,&TIM_OCInitStructure);//使能通道144.TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);45./*PWM1Modeconfiguration:Channel2*/46.TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;47.TIM_OCInitStructure.TIM_Pulse=CCR2;//设置通道2的电平跳变值,输出另外一个占空比的PWM48.TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//当定时器计数值小于CCR2时为低电平49.TIM_OC2Init(TIM3,&TIM_OCInitStructure);//使能通道250.TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);51.TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIM3重载寄存器ARR52./*TIM3enablecounter*/53.TIM_Cmd(TIM3,ENABLE);//使能TIM354.}主函数代码:1./***************************************************************2.*函数名:main3.*描述:主函数4.*输入:无5.*输出:无6.***************************************************************/7.intmain(void)8.{9.SystemInit();10.GPIO_Config();11.TIM3_Config();12.while(1)13.{14.15.}16.}最后上结果图:疑问:虽然不影响用,但是为什么第一个周期不正确,正确的波形是从第二个周期开始输出的?