初级会员
- 积分
- 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; //开启下一次捕获
}
}
|
|