OpenEdv-开源电子网

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

关于输入脉冲捕获实验的疑惑???STM'32rct6

[复制链接]

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
发表于 2016-11-29 09:50:04 | 显示全部楼层 |阅读模式
5金钱
现在我是要给PB0(TIM3—CH3)输入一个脉冲,每次检测到一个上升沿或者下降沿的时候,计数器的值上升1:
然后上周原子哥让我去参考他之前写的程序:
//TIM5,外部计数模式
void TIM3_CH2_Excnt_Init(u16 arr,u16 psc)
{   
    RCC->APB1ENR|=1<<1;    //TIM3 时钟使能  
    RCC->APB2ENR|=1<<2;        //使能PORTA时钟   

    GPIOA->CRL&=0X0FFFFFFF;      //PA7 清除之前设置   
    GPIOA->CRL|=0X80000000;      //PA7 输入   
    GPIOA->ODR|=1<<7;          //PA7 上拉

    TIM3->ARR=arr;    //设定计数器自动重装值   
    TIM3->PSC=psc;    //预分频器  

    TIM3->CCMR1|=1<<8;  //CC2S=01  选择输入端 IC2映射到TI2上
    TIM3->CCMR1|=0<<12;     //IC2F=0000 配置输入滤波器 不滤波

    TIM3->CCER|=1<<5;   //CC1P=0   下降沿计数
    TIM3->SMCR|=6<<4;   //触发选择:滤波后的定时器输入2(TI2FP2)
    TIM3->SMCR|=7<<0;   //外部时钟模式1
    TIM3->CR1|=1<<0;    //启动计数器,CEN=1
}


///////这个程序在我板子上使用起来没有问题,我测试了一下,的确是按键按下,检测到一个边沿信号之后,CNT寄存器里面的值是逐渐增加的。
但是我依照原子哥的教程来编写PB0口的输入捕获的时候,编写程序如下,(我也考虑到用的是CH3,所以变换使用了TIM3->CCMR2寄存器)
void PB0Init(void){ RCC->APB1ENR|=1<<1;      //TIM3 时钟使能   RCC->APB2ENR|=1<<3;     //使能PORTB时钟     GPIOB->CRL&=0XFFFFFFF0;     //PB0 清除之前设置    GPIOB->CRL|=0X00000008;     //PB0输入     GPIOB->ODR|=1<<0;         //PB0 上拉   TIM3->ARR=20;      //设定计数器自动重装值     TIM3->PSC=0;      //预分频器    TIM3->CCMR2|=1<<0;     //CC2S=01  选择输入端 IC2映射到TI2上  TIM3->CCMR2|=0<<4;    //IC2F=0000 配置输入滤波器 不滤波   TIM3->CCER|=1<<9;   //CC1P=0   下降沿计数  TIM3->SMCR|=6<<4;   //触发选择:滤波后的定时器输入2(TI2FP2)  TIM3->SMCR|=7<<0;   //外部时钟模式1  TIM3->CR1|=1<<0;    //启动计数器,CEN=1 }
//这个程序使用起来很奇怪,烧写进去之后PB0口有输入脉冲时没有任何反应,但是,继续对PA7口进行相应的输入时,他却还是继续有反应??
很不解,我明明配置的是PB0,为何PB5有反应了呢??PB0为什么就是设置不对呢??

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

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-29 10:05:13 | 显示全部楼层
发现那个程序乱码了,重新发一次:
void PB0Init(void)
{
RCC->APB1ENR|=1<<1;      //TIM3 时钟使能  
RCC->APB2ENR|=1<<3;     //使能PORTB时钟     

GPIOB->CRL&=0XFFFFFFF0;     //PB0 清除之前设置   
GPIOB->CRL|=0X00000008;     //PB0输入   
GPIOB->ODR|=1<<0;         //PB0 上拉   

TIM3->ARR=20;      //设定计数器自动重装值     
TIM3->PSC=0;      //预分频器   

TIM3->CCMR2|=1<<0;     //
CC2S=01  选择输入端 IC2映射到TI2上  
TIM3->CCMR2|=0<<4;    //
IC2F=0000 配置输入滤波器 不滤波
  
TIM3->CCER|=1<<9;   //CC1P=0   下降沿计数  
TIM3->SMCR|=6<<4;   //触发选择:滤波后的定时器输入2(TI2FP2)  
TIM3->SMCR|=7<<0;   //外部时钟模式1  
TIM3->CR1|=1<<0;    //启动计数器,CEN=1
}
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-29 21:00:09 | 显示全部楼层
从模式,外部脉冲输入,让定时器计数,对TIM3_CH3不适用,除非你使用CH1 CH2 CH3的异或功能,也就是三个通道同时使用,所以这没必要,但是单独CH1,CH2是可以的有这个功能的,看参考手册定时器框图一下就明白了
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-29 21:37:07 | 显示全部楼层
lycreturn 发表于 2016-11-29 21:00
从模式,外部脉冲输入,让定时器计数,对TIM3_CH3不适用,除非你使用CH1 CH2 CH3的异或功能,也就是三个通 ...

所以说,我的管脚选择是错误的了??但是我现在还有补救的方法么??
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-29 21:50:11 | 显示全部楼层
beibei 发表于 2016-11-29 21:37
所以说,我的管脚选择是错误的了??但是我现在还有补救的方法么??

ch3 没这功能,换其他通道(CH1,CH2,ETR)吧
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-29 21:58:14 | 显示全部楼层
lycreturn 发表于 2016-11-29 21:50
ch3 没这功能,换其他通道(CH1,CH2,ETR)吧

,那我可否设置为采样一个中断,然后每次检测到一个边沿就计一次数,这样子芯片可以反应过来么??
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-29 22:09:07 | 显示全部楼层
beibei 发表于 2016-11-29 21:58
,那我可否设置为采样一个中断,然后每次检测到一个边沿就计一次数,这样子芯片可以反应过来么??

如果只是对脉冲计数,任意通道都可以,设置一个变量,捕获一次上升沿(或者下降沿),变量+1;
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-29 22:09:09 | 显示全部楼层
beibei 发表于 2016-11-29 21:58
,那我可否设置为采样一个中断,然后每次检测到一个边沿就计一次数,这样子芯片可以反应过来么??

如果只是对脉冲计数,输入频率又不是很高,任意通道都可以,设置一个变量,捕获一次上升沿(或者下降沿),变量+1;
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-29 22:18:51 | 显示全部楼层
lycreturn 发表于 2016-11-29 22:09
如果只是对脉冲计数,输入频率又不是很高,任意通道都可以,设置一个变量,捕获一次上升沿(或者下降沿) ...

这里的频率大概是多少??编码器的脉冲可以么??
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-30 10:29:55 | 显示全部楼层
beibei 发表于 2016-11-29 22:18
这里的频率大概是多少??编码器的脉冲可以么??

最好不超过10K,其实你可以写个代码测试的,测试一下就知道了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 18:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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