思路是:
在主函数里一直发高低脉冲;
然后把超声波接收回波信号的引脚, 设置为浮空输入,并且设置为上升沿中断:
在中断服务函数里,开关定时器,统计高脉冲宽度。
把主要代码贴出来,供大家参考。我的这个代码也是参照网上同志们的代码写出来的,在这儿感谢同志们的无私奉献。谢谢!
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->PR=1<<13; //清除LINE13上的中断标志位
}
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=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
}
stm-hc-sr04.rar_SR04_STM32 HC-SR04 pudn_hc-hr04 stm32_sr04 stm
版权申诉
143 浏览量
2022-07-15
10:02:46
上传
评论 1
收藏 1KB RAR 举报
局外狗
- 粉丝: 64
- 资源: 1万+
最新资源
- 历届(第1-21届)希望杯数学竞赛初一试题及答案(最新整理).doc全国数学邀请赛(264页资料)
- 水滴.psd
- TokenPocket_V2.1.2_release.apk
- Apache-druid-kafka-rce.yaml
- 半导体行业词汇 相关缩写
- 基于C#的ASP.NET数据库原理及应用技术课程指导平台的开发
- 基于ROS的智能车轨迹跟踪算法的仿真与设计源码运用PID跟踪算法.zip.zip
- Bug Bounty Tip - i春秋Self-XSS变废为宝的奇思妙想
- 1991-2015年全国初中化学竞赛复赛试题汇编(212页)(24年竞赛复赛真题).docx天原杯
- Apache Flink 未授权访问+远程代码执行.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0