打印
[STM32F0]

【STM32F072】F072的PWM

[复制链接]
4443|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dontium|  楼主 | 2014-4-10 01:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
       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);

}


沙发
xlhtracy| | 2014-4-11 15:38 | 只看该作者

使用特权

评论回复
板凳
yzb0414| | 2014-5-19 20:56 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:官向官来民向民,穷人向的是穷人

150

主题

1170

帖子

10

粉丝