与 f103 pwm 配置不同(也就是引脚复用)
源码:PA0 TIM19_CH1
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
TIM4_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz 函数名可以随便设,此处不想改了
while(1)
{
Delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval>300)
dir=0;
if(led0pwmval==0)
dir=1;
TIM_SetCompare1(TIM19,led0pwmval);
}
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);
//端口初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_11);//配置端口为某个复用功能
/* GPIO_PinAFConfig();把这个函数单独列出来,是因为只是看函数的话,按F12,会容易把 GPIO_AF_11写成 GPIO_AF_2了,此处一定要去看下数据手册*/
//定时器初始化
TIM_TimeBaseStructure.TIM_Period =arr; //当定时器从0计数到999,即为1000次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置预分频:不预分频,即为72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
//设置定时器的工作模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置定时器为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 12000; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM19, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM19, TIM_OCPreload_Enable);
//使能定时器
TIM_ARRPreloadConfig(TIM19, ENABLE); // 使能TIM5重载寄存器ARR
TIM_Cmd(TIM19, ENABLE); //使能定时器5
}
源码:PA1 TIM19_CH2
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
TIM4_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
while(1)
{
Delay_ms(8); //变了
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval>300)
dir=0;
if(led0pwmval==0)
dir=1;
TIM_SetCompare2(TIM19,led0pwmval); //变了
}
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);
//端口初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //变了
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_11);//配置端口为某个复用功能
//可能
//定时器初始化
TIM_TimeBaseStructure.TIM_Period =arr; //当定时器从0计数到999,即为1000次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置预分频:不预分频,即为72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
//设置定时器的工作模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置定时器为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 12000; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR1_Val时为高电平
// 见 f103 ch1 与 ch2 ch1是cnt<ccrx 为有效电平 ch2是cnt>ccrx 为有效电平
// ccrx 是TIM_SetCompare2(TIM19,led0pwmval); 不断变化,cnt 是由时钟不断+1,
// 中断触发 是由 TIM4_PWM_Init(899,0); 899决定,一旦 cnt + 到 899,cnt 被清0 ,重新计数,此处未写中断触发
TIM_OC2Init(TIM19, &TIM_OCInitStructure); //使能通道1 变了
TIM_OC2PreloadConfig(TIM19, TIM_OCPreload_Enable); //使能定时器 变了
TIM_ARRPreloadConfig(TIM19, ENABLE); // 使能TIM5重载寄存器ARR
TIM_Cmd(TIM19, ENABLE); //使能定时器5
}