OpenEdv-开源电子网

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

模仿输入捕获实验例程,打算用TIME3的通道4获取低电平,未成功

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-5-21
在线时间
22 小时
发表于 2020-6-12 19:48:31 | 显示全部楼层 |阅读模式
5金钱
正点原子的输入捕获实验,我想用TIM3的4通道(PB1)来捕获低电平时间(把PE4(KEY0)和PB1连起来按下KEY0来给低电平),但是我还没按开关它就一直发送低电平时间,而且每次都是65536,我是模仿着例程来的呀,实在不知道错在哪了,希望各位大哥大姐们能抽空帮帮我。下面是timer.c里的代码,包含了原来的例程和我自己加入的代码
#include "timer.h"
#include "led.h"

//定时器5通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM5_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<3;           //TIM5 时钟使能
        RCC->APB2ENR|=1<<2;            //使能PORTA时钟  
         
        GPIOA->CRL&=0XFFFFFFF0;        //PA0 清除之前设置  
        GPIOA->CRL|=0X00000008;        //PA0 输入   
        GPIOA->ODR|=0<<0;                //PA0 下拉
          
        TIM5->ARR=arr;                  //设定计数器自动重装值   
        TIM5->PSC=psc;                  //预分频器

        TIM5->CCMR1|=1<<0;                //CC1S=01         选择输入端 IC1映射到TI1上
        TIM5->CCMR1|=0<<4;                 //IC1F=0000 配置输入滤波器 不滤波
        TIM5->CCMR1|=0<<2;         //IC1PS=00         配置输入分频,不分频

        TIM5->CCER|=0<<1;                 //CC1P=0        上升沿捕获
        TIM5->CCER|=1<<0;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM5->DIER|=1<<1;           //允许捕获中断                               
        TIM5->DIER|=1<<0;           //允许更新中断       
        TIM5->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占2,子优先级0,组2          
}

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值
u8  TIM3CH4_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM3CH4_CAPTURE_VAL;        //输入捕获值
//定时器5中断服务程序         
void TIM5_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM5->SR;
        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {
                if(tsr&0X01)//溢出
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                            TIM5CH1_CAPTURE_VAL=TIM5->CCR1;        //获取当前的捕获值.
                                 TIM5->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                 TIM5->CNT=0;                                        //计数器清空
                                 TIM5->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }
        TIM5->SR=0;//清除中断标志位             
}
/定时器3通道4输入捕获配置
//arr:自动重装值
//psc:时钟预分频数

