以STM32F030F4P6,uVision开发环境为例,注意了,若使用其它相近芯片,本文仅供参考。
程序运行后TIM3的CH1、CH2、CH4,TIM14的CH1输出PWM波形。
以下是main.c文件:
#include "stm32f0xx.h"
void PWM_GPO_TIM(void) //PWM引脚时钟设置函数
{
GPIO_InitTypeDef GPIO_InitStructure; //声明GPIO_InitStructure结构变量
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能AHB预分频器到端口B的开关
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); //使能AHB预分频器到端口A的开关
GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_1); //B口功能复用选择AF_1(含Tim3, USART1等)
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_1); //A口功能复用选择AF_1(Tim3/1/6、SPI、串口)
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_1); //A口功能复用选择AF_1(Tim3/1/14/17、SPI)
GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_4); //A口功能复用选择AF_4(Tim14、SPI、串口)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //指定模式为功能复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //指定输出为推挽输出
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //内部上拉输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设定端口最快输出50MHz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|
GPIO_Pin_4; //指定脚6、7、4输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //按以上参数设置A口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //指定脚1输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //按以上参数设置B口
}
void TIM3_PWM_Init(uint16_t period, uint16_t prescaler)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //声明TIM_TimeBaseStructure结构变量
TIM_OCInitTypeDef TIM_OCInitStructure; //声明TIM_OCInitStructure结构变量
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能AHB预分频器到TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能AHB预分频器到TIM14
TIM_TimeBaseStructure.TIM_Period = period; //设置TIM3自动重装周期值
TIM_TimeBaseStructure.TIM_Prescaler = prescaler; //设置TIM3预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //按以上参数初始化TIM3
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //按以上参数初始化TIM14
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //PWM2模式
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出低
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse=12; //占空比系数
TIM_OC1Init(TIM3,&TIM_OCInitStructure); //按以上参数初始化TIM3CH2
TIM_OCInitStructure.TIM_Pulse=24; //占空比系数
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //按以上参数初始化TIM3CH2
TIM_OCInitStructure.TIM_Pulse =36; //占空比系数
TIM_OC4Init(TIM3,&TIM_OCInitStructure); //按以上参数初始化TIM3CH4
TIM_Cmd(TIM3, ENABLE); //使能TIM3
TIM_OCInitStructure.TIM_Pulse=12; //占空比系数
TIM_OC1Init(TIM14,&TIM_OCInitStructure); //按以上参数初始化TIM14CH1
TIM_Cmd(TIM14, ENABLE); //使能TIM4
}
int main(void)
{
PWM_GPO_TIM(); // PWM输出引脚、TIM函数
TIM3_PWM_Init(47, 0); // 时钟/PWM初始化函数
while (1)
{}
}
说明:
1 20脚封装TIM3只有CH1、CH2、CH4能输出。
2 输出频率:48M/(47+1)=1MHz,1M/(0+1)=1M
3 TIM3的CH1占空比=12/(47+1)*100%=25%、 CH2占空比=50%、CH2占空比=75%,
TIM4的CH1占空比=25% ;
4 注意“(GPIOA,GPIO_PinSource6,GPIO_AF_1)” 这句,STM不同型号芯片、同型号芯片管脚封装
不同,其AF值都不同,一定要仔细看各自的芯片手册。