HCSR04+定时中断测距(调试发现卡死在HAL_Delay())

不同代码的bug情况不一样,至于我的就是在其他中断回调函数中间接调用了
HAL_Delay()导致卡死,具体卡死的原理是:HAL_Delay()本质就是滴答定时器的应用,其中通过cubumx配置生成的代码采用的是中断计数定时方式,并且默认配置中断优先级为最低,因此在其他中断回调函数就会卡死。
解决方法:在cubumx上将滴答定时器的中断优先级配置级别比所在中断回调函数所对应的中断源级别高(stm32中断优先级,数值越低,优先级越高)。
在这里插入图片描述
以下是我的使用案例导致的bug:
超声波测距启动代码 HC05_Start();调用了HAL_Delay()

void HC05_Start(void)
{
	HAL_GPIO_WritePin(  GPIOB,   GPIO_PIN_1,   GPIO_PIN_RESET);
	HAL_GPIO_WritePin(  GPIOB,   GPIO_PIN_1,   GPIO_PIN_SET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(  GPIOB,   GPIO_PIN_1,   GPIO_PIN_RESET);
	
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint16_t times=0;
	 if (htim->Instance == TIM3)	// 判断是定时器1发生中断
	 {
		 times++;
		 if(times==500)
		 {
			 
			 HAL_GPIO_TogglePin(GPIOC,  GPIO_PIN_13);
			 printf("\r\n启动超声波测距\r\n");
			 times=0;
			 HC05_Start();/*启动超声波测距*/
		 }
		 

}

还有一种解决方法就是,自写非中断式的延时函数,供 HC05_Start()使用。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F407上使用HCSR04超声波传感器进行测距,需要进行以下步骤: 1. 连接HCSR04超声波传感器到STM32F407开发板上。将VCC引脚连接到3.3V电源,GND引脚连接到GND,Trig引脚连接到STM32F407的GPIOx(x为对应的GPIO口)的输出引脚,Echo引脚连接到STM32F407的GPIOx(x为对应的GPIO口)的输入引脚。 2. 在STM32CubeMX中配置GPIO口,将Trig引脚配置为输出模式,将Echo引脚配置为输入模式。 3. 在代码中初始化GPIO口,配置Trig引脚为推挽输出模式,配置Echo引脚为上拉输入模式。 4. 在代码中编写测距函数,包括向Trig引脚输出一个至少10us的高电平,然后等待Echo引脚变高,再计算Echo引脚高电平持续的时间,最后根据公式计算出距离。 以下是一个简单的示例代码: ``` #include "stm32f4xx_hal.h" #define TRIG_PIN GPIO_PIN_0 #define TRIG_PORT GPIOA #define ECHO_PIN GPIO_PIN_1 #define ECHO_PORT GPIOA void delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(&htim6, 0); while (__HAL_TIM_GET_COUNTER(&htim6) < us); } float get_distance() { uint32_t duration; float distance; HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); delay_us(2); HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET); delay_us(10); HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); while (!HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN)); uint32_t start = HAL_GetTick(); while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN)); duration = HAL_GetTick() - start; distance = duration * 0.034 / 2; // 距离公式 return distance; } int main(void) { HAL_Init(); SystemClock_Config(); // 配置系统时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIO时钟 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = TRIG_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = ECHO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct); while (1) { float distance = get_distance(); printf("Distance: %.2fcm\r\n", distance); HAL_Delay(1000); } } ``` 注意:这只是一个简单的示例代码,具体实现方式可能因开发板和库的不同而有所不同,需要自行进行适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值