经过将近四天的调试,终于检测到超声回波高电平信号的宽度了,在这儿把代码贴出来,让那些还在苦苦奋斗的同志们,省点时间。本人用的模块是HC-SR04。
我的思路是:
在主函数里一直发高低脉冲;
然后把超声波接收回波信号的引脚, 设置为浮空输入,并且设置为上升沿中断:
在中断服务函数里,开关定时器,统计高脉冲宽度。
把主要代码贴出来,供大家参考。我的这个代码也是参照网上同志们的代码写出来的,在这儿感谢同志们的无私奉献。谢谢!
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
EXTIX_Init(); //PA13设置为上升沿中断
Timerx_Init(59999,71);//10Khz的计数频率,计数到5000为500ms
while(1)
{
PAout(2)=1;delay_us(15); // 15us高电平,让超声波模块开始工作
PAout(2)=0;delay_ms(100);
}
}
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=0X04000000; //关闭JTAG
GPIOA->CRH&=0XFF0FFFFF;//PA13设置成输入
GPIOA->CRH|=0X00800000;
GPIOA->CRH&=~(1<<13);
Ex_NVIC_Config(GPIO_A,13,RTIR);//上降沿触发
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
}
//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
double dis;
LED1 = 0;// 调试用的
TIM3->CNT=0;
TIM3->CR1|=0x01;
while(PAin(13)==1);
TIM3->CR1&=~(1<<1);
dis = (double)((340.0*TIM3->CNT)/(2*1000)); //测得的距离值的单位是mm
printf("%.6lf ",dis);
EXTI-> R=1<<13; //清除LINE13上的中断标志位
}
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
// TIM3->DIER|=1<<0; //允许更新中断
// TIM3->DIER|=1<<6; //允许触发中断
// TIM3->CR1|=0x01; //使能定时器3
// MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
|