打印
[STM32U5]

【NUCLEO-U575ZI-Q测评】体验第N种闪灯之四——Tick实现非阻塞式点灯

[复制链接]
5154|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-2-18 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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来实现是最简单的一种。

使用特权

评论回复
沙发
mikewalpole| | 2023-3-3 21:13 | 只看该作者
实现的效果怎么样              

使用特权

评论回复
板凳
pl202| | 2023-3-3 21:49 | 只看该作者
这个可以使用时间间隔实现的              

使用特权

评论回复
地板
lulugl|  楼主 | 2023-3-3 22:14 | 只看该作者
对的,可以任意定多少时间来翻转。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

715

帖子

9

粉丝