16085|18

4005

帖子

0

TA的资源

版主

楼主
 

stm32定时器的同步触发 [复制链接]

 
本帖最后由 huo_hu 于 2015-10-16 14:05 编辑

stm32定时器功能之一是同步启动,比如你想让两个定时器tim3和tim4输出完全一模一样的pwm波形这个时候你
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
不管先开哪一个因为时间差定时器都不可能完全同步,如果能够同步定时器的CNT是完全一模一样的,要完成这个功能需要使用同步触发功能。

下面代码是个例子,目的是tim3为从模式受控于tim4的启动。
u16 tmp=0;
//。。。定时器配置略
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Enable);//Tim4使能输出作为触发信号
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);//触发选择,ITR3即TIM4
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//触发模式只启动;门模式起停都控制
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式MSM

TIM_Cmd(TIM3, ENABLE);
while (--tmp);
TIM_Cmd(TIM4, ENABLE);//调试截获在这里可以看到tim3的CNT并没有计数
while (--tmp);
TIM_Cmd(TIM4, DISABLE);//这里看到tim4启动后tim3也同时启动
while (--tmp);
TIM_Cmd(TIM4, ENABLE);//调试截获可以看到tim3的CNT和tim4的CNT都有计数并且是完全一样的
while (--tmp);
TIM_Cmd(TIM4, DISABLE);
while (--tmp);
TIM_Cmd(TIM4, ENABLE);//同上
while (--tmp);
TIM_Cmd(TIM4, DISABLE);
while (--tmp);
TIM_Cmd(TIM4, ENABLE);

这里之所以使用停止后查看是因为调试仿真暂停程序运行后,读取两个CNT有时间差,这是看到的数据不会完全一样,但实际是一样的。

此帖出自单片机论坛

最新回复

大神有时间帮我看下这个,我刚学这东西,好多东西想不清楚,指点下,哈哈。 https://bbs.eeworld.com.cn/thread-558731-1-1.html  详情 回复 发表于 2017-9-7 18:17
点赞 关注(2)
 

回复
举报

4005

帖子

0

TA的资源

版主

推荐
 
本帖最后由 huo_hu 于 2017-8-17 15:08 编辑
1152075117 发表于 2017-8-17 09:47
TIM_SlaveMode_Gated改成了TIM_SlaveMode_Trigger,可以启动了,但是在TIM1中断里执行test_delay = TIM_Get ...

test_delay = TIM_GetCounter(TIM3) - TIM_GetCounter(TIM1)
你这个减肯定不是0,要停住再取数才行,两次读数总是有时间差的。

是keil的调试仿真啊,里面可以查看各个设备寄存器
此帖出自单片机论坛
 
 

回复

373

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
不错,现在的一些STM32的资料只讲定时器的基本用法,像这些较为深入的用法基本都不讲,楼主多给讲讲吧,另外问一下,像这些较为深入的用法,在实际工程项目中用的多吗
此帖出自单片机论坛
 
 
 

回复

373

帖子

0

TA的资源

纯净的硅(中级)

4
 
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);//触发选择,ITR3即TIM4
为什么ITR3是TIM4呢,这里不太明白,楼主能详细说说嘛
此帖出自单片机论坛

点评

手册上有,一共可选8个触发源。。。ITR3固定是tim4的溢出信号。  详情 回复 发表于 2015-10-19 20:43
 
 
 

回复

4005

帖子

0

TA的资源

版主

5
 
wudayongnb 发表于 2015-10-19 20:39
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);//触发选择,ITR3即TIM4
为什么ITR3是TIM4呢,这里不太明白, ...

手册上有,一共可选8个触发源。。。ITR3固定是tim4的溢出信号。
此帖出自单片机论坛

点评

看到了,以前没怎么研究寄存器,一直用库函数了  详情 回复 发表于 2015-10-19 20:46
 
 
 

回复

373

帖子

0

TA的资源

纯净的硅(中级)

6
 
huo_hu 发表于 2015-10-19 20:43
手册上有,一共可选8个触发源。。。ITR3固定是tim4的溢出信号。

看到了,以前没怎么研究寄存器,一直用库函数了
此帖出自单片机论坛

点评

是库函数没有用寄存器  详情 回复 发表于 2016-12-7 10:52
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
你好,我现在在做一个外部脉冲触发定时器延时的东西,但是一直存在问题,能否帮忙看看
此帖出自单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

8
 
可以
此帖出自单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

9
 
wudayongnb 发表于 2015-10-19 20:46
看到了,以前没怎么研究寄存器,一直用库函数了

是库函数没有用寄存器
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
非常好,谢谢
此帖出自单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

11
 
我想做TIM1和TIM3的同步计数,TIM3为主,TIM1为从,但是按照你这个配置改了以后TIM1没有启动。我这个配置有错吗       
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Enable);//Tim4??????????
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);//????,ITR3?TIM4
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//???????;????????
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);//????MSM

