问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ARM单片机的头文件如何用结构体定义地

发布网友 发布时间:2022-05-16 18:36

我来回答

1个回答

热心网友 时间:2023-12-12 23:21

下面我们以ARM Cortex-M0内核单片机LPC1114的头文件lpc11xx.h文件进行说明。

1.先说两句

lpc11xx.h文件是lpc11xx系列单片机包含的头文件。这个文件的作用和51单片机中的reg51.h头文件是一个性质,都是用来定义寄存器在单片机中的地址的。

你现在就可以打开reg51.h文件和lpc11xx.h文件看看,对比后你会发现两个主要的区别,首先是lpc11xx.h文件的寄存器定义是用结构体的形式,而reg51.h文件中,寄存器的定义都是一条一条的很直接的地址定义。然后是reg51.h文件中有sfr这样的“伪c语言”,而lpc11xx.h中用的是标准的c语言。C语言的最大用武之地就是单片机,要想学c,就在单片机上学,要想学单片机,就先入门c语言。两者相辅相成的学,效果最好。学以致用,才是学习的最终目标。

2.lpc11xx.h文件中如何定义寄存器地址?

在文件中,定义寄存器地址用到了一下几方面的c语言基础知识:

结构体;

结构体指针;

宏定义#define

关键字typedef

关键字volatile

关键字const

lpc11xx.h文件中,把每个模块都定义了一个结构体,这些模块有SYSCON、IOCON、UART、GPIO、SSP、I2C、WDT、ADC等。

例如,下面是ADC模块的结构体定义:

typedef struct
{
__IO uint32_t CR;
__IO uint32_t GDR;
uint32_t RESERVED0;
__IO uint32_t INTEN;
__IO uint32_t DR[8];
__I uint32_t STAT;
} LPC_ADC_TypeDef;

结构体的定义有三种形式,我们这里使用的是“直接说明变量”的形式。

lpc11xx.h文件的第566~584行,给每个模块的结构体变量定义了结构体指针,并加了宏定义#define,为的是以后写程序时书写方便。

把鼠标放到uint32_t上面,单击鼠标右键,在弹出的菜单中选择“Go To Definition Of ‘uint32_t’”,如下图所示:

选择后,就会跳到它的定义之处,如下图所示:

typedef是类型重定义关键字,所以实际上,CR寄存器的定义是这样的:

__IO unsigned int CR;

按照同样的方法,可以找到__IO的定义为:

所以,CR寄存器定义实际上是:

volatile unsigned int CR;

volatile关键字的作用是为了让编译器不要优化这个变量。

unsigned int关键字,用来定义无符号的整形变量。

这时候,有人会问,为什么不直接写成这样呢?答:为了阅读方便。

__IO uint32_t CR;

看到这条语句,我们就会知道,CR寄存器是一个“32位的可读可写寄存器”。

volatile unsigned int CR;

同样的这句话,我们对它的了解就不是那么一目了然了。

3.如何查看每个寄存器的地址?

上面讲到,寄存器的地址是由结构体和结构体指针定义的。现在我们来验证一下它的正确性。

我们随便找个寄存器,比如ADC模块的INTEN寄存器(ADC中断允许寄存器),打开LPC1114的用户手册,找到第25章ADC模块部分,如下图所示:

从上面图中,可以看到INTEN的寄存器的地址是0x4001C00C,接下来,我们打开lpc11xx.c文件来验证一下吧。

打开lpc11xx.c文件,找到ADC模块的结构体,如下图所示:

然后再找到LPC_ADC_TypeDef的结构体指针,如下所示:

结构体指针就是用来指向一个地址的,我们来看看上面语句中的LPC_ADC_BASE是什么:

再看看上条语句中的LPC_APB0_BASE是什么:

现在终于挖到底了,原来LPC_ADC_TypeDef指针指向的地址为:

0x40000000+0x1C000=0x4001C000

c语言基础知识:结构体的第一个变量的地址=结构体指针的地址。

所以结构体的第一个变量地址就是0x4001C000,INTEN前面有3个4字节的变量,所以INTEN的地址就是0x4001C00C。

验证完毕。

4.程序中,如何操作寄存器?

C语言基础知识:用结构体变量指针访问结构体中的变量,形式有两种:

*结构体指针变量.变量名

结构体指针变量->变量名

还是拿INTEN寄存器为例,假设我们要给这个寄存器写0x837,可以这样写:

*LPC_ADC.INTEN=0x837;

LPC_ADC->INTEN=0X837;

以上两种形式,在写程序的时候,都可以用。人们习惯用第二种形式。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
圣斗士星矢正义传说攻略_圣斗士星矢正义传说新手攻略 圣斗士星矢正义传说怎么觉醒圣衣 圣衣玩法攻略 圣斗士星矢正义传说召唤石怎么获得 获取攻略一览 超市促销员手机上打卡迟到几分钟 在超市里打卡显示的公司是什么意思? 长鹿休闲度假农庄交通指南 求从容桂到长鹿农庄怎么坐车,详细,准确 形容神情的五字词语 女生内衣穿多久该扔掉 吴江离张家港有多远? arm体系单片机必须要bootloader吗,需要是在什么情况下,不需要又是在什么情况下?cortex-m0需要bootloader 有谁知道犀照到底什么时候上映呀??? 请问现在剑网三指尖江湖里祁进还有可玩性吗,听说被大削一顿了 旭什么意思 彩虹甜心中哪集彭小芊形象变成公主形象了? 玩有人用夜神模拟器玩过剑网3指尖江湖吗?怎么样? 模特小芊qq号码是多少号 剑网3指尖江湖手游玩的人多吗2022 旭的意思是什么 酷我音乐美女主播封面谁? 怎样脸部去斑? 山东临沂,美女主播彭某,被男粉丝郭某和彭某用刀伤害,你咋看? 怎样才能把网上的视频上传到空间? 地面瓷砖油泥怎么处理? 虚拟歌姬的古风歌曲,比如天依唱的桃花雪,之类的 虚拟歌姬合唱的一首歌。求歌名 有什么中国虚拟歌姬的古风好歌,像寄明月,牵丝戏一样的,四首以上 在公司怎样监控家中情况? 我心中未来世界时什么样子的短文 以我眼中的自己与我心中的未来为题写一篇不下1000字的文章 找一部电影 50分 arm自带有rom和ram吗?有多大?(arm7/arm9/arm11) 最近哪个电影好看? 那个军事模型品牌好 现在国内静态军事模型已经越来越少,相关的实体店也越来越少,外国是这样的情况吗?如果不是,原因何在? 北京田宫之类的军事模型从哪进货,因为本人是军模爱好者,所以想开个军模店,所以想问哪里有货源 烟台市有军事模型、坦克模型、导弹车模型卖吗 军迷是什么意思是什么 有在安卓端可以用的类似于几何画板的APP吗? 求Superjunior it's you歌词! 紧急!送给爱好军事的男生什么军事类的礼物好? 商业意外保险能报销住院期间的哪些费用? 关于植树的广告语怎样设计最好?写两句最好的句子。 植树广告,要求用到比喻 唱一曲钗头凤,吟半阙风月情,错今生鹊桥,愿来世再逢。是什么意思? 唱一曲归来未晚,歌一调湖海茫茫啥意思 唱一曲风花雪月, 吟一阕岁月静好。什么意思 歌词为唱一曲我们自己的歌,歌名是什么 唱一曲风花雪月,吟一阕岁月静好,烟火、流年、红尘、沧桑,浅浅遇,淡淡忘怎么接 闲来静处,且将诗酒猖狂,唱一曲归来未晚,歌一调湖海茫茫.哪一篇