OpenEdv-开源电子网

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

TIM4_CH3的输入捕获实验为什么不能正常捕获?

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
发表于 2013-8-22 16:57:33 | 显示全部楼层 |阅读模式
原子哥,各位大神们,请问一下我的TIM4_CH3的输入捕获实验为什么不能正常捕获?
下面是主要的程序,用TIM3_CH2输出PWM,TIM4_CH3捕获输入(MINI开发板 STM32F103RBT6)。

//输入捕获初始化程序
void TIM4_CH3_CC_Init(u16 arr,u16 psc) //PB8
{
RCC->APB1ENR|=1<<2;   //使能TIM4时钟
RCC->APB2ENR|=1<<3;     //使能PORTB时钟

GPIOB->CRH&=0XFFFFFFF0; //清空
GPIOB->CRH&=0XFFFFFFF4; /*浮空输入模式 */
TIM4->ARR=arr;
TIM4->SC=psc;
TIM4->CCMR2|=0X00000001; //IC1F[7:4]=0000无滤波; IC1PSC[3:2]=00 无分频; CC1S[1:0]=01 IC1映射在TI1上
TIM4->CCER|=0x0100; //CC3P[9]=0 上升沿捕获; CC3E[8]=1 捕获使能; 
TIM4->DIER|=0X0009; //CC3IE[3]=1 允许捕获/比较3中断;UIE[0]=1 允许更新中断;
MY_NVIC_Init(1,2,TIM4_IRQChannel,2); //抢占1,子优先级2,编号,组2
TIM4->CR1|=0X01; //CEN[0]=1 使能计数器
}
u8 TIM4CH3_CC_STA=0;
//BIT7 捕获成功一次
//BIT6 捕获到高电平标志
//BIT[5~0] 捕获高电平后的溢出次数
u16 TIM4CH3_CC_VAL;
//输入捕获中断服务程序
void TIM4_IRQHandler(void)
{
u16 T4SR;
T4SR=TIM4->SR; //TIM4的状态寄存器值  UIE[0]更新中断标志位
if((TIM4CH3_CC_STA&0x80)==0) //还没捕获成功
{
if(T4SR&0X01) //如果产生溢出
{
if(TIM4CH3_CC_STA&0x40) //如果已经捕获到高电平
{
if(TIM4CH3_CC_STA&0x3ff==0x3ff) //如果高电平太长
{
TIM4CH3_CC_STA|=0x80; //标记成功捕获一次
TIM4CH3_CC_VAL=0XFFFF;
}
else TIM4CH3_CC_STA++;
}
}
if(T4SR&0X08) //如果捕获3发生捕获事件
{
if(TIM4CH3_CC_STA&0x40) //如果一ing捕获到了高电平,则此次捕获到一个下降沿
{
TIM4CH3_CC_STA|=0x80; //标记捕获成功一次
TIM4CH3_CC_VAL=TIM4->CCR1; //获取当前捕获值
TIM4->CCER&=~(1<<9); //CC3P[9]=0 设置上升沿捕获;
}
else
{
TIM4CH3_CC_STA|=0x40; //捕获到上升沿,标记高电平
TIM4->CNT=0; //计数器清空
TIM4->CCER|=1<<9; //设置下降沿捕获

}
}
}
TIM4->SR=0; //清空中断标志位
}

主函数中

int main(void)
{
u32 temp=0;
  Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,115200);   //串口初始化 
LED_Init();   //初始化与LED连接的硬件接口

TIM3_CH2_PWM_Init(200,7200); //PA7 OK 占空比1.5ms周期20ms,72M/7200=10kHz 
TIM4_CH3_CC_Init(0XFFFF,7200); /*为什么TIM4不能正常捕获?串口收不到数据*/
    while(1)
{

delay_ms(10);
TIM3_CH2_PWM_VAL++;
if(TIM3_CH2_PWM_VAL==300)TIM3_CH2_PWM_VAL=0;
 
if(TIM4CH3_CC_STA&0X80) //如果捕获成功到了一次
{
temp=TIM4CH3_CC_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM4CH3_CC_VAL; //得到总的高电平时间
printf("HIGH:%d us\r\n",temp); //打印总的高点平时间
TIM4CH3_CC_STA=0; //开启下一次捕获
}
  
}  
}

