求助,超声波传感器测距,一直收不到上升沿,这是怎么回事,

2019-10-16 04:39发布

这是一个超声波测距的程序,一直收不到上升沿信号,(一直进不了触发中断),拜托大神帮我看看,十分感谢,PC1是触发信号  PA0是收信的

int main (void)        
{
        Stm32_Clock_Init(9);
        delay_init(72);
        uart1_init(72,115200);
        chaoshengbo_init();                                //测距模块初始化
        TIM5_Cap_Init(59999,71);        //测量周期  60ms
        while(1)
        {
                cejuxinhao();     //一个大于10us的开始信号  
                delay_ms(1000);
        }
}


void chaoshengbo_init(void)                                                        //超声传感器的初始化程序,20us
{
        //传感器管脚接线配置
        //PC1管脚上拉20us,
        RCC->APB2ENR|=1<<4;                //IO口C时钟使能
        GPIOC->CRL&=0XFFFFFF0F;//管脚8设置为输出
        GPIOC->CRL|=0X000000B0;//GPIO_Mode_Out_PP 50MHz复用推挽输出
        GPIOC->ODR|=1<<1;                   //PC1 上拉
        delay_us(20);
        GPIOC->ODR|=0<<1;                   //PC1 下拉
        
}

void cejuxinhao(void)       //发送一个大于10us的开始信号  
{
        printf("触发/n");
                GPIOC->ODR|=1<<1;                   //PC1 上拉
                delay_us(20);
                GPIOC->ODR|=0<<1;                   //PC1 上拉
}

void TIM5_Cap_Init(u16 arr,u16 psc)                  //定时器5通道1输入捕获配置
{        
        MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占2,子优先级0,组2
        //PA0口位脉冲捕获口
        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->SC=psc;                  //预分频器

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

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

        TIM5->DIER|=1<<1;           //允许捕获中断                                
                                   //TIM5->DIER|=1<<0;           //允许更新中断        
        
        TIM5->CR1|=0x0080; //设置第7位 使能缓冲器
        TIM2->EGR|=1<<0;   //定时器的计数器恢复初始化
        TIM5->CR1|=0x01;            //使能定时器5         
}

void TIM5_IRQHandler(void)                                                        //定时器5中断服务程序

{
     int tsr;
     tsr=TIM5->SR;
        printf("中断");
        if(tsr&0x02)   //出发捕获中断
        {
                switch (TIM5CH1_CAPTURE_STA)
                {
                        case 0x01:                                //已捕获上升沿
                        {
                                TIM5->CCER|=1<<1;                 //CC1P=1 设置为下降沿捕获
                                TIM5CH1_CAPTURE_STA=0x02;
                                //TIM2->EGR|=1<<0;   //定时器的计数器恢复初始化
                                TIM5->CNT=0;
                                TIM5CH1_CAPTURE_VAL=0;
                                printf("上升沿");
                        }break;
                        case 0x02:                                //已捕获下降沿
                        {               
                                TIM5CH1_CAPTURE_VAL=TIM5->CCR1;        //获取当前的捕获值
                                while((USART1->SR&0X40)==0);
                                printf("%d",TIM5CH1_CAPTURE_VAL);
                                TIM5->CCER|=0<<1;                        //CC1P=0 设置为上升沿捕获
                                TIM5CH1_CAPTURE_STA=0x01;  
                                printf("下降沿");
                                //TIM2->EGR|=1<<0;   //定时器的计数器恢复初始化
                        }break;
                }
        }
        TIM5->SR=0;//清除中断标志位
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。