void TIM3_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<1;           //TIM3 时钟使能
        RCC->APB2ENR|=1<<3;            //使能PORTB时钟
        RCC->APB2ENR|=1<<6;            //使能PORTE时钟       
         
        GPIOB->CRL&=0XFFFFFF0F;        //PB1 清除之前设置  
        GPIOB->CRL|=0X00000080;        //PB1 输入   
        GPIOB->ODR|=1<<1;                //PB1 上拉
        GPIOE->CRL&=0XFFF0FFFF;        //PE4 清除之前设置  
        GPIOE->CRL|=0X00030000;        //PE4 输出   
        GPIOE->ODR|=1<<4;                //PE4 输出高电平
          
        TIM3->ARR=arr;                  //设定计数器自动重装值   
        TIM3->PSC=psc;                  //预分频器

        TIM3->CCMR2|=1<<8;                //CC4S=01         选择输入端 IC4映射到TI4上
        TIM3->CCMR2|=0<<12;                 //IC4F=0000 配置输入滤波器 不滤波
        TIM3->CCMR2|=0<<10;         //IC4PS=00         配置输入分频,不分频

        TIM3->CCER|=1<<13;                 //CC4P=1        下降沿捕获
        TIM3->CCER|=1<<12;                 //CC4E=1         允许捕获计数器的值到捕获寄存器中

        TIM3->DIER|=1<<1;           //允许捕获中断                               
        TIM3->DIER|=1<<0;           //允许更新中断       
        TIM3->CR1|=0x01;            //使能定时器3
        MY_NVIC_Init(1,0,TIM3_IRQn,2);//抢占1,子优先级0,组2          
}
//定时器5中断服务程序
void TIM3_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM3->SR;
        if((TIM3CH4_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {
                if(tsr&0X01)//溢出
                {            
                        if(TIM3CH4_CAPTURE_STA&0X40)//已经捕获到低电平了
                        {
                                if((TIM3CH4_CAPTURE_STA&0X3F)==0X3F)//低电平太长了
                                {
                                        TIM3CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM3CH4_CAPTURE_VAL=0XFFFF;
                                }else TIM3CH4_CAPTURE_STA++;
                        }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                        if(TIM3CH4_CAPTURE_STA&0X40)                //捕获到一个上升沿                
                        {                                 
                                TIM3CH4_CAPTURE_STA|=0X80;                //标记成功捕获到一次低电平脉宽
                            TIM3CH4_CAPTURE_VAL=TIM3->CCR1;        //获取当前的捕获值.
                                 TIM3->CCER&=~(0<<13);                        //CC4P=1 设置为下降沿捕获
                        }else                                                                  //还未开始,第一次捕获下降沿
                        {
                                TIM3CH4_CAPTURE_STA=0;                        //清空
                                TIM3CH4_CAPTURE_VAL=0;
                                TIM3CH4_CAPTURE_STA|=0X40;                //标记捕获到了下降沿
                                 TIM3->CNT=0;                                        //计数器清空
                                 TIM3->CCER|=0<<13;                                 //CC4P=0 设置为上升沿捕获
                        }                    
                }                                                                                   
        }
        TIM3->SR=0;//清除中断标志位             
}

下面是主函数:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
//ALIENTEK精英STM32F103开发板 实验10
//输入捕获 实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司

extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值
extern u8  TIM3CH4_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM3CH4_CAPTURE_VAL;        //输入捕获值
int main(void)
{                                          
        u32 temp=0;         
        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
        TIM3_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
           while(1)
        {                          
                if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
                {
                        temp=TIM5CH1_CAPTURE_STA&0X3F;
                        temp*=65536;                                        //溢出时间总和
                        temp+=TIM5CH1_CAPTURE_VAL;                //得到总的高电平时间
                        printf("HIGH:%d us\r\n",temp);        //打印总的高点平时间
                        TIM5CH1_CAPTURE_STA=0;                        //开启下一次捕获
                }
                if(TIM3CH4_CAPTURE_STA&0X80)//成功捕获到了一次低电平
                {
                        temp=TIM3CH4_CAPTURE_STA&0X3F;
                        temp*=65536;                                        //溢出时间总和
                        temp+=TIM3CH4_CAPTURE_VAL;                //得到总的低电平时间
                        printf("LOW:%d us\r\n",temp);        //打印总的低电平时间
                        TIM3CH4_CAPTURE_STA=0;                        //开启下一次捕获
                }
        }
}


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

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-5-21
在线时间
22 小时
 楼主| 发表于 2020-6-14 08:38:43 | 显示全部楼层
解决这个一直发送数据的问题了,还是模仿的不仔细,中断服务程序里有两个寄存器没注意查看。但是出现了新问题就是我按下按键后它发送的是最大允许的值(等一阵子才发送),检测到下降沿后检测不到上升沿吧应该是,暂时没搞清为什么。然后做这个实验是不是不太好,按下KEY0键,KEY0是不是短路了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-15 01:31:29 | 显示全部楼层
拥有 发表于 2020-6-14 08:38
解决这个一直发送数据的问题了,还是模仿的不仔细,中断服务程序里有两个寄存器没注意查看。但是出现了新问 ...

按下就是接GND了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-5-21
在线时间
22 小时
 楼主| 发表于 2020-6-17 09:43:30 | 显示全部楼层

接地了然后就检测到下降沿了嘛,但是我松开按键之后并不会发送低电平时间,要等到强制结束发送最长的那个时间。或者就是我连续多按几次它才会发送几个低电平时间回来,为什么按一次松开后它不会检测到高电平呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-18 01:34:47 | 显示全部楼层
拥有 发表于 2020-6-17 09:43
接地了然后就检测到下降沿了嘛,但是我松开按键之后并不会发送低电平时间,要等到强制结束发送最长的那个 ...

示波器看看波形吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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