OpenEdv-开源电子网

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

加一路捕获,如何进行中断处理?

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-10-12
在线时间
0 小时
发表于 2015-1-30 11:01:46 | 显示全部楼层 |阅读模式
5金钱
PA0是原例子程序的输入端,用TIM2的通道1进行捕获,我想加一路PA2输入,用TIM5通道3进行捕获,我想计算两个上升沿的时间差(默认PA0的上升沿先到)
下面是依葫芦画瓢 写的部分代码
TIM_ICInitTypeDef  TIM2_ICInitStructure;
TIM_ICInitTypeDef  TIM5_ICInitStructure;

void TIM2_Cap_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM5, ENABLE); //使能TIM2 TIM5时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
GPIO_ResetBits(GPIOA,GPIO_Pin_2);    //PA2 下拉

//初始化定时器2和定时器5 TIM2 &TIM5 
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器   
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中指定的参数初始化TIM2的时间基数单位
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIM5的时间基数单位
  
//初始化TIM2&TIM5输入捕获参数
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
  TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
  TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
  TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  TIM_ICInit(TIM2, &TIM2_ICInitStructure);

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_3; //
  TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //
  TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
  TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
  TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  TIM_ICInit(TIM5, &TIM5_ICInitStructure);
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 

TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
TIM_Cmd(TIM2,ENABLE ); //使能定时器2

}
我遇到的问题是:1、这里的中断分组初始化是只要TIM2的通道1有上升沿产生就中断,那么TIM5的通道3产生上升沿时该如何处理?可以在中断服务程序里面处理TIM5的通道3的上升沿不?
2、TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE)TIM_Cmd(TIM2,ENABLE )这两个函数的意思没太弄懂,是使能TIM2要产生中断?
3、TIM2有四个通道,可以同时用不?比如我用TIM2的通道1捕获一个上升沿,TIM2的通道3捕获另外一路信号的上升沿

最佳答案

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

1,这就和统计高电平脉宽是类似的思路。 第一次上升沿的时候,先清零CNT,然后记录溢出次数,然后第二次上升沿时,记录CNT值。第二次记录到的值+溢出次数,就是两次上升沿的时间差(还要根据定时器频率换算下)。 2,同一个中断函数即可。 回复【4楼】wei555: --------------------------------- 判断有没有更新中断、捕获中断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-30 11:01:47 | 显示全部楼层
1,这就和统计高电平脉宽是类似的思路。 第一次上升沿的时候,先清零CNT,然后记录溢出次数,然后第二次上升沿时,记录CNT值。第二次记录到的值+溢出次数,就是两次上升沿的时间差(还要根据定时器频率换算下)。
2,同一个中断函数即可。

回复【4楼】wei555:
---------------------------------
判断有没有更新中断、捕获中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-1-30 11:32:32 | 显示全部楼层
1.Tim5的处理方式和tim2一样。
2.恩,设置更新中断与使能中断。
3.可以同时使用捕获的功能,只要你在中断函数当中区分即可。
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-10-12
在线时间
0 小时
 楼主| 发表于 2015-1-30 11:41:54 | 显示全部楼层
回复【2楼】ST-FAE-SALE:
---------------------------------
可能我还是没描述的太清楚
1.其实是想知道怎么得到两个上升沿的时间差值
3. 在中断函数中做区分,没太弄懂,是要写两个中断函数吗?都为TIM2的话 设置更新和使能中断好像用的是同一个函数
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-10-12
在线时间
0 小时
 楼主| 发表于 2015-2-2 14:38:21 | 显示全部楼层
另外这两个获取函数是判断什么:
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)


if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 04:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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