OpenEdv-开源电子网

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

stm32f103zet6高级,通用,基本定时器功能汇总:1普通定时,2输入捕获,3输出比较,4PWM,5单脉冲模式输出,6标...

  [复制链接]

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2017-6-24 12:35:17 | 显示全部楼层 |阅读模式
本帖最后由 nashui_sx 于 2019-7-15 09:06 编辑

修正一个错误,输出比较的时候,两个定时器共用CH1_Flag造成干扰,前面分别加上定时器标记 TIM1_CH1_Flag,别的还未发现错误,已经重新上传
//每个功能都在stm32f103zet6上测试通过
// 1普通定时               2输入捕获                     3输出比较                          4PWM                5单脉冲输出
//TIMx_Time_Init   TIMx_InputCapture_Init   TIMx_OutputCompare_Init    TIMx_Pwm_Init   TIMx_OnePulseOutput_Init
//基本定时器TIM6,7只有1定时的功能,剩余的4个功能分别用高级TIM1 通用TIM2进行测试,便于大家移植
在time.h 中切换功能
#define  TIMx_Time_Init_Test                  0
#define  TIMx_InputCapture_Init_Test       0
#define  TIMx_OutputCompare_Init_Test   0
#define  TIMx_Pwm_Init_Test                 0
#define  TIMx_OnePulseOutput_Init_Test  0
定时器5种模式实验.rar (314.4 KB, 下载次数: 2089)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-6-24 16:30:15 | 显示全部楼层
大神 请教一个问题:我在main函数中有个if判断句,满足条件我就从某一IO口输出一个脉冲波(单个脉冲),只用一个定时器的单脉冲模式可以做到吗?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-6-24 16:54:40 | 显示全部楼层
本帖最后由 275891381 于 2017-6-24 17:25 编辑
Rainday 发表于 2017-6-24 16:30
大神 请教一个问题:我在main函数中有个if判断句,满足条件我就从某一IO口输出一个脉冲波(单个脉冲),只 ...

单脉冲模式好处是,一个通道检测触发信号,一个通道输出单脉冲,你这个知道触发信号,用输出比较模式好点,比较一次后,关闭输出比较就可以了,这样也可以用任意io口输出脉冲,你也可以看看http://www.openedv.com/thread-67504-1-1.html 这个帖子,
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-6-24 17:24:50 | 显示全部楼层
275891381 发表于 2017-6-24 16:54
单脉冲模式好处是,一个通道检测触发信号,一个通道输出单脉冲,你这个知道触发信号,用输出比较模式好点 ...

刚入手没多久定时器的用法比较陌生,既然单脉冲模式必须要外部触发信号,请大神给个意见。还是上面说的,满足if判断句,输出一个单脉冲,应该用哪种模式可以实现???非常感谢!
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-6-24 17:26:43 | 显示全部楼层
Rainday 发表于 2017-6-24 17:24
刚入手没多久定时器的用法比较陌生,既然单脉冲模式必须要外部触发信号,请大神给个意见。还是上面说的, ...

也不是必须要外部触发,你看看这个帖子 http://www.openedv.com/thread-67504-1-1.html,他用单脉冲触发固定个数脉冲,你只保留单脉冲的部分就可以了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-6-24 18:06:43 | 显示全部楼层
本帖最后由 275891381 于 2017-6-24 18:08 编辑
Rainday 发表于 2017-6-24 17:24
刚入手没多久定时器的用法比较陌生,既然单脉冲模式必须要外部触发信号,请大神给个意见。还是上面说的, ...

参考刚才发的那个连接,给你改了个 主函数触发单脉冲.rar (309.83 KB, 下载次数: 975)
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-6-24 19:50:19 | 显示全部楼层
275891381 发表于 2017-6-24 18:06
参考刚才发的那个连接,给你改了个

真是太感谢你了! ,非常感谢
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-6-24 21:26:57 | 显示全部楼层
大神,刚才用了你的程序,用示波器测试了TIM2的PA0口输出的是连续的脉冲波,周期100ms左右,脉宽20ms。另外我把main中的while(1)里的delay_ms(1000)给删除了,因为我做的是高速AD实时采集,加上delay会影响AD。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-6-24 22:15:29 | 显示全部楼层
Rainday 发表于 2017-6-24 21:26
大神,刚才用了你的程序,用示波器测试了TIM2的PA0口输出的是连续的脉冲波,周期100ms左右,脉宽20ms。另外 ...

