STM32—常用的几种伪指令宏

发布者:jingyan最新更新时间:2021-09-03 来源: eefocus关键字:STM32  伪指令 手机看文章 扫描二维码
随时随地手机看文章
  1. 说到伪指令宏一般就会联想到指令、宏指令和伪指令。


先借用别人的话简单介绍一下三者之间的关联和区别(看到一个博主写的很不错):

我们使用的各种指令,都是写给“编译软件”看的。


要由“编译软件”翻译成计算机可以识别的机器语言,即机器码。


通俗地讲:

就好像召开新闻发布会,主持人用中文讲话,由一个翻译,现场翻译成英文,讲给外国记者听。


主持人说的中文,大部分都是要翻译成英文的;少数几句,是说给翻译听的,告诉他如何翻译。


我们写的指令,由“编译软件”翻译成机器码的,称为指令语句;

有一些是写给“编译软件”看的,不翻译成机器码,这样的就是“伪指令”。


一条条计算机的指令,一般来说,功能都是极为简单的。我们可以把几条、几十条指令,编写成一个“宏指令”,来完成一个比较复杂的任务。


在这样“一批指令”的前面,要用一条“伪指令”来命名这个“宏指令”;

在后面,要用一条“伪指令”说明结尾。


以后,这个“宏指令”,就可以当成 正式指令 来使用了。


2.伪指令宏分为简单宏、参数宏、条件宏、预定义宏和宏释放


简单宏:

定义格式: #define 宏标识符 宏体

是最常见的宏,在宏体长的时候使用续行符“”连接宏体,如示


#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||

                                    ((PERIPH) == GPIOB) ||

                                    ((PERIPH) == GPIOC) ||

                                    ((PERIPH) == GPIOD) ||

                                    ((PERIPH) == GPIOE) ||

                                    ((PERIPH) == GPIOF) ||

                                    ((PERIPH) == GPIOG))


宏的用法:在源文件中,用预处理器伪指令定义过宏标识符后,就可以用宏标识符编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便在宏的所在处将宏扩展为宏体。


参数宏:

定义格式:#define 宏标识符(形式参数表) 宏体

形式参数表为逗号分割的形式参数,宏体可以用“”进行续行,使用参数宏时形式参数被换为相同个数的实参数表。(类似于函数的调用,实际上许多库函数时用参数宏编写的。二者区别是参数宏的形式参数表中没有类型说明符)

举例如示


#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) ||

                              ((PIN) == GPIO_Pin_1) ||

                              ((PIN) == GPIO_Pin_2) ||

                              ((PIN) == GPIO_Pin_3) ||

                              ((PIN) == GPIO_Pin_4) ||

                              ((PIN) == GPIO_Pin_5) ||

                              ((PIN) == GPIO_Pin_6) ||

                              ((PIN) == GPIO_Pin_7) ||

                              ((PIN) == GPIO_Pin_8) ||

                              ((PIN) == GPIO_Pin_9) ||

                              ((PIN) == GPIO_Pin_10) ||

                              ((PIN) == GPIO_Pin_11) ||

                              ((PIN) == GPIO_Pin_12) ||

                              ((PIN) == GPIO_Pin_13) ||

                              ((PIN) == GPIO_Pin_14) ||

                              ((PIN) == GPIO_Pin_15))


预处理器在处理参数宏时使用俩次宏展开。第一次展开宏体,第二次对展开的宏体用实参数替换形式参数。


宏释放:

定义格式: #undef 宏标识符

用于释放原定义的宏标识符,释放后的宏标识符可以再次用于定义其他宏体。

条件宏定义:

条件宏定义主要是用来测试是否定义过某宏标识符,以及决定如何处理宏标识符,具体格式有俩种:


\测试存在情况

#ifdef  宏标识符

#undef  宏标识符

#define  宏标识符  宏体

#else

#define  宏标识符  宏体

#endif


\测试不存在情况

#ifndef  宏标识符

#define  宏标识符  宏体

#else

#undef  宏标识符

#define  宏标识符  宏体

#endif


常用于头文件中。

预定义宏:

预定义宏基本莫得存在感,其特征就是标识符前后都有双下划线。如


__DATE__     __TIME__

__FILE__     __LINE__

__STDC__


这些预定义宏的宏体分别是当时的日期、时间、所在文件名、所在文件的行数。


这些宏在后续的学习阶段会频繁出现,在此总结一下。

关键字:STM32  伪指令 引用地址:STM32—常用的几种伪指令宏

