IAR 430 头文件中#define定义的部分解释

发布者:MysticEssence最新更新时间:2015-12-14 来源: eefocus关键字:IAR  头文件  define定义 手机看文章 扫描二维码
随时随地手机看文章
今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。

首先来看一下cc430x613x.h 中的3个#define的例子:

#define DEFC(name, address) __no_init volatile unsigned char name @ address;

#define DEFW(name, address) __no_init volatile unsigned short name @ address;

#define DEFCW(name, address) __no_init union

{

struct

{

volatile unsigned char name##_L;

volatile unsigned char name##_H;

};

volatile unsigned short name;

} @ address;

前面的两个#define的用法是一样的。首先我可以发现,在宏定义里面都有一个关键字__no_init。查看了《MSP430 IAR C/EC++ Compiler Reference Guide》内的IAR Language Extension Overview 可以发现,__no_init是IAR扩展语法里面的一个扩展关键字。作用是声明一个non-volatile类型的内存地址(Support non-valotile memory)。

于是解决了__no_init的问题。

再者对@这个字符存在一定的疑问,于是上网查了查资料。虽然对于@这个字符的用法还是不是很明确,但是可以明确的是:

#define DEFC(name, address) __no_init volatile unsigned char name @ address;

#define DEFC(name, address) sfrb name = address;

这两种定义是等价的,但是后者是基于汇编嵌入式编程的情况下才成立。也就是说“=”是MSP430汇编中数据分配伪指令中的一种。我们来看一下MSP430汇编的数据分配伪指令有哪些:

这类指令有以下一些:

SET (VAR, ASSIGN) 赋予一个临时值;

EQU (=) 在当前模块中赋予一个永久的值;

DEFINE 定义一个整个文件中都有效的值;

sfrb 寄存器类型的字节;

sfrw 寄存器类型的字。

使用语法如下:

label SET expr

label EQU expr

label = expr

label DEFINE expr

[const] sfrb register = value

[const] sfrw register = value

其中,

label 定义一个标志符、

expr 标志符的值、

register 特殊功能寄存器、

value 特殊功能寄存器的值。

在下面的例子中使用了局部变量与全局变量,在模块add1 中定义了符号value ,同样在

模块add2 中也定义了符号value,但它们表示两个不同的量,都只在各自的模块内部有效,

这是局部变量。而在模块add1 中定义的locn 则为全局变量,在两个模块中表示同一个值。

NAME add1

locn DEFINE 100H

value EQU 77

MOV locn,R4

ADD #value,R4

ENDMOD

NAME add2

value EQU 88

MOV locn,R5

ADD #value,R5

END

很明显,“=”也就是EQU,作用是:在当前模块中赋予一个永久的值。

至此,

#define DEFCW(name, address) __no_init union

{

struct

{

volatile unsigned char name##_L;

volatile unsigned char name##_H;

};

volatile unsigned short name;

} @ address;

这种定义也变得相对好理解。以上的这种定义只是多了一个union的定义,将一个16位的地址存储空间分成2个8bits或者1个16位。可以实现字访问,也可以实现字节访问。以上定义是将一个无名的union与address联系起来,使得访问address对应的内存时,就像访问union一样。

那么对于下面的一些看起来貌似比较复杂的定义就相对比较好理解了:

#define RF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#define RF1AIFIFG RF1AIFCTL1_L

#define RF1AIFIE RF1AIFCTL1_H

可以发现,第一个宏定义,“RF1AIFCTL1_”在字符串的最后带一个下划线,其实代表这只是一个地址。而通过宏扩展DEFCW( RF1AIFCTL1 , RF1AIFCTL1_),将会被扩展为:

__no_init union

