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来实现是最简单的一种。
|