平凡的有点不正常
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-22 17:36:59 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
 楼主| 发表于 2013-8-22 18:14:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
if(TIM4CH3_CC_STA&0X80) //如果捕获成功到了一次
{
temp=TIM4CH3_CC_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM4CH3_CC_VAL; //得到总的高电平时间
printf("HIGH:%d us\r\n",temp); //打印总的高点平时间
TIM4CH3_CC_STA=0; //开启下一次捕获
}
应该没有进入中断,这段程序进入不了-------我没有用JTAG仿真器,那个JTAG仿真器前段时间不好使,直接用的串口下载到开发板上,,,所以不太确定有没有进入中断
平凡的有点不正常
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-22 22:33:37 | 显示全部楼层
PB8设置为带上下输入吧。
我测试你的输入捕获配置,是可以进入中断的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
 楼主| 发表于 2013-8-23 14:43:23 | 显示全部楼层
我在主函数里面点亮LED1,然后在TIM4_IRQHandler中断函数里面将LED1熄灭,结果是可以进入中断。
PB8设置为带上下拉输入模式,但依然不能够捕获,串口没有输出(已确认串口没有问题)。

顺带问一下:UIE[0]=1 允许更新中断---是指它本身就是一个中断(在计数器溢出时,更新计数器值而产生的一个中断),还是指允许更新其他的中断,比如更新捕获中断。
TIM4->DIER|=1<<3;  //CC3IE[3]=1 允许捕获/比较3中断;
        // TIM4->DIER|=1<<0;  //UIE[0]=1 允许更新中断;【将这一程序屏蔽后就不能进入中断了】
平凡的有点不正常
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
 楼主| 发表于 2013-8-23 14:45:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我在主函数里面点亮LED1,然后在TIM4_IRQHandler中断函数里面将LED1熄灭,结果是可以进入中断。 
PB8设置为带上下拉输入模式,但依然不能够捕获,串口没有输出(已确认串口没有问题)。 

顺带问一下:UIE[0]=1 允许更新中断---是指它本身就是一个中断(在计数器溢出时,更新计数器值而产生的一个中断),还是指允许更新其他的中断,比如更新捕获中断。 
TIM4->DIER|=1<<3;  //CC3IE[3]=1 允许捕获/比较3中断; 
 // TIM4->DIER|=1<<0;  //UIE[0]=1 允许更新中断;【将这一程序屏蔽后就不能进入中断了】
平凡的有点不正常
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-25 23:27:55 | 显示全部楼层
回复【6楼】justin小默:
---------------------------------
UIE,本身就是一个中断
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
发表于 2013-9-3 16:01:54 | 显示全部楼层
回复【楼主位】justin小默:
---------------------------------
请问楼主这个问题解决了吗?我现在也遇到了和你一样的问题,我用仿真器看,进入了中断,但是就是不能正常捕获
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-4-27
在线时间
3 小时
 楼主| 发表于 2013-9-12 00:52:37 | 显示全部楼层
回复【8楼】everyday666:
---------------------------------
没呢,最近也没仔细研究
平凡的有点不正常
回复 支持 反对

使用道具 举报

8

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2013-9-5
在线时间
31 小时
发表于 2014-3-6 21:52:58 | 显示全部楼层
没有解决的问题,记号一个
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-4-3
在线时间
13 小时
发表于 2014-4-3 20:43:01 | 显示全部楼层
TIM4CH3_CC_VAL=TIM4->CCR1; //获取当前捕获值

TIM4CH3_CC_VAL=TIM4->CCR3; //获取当前捕获值

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 19:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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