STM32F072的timer功能强大,可以用于很多用途,这里只对PWM的应用谈谈几个关键点。
PWM的编程,实际只有两个必须用到的寄存器:ARR、CCRx,作用如图:
ARR是在时钟计数器达到它的值时,输出事件,它决定PWM的周期。CCR可以在计数器达到它的值时,使输出变化,决定PWM的宽度。
其它的寄存器可根据需要设置。
具体步骤如下:
1、设置IO口为推挽模式
2、启用AF功能
3、根据F072的特殊功能分配设置端口。如PC端口
4、设置TIM模块的时基部分,
5、设置比较输出方式。
6、其它功能,如中断等。
以下是板上的LED4受TIM3驱动,明暗交替变化的程序段:
/* TIM3 chennel3 configuration : PC.8 */
GPIO_InitStructure.GPIO_Pin = LED4_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Connect TIM pin to AF2 */
//GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_0);
GPIOC->AFR[1] = 0; // Pin8 AF0, TIM3-CH3
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period =0x1fff;
TIM_TimeBaseStructure.TIM_Prescaler = 2; //设置预分频:预分频=2,即为72/3=24MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM3 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 3600; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //当定时器计数值小于CCR1时为高电平
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
。void TIM3_IRQHandler(void)
{
static uint16_t tim3 = 0;
tim3++;
tim3 = tim3 & 0x1ff;
if (tim3 == 0 )
{
GPIOC->ODR ^= (1<<9);
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
|