打印
[STM32F0]

解密开发板界”小精灵“之定时器篇---STM32F042 Nucleo32评测

[复制链接]
1085|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Micachl|  楼主 | 2016-3-12 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家都知道,STM32的片内资源是相当丰富的,而这些资源里面,要数定时器功能最强大了,F042K6有1个16位高级控制定时器,1个32位4个16位通用定时器,共26通道PWM输出,用来控制电机是非常不错的,下面,让我们看看定时器的PWM输出功能。

看原理图:




板载LED连在了PB3上,而PB3正好是TIM2的CH2,那么,本篇将介绍如何使用定时器弄一个呼吸灯。


新建工程目录如图,并添加相应标准库文件




选择型号,建立工程
沙发
Micachl|  楼主 | 2016-3-12 20:58 | 只看该作者
编写初始化代码如下:
void TIM_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
        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(GPIOB,&GPIO_InitStructure);
        
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_2);
        
        TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
        TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
        TIM_TimeBaseInitStructure.TIM_Prescaler = 48-1;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
        
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);

        TIM_CtrlPWMOutputs (TIM2,ENABLE);
        
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH2
        TIM_ARRPreloadConfig(TIM2, ENABLE);
        
        TIM_Cmd(TIM2,ENABLE);
}

然后编写呼吸灯相关代码
i=0;
                while(i+=5)
                {
                        TIM_SetCompare2(TIM2,i);
                        delay_ms(10);
                        if(i>=1000)
                                break;
                }
                i=1000;
                while(i-=5)
                {
                        TIM_SetCompare2(TIM2,i);
                        delay_ms(10);
                        if(i<=0)
                                break;
                }
                delay_ms(1000);
                delay_ms(1000);

使用特权

评论回复
板凳
Micachl|  楼主 | 2016-3-12 21:00 | 只看该作者
写完,编译连接下载,便可以看到这颗绿色LED渐亮渐灭了。



呼吸灯.rar

4.1 MB

使用特权

评论回复
地板
eurphan| | 2016-3-13 13:13 | 只看该作者
转载请注明出处,谢谢~

使用特权

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

本版积分规则

43

主题

300

帖子

1

粉丝