恩,周期,高电平可以用它俩改
u16 zhouqi=1000;//*0.1ms
u16 gaodianping=200;//*0.1ms
改成成全局变量就可以在主函数例修改了
回复 支持 反对

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-6-26 10:43:41 | 显示全部楼层
       大神   能帮我看下程序么   我这个是门控模式  为什么  PA0还是高电平的时候  PA6  就没输出了   
QQ图片20170626100530.png
回复 支持 反对

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-6-26 10:44:53 | 显示全部楼层
程序上传不了  说太大 什么鬼
QQ图片20170626104430.png
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-11-7
在线时间
21 小时
发表于 2017-11-7 11:33:00 | 显示全部楼层
[img]file:///D:\用户目录\我的文档\Tencent Files\303362859\Image\Group\VVLPVB%~3N)$O6YPR]G[B8P.png[/img]TIM2,3按照这个配置单脉冲输出可以,TIM4,5,8为什么就不行,请教大佬了

TIM2,3按照这个配置可以,TIM4,5,8为什么就不行,请教大佬

TIM2,3按照这个配置可以,TIM4,5,8为什么就不行,请教大佬
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-11-7 14:48:29 | 显示全部楼层
浅情辄止 发表于 2017-11-7 11:33
TIM2,3按照这个配置单脉冲输出可以,TIM4,5,8为什么就不行,请教大佬了

8是高级定时器,参考定时器1的;4 5就不知道为啥了,你在琢磨琢磨
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-11-7
在线时间
21 小时
发表于 2017-11-7 17:46:49 | 显示全部楼层
275891381 发表于 2017-11-7 14:48
8是高级定时器,参考定时器1的;4 5就不知道为啥了,你在琢磨琢磨

你TIM4和TIM5试过吗
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-11-7 17:47:54 | 显示全部楼层

我没试过,感觉2都可以,45应该没啥问题,所以当时就用1 2测试高级和普通的了,
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-11-7
在线时间
21 小时
发表于 2017-12-4 09:32:04 | 显示全部楼层
哥们,定时器做计数器模式配置过没有,能不能也发个例程。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2017-12-5 20:14:47 | 显示全部楼层
浅情辄止 发表于 2017-12-4 09:32
哥们,定时器做计数器模式配置过没有,能不能也发个例程。

上传上面了,不过是c8t6做的
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-7 20:19:05 | 显示全部楼层
我的STM32f103c8t6用高级定时器配置捕获,跟您的一样,不过,我用的是PB13口,为啥捕获不到频率呢,大神可有什么地方需要注意的给个提示,谢谢
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-7 20:23:30 | 显示全部楼层
邦尼power 发表于 2018-5-7 20:19
我的STM32f103c8t6用高级定时器配置捕获,跟您的一样,不过,我用的是PB13口,为啥捕获不到频率呢,大神可 ...

定时器1 引脚是 A 8 9 10 11吧  pb13 TIM1_CH1N是TIM1_CH1的反向
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-7 20:43:57 | 显示全部楼层
275891381 发表于 2018-5-7 20:23
定时器1 引脚是 A 8 9 10 11吧  pb13 TIM1_CH1N是TIM1_CH1的反向

我用的是TIM1_CH1N和TIM1_CH2N,对应的是PB13和PB14,您说的反向是什么呢,不是很理解,可以给具体解释下吗,还有配置上应该怎么配呢,谢谢
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-7 20:52:07 | 显示全部楼层
邦尼power 发表于 2018-5-7 20:43
我用的是TIM1_CH1N和TIM1_CH2N,对应的是PB13和PB14,您说的反向是什么呢,不是很理解,可以给具体解释下 ...

你用pa8 pa9 就是TIM1通道1 2了
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-7 21:04:26 | 显示全部楼层
275891381 发表于 2018-5-7 20:52
你用pa8 pa9 就是TIM1通道1 2了

谢谢!大神
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-7 21:16:14 | 显示全部楼层

带N的通道是互补通道,一般做PWM互补输出
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-7 22:24:36 | 显示全部楼层
275891381 发表于 2018-5-7 21:16
带N的通道是互补通道,一般做PWM互补输出

哦哦,谢谢,大神
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4710
金钱
4710
注册时间
2017-7-6
在线时间
709 小时
发表于 2018-5-8 09:59:25 | 显示全部楼层
564646396 发表于 2017-6-26 10:44
程序上传不了  说太大 什么鬼

