在一些项目中,我们可能看到过很多,在学习的时候没有见过的代码,比如 do{...} while(0U) 这种代码,在我们学习的时候可能很少见,但实际项目中却存在很多类似代码。
今天就来讲讲关于 do{...} while(0U) 的内容。
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):
大家再对比以上两种,发现了什么问题?
我这里也不再继续举例说明了,大家可以上网了解,其实还有很多重要意义和作用。
怎么说呢,点到为止,希望对你有启发。
关键字:STM32
引用地址:
do{...} while(0U) 这种代码的作用和意义
推荐阅读最新更新时间:2024-11-04 02:27
STM32的三种开发模式
寄存器,固件库,操作系统
[单片机]
基于STM32单片机的工业循环水极化控制系统设计
0 引言 工业生产中的循环水系统在运行中对淡水消耗非常大,同时,为防止工业设备结垢等现象,需要对循环水不断添加各种化学药剂,且需要不断地排放污水、补充新鲜水,这样既对水资源造成了很大的浪费又污染环境。鉴此,笔者设计了一种基于ARM的工业循环水极化控制系统。该系统通过极化场对水的极化作用 ,实现对工业循环水的处理功能,达到减少水资源消耗、避免使用化学药剂、有效防止水资源污染的目的。 1 系统总体设计方案 基于ARM 的工业循环水极化控制系统采用ST公司的STM32F103微控制器作为主控制核心,由极化能量检测电路实时检测循环水水质参数,经STM32F103运算处理后,由极化能量输出电路调整极化能量的输出,由LCD显示电路实时显
[单片机]
采用STM32 单片机的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功
[电源管理]
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。 一、基本工作原理 (1)给TRIG引脚至少10us的高电平信号触发测距。 (2)模块自动发送8个40KHz的方波,自动检测是否有信号返回 (3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。 (4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。 二、接线 三、模块时序图 四、驱动程序 在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需
[单片机]
STM32接口FSMC/FMC难点的理解
一,FSMC FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。 二,FSMC存储块 STM32F767的FMC将外部存储器划分为6个固定大小的256M的存储区域,如下图 如图: FSMC分为4块,每块256M字节又被划分为4*64,即四个片选 NOR / PSRAM使用块1,共256M NAND闪存使用块2,3,共512M PC卡使用块4,共256M 三,存储块1(Bank1)寄存器 STM32 的 FSMC 存储块 1(Bank1)被分为 4
[单片机]
英特尔Atom动力Windows8平板2012年下半年推出
Medfield平板和智能手机将在2012年上半年发布。在2012年下半年,我们会看到配备英特尔Clover Trail W处理器的Windows 8平板。Clover Trail W是Medfield的后继产品。 Medfield平板和智能手机将在2012年上半年发布。在2012年下半年,我们会看到配备英特尔Clover Trail W处理器的Windows 8平板。Clover Trail W是Medfield的后继产品。 我们第一次看到英特尔演示Moorsetown智能手机是在2010年国际消费电子展,所以英特尔加入智能手机/平板行业已经有很长的时间。上述路线图,提示又一代
[手机便携]
STM32:重定向 prinft 和 getchar 函数,但是使用过程串口出现问题
在STM32学习中,我们肯定会学到串口的使用。其中关于串口数据的接收和发送,我们其实可以用 printf() 函数和 getchar() 函数来简化传输。我们只需要做一些简单的前期工作即可。 在 C 语言标准库中,fputc 函数是 printf 函数内部的一个函数,功能是将字符 ch 写入到文件指针 f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们使用 USART 函数重新修改 fputc 函数内容,达到类似“写入”的功能。 fgetc 函数与 fputc 函数非常相似,实现字符读取功能。在使用 scanf 函数时需要注意字符输入格式。 还有一点需要注意的,使用 fput 和 fgetc 函数
[单片机]
STM32中断使用笔记
1.GPIO 的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPI
[单片机]