https://bbs.21ic.com/icview-3284890-1-1.html
【目的】改造HAL_Delay阻塞式实现延时为非阻塞式延,实现每0.5秒来翻LED灯。
【开发环境】MacOS+STM32CubeIDE
【硬件】NUCLEO-U575ZI-Q开发板
【步聚】
1、利用两个变量来获取系统tick计数。
2、如果两个计数相差500个tick,则翻转LED灯。
【实现过程】
STM32CubeIDE在选择开发板生成基础工程时,已经初始化好了TICK,使用HAL_GetTick获取当前运行的tick计数。
代码如下:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint32_t last_tick;
- uint32_t this_tick;
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* Configure the System Power */
- SystemPower_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_UCPD1_Init();
- MX_USART1_UART_Init();
- MX_USB_OTG_FS_PCD_Init();
- MX_RTC_Init();
- /* USER CODE BEGIN 2 */
- /* USER CODE END 2 */
- last_tick = HAL_GetTick();
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- this_tick = HAL_GetTick();
- if((this_tick - last_tick)>=500)
- {
- last_tick = this_tick;
- HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
- }
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
【效果】板载的LED3实现每0.5秒翻转一次。
【提示】初学者往往会用阻塞式的delay来实现延时,但是在实际应用中,如果运用阻塞式的延时,会浪费大量的CPU资源。新手一定要改变这种习惯。当然实现非塞阻试的延习有很多种方式。利用系统的tick来实现是最简单的一种。
|