为啥用MDK开发环境的逻辑分析仪测PA6口还要&上00000040再右移?不是直接PORTA6吗?
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4710
金钱
4710
注册时间
2017-7-6
在线时间
709 小时
发表于 2018-5-8 10:24:03 | 显示全部楼层
564646396 发表于 2017-6-26 10:44
程序上传不了  说太大 什么鬼

这个对应端口,为啥还要右移才提示有这个信号,不然都添加不了这个端口
1525746068(1).jpg
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-8 10:31:54 | 显示全部楼层
本帖最后由 邦尼power 于 2018-5-8 10:36 编辑

STM32F103C8t6的板子

  TIM1_Cap_Init(0xffff,72-1);  //òÔ1MhzμÄÆμÂê¼Æêy

void TIM1_Cap_Init(u16 arr,u16 psc)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;       
        TIM_ICInitTypeDef  TIM1_ICInitStructure;//
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);         //ê1ÄüTIM1ê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //ê1ÄüGPIOBê±Öó
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //

       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;    //PA10 Çå3y֮ǰéèÖà 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ; //PA10 êäèë  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_10);                                                   //PA10 ÏÂà-       

                //3õê¼»ˉ¶¨ê±Æ÷1 TIM1
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//éèÖÃè±ê¡Öμ,Õaò»2½×îoüóéÏ
        TIM_TimeBaseStructure.TIM_Period = arr;     //é趨¼ÆêyÆ÷×Ô¶ˉÖØ×°Öμ
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //Ô¤·ÖÆμÆ÷   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//éèÖÃÖظ′òç3ö′Îêy£¬¾íêǶàéù′Îòç3öoó½øèëÖD¶Ï£¬ò»°ãÎa0£¬Ö»óD¸ß¼¶¶¨ê±Æ÷2ÅóDóÃ
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ

        //3õê¼»ˉTIM1êäèë2¶»ñ2Îêy
        TIM_ICStructInit(&TIM1_ICInitStructure);//éèÖÃè±ê¡Öμ,Õaò»2½×îoüóéÏ
        TIM1_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC2S=01         Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ   //TIM1_CH2 pB14
  TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //éÏéyÑØ2¶»ñ
  TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3éäμ½TI2éÏ
  TIM1_ICInitStructure.TIM_ICPrescaler =  TIM_ICPSC_DIV8  ;           //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
  TIM1_ICInitStructure.TIM_ICFilter = 0x00;   //IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
  TIM_ICInit(TIM1, &TIM1_ICInitStructure);
       
       
        //ÖD¶Ï·Ö×é3õê¼»ˉ
        NVIC_InitStructure.NVIC_IRQChannel =  TIM1_CC_IRQn;  //TIM1ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;  //ÏèÕ¼óÅÏ輶2¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //′óóÅÏ輶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       
        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC3,ENABLE);//ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï
//        TIM_CtrlPWMOutputs(TIM1,ENABLE);        //Ö÷êä3öê1Äü       
  TIM_Cmd(TIM1,ENABLE );         //ê1Äü¶¨ê±Æ÷1
}

u8  TIM1CH3_CAPTURE_STA=0;        //êäèë2¶»ñ×′쬠                                                  
u16        TIM1CH3_CAPTURE_VAL;        //êäèë2¶»ñÖμ
long long temp=0;
u32 freq_gate=10000;
u8 FLAG = 0;       

