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

发布者:创新驿站最新更新时间:2016-12-08 来源: eefocus关键字:ARM  单片机  头文件  结构体  定义地址 手机看文章 扫描二维码
随时随地手机看文章

下面我们以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’”,如下图所示:

找原始定义

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

uint32_t定义

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

__IO unsigned int CR;

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

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模块部分,如下图所示:

ADC-INTEN寄存器

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

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

LPC_ADC_TypeDef结构体

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

LPC_ADC结构体指针

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

LPC_ADC_BASE

再看看上条语句中的LPC_APB0_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;

以上两种形式,在写程序的时候,都可以用。人们习惯用第二种形式。


关键字:ARM  单片机  头文件  结构体  定义地址 引用地址:ARM单片机的头文件如何用结构体定义地址

上一篇:Stm32f103 DAC 最低电流输出问题
下一篇:Cortex-M0 LPC1114中断优先级怎么设置

推荐阅读最新更新时间:2024-03-16 15:24

单片机常用功能模块的使用 Part7. LCD 1602
1、基本常识: ①、好像也写成 LCM 1602,个人感觉和 LCD 1602 是一个东西,可能叫法不一样吧。 ②、LCD 1602,本质上是一种 字符型液晶 ,用来显示字母、数字、符号,基本不用来显示汉字。 ③、由若干 5 x 7 或者 5 x 11 大小的点阵字符位组成,字符与字符之间有一个点距的间隔。 ④、所谓的 LCD 1602,其实就是 显示内容为 16 x 2,每行 16 字符,显示 2 行 。 ⑤、目前市面上 字符型液晶 绝大多数是基于 HD44780 液晶芯片的,控制原理完全相同,因此基于 HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 ⑥、LCD 1602 样子如下图:
[单片机]
<font color='red'>单片机</font>常用功能模块的使用 Part7. LCD 1602
量增价跌 2015年MCU总销售额仅成长4%
市调机构IC Insights指出,受惠智慧卡和物联网相关应用需求快速激增,2015年全球微控制器出货量预估将攀升至二百五十四亿颗,较2014年劲扬33%;尽管如此,由于平均销售价格(ASP)持续下滑,2015年总销售额仅将微幅增长4%,达166亿美元。
[单片机]
量增价跌 2015年<font color='red'>MCU</font>总销售额仅成长4%
单片机中断的应用
51单片机: P3.2 引脚为INT0 中断 P3.3引脚为INT1 中断 按钮 P3.2 P3.3 按钮低电平触发: while(PB0==0); delay(); #include reg51.h #define SEG P0 // 定义七节显示器接至Port 0 sbit LED = P2^0; // 定义LED灯接至P2.0 sbit com = P1^0 ; // 数码管 com 口 sbit OC = P1^1; // 定义573锁存器使能口,我是用的573驱动7段数码管 void delay10ms(int x); // 声明延迟函数
[单片机]
<font color='red'>单片机</font>中断的应用
单片机软件滤波方法
10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int), AD采的返回给 get_ad();函数. 1、限副滤波 /* A值可根据实际情况调整 value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char filter() { char new_value; new_value = get_ad(); if ( ( new_value - value A ) || ( value - new_value A ) return value; return new_va
[单片机]
单片机应用系统的主要干扰形式
1.干扰的三要素 在单片机应用系统或其他电子设备中,一个电路所受的干扰程度用下式描述: S=WC/I; 其中,S表示电子线路受干扰的程度;W表示干扰发生源的强度;C为干扰源通过某途径到达受干扰处的耦合因素;I为受干扰电路的抗干扰性能。 由上式可以看到,要减少干扰的影响,可以从减小分子或增大分母来考虑。既可以尽量减小干扰源产生的干扰强度,也可以切断或降低干扰耦合因素,使干扰强度尽量衰减,再就是采取各种措施,提高电子线路的抗干扰能力。 干扰源有的来自单片机应用系统的外部,例如工业电气设备的电火花、高压输电线上的放电、无线广播通信设备的电磁被、太阳辐射、雷电,以及各大功率设备开关时发出的干扰均属于这类干扰。另一类干扰来自单片机应用系统内部
[单片机]
基于ARM的车载GPS智能导航系统
1 引言 ARM 随着中国的城市化的程度不断加快,使得越来越多的人口与事业单位集中在一个“狭小”范围内生活与工作。城市的迅速“膨胀”直接导致了交通 网络 的日趋复杂,人员流动的日益频繁也使得每个人对空间信息有了更多的依靠。人们更加关心“当前我在哪里?”“目的地在哪里?”“如何到达?”等问题。而以嵌入式系统为平台的数字地理集成应用方案可以有效地解决这些矛盾。在此背景下,本文给出了基于 ARM 的嵌入式解决方案。 字串4 2  硬件实现 本嵌入式 GPS 导航系统的硬件核心是三星公司 ARM9 系列中的 16/32 位 RISC 处理器 S3C24
[单片机]
基于<font color='red'>ARM</font>的车载GPS智能导航系统
AVR单片机熔丝位锁死简单快捷的解密方法
1.AVR单片机熔丝位锁死简单快捷的解密方法: 在很多AVR单片机的初学者在使用AVR单片机中,很容易把熔丝位弄错而造成单片机锁死,比如说JTAGEN置为1后,单片机的JTAG就不能再下载程序进去了,因此给我们带来很多麻烦。 常见的恢复方法是使用并口编程器来恢复,对于初学者来说,很多设备是很欠缺的,所以很难解决。 现为我们初学者介绍一个简单实用可行的方法 有源晶振恢复法。将被锁死的AVR单片机接入最小系统或者开发板中,将系统中的晶振拆下来,在XAIL1接上有源晶振的第三脚(按下图接即可)。 然后通电,使用ISP下载线进行熔丝位编辑,本人使用智峰p
[单片机]
AVR<font color='red'>单片机</font>熔丝位锁死简单快捷的解密方法
采用C8051F单片机实现半导体激光器驱动电源的设计
半导体激光器(LD)体积小,重量轻,转换效率高,省电,并且可以直接调制。基于他的多种优点,现已在科研、工业、军事、医疗等领域得到了日益广泛的应用,同时其驱动电源的问题也更加受到人们的重视。使用单片机对激光器驱动电源的程序化控制,不仅能够有效地实现上述功能,而且可提高整机的自动化程度。同时为激光器驱动电源性能的提高和扩展提供了有利条件。 1总体结构框图 本系统原理如图1所示,主要实现电流源驱动及保护、光功率反馈控制、恒温控制、错误报警及键盘显示等功能,整个系统由单片机控制。本系统中选用了C8051F单片机。C8051F单片机是完全集成的混合信号系统级芯片(SOC),他在一个芯片内集成了构成一个单片机数据采集或控制系统所需要的几乎
[单片机]
采用C8051F<font color='red'>单片机</font>实现半导体激光器驱动电源的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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