{

struct

{

volatile unsigned char RF1AIFCTL1_L;

volatile unsigned char RF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

关于@的用法,今天查阅了《MSP430 IAR C/EC++ Compiler Reference Guide》,找到了结果:

A variable that has been explicitly placed at an address, for example by using the compiler @ syntax, will be placed in either the DATA16_AC or the DATA16_AN segment.

从中可以看出,@是一种语法。那么它的作用很明显就是将变量放置到对应的地址中。使用@,一个变量可以明确的制定一个存储地址。

因此之前的宏定义就变得好理解了。

#define DEFC(name, address) __no_init volatile unsigned char name @ address;

就是将name变量存放在address地址中,那么如此一来就可以为每个寄存器进行命名了,也就是说可以实现每个寄存器对应一个或者多个变量。

至此头文件中另外一个问题也迎刃而解:

#define RF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#define RF1AIFIFG RF1AIFCTL1_L

#define RF1AIFIE RF1AIFCTL1_H

我们将DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)展开:

__no_init union

{

struct

{

volatile unsigned char RF1AIFCTL1_L;

volatile unsigned char RF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已经声明成为一个变量,存放的地址分别是0x0F02u,0x0F02u+1,0x0F02u。因此接下来后面两条宏定义就自然的解开了。

#define RF1AIFIFG RF1AIFCTL1_L

#define RF1AIFIE RF1AIFCTL1_H

功能只是为变量RF1AIFCTL1_L,RF1AIFCTL1_H定义了另外的一种名字作为替换。

关键字:IAR  头文件  define定义 引用地址:IAR 430 头文件中#define定义的部分解释

上一篇:STM8学习笔记——时钟和GPIO
下一篇:STC12C5620AD ADC模块和PWM模块注意事

推荐阅读最新更新时间:2024-03-16 14:40

欧盟敲定430亿欧元《芯片法案》
当地时间周二(4月18日),欧盟内部市场专员蒂埃里·布雷顿(Thierry Breton)18日表示,欧盟已就一项规模430亿欧元(约470亿美元)的半导体行业促进计划达成协议。布雷顿在发布会上称,欧盟委员会、欧盟成员国与欧洲议会从18日早上开始就《欧盟芯片法案》(The EU Chips Act)最终细节谈判,现敲定协议。 欧盟委员会去年提出《欧盟芯片法案》,希望到2030年将欧盟在全球半导体制造市场的份额从10%提升到至少20%,并大幅提升当地的芯片制造工艺,建立欧盟的半导体供应链,避免汽车等重要行业的芯片短缺,并与美国和亚洲同行竞争。 欧委会提出了三个主要行动方针或支柱: 一、为大规模的技术产能建设提供支持; 二、设
[半导体设计/制造]
msp430f5529简单uart源程序(用串口助手 发什么 回复什么)
单片机源程序如下: /*****用串口助手 发什么 回复什么****/ #include msp430f5529.h // ACLK = REFO = 32768Hz, MCLK = SMCLK = default DCO/2 = 1048576Hz // P3.4,5——USCI_A0 TXD/RXD;P9.4,5——USCI_A2 TXD/RXD;P10.4,5——USCI_A3 TXD/RXD; void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P4SEL |=BIT4+BIT5 ; // P5.6,7
[单片机]
IAR Systems和Energy Micro合作简化MCU应用开发
    IAR Systems,宣布与低耗能MCU供应商 Energy Micro AS进行合作。Energy Micro在新发布的EFM32 Gecko开发套件中,选择了IAR Embedded Workbench for ARM作为其套件的嵌入式开发平台,这个套件的所有代码示例都基于IAR Systems的开发工具。此外,客户也有机会从IAR Systems直接购买Energy Micro的开发套件。     Energy Micro AS的工具经理Jorn Norheim这样说道:“IAR Systems的Embedded Workbench for ARM嵌入式开发平台可以产生高效率的代码,是我们EFM32 MCU的完
[嵌入式]
基于MSP430的电子纸驱动接口设计
  1 引言   电子纸(ePaper)是新一代的显示装置,其对比度超高,超低功耗,超薄,且可任意弯曲折叠,柔韧性良好。电子纸的应用出现急速扩大,应用于超市价格标签、在手机、电子书阅读器。电子纸已成为继液晶与OLED之后便携式电子装置使用的新型显示技术。这里提出一种采用MSP43OF413单片机的电子纸驱动接口设计方案。MSP430F413自带LCD显示单元,在软件设计中可将其显示内存作为刷新电子纸显示的内存,从而节约MCU的内存资源。   2 电子纸硬件设计   主控制器MSP430F413单片机是一种超低功耗混合信号16位单片机系列,采用16位精简指令系统,125 ns指令周期,大部分指令在一个指令周期内完成,16
[嵌入式]
MSP430随机数产生器
//***************************************************************************** // MSP430-随机数的产生 // Built with IAR Embedded Workbench Version: 3.42A // 程序功能:产生一个16位的随机数 // 原理: // AD输入口处于悬浮状态,这样输入的是一个不确定的数字 // 转换结果的最后一位尤是如此,转换16次(也可以不是16次, // 但最大只能是16次,为什么?)后,这16次里有X次转换结果 // 的LSB是1,则把x放在randomNUM的最高四位,
[单片机]
基于MSP430的轨道电路在线测试仪设计与实现
随着列车车速的不断提高,对列车轨道的要求也越来越高。原有的有绝缘轨道电路已无法满足铁路运输事业发展的需要,因而世界各先进工业国家开始研制无绝缘轨道电路 。 其中,以法国CSEE公司研制成功的UM71无绝缘轨道电路应用最为广泛。该系统于20世纪80年代末引入我国, 这种无绝缘轨道电路利用谐振原理,把低频调制的FSK信号(4种载频,18种低频)通过钢轨进行传输。由于平行的钢轨具有等效感抗特性,严重影响信号传输的距离,为了使输出信号不失真,在每一闭塞分区,每隔100米便安装1个33μF的谐振电容,与钢轨的等效电感组成串联谐振电路来提高信号传输距离。为确保该系统工作正常,铁路工作人员必须经常沿铁轨检查轨道电路的运行参数。其
[单片机]
基于MSP430的变频伺服系统设计
  近年来,伺服系统的发展始终以稳定性、响应性与精度为发展主轴,这也是用户在使用过程中最为看重的几大因素。在机床伺服系统、 机器人 控制系统、雷达天线控制系统等场合大都由直流伺服电机和直流伺服控制器来完成控制。在这些控制领域中,主要以负载的位置或角度等为控制对象的伺服控制系统 。随着变频器技术的高速发展,在伺服系统中交流变频传动因其功率因数高、反应速度快、精度高、适合在恶劣环境中使用等优点得到了越来越广泛的应用。本文提出一种基于高性能 单片机 MSP430 F149、变频器、变频电机组成的数字式变频伺服系统,并将数字PID算法引入到此系统中,使系统获得了良好的系统静、动态性能。   1变频伺服系统的功能   为达到变频伺服系统的运行
[单片机]
基于MSP<font color='red'>430</font>的变频伺服系统设计
DS18B20 MSP430 C程序
DS18B20 MSP430程序 MSP430高级开发板上的DS18B20温度传感器的程序 /**********************************************************/ //MSP430 Advanced Developping Components - ////DS18B20 One-Wire Digital Thermometer Demos ////- http://www.just430.cn ////- tel :(0)13500717874 /**********************************************************/ //M
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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