void TIM1_CC_IRQHandler(void)
{
       
                if((TIM1CH3_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ       
                {          
                        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
                        {
                                if(TIM1CH3_CAPTURE_STA&0X40)//òѾ-2¶»ñμ½¸ßμçƽáË
                                {
                                        if((TIM1CH3_CAPTURE_STA&0X3F)==0X3f)//¸ßμçƽì«3¤áË
                                        {
                                                TIM1CH3_CAPTURE_STA=0X80;//±ê¼Ç3é1|2¶»ñáËò»′Î
                                                TIM1CH3_CAPTURE_VAL=0;
                                        }
                                        else TIM1CH3_CAPTURE_STA++;
                                }
                        }
                 if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)//2¶»ñ1·¢éú2¶»ñê¼t
                        {       
                                if(TIM1CH3_CAPTURE_STA&0X40)                //2¶μú¶t′λñμ½éÏéyÑØ
                                {
                                       
                                        TIM1CH3_CAPTURE_STA|=0X80;                //±ê¼Ç3é1|2¶»ñμ½ò»′θßμçƽÂö¿í
                            TIM1CH3_CAPTURE_VAL=TIM_GetCapture3(TIM1);//»ñè¡μ±Ç°μÄ2¶»ñÖμ.
                                  
                                  temp=TIM1CH3_CAPTURE_STA&0X3F;
                                  temp=temp*0XFFFF;                                      
                                  temp=temp+TIM1CH3_CAPTURE_VAL;                                       
                                        if(temp<freq_gate)
                                                    FLAG=0;
                                        else
                                                    FLAG=1;                                       
                                }
                                else                                                                  //μúò&#187;′&#206;2&#182;&#187;&#241;é&#207;éy&#209;&#216;
                                {
//                                        ReadValue1=TIM_GetCapture1(TIM1);
                                        TIM1CH3_CAPTURE_STA=0;                        //&#199;&#229;&#191;&#213;
                                        TIM1CH3_CAPTURE_VAL=0;
                                        TIM1CH3_CAPTURE_STA |= 0X40;                //±ê&#188;&#199;2&#182;&#187;&#241;μ&#189;á&#203;é&#207;éy&#209;&#216;
                                        TIM_Cmd(TIM1,DISABLE );           //1&#216;±&#213;&#182;¨ê±&#198;÷2
                                   TIM_SetCounter(TIM1,0);
                                 //TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 éè&#214;&#195;&#206;a&#207;&#194;&#189;μ&#209;&#216;2&#182;&#187;&#241;
                                   TIM_Cmd(TIM1,ENABLE );         //ê1&#196;ü&#182;¨ê±&#198;÷2                               
                                }
                        }
                }
          TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_Update); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}



大神可以帮我看一下吗,以1MHZ计数,频率算出来的跟我输入的不一样,我调试了很多次,结果变来变去,不稳定,可以帮我看那一下吗,谢谢!

回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-8 11:34:29 | 显示全部楼层
邦尼power 发表于 2018-5-8 10:31
STM32F103C8t6的板子

  TIM1_Cap_Init(0xffff,72-1);  //ò&#212;1Mhzμ&#196;&#198;μ&#194;ê&#188;&# ...

脉冲宽度小于10us左右就不稳定了,你的脉冲多块
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-8 11:45:17 | 显示全部楼层
本帖最后由 邦尼power 于 2018-5-8 11:46 编辑
275891381 发表于 2018-5-8 11:34
脉冲宽度小于10us左右就不稳定了,你的脉冲多块

我要测得频率范围在1Khz之内,这个时钟是72MHz,以1MHZ计算,频率采的不对,我的配置算对吗,对于TIM1
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-8 11:51:16 | 显示全部楼层
邦尼power 发表于 2018-5-8 11:45
我要测得频率范围在1Khz之内,这个时钟是72MHz,以1MHZ计算,频率采的不对,我的配置算对吗,对于TIM1

对了你为啥非要用PA10,这个引脚是串口1呀,你是不是串口1 干扰了,用PA8 PA11吧
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-8 13:31:20 | 显示全部楼层
275891381 发表于 2018-5-8 11:51
对了你为啥非要用PA10,这个引脚是串口1呀,你是不是串口1 干扰了,用PA8 PA11吧

58.jpg PA8和PA11我做其他它用了,对了,串口1我没用也会干扰呀
我准备换TIM2,但是需要重新映像,您再看我一眼我的映像对吗,谢谢!

重3.jpg
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-8 13:51:58 | 显示全部楼层
邦尼power 发表于 2018-5-8 13:31
PA8和PA11我做其他它用了,对了,串口1我没用也会干扰呀
我准备换TIM2,但是需要重新映像,您再看我一 ...

没用你要看看你初始化没,定时器2看着没啥问题,你把重映射打开就可以了
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-8 14:02:31 | 显示全部楼层
275891381 发表于 2018-5-8 13:51
没用你要看看你初始化没,定时器2看着没啥问题,你把重映射打开就可以了

哦哦,谢谢您的耐心解答,非常感谢
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-8 14:49:42 | 显示全部楼层
邦尼power 发表于 2018-5-8 14:02
哦哦,谢谢您的耐心解答,非常感谢

