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

解密开发板界”小精灵“之定时器篇---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, 下载次数: 71)
收藏 评论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

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

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