0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HAL库中do{...} while(0U) 宏定义的作用和意义

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-03 14:07 次阅读

应部分老铁的要求,讲一些细节知识点。一来,我不用花费大量精力去写文章;二来,大家也不会因看文章觉得累。

1写在前面

很多初学者,以及有一定工作经验的朋友都不知道这个“do{...} while(0U)”作用和意义,甚至觉得这样写的代码复杂且没意义。

相信使用过STM32Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。

今天讲的主要知识点是:HAL库中do{...} while(0U)作用和意义。

当然,do{...} while(0U)不限于HAL库中,适用于很多地方。

2

HAL库中do{} while(0U)宏定义

在HAL库中,很多.h文件都有do{...} while(0U)这样的宏定义,比如:在stm32f1xx_hal_rcc.h中,使能GPIO时钟

对比在LL库中时钟使能代码,如下:

很多人只会觉得LL库这种函数比较合理,而想不明白为什么HAL会使用这种“do{...} while(0U)”宏定义的语句。

下一章节重点讲述一下这种“do{...} while(0U)”宏定义的作用和意义。

3

do{...} while(0U)宏定义的作用和意义

使用do{...} while(0U)这种方式其实有几种重要作用,下面简单说几条:

1.编译出错

不使用do{}while:

使用大括号,多一个分号:

使用do{...} while(0U):

大家对比以上几种,你觉得哪一种合理?

2.避免goto跳转语句带来问题

不使用do{}hwile(0):

使用do{}hwile(0):

大家再对比以上两种,发现了什么问题?

我这里也不再继续举例说明了,大家可以上网了解,其实还有很多重要意义和作用。

怎么说呢,点到为止,希望对你有启发。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 宏定义
    +关注

    关注

    0

    文章

    50

    浏览量

    9001
  • stm32cubemx
    +关注

    关注

    5

    文章

    280

    浏览量

    14749
  • HAL库
    +关注

    关注

    1

    文章

    114

    浏览量

    6170
收藏 人收藏

    评论

    相关推荐

    hali2c卡死在HAL_I2C_Master_Transmit

    ; Timeout) || (Timeout == 0U)) { if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)) { hi2c->
    发表于 10-31 09:03

    SVdefine定义的用法

    SV中使用预处理指令`define来定义可以用来创建文本替换。根据场景不同,`define主要用来定义常量、简化复杂的表达式或代码段以及提高代码的可移植性。其基本语法为:
    的头像 发表于 10-21 14:22 303次阅读

    课程上线 | STM32单片机入门教程(1)基于HAL的多核心开发(F1/F4/G0/U5)

    ​好消息!华清远见STM32入门视频课程《基于HAL的STM32多核心开发》正式上线,已更新90讲,持续更新,8月份将全部上线。课程优势真人出镜,手把手教学一板玩转STM32多型号多核心支持
    的头像 发表于 08-08 16:42 309次阅读
    课程上线 | STM32单片机入门教程(1)基于<b class='flag-5'>HAL</b><b class='flag-5'>库</b>的多核心开发(F1/F4/G<b class='flag-5'>0</b>/<b class='flag-5'>U</b>5)

    stm32h5使用jlink调试器,在while (READ_BIT(RCC-&gt;CR, RCC_CR_PLL1RDY) == 0U)这里超时的原因?

    ,然后淘宝买了个jlink的调试器,就想试下,结果连上后,发现程序会在rcc初始化的时候,在 while (READ_BIT(RCC->CR, RCC_CR_PLL1RDY) == 0U)这里超时,进errorhandler
    发表于 05-27 07:36

    stm32h745的特殊引脚如何使用HAL定义

    现在手上有块stm32h745ii的板子,想把pc13 pc14 pc15三个特殊引脚重定义为普通io口,找了一下HAL,好像没有f4库里面能直接调用的接口,有知道的大神麻烦告知一下该如何操作
    发表于 05-24 08:31

    求助,使用STM32cube生成的HALCAN初始化函数HAL_CAN_Init的疑问求解

    后进行初始化配置; 然后请求退出初始化模式,并等待确认初始化模式退出; 在HAL的CAN初始化函数,上述红色字体部分代码如下: HAL_StatusTypeDef
    发表于 05-08 06:06

    STM32 hal无法接收串口数据是怎么回事?

    型号:STM32L432KC官方开发板 串口使用的是板载的USB下载口以及串口 用法: 在串口初始化后,while(1)之前调用 接收中断函数 HAL_UART_Receive_IT(),接收
    发表于 04-29 06:11

    STM32 RTX CAN封装while循环无法跳出是为什么?

    ;MCRCAN_MCR_RESET) != 0U); #defineCAN_MCR_RESET((uint16_t)0x8000)/*!&lt; CAN software master
    发表于 04-19 07:58

    STM32F4初始化USART调用HAL_USART_Receive_IT开启接收中断,HAL为什么要专门发0XFF?

    0xFF。 然后在HAL_USART_RxCpltCallback()中会接收到0x7F(不知从何而来),调用HAL_USART_Transmit()发送,函数返回
    发表于 04-18 07:43

    使用HAL的USB模块时,当设置要接收的数据长度为大于64字节时,无法从接收结束回调函数的原因?

    在使用HAL的USB模块时,使用了自定义的USB设备,发现了一个问题, 版本为1.1.1, 芯片为STM32F103T8 USB类型:自定义
    发表于 04-12 06:07

    使用STM32F407 USB HOST遇到的疑问求解

    一直不对 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) { uint32_t count = 0U
    发表于 04-03 06:11

    hal_initTickuwTickFreq的含义是什么?

    /uwTickFreq又是什么意思? 在stm32f1xx_hal.h定义如下: typedef enum { HAL_TICK_FREQ_10HZ= 100
    发表于 03-18 06:25

    arduinowhile循环怎么跳出

    Arduino 是一款开源的硬件平台,广泛应用于各种物联网和嵌入式系统项目。在 Arduino 上编写代码时,循环结构起到了至关重要的作用。而其中的 while 循环更是常用于需要根据特定条件重复
    的头像 发表于 02-14 16:22 2385次阅读

    使用STM32 HAL进行GPIO控制的实例

    在基于STM32微控制器的嵌入式系统开发,GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常见的操作之一。通过使用STM32的HAL,可以轻松地对GPIO进行配置和控制。本文将演示如何使用
    的头像 发表于 12-21 15:22 3137次阅读

    HAL常用函数汇总

    1,系统函数HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定时器生成的系统延迟函数参数:Delay:延迟时间,单位是ms返回值:无示例代码
    的头像 发表于 11-29 08:00 3049次阅读
    <b class='flag-5'>HAL</b><b class='flag-5'>库</b>常用函数汇总