上一篇:STM32—ADC多通道采集电压
下一篇:【FDCAN】STM32G0B1+FDCAN+HAL库调试记录

推荐阅读最新更新时间:2024-11-13 10:51

STM32学习笔记:SysTick时钟
SysTick时钟,俗称“嘀嗒定时器”,它能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 它是由HCLK/8得到的,也就是:72MHz/8=9MHz。 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄存器的配置了: 可以看到SysTick共有4个寄存器. 注意看上面的CTRL寄存器的CLKSOURCE位(时钟源位),它有两个选择,一个是
[单片机]
<font color='red'>STM32</font>学习笔记:SysTick时钟
STM32 串口通信(库函数操作)
1.说在前面: 清明三天小假期,放松一下无可厚非,但是,依旧要完成自己的学习任务 2.串口通信的简单介绍: 1.将串口作为一个沟通的渠道,可以和外界进行接收和发送信号 2.STM32和串口相关的寄存器: 2-1:USART_SR(状态寄存器):存储着MCU的一些状态 2-2:USART_DR(数据寄存器):暂存着一些数据信息 2-3:USART_BRR(波特率寄存器:暂存波特率信息 2-4:USART_CRI(控制寄存器):用于给usart进行使能 3.注:波特率的计算方法: 只要给出相应的时钟频率和设置usartdiv,就可以计算出波特率 3.串口通讯的简单配置和使用 1.其实基于
[单片机]
<font color='red'>STM32</font> 串口通信(库函数操作)
STM32关于USART的问题集锦
1、STM32103USART1死机 问:voidUSART_Receive(USART_TypeDef*USARTx) { if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) { USART_ClearFlag(USARTx,USART_FLAG_RXNE); s =USART_ReceiveData(USART1); delay(1000); s =USART_ReceiveData(USART1); delay(1000); s =USART_ReceiveData(USART1); delay(1000); write_c
[单片机]
STM32开发笔记25:STM32L0低功耗设计-使用Keil和ST-Link下载程序
单片机型号:STM32L053R8T6 继续项目的开发工作,突然发现,程序不能够正常下载到单片机中了,提示如下图所示的错误,我使用的是keil和ST-Link。 这个问题在我第1次调试的时候发生过1次,我认为是我误操作将芯片烧坏了,因为当时又反复的焊接了一下芯片,也没有修好,就把这件事情放下了。 今天再次出现,自己感觉可能和低功耗有关,仔细查看刚刚下载的程序,里面上来程序就进入低功耗,没有任何退出语句,所以应该是CPU不响应下载命令了。 按照这种思路,先将单片机的复位引脚接地,然后点击下载按钮的同时,放开复位引脚,居然成功了。 再仔细想不应该呀,ST-Link控制着复位引脚了,应该在下
[单片机]
<font color='red'>STM32</font>开发笔记25:STM32L0低功耗设计-使用Keil和ST-Link下载程序
STM32作为主机I2C,读写24C02 EEPROM
1、 时钟和数据的传输:开始和停止条件,数据在SCL的高电平期间有效,在SCL的低电平期间改变。 2、 开始条件:在SCL高电平期间,SDA产生一个下降沿 3、 停止条件:在SCL高电平期间,SDA产生一个上升沿 4、 应答:成功接收到数据(地址和数据),产生一个应答位(在第9个时钟周期,将SDA拉低) 下面是源程序:原理上说,下面程序再移植时,只要将数据类型变化,可以应用到任何处理器 AT24c02.h #ifndef __24CXX_H #define __24CXX_H #include i2c.h /*************************************************************
[单片机]
学习笔记之 STM32单片机
1、 AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备 2、 Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、 HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、 LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed Intern
[单片机]
STM32的精准延迟
这里主要是使用Systick 时钟 来实现精准延迟,它本质也是一个 定时器 ,使用时只需复制粘贴使用,这里是使用72M的 STM32 F103ZET6,不同型号需要自行修改对应参数。 #include stm32f10x.h static uint8_t D_us=0; //微妙系数 static uint16_t D_ms=0; //毫秒系数 void Delay_Init(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); D_us = SystemCoreClock/8000000; D_ms = (uint16
[单片机]
STM32系列是大端还是小端?
ARM的手册上有关于大小端的描述,如下: The processor can access data words in memory in little-endian format or big-endian format. It always accesses code in little-endian format. Note: Little-endian is the default memory format for ARM processors. STM32是固定配置为小端的 The bytes are coded in memory in Little Endian format. The lowest number
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved