Interrupt这一词是问题的关键,既然是中断,势必就有优先级,如果在中断里面HAL_Delay会卡死,而main函数则不会,那么有没有可能是Systick优先级太低造成的呢。带着这个问题我们回到STM32CubeMX中重新找到NVIC。 这时候我们注意到在默认使能的中断里面有一个System tick的中断,这就是给HAL_Delay函数提供时基的定时器中断...
STM32官方提供的函数库中,可以找到类似于HAL_Delay()这样的函数。这个函数的就是通过使用定时器,达到一个较为精确的时间延迟,提供给用户调用。 这个函数一般包含在类似于stm32f4xx_hal.c这样的函数中。函数原型如下: __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0U; tickstart ...
delay_us(50); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET); delay_us(50);/*USER CODE BEGIN 3*/}/*USER CODE END 3*/} 实际测试, 函数调用能带来几百ns的误差.
void delay_us(uint16_t nus) { __HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0); __HAL_TIM_ENABLE(DLY_TIM_Handle); while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus) { } __HAL_TIM_DISABLE(DLY_TIM_Handle); } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11....
voiddelay_us(uint32_t us){uint32_t delay=(HAL_RCC_GetHCLKFreq()/4000000*us);while(delay--){;}} 方式三:普通定时器 优点:STM32全系列通用缺点:占用一个定时器 该方法的思路是将定时器设置为1MHZ的计数频率,定时器计一个数就是1us,实现如下: ...
但要注意的是,当使用外部中断时,我们应该避免在中断服务子程序(ISR)中使用延时函数,如HAL_Delay。这是因为在ISR中调用延时函数会导致中断响应时间增加,从而影响其他中断的响应和整个系统的实时性。所以在ISR中,我们只能执行最核心、最迅速的操作。 为了避免在ISR中使用延时函数,我们可以使用定时器中断来实现延时。定时...
HAL_Delay(1000);//延时1S capture_Cnt =0;//清空标志位 break; } } /* USER CODE END 3 */ 在main函数下方添加中断回调函数: /* USER CODE BEGIN 4 */ voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(TIM5 == htim->Instance) ...
编译,下载,运行,效果应该跟刚才一样,下面试一下TIM。 搞完后,小灯应该每秒闪烁5次。注意: 中断里不要使用延时函数Hal_Delay() TIM中断要手动开启(Hal_TIM_Base_Start_IT())
(&huart1,(uint8_t*)&ch,1,0xffff);returnch;}/***main.c文件中编写相关代码***/while(1){HAL_UART_Transmit(&huart1,"HAL_UART_Transmit Test...",25,0xffff);printf("\r\nprintf test...\r\n");HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);HAL_Delay(1000);/* USER CODE END WHILE */}...
if(HAL_GPIO_ReadPin(GPIOB, KEY2_Pin) == GPIO_PIN_RESET)//再次判断按键是否按下 { HAL_Delay(20); HAL_GPIO_TogglePin(GPIOA, DIR_Pin);//原先DIR端给的低电平,逆时针转动 __HAL_TIM_SetAutoreload(&htim1,1000-1);//恢复默认速度