测方波频率,对其高电平电压有要求吗,我的输入方波峰峰值是1.6v的,这样的频率能采到吗
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-20
在线时间
11 小时
发表于 2018-5-15 20:52:22 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-5-15 21:16:40 | 显示全部楼层
邦尼power 发表于 2018-5-8 14:49
测方波频率,对其高电平电压有要求吗,我的输入方波峰峰值是1.6v的,这样的频率能采到吗

要么三极管处理下,要么施密特触发,要么放大下最好把
回复 支持 反对

使用道具 举报

32

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2017-7-25
在线时间
129 小时
发表于 2018-5-16 08:49:41 | 显示全部楼层
275891381 发表于 2018-5-15 21:16
要么三极管处理下,要么施密特触发,要么放大下最好把

哦哦,谢谢!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-18
在线时间
2 小时
发表于 2018-12-18 22:52:39 | 显示全部楼层
楼主又试过TIM的ETR捕获吗?我试的一直不行。。。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-19 13:28:18 | 显示全部楼层
Chongki 发表于 2018-12-18 22:52
楼主又试过TIM的ETR捕获吗?我试的一直不行。。。

试过,c8t6的,只有两个定时器可用
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-18
在线时间
2 小时
发表于 2018-12-19 20:03:21 | 显示全部楼层
nashui_sx 发表于 2018-12-19 13:28
试过,c8t6的,只有两个定时器可用

没说清楚,是TIM1不行。。。现在的是TIM2的可以,,,TIM1的不行,搞不清楚什么原因,网上的方案基本都试过了,不知道楼主有没有什么好办法?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-19 21:13:54 | 显示全部楼层
Chongki 发表于 2018-12-19 20:03
没说清楚,是TIM1不行。。。现在的是TIM2的可以,,,TIM1的不行,搞不清楚什么原因,网上的方案基本都试 ...

第8条就是呀  tim1 tim2都写好了
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-18
在线时间
2 小时
发表于 2018-12-19 22:05:44 | 显示全部楼层
nashui_sx 发表于 2018-12-19 21:13
第8条就是呀  tim1 tim2都写好了

8 TIM计数模式c8t6做的   TIM 计数模式.rar (3.28 MB, 下载次数: 519)  这个?这个里面没有TIM1啊...
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-19 22:51:31 | 显示全部楼层
Chongki 发表于 2018-12-19 22:05
8 TIM计数模式c8t6做的   TIM 计数模式.rar (3.28 MB, 下载次数: 519)  这个?这个里面没有TIM1啊...
不好意思,估计发的早没有,新的复制给你了
[mw_shl_code=applescript,true]#include "tim_count.h"
//计数器模式

//这种计数器模式方案只能用ETR引脚
//stm32f103c8只有TIM1_ETR(PA12),和TIM2_CH1_ETR(PA0)两个可以用


volatile u16 Tim1_Update_Flag=0,Tim2_Update_Flag=0;        


//计数模式arr=计数到多少产生中断,psc没用,设置0
void TIM1_Init(u16 arr,u16 psc,IRQ_IRQHandler_Callback cb)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //上拉输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
        

        TIM_DeInit(TIM1);//将外设TIMx寄存器重设为缺省值
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到100
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率                  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设0置时钟分割:TDTS = Tck_tim           psc
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  //注册回调函数
  TIM1_UP_IRQHandler_Callback=cb;
               
        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIM1_UP_IRQHandler_NVIC_PP;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
  
        TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //设置为外部计数模式
        
        TIM_SetCounter(TIM1, 0);//计数器清零
        TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中断标志位
  TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断
        TIM_Cmd(TIM1, ENABLE);  //使能TIMx外设        
}


