OpenEdv-开源电子网

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

怎么用1052的qtmr做输入捕获啊!

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2019-3-21
在线时间
27 小时
发表于 2019-5-17 20:55:53 | 显示全部楼层 |阅读模式
1金钱
怎么用1052的qtmr做输入捕获啊!

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

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2019-3-21
在线时间
27 小时
 楼主| 发表于 2019-5-17 21:23:55 | 显示全部楼层

原子哥,能不能帮忙看看这个,就是因为这个把芯片烧了

本帖最后由 CAONIMA 于 2019-5-21 20:22 编辑

这是我参照gpt做输入捕获写的超声波测距,有没有大佬能帮我看一下

#include "tpad.h"
#include "delay.h"                    
#include "lpuart.h"

u8  qtmrIsrFlag = 0;//qtmrIsrFlag=0,上升沿中断,qtmrIsrFlag=1,下降沿中断
u8  QTMRCAP_CAPTURE_STA=0;        //输入捕获状态                                                   
u32        QTMRCAP_CAPTURE_VAL;        //输入捕获值(QTMR是16位)
uint32_t time1 = 0;
double temp1=0;


//返回值:捕获值/计数值                                  
//        return TMR3->CHANNEL[kQTMR_Channel_2].CAPT;          
         
void QTMR3_CH2_CAP_Init(void)
{
    qtmr_config_t qtimer3_config;
    gpio_pin_config_t pin_config;   

    //发送IO设置
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_GPIO1_IO17,0);        //GPIO_AD_B1_01配置为ALT5,即GPIO1_17
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_GPIO1_IO17,0x10B0);   
    pin_config.direction=kGPIO_DigitalOutput;        //输出
        pin_config.interruptMode=kGPIO_NoIntmode;        //不使用中断功能
        pin_config.outputLogic=0;                                        //默认di电平   
        GPIO_PinInit(GPIO1,3,&pin_config);                 //初始化GPIO1_3


    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_02_QTIMER3_TIMER2,0);          
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_02_QTIMER3_TIMER2,0x10C1); //捕获引脚配置

        //IOMUXC->SELECT_INPUT[kIOMUXC_QTIMER3_TIMER2_SELECT_INPUT]=1;        //选择TMR3_CH2的输入接到GPIO_AD_B1_02(GPIO1_IO18,ALT1)
    //使用Ipg时钟的128分频  150Mhz /128 = 1171 875hz   qtmr是16位的计数器,一次最大65535 最大计时 65536/1171875 = 55ms
    QTMR_GetDefaultConfig(&qtimer3_config);             //先设置为默认配置,后面在根据实际情况配置
    qtimer3_config.primarySource=kQTMR_ClockDivide_128; //设置第一时钟源
    QTMR_Init(TMR3,kQTMR_Channel_2,&qtimer3_config);    //初始化QTIMER

    //设置输入捕获上升沿
    QTMR_SetupInputCapture(TMR3,kQTMR_Channel_2,kQTMR_Counter2InputPin,0,0,kQTMR_RisingEdge);
    //使能边沿中断和溢出中断
    QTMR_EnableInterrupts(TMR3, kQTMR_Channel_2, kQTMR_EdgeInterruptEnable|kQTMR_OverflowInterruptEnable);   
    //优先级配置 抢占优先级0  子优先级2   越小优先级越高  抢占优先级可打断别的中断       
    RT1052_NVIC_SetPriority(TMR3_IRQn,0,0);
    EnableIRQ(TMR3_IRQn);

    //开始通道2   
    QTMR_StartTimer(TMR3, kQTMR_Channel_2,kQTMR_PriSrcRiseEdge);    //通道2在primary时钟源的上升沿计数
}

void TMR3_IRQHandler(void)
{
    if((QTMRCAP_CAPTURE_STA&0X80)==0)//还未成功捕获
    {       
         if(QTMR_GetStatus(TMR3, kQTMR_Channel_2) & kQTMR_OverflowFlag)      //判断是溢出中断还是边沿中断
        {
            if(QTMRCAP_CAPTURE_STA&0X40)               //已经捕获到高电平了
                        {
                                if((QTMRCAP_CAPTURE_STA&0X3F)==0X3F)   //高电平太长了
                                {
                                        QTMRCAP_CAPTURE_STA|=0X80;                    //标记成功捕获了一次
                                        QTMRCAP_CAPTURE_VAL=0XFF;
                                }
                else QTMRCAP_CAPTURE_STA++;// 低6位表示溢出次数
                        }                       
        }   
        if(QTMR_GetStatus(TMR3, kQTMR_Channel_2) & kQTMR_EdgeFlag)       //判断是溢出中断还是边沿中断
        {            
            if(qtmrIsrFlag == 0)          //还未开始,第一次捕获上升沿
                        {
                qtmrIsrFlag++;
                time1 = TMR3->CHANNEL[kQTMR_Channel_2].CAPT;
                                QTMRCAP_CAPTURE_STA = 0;                                //清空
                                QTMRCAP_CAPTURE_VAL = 0;                                //捕获值清零
                                QTMRCAP_CAPTURE_STA |= 0X40;                        //标记捕获到上升沿
                QTMR_StopTimer(TMR4, kQTMR_Channel_2);       //关闭QTMR  
                                                                                        //设置捕获下降沿
                QTMR_SetupInputCapture(TMR3,kQTMR_Channel_2,kQTMR_Counter2InputPin,0,0,kQTMR_FallingEdge);
                QTMR_StartTimer(TMR3, kQTMR_Channel_2,kQTMR_PriSrcRiseEdge);  //通道2在primary时钟源的上升沿计数
                        }       
            else if((QTMRCAP_CAPTURE_STA&0X40) && qtmrIsrFlag == 1)                        //捕获到一个下升沿                
            {
                qtmrIsrFlag = 0;
                QTMRCAP_CAPTURE_STA|=0X80;        //标记捕获到一次高电平脉宽  成功捕获一次高电平
                //获取当前的捕获值.
                QTMRCAP_CAPTURE_VAL = TMR3->CHANNEL[kQTMR_Channel_2].CAPT;
                //设置捕获上升沿
                QTMR_SetupInputCapture(TMR3,kQTMR_Channel_2,kQTMR_Counter2InputPin,0,0,kQTMR_RisingEdge);
            }            
        }
    }
    QTMR_ClearStatusFlags(TMR3, kQTMR_Channel_2, kQTMR_EdgeFlag|kQTMR_OverflowFlag);   
    __DSB();
}
void ceju(void)
{
    GPIO_PinWrite(GPIO1,17,1);
    delay_us(20);
    GPIO_PinWrite(GPIO1,17,0);
    if((QTMRCAP_CAPTURE_STA&0X80)&&(qtmrIsrFlag == 0))                //成功捕获到了一次高电平
        {
        temp1=QTMRCAP_CAPTURE_STA&0X3F;
        temp1 = QTMRCAP_CAPTURE_STA&0X3F;
        temp1 *= 0XFFFF;                                 //溢出时间总和(溢出计数次数重和)
        temp1 += QTMRCAP_CAPTURE_VAL;    //总的计数值       time=temp1*  1/1171875
        temp1 -= time1;
        temp1 = temp1*170/11718;          //                距离=time*340/2       cm         
        printf("\n距离=%f cm \n", temp1);
        QTMRCAP_CAPTURE_STA=0;                        //开启下一次捕获
    }
}










回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-5-18 02:23:01 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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