OpenEdv-开源电子网

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

设置了一个输入捕获但不知道为什么死在了中断里面谁能帮我看看。

[复制链接]

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-6-3
在线时间
0 小时
发表于 2015-3-28 16:21:06 | 显示全部楼层 |阅读模式
5金钱

u16 CH_Data,CH1_STA,CH2_STA;
void TIM4_Cap_Init(void)

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //使能TIM5时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);      //使能GPIOA时钟
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6|GPIO_Pin_7;      //PA0 清除之前设置 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;       //PA0 输入 
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);       //PA0 下拉
 
 //初始化定时器5 TIM5 
 TIM_TimeBaseStructure.TIM_Period      = 65535;      //设定计数器自动重装值
 TIM_TimeBaseStructure.TIM_Prescaler     = 4;       //预分频器  
 TIM_TimeBaseStructure.TIM_ClockDivision    = TIM_CKD_DIV1;    //设置时钟分割:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode    = TIM_CounterMode_Up;   //TIM向上计数模式
 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
 //初始化TIM5输入捕获参数
 TIM_ICInitStructure.TIM_Channel      = TIM_Channel_1|TIM_Channel_2;      //CC1S=01  选择输入端 IC1映射到TI1上
   TIM_ICInitStructure.TIM_ICPolarity      = TIM_ICPolarity_Rising;      //上升沿捕获
   TIM_ICInitStructure.TIM_ICSelection     = TIM_ICSelection_DirectTI;      //映射到TI1上
   TIM_ICInitStructure.TIM_ICPrescaler     = TIM_ICPSC_DIV1;         //配置输入分频,不分频
   TIM_ICInitStructure.TIM_ICFilter      = 0x0;           //IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM4, &TIM_ICInitStructure);

 TIM_ICInitStructure.TIM_Channel      = TIM_Channel_2;      //CC1S=01  选择输入端 IC1映射到TI1上
   TIM_ICInitStructure.TIM_ICPolarity      = TIM_ICPolarity_Rising;      //上升沿捕获
   TIM_ICInitStructure.TIM_ICSelection     = TIM_ICSelection_DirectTI;      //映射到TI1上
   TIM_ICInitStructure.TIM_ICPrescaler     = TIM_ICPSC_DIV1;         //配置输入分频,不分频
   TIM_ICInitStructure.TIM_ICFilter      = 0x0;           //IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM4, &TIM_ICInitStructure);
 
 //中断分组初始化
 NVIC_InitStructure.NVIC_IRQChannel        = TIM4_IRQn;      //TIM3中断
 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(TIM4,TIM_IT_CC1|TIM_IT_CC2,ENABLE);          //允许更新中断 ,允许CC1IE捕获中断
 CH1_STA=0;
 CH2_STA=0; 
 
}
void TIM4_IRQHandler(void)
{
 if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
 { 
  if(CH2_STA==0)
  {
   CH1_STA=1;
   TIM_SetCounter(TIM4,0);
   usartdata("1");
  }
  else
  {
   CH_Data=TIM_GetCapture1(TIM4);
//   usartdata("准备关闭TIM4");
   TIM_Cmd(TIM4,DISABLE); 
  }
 }
 if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
 {
  if(CH1_STA==0)
  {
   CH2_STA=1;
   TIM_SetCounter(TIM4,0);
   usartdata("2");
  }
  else
  {
   CH_Data=TIM_GetCapture2(TIM4);
//   usartdata("准备关闭TIM4");
   TIM_Cmd(TIM4,DISABLE);
  }
   
 }                          
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_CC2); //清除中断标志位
 
}
//主要的目地是想测两个方波信号之间的相位,设置好后下到板上试不知道为什么都是跑到中断里

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-6-3
在线时间
0 小时
 楼主| 发表于 2015-3-28 16:28:24 | 显示全部楼层

完整工程在这

输入捕获.rar

4.62 MB, 下载次数: 24

回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-28 19:11:17 | 显示全部楼层
你这个是什么意思



TIM_Channel_1=0;    TIM_Channel_1|TIM_Channel_2 = TIM_Channel_2   相当于你把通道2配置了2次,  通道1都没配置     
每次中断都是由通道2产生的,通道1不产生中断,那么CH1_STA一直都为0 ,然后你的定时器一直处于开启状态,然后通道2 来一个上升沿,进一次中断,还不停歇~
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2014-4-23
在线时间
31 小时
发表于 2015-3-28 21:08:03 | 显示全部楼层

TIM2?TIM4?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 11:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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