//计数模式arr=计数到多少产生中断,psc没用,设置0
void TIM2_Init(u16 arr,u16 psc,IRQ_IRQHandler_Callback cb)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //上拉输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
        TIM_DeInit(TIM2);//将外设TIMx寄存器重设为缺省值
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到100
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率                  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设0置时钟分割:TDTS = Tck_tim           psc
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  //注册回调函数
  TIM2_IRQHandler_Callback=cb;
        
        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
  
        TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //设置为外部计数模式
        
               
        TIM_SetCounter(TIM2, 0);//计数器清零
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
}
void Count_Init(u16 yichu_max)
{
  TIM1_Init(yichu_max-1,0,TIM1_UP_IRQHandler_Callback_Count);
  TIM2_Init(yichu_max-1,0,TIM2_IRQHandler_Callback_Count);//计数模式arr=Update_TIM_Period计数到100多少产生中断,psc没用,设置0
}
void TIM1_UP_IRQHandler_Callback_Count(void)   
{
                if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  
                {
                                TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
                          Tim1_Update_Flag++;//标记溢出次数
                }
}
//定时器2中断服务程序
void TIM2_IRQHandler_Callback_Count(void)   //TIM3中断
{
                if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM6更新中断发生与否
                {
                                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIMx更新中断标志
        Tim2_Update_Flag++;//标记溢出次数               
                }
}
u32 Get_MaiChong(u8 ch)
{
         u32 count=0;
         switch(ch)
         {
                 case 1:count=Tim1_Update_Flag*Update_TIM_Period+TIM_GetCounter(TIM1);break;
                 case 2:count=Tim2_Update_Flag*Update_TIM_Period+TIM_GetCounter(TIM2);break;
         }
         return count;
}






#ifndef _tim_count_H_
#define _tim_count_H_         
#include "sys.h"


#define Update_TIM_Period  1000

void Count_Init(u16 yichu_max);
void TIM1_Init(u16 arr,u16 psc,IRQ_IRQHandler_Callback cb);
void TIM2_Init(u16 arr,u16 psc,IRQ_IRQHandler_Callback cb);

u32  Get_MaiChong(u8 ch);
void TIM1_UP_IRQHandler_Callback_Count(void);   
void TIM2_IRQHandler_Callback_Count(void);  
                                    
#endif[/mw_shl_code]
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-18
在线时间
2 小时
发表于 2018-12-20 13:15:20 | 显示全部楼层
nashui_sx 发表于 2018-12-19 22:51
不好意思,估计发的早没有,新的复制给你了
[mw_shl_code=applescript,true]#include "tim_count.h"
//计 ...

嗯嗯,谢谢楼主!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-18
在线时间
2 小时
发表于 2018-12-20 13:15:50 | 显示全部楼层
nashui_sx 发表于 2018-12-19 22:51
不好意思,估计发的早没有,新的复制给你了
[mw_shl_code=applescript,true]#include "tim_count.h"
//计 ...

试了一下,似乎是板子的问题,换了一块可以了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-3-14
在线时间
2 小时
发表于 2019-4-2 17:33:13 | 显示全部楼层
nashui_sx 发表于 2018-12-19 22:51
不好意思,估计发的早没有,新的复制给你了
[mw_shl_code=applescript,true]#include "tim_count.h"
//计 ...

大神 本人小白一枚 用了你写的这个脉冲计数, 我想让计数到10000的时候开始重新计数 在最后get_maichong 那个函数那我加了个循环 当count等于10000 然后 使计数器和溢出次数清零 但没有实现功能
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-3-14
在线时间
2 小时
发表于 2019-4-2 17:33:46 | 显示全部楼层
tmc159 发表于 2019-4-2 17:33
大神 本人小白一枚 用了你写的这个脉冲计数, 我想让计数到10000的时候开始重新计数 在最后get_maichong  ...

         if(count == 10000)
         {
                 Update_Flag=0;
                 TIM_SetCounter(TIM2, 0);
   }
这个是添加的代码
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-2 18:22:22 | 显示全部楼层
tmc159 发表于 2019-4-2 17:33
大神 本人小白一枚 用了你写的这个脉冲计数, 我想让计数到10000的时候开始重新计数 在最后get_maichong  ...

为啥用清零记住上次的,这次的减去上次的不就是变化量了
真要10000重新计数 你把Update_TIM_Period 改成10000 就是计数10000次进中断了
删除Update_Flag++;//标记溢出次数  不需要溢出处理了反正10000就清零
Get_MaiChong
改为
u32 Get_MaiChong(void)
{
         return TIM_GetCounter(TIM2);
}
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-3-14
在线时间
2 小时
发表于 2019-4-2 18:53:20 | 显示全部楼层
nashui_sx 发表于 2019-4-2 18:22
为啥用清零记住上次的,这次的减去上次的不就是变化量了
真要10000重新计数 你把Update_TIM_Period 改成 ...

哦哦 谢谢 大神帮助
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-3-5
在线时间
6 小时
发表于 2019-4-7 14:57:15 | 显示全部楼层

学习了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 22:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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