你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
eurphan 发布时间:2016-3-12 20:15
继上一次对Nucleo32-f042做了简单的介绍之后,这次,让我们来看看这款芯片的内部资源。

大家都知道,STM32的片内资源是相当丰富的,而这些资源里面,要数定时器功能最强大了,F042K6有1个16位高级控制定时器,1个32位4个16位通用定时器,共26通道PWM输出,用来控制电机是非常不错的,下面,让我们看看定时器的PWM输出功能。

看原理图:
PB3.JPG

LED.JPG

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

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

型号.JPG
工程2.JPG

选择型号,建立工程

编写初始化代码如下:

  1. void TIM_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  5.         TIM_OCInitTypeDef TIM_OCInitStructure;
  6.         
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
  9.         
  10.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
  11.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  14.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  16.         
  17.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_2);
  18.         
  19.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
  20.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
  21.         TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
  22.         TIM_TimeBaseInitStructure.TIM_Prescaler = 48-1;
  23.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  24.         
  25.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
  26.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  27.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
  28.         TIM_OCInitStructure.TIM_Pulse = 0;
  29.         TIM_OC2Init(TIM2,&TIM_OCInitStructure);

  30.         TIM_CtrlPWMOutputs (TIM2,ENABLE);
  31.         
  32.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH2
  33.         TIM_ARRPreloadConfig(TIM2, ENABLE);
  34.         
  35.         TIM_Cmd(TIM2,ENABLE);
  36. }
复制代码
然后编写呼吸灯相关代码
  1. i=0;
  2.                 while(i+=5)
  3.                 {
  4.                         TIM_SetCompare2(TIM2,i);
  5.                         delay_ms(10);
  6.                         if(i>=1000)
  7.                                 break;
  8.                 }
  9.                 i=1000;
  10.                 while(i-=5)
  11.                 {
  12.                         TIM_SetCompare2(TIM2,i);
  13.                         delay_ms(10);
  14.                         if(i<=0)
  15.                                 break;
  16.                 }
  17.                 delay_ms(1000);
  18.                 delay_ms(1000);
复制代码

P60312-201305[1].jpg
写完,编译连接下载,便可以看到这颗绿色LED渐亮渐灭了。

呼吸灯.rar (4.1 MB, 下载次数: 87)
收藏 评论4 发布时间:2016-3-12 20:15

举报

4个回答
ct3paul 回答时间:2017-3-22 16:12:23
楼主您好!
麻烦问下我现在在使用STM32F042的板子,使用定制器TIM17 CH1输出5Mhz的PWM波,发现输出的波形为5.3MHZ,占空比为33%,但是输出1kHZ的就是正确的,麻烦帮忙分析下,附配置代码:
  1. void TIM17_CH1_PWM(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6.         uint16_t TimerPeriod;
  7.         uint16_t Channel1Pulse;
  8.        
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);
  12.        
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  21.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
  22.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N
  23.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);

  24.         //Time Base configuration
  25.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  26.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  27.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  28.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  29.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  30.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);

  31.         //Channel 1Configuration in PWM mode
  32.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  33.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  34.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  35.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
  36.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  37.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  38.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  39.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  40.        
  41.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);
  42.         TIM_Cmd(TIM17, ENABLE);
  43.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
  44. }
复制代码
ct3paul 回答时间:2017-3-22 16:15:51
楼主,您好!
我在做使用STM32F042 定时器17通道1 输出5MHZ方波,占空比为50%时,输出的波形为5.336MHZ,占空比约为33%
    但是输出较小频率是稳定,如2MHZ,示波器测量就正确,麻烦解答下
    是否是超出输出上限了?
    系统时钟为48M,HCLK、PCLK均未分频,为48M
    附配置代码:
  1. void TIM17_CH1_PWM(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6.         uint16_t TimerPeriod;
  7.         uint16_t Channel1Pulse;
  8.        
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);
  12.        
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  21.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
  22.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N
  23.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);

  24.         //Time Base configuration
  25.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  26.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  27.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  28.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  29.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  30.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);

  31.         //Channel 1Configuration in PWM mode
  32.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  33.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  34.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  35.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
  36.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  37.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  38.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  39.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  40.        
  41.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);
  42.         TIM_Cmd(TIM17, ENABLE);
  43.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
  44. }
复制代码
aliuxiaba 回答时间:2018-4-30 17:06:30
本帖最后由 aliuxiaba 于 2018-4-30 17:11 编辑

楼主,我下载了您的压缩包,但是编译的时候提示有27个错误
小白,勿喷
aliuxiaba 回答时间:2018-4-30 17:07:51
本帖最后由 aliuxiaba 于 2018-4-30 17:09 编辑

file:///C:/Users/Bling/AppData/Roaming/Tencent/QQ/Temp/H0Z@HXCF1$4A1J16%7BYL1Q1G.jpg
1.jpg

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版