后面就是使能TIM3
此帖出自单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

12
 
TIM_SlaveMode_Gated改成了TIM_SlaveMode_Trigger,可以启动了,但是在TIM1中断里执行test_delay = TIM_GetCounter(TIM3) - TIM_GetCounter(TIM1)结果不是零,你这个界面我也没找到。你用的是Keil吗,这个界面是怎么弄出来的。求教求教!这么长时间了也不知道你能不能看见。。
此帖出自单片机论坛

点评

test_delay = TIM_GetCounter(TIM3) - TIM_GetCounter(TIM1) 你这个减肯定不是0,要停住再取数才行,两次读数总是有时间差的。 是keil的仿真啊  详情 回复 发表于 2017-8-17 15:07
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

13
 
huo_hu 发表于 2017-8-17 15:07
test_delay = TIM_GetCounter(TIM3) - TIM_GetCounter(TIM1)
你这个减肯定不是0,要停住再取数才行,两 ...

停住是指按下stop还是设置断点,这两种我都试了,然后看TIM1和TIM3的CNT寄存器的值不一样。你这个界面我找了半天没有,我是用View->System Viewer->Tims看的寄存器的值。下面是我的配置,TIM1为主,TIM3为从。
        TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
        TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Enable);

        TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);
        TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);

        TIM_Cmd(TIM1, ENABLE);

捕获.PNG (76.75 KB, 下载次数: 0)

捕获.PNG
此帖出自单片机论坛

点评

TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Enable);//Tim4使能输出作为触发信号 TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);//触发选择,ITR3即TIM4 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//触  详情 回复 发表于 2017-8-19 21:44
 
 
 

回复

4005

帖子

0

TA的资源

版主

14
 
本帖最后由 huo_hu 于 2017-8-19 22:11 编辑
1152075117 发表于 2017-8-18 09:43
停住是指按下stop还是设置断点,这两种我都试了,然后看TIM1和TIM3的CNT寄存器的值不一样。你这个界面我 ...
这个我式过了,可以的 (主3从1)


TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Enable);//
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);//
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);//



停住是指断点截获


此帖出自单片机论坛

点评

为什么我用TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//这个模式起动不了TIM1呢,只能用Trigger起动,用Trigger启动后设置断点发现TIM1和TIM3的CNT值不一样。能把你的TIM的配置发给我看看吗,我看看哪里出错  详情 回复 发表于 2017-8-25 10:03
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

15
 
huo_hu 发表于 2017-8-19 21:44
这个我式过了,可以的 (主3从1)


TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Enable);//
TIM_S ...

为什么我用TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//这个模式起动不了TIM1呢,只能用Trigger起动,用Trigger启动后设置断点发现TIM1和TIM3的CNT值不一样。能把你的TIM的配置发给我看看吗,我看看哪里出错了。
此帖出自单片机论坛

点评

#include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "stm32f10x_rcc.h" void Tim3_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBase  详情 回复 发表于 2017-8-26 15:25
 
 
 

回复

4005

帖子

0

TA的资源

版主

16
 
本帖最后由 huo_hu 于 2017-8-26 15:27 编辑
1152075117 发表于 2017-8-25 10:03
为什么我用TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//这个模式起动不了TIM1呢,只能用Trigger起 ...

#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
void Tim3_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
//TIM2设置
        TIM_DeInit(TIM3);        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //clock
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //clock
                TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                //其它默认值
          TIM_TimeBaseStructure.TIM_Period = 65535;           //重载定时器周期,ARPE=1时更新事件时//
          TIM_TimeBaseStructure.TIM_Prescaler = 0;                    //定时器时钟分频数,下次更新事件时采用//
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);        
          TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);        
               
                TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Enable);//
                TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);//
                TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//
                TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);//
                TIM_Cmd(TIM1, ENABLE);        
                TIM_Cmd(TIM3, ENABLE);
}

int main(void)
{
        u16 tmp=0;
        Tim3_Init();
        while(1) {
                while(--tmp);
                TIM_Cmd(TIM3, DISABLE);               
                while(--tmp);
                TIM_Cmd(TIM3, ENABLE);                        
                while(--tmp);
                TIM_Cmd(TIM3, DISABLE);               
                while(--tmp);
                TIM_Cmd(TIM3, ENABLE);        
               
        }

}
此帖出自单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

17
 
截在disable以后是相同的,enable以后看到不同是时间差问题。
此帖出自单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

18
 
大神果然厉害!非常感谢!我之前没用disable看的。
此帖出自单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

19
 
大神有时间帮我看下这个,我刚学这东西,好多东西想不清楚,指点下,哈哈。
https://bbs.eeworld.com.cn/thread-558731-1-1.html
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表