OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7985|回复: 11

stm32f0定时器外部脉冲计数,调了三天了,不能计数啊

[复制链接]

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-13 11:50:43 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 xyl210xyl 于 2016-6-13 11:58 编辑

void MX_TIM2_Init(void)
{
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
TIM_ClockConfigTypeDef sClockSourceConfig;
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFF;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  sClockSourceConfig.ClockPolarity = TIM_ETRPOLARITY_NONINVERTED;//TIM_ETRPOLARITY_NONINVERTED
sClockSourceConfig.ClockPrescaler = TIM_ETRPRESCALER_DIV1;
sClockSourceConfig.ClockFilter = 0x0;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }





这是我定时器的配置方式,单片机是stm32f042f4p6,用的cubemx的HAl库,口线接的是PA0,TIM2的ETR口,
虽然用hal库我配置的相关寄存器都去看了一遍了,最终配进去的寄存器值跟标准库相同计数应用的方式是一样的,我不知道我这个问题出在哪里,还是我模式选错了。
我TIM_CLOCKSOURCE_ETRMODE2,TIM_CLOCKSOURCE_ETRMODE1,TIM_SLAVEMODE_TRIGGER模式都试过了,不行

时钟启动和输入io口配置是在上面的HAL_TIM_Base_Init(&htim2)完成的,这个应该没问题


最佳答案

查看完整内容[请看2#楼]

已解决 /* TIM2 init function */ void MX_TIM2_Init(void) { TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; //251論 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { E ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
 楼主| 发表于 2016-6-13 11:50:44 | 显示全部楼层

已解决
/* TIM2 init function */
void MX_TIM2_Init(void)
{
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;   //251論
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFF;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
  sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;
  sSlaveConfig.TriggerFilter = 0;
  if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}


回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
 楼主| 发表于 2016-6-13 11:55:08 | 显示全部楼层
自己顶
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-13 11:55:36 | 显示全部楼层
没用过cubemx
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
 楼主| 发表于 2016-6-13 11:58:02 | 显示全部楼层

我也第一次用,好蛋疼啊
回复

使用道具 举报

17

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2016-6-1
在线时间
33 小时
发表于 2016-6-13 12:17:09 | 显示全部楼层
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//Mini STM32¿a·¢°å
//ía2¿ÖD¶Ï Çy¶ˉ′úÂë                          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2010/12/01  
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) ÕyμãÔ-×ó 2009-2019
//All rights reserved          
//////////////////////////////////////////////////////////////////////////////////           

extern unsigned int s1;
extern unsigned int s2;
//ía2¿ÖD¶Ï3õê¼»ˉoˉêy
void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_Initok;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ía2¿ÖD¶Ï£¬Dèòaê1ÄüAFIOê±Öó

          KEY_Init();//3õê¼»ˉ°′¼ü¶Ôó|ioÄ£ê½

    //GPIOA.0          ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

           EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

          NVIC_Initok.NVIC_IRQChannel = EXTI0_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_Initok.NVIC_IRQChannelPreemptionPriority = 0x02;        //ÇàÕ¼óÅÏè¼¶2
          NVIC_Initok.NVIC_IRQChannelSubPriority = 0x02;                                        //×óóÅÏè¼¶1
          NVIC_Initok.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_Initok);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
//GPIOC.5 ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

          EXTI_InitStructure.EXTI_Line=EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//ϽμÑØ′¥·¢
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

                NVIC_Initok.NVIC_IRQChannel = EXTI9_5_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_Initok.NVIC_IRQChannelPreemptionPriority = 0x02;        //ÇàÕ¼óÅÏè¼¶2£¬
          NVIC_Initok.NVIC_IRQChannelSubPriority = 0x01;                                        //×óóÅÏè¼¶1
          NVIC_Initok.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_Initok);

        }


void EXTI0_IRQHandler(void)
{
s1=s1+1;

        EXTI_ClearITPendingBit(EXTI_Line0);  //Çå3yEXTI0Ïß·1òÆeλ
}

void EXTI9_5_IRQHandler(void)
{                       
        s2=s2+1;
         EXTI_ClearITPendingBit(EXTI_Line5);    //Çå3yLINE5éÏμÄÖD¶Ï±ê־λ  
}





這是我用来做两路频率计用的外部中断计数,希望有用
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
 楼主| 发表于 2016-6-13 14:09:12 | 显示全部楼层
龙战云野 发表于 2016-6-13 12:17
#include "exti.h"
#include "led.h"
#include "key.h"

不来考虑用外部中断计数,频率一高计数不准
回复

使用道具 举报

24

主题

157

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-7
在线时间
131 小时
发表于 2018-1-9 14:17:20 | 显示全部楼层
楼主,这个问题解决了没有,我用STM32F03C8T6,定时器用不了
回复

使用道具 举报

24

主题

157

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-7
在线时间
131 小时
发表于 2018-1-9 14:18:03 | 显示全部楼层
如果解决了,能不能告诉问我一下QQ1964439971
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
 楼主| 发表于 2018-1-9 16:08:37 | 显示全部楼层
lumilu 发表于 2018-1-9 14:18
如果解决了,能不能告诉问我一下QQ1964439971

qq928508236
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-21 20:16:40 | 显示全部楼层
xyl210xyl 发表于 2018-7-21 10:23
已解决
/* TIM2 init function */
void MX_TIM2_Init(void)

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-5-19
在线时间
26 小时
发表于 2019-12-10 19:21:10 | 显示全部楼层
楼主,请问下f103 外部计数怎么操作呀,这是我的程序调3天了,用外部输入模式2,ETR输入
//通用定时器中断初始化
void TIM2_Int_Init(void)                                                //配置 TIM2_CH1_ETR 为外部脉冲计数
{       
                GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);                 //使能GPIOA,使能AFIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);                        //使能定时器2

                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_15;                       
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
               
    //配置TIMER2作为计数器
                TIM_DeInit(TIM2);                //缺省模式

    //初始化定时器2 TIM2   
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;              //设定计数器自动重装值
    TIM_TimeBaseStructure.TIM_Prescaler =0;             //预分频器   
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);         //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
               
        //        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器2更新中断
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);                //外部时钟输入2,上升沿触发,无滤波

    TIM_SetCounter(TIM2,0);        //清楚计数器
    TIM_Cmd(TIM2,ENABLE);          //使能定时器
               
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 05:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表