新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2022-5-28
- 在线时间
- 1 小时
|
1金钱
楼主想实现hr-sc04超声波模块采集距离,按键设置距离,并在OLED上显示的功能,但是发现有时候按下按键,就发生卡死,求助
这是while主体里的代码,OLED,显示和超声波模块获取距离
延时函数都是用的TIM1
while (1)
{
OLED_ShowString(0,16,String1,12,1);
OLED_ShowString(0,36,String2,12,1);
OLED_ShowNum(20,0,Dec_NUM,1,8,1);
OLED_ShowNum(28,0,Bit_NUM,1,8,1);
OLED_ShowNum(44,16,Setting,2,12,1);
OLED_Refresh();
GET_Distance();
OLED_ShowNum(44,36,(uint16_t)Distance,3,12,1);
OLED_Refresh();
}
超声波获取距离的函数
uint16_t Total_us=0;//超声波时间
float Distance=0;//测量的距离
void GET_Distance(void)
{
float One_distance=0;//单次测得的距离
int i=0;
for(;i<10;++i)//循环10次
{
uint16_t flag=1;//判断EchoPIN是否由高电平转向低电平
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
hal_TIM1_usDelay(20);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);//发送20us给TrigPIN
htim1.Init.Period=60000;//设置60000us为预装载值
HAL_TIM_Base_Init(&htim1);//初始化TIM1
htim1.Instance->CNT=0;//清空TIM1计数值
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)//等待高电平传入
{
}
HAL_TIM_Base_Start(&htim1);//高电平传入,开始计时
while(flag==1)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)//低电平,flag置零,并且获取一次测量中总的us
{
HAL_TIM_Base_Stop(&htim1);//关闭定时器
Total_us=htim1.Instance->CNT;//获取计数值
flag=0;
}
}
One_distance+=340*100.0/2*Total_us/1000000;//计算距离
Total_us=0;//计算完一次距离后清0
}
Distance=One_distance/10;//求均值
}
hal库的中断函数
按键中断里只操作了一项,对数字加一
另外一个中断也是和这个类似,同样的优先级,十位换成个位数值
void EXTI3_IRQHandler(void)
{
HAL_Delay(10);
Dec_NUM+=1;//楼主设置距离用的十位数值
if(Dec_NUM%5==0) Dec_NUM=0;
Setting=(Dec_NUM*10+Bit_NUM);//
HAL_Delay(10);
HAL_GPIO_EXTI_IRQHandler(KEY1_Pin);
}
优先级配置
调试后发现,按键中断仍然可以正常进行,但是超声波测距模块不动
TIM1配置
时钟
|
|