ARM寄存器地址定义——#define rGPBCON (*(volatile unsigned *)0x56000010)

本文探讨了DMA的学习过程及寄存器的使用方法。重点解析了rGPBCON寄存器的定义方式和作用,揭示其实际上是内存地址的别名而非真正的硬件寄存器。

今天学习DMA,需要传递地址,我想从串口传到寄存器来点亮led灯,只是学习一下DMA的原理,首先说明一点的是程序还很烂,没有做成功。其中发现了一个问题,就是寄存器的地址#define rGPBCON    (*(volatile unsigned *)0x56000010)我看了这个的时候,到底这是定义的一个什么呢?上网搜了一下,总结一下。

1.首先这是定义的一个变量,这一点要非常明白,因为rGPBCON就是一个寄存器变量,我们可以给他赋值对他读写操作,这是一个变量,而不是一个指针或者地址。

2.这是一个地址固定的变量,以前分配的变量地址是随机的,但这里的地址是固定的,就是0x56000010。

3.#define rGPBCON    (*(volatile unsigned *)0x56000010)宏定义的过程,首先把0x56000010这个物理地址强制转换为指针变量

(volatile unsigned *)0x56000010 这就是一个指针变量。然后再用*符号对指针变量操作相当于*p是一个变量。其中因为这里是寄存器映射到内存是虚地址,所以需要用关键字volatile写回,而不是读缓冲器中的值。

2011-04-17  15:46:54

4. 关于rGPBCON这个特殊寄存器到底有没有这样一个寄存器?

  这个我一直很迷惑,直到今天,我才明白,其实没有这样一个寄存器,这个寄存器是0x56000010开始的四个字节的内存地址的别名,rGPBCON是占用内存的,而不存在IO空间或者说IO寄存器。因为ARM根本久没有IO空间,直接映射到内存空间。

2012-02-21


/按键实验***********/ // 公司名称 :保定飞凌嵌入式技术有限公司 // 描 述 :按键控制蜂鸣器 // 版 权 :保定飞凌嵌入式技术有限公司 // 网 址 :www.witech.com.cn /***************************************************************/ /* 本实验接口说明 GPB5 ------ LED0 GPB6 ------ LED1 GPB8 ------ LED2 GPB10 ------ LED3 */ /------------------------地址声明---------------------------/ #define GPBCON (*(volatile unsigned )0x56000010) #define GPBDAT ((volatile unsigned )0x56000014) #define GPBUP ((volatile unsigned *)0x56000018) #define uchar unsigned char #define uint unsigned int /-----------------------定义全局变量------------------------/ /-----------------------函数声明----------------------------/ void Delay(int x); /------------------------------------------------------------/ 函数名称: Delay 功能描述: 延时函数 传 参: int x 返 回 值: 无 -------------------------------------------------------------/ void Delay(int x) { int k, j; while(x) { for (k=0;k<=0xff;k++) for(j=0;j<=0xff;j++); x--; } } /------------------------------------------------------------- 函数名称: ledMain 功能描述: 入口程序 初始化后,进入跑马灯死循环 传 参: 无 返 回 值: int 0 -------------------------------------------------------------/ int ledMain(void) { GPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出 GPBDAT = ((1<<5)|(1<<6)|(1<<8)|(1<<10)); //使LED全灭 GPBDAT&=0xffe; //关闭蜂鸣器 GPBUP = 0x00; while (1) // 死循环 { GPBDAT = ~(1<<5); //LED0亮 Delay(500); GPBDAT = ~(1<<6); //LED1亮 Delay(500); GPBDAT = ~(1<<8); //LED2亮 Delay(500); GPBDAT = ~(1<<10); //LED3亮 Delay(500); } return 0; } ; init.s AREA |DATA|,CODE,READONLY ENTRY ldr r13, =0x1000 ;设置堆栈栈顶指针 IMPORT ledMain b ledMain END 预定义语句#define rGPBCON (*(volatile unsigned )0x56000010)中,关键字volatile的作用是什么?unsigned * 的作用的是什么? 第一个的作用是什么?rGPBCON代表的是什么特殊功能寄存器?其功能是什么? volatile 不稳定的,易变的,告诉编译器不要对volatile 修饰的变量或存储单元进行优化,其值随时可变,每次都直接访问存储单元。 unsigned * 的作用是强制类型转换,把0x56000010的本来的整数类型强制转换成无符号指针类型 第一个*的作用在地址0x56000010上,是指针运算符,访问地址0x56000010的特殊功能寄存器 GPBCON是 GPIO的B端口的配置寄存器,为每一个GPIO B组的引脚定义功能(用2位定义一个引脚的功能) 00 - 输入 01-输出 10-定义具体硬件模块引脚功能 11 - 保留 把十六进制数0x1dd7fc转换成二进制,配置管脚GPB5的功能是什么?是GPBCON的哪些位段以及什么数值决定的? 语句rGPBDAT = ((1<<5)|(1<<6)|(1<<8)|(1<<10)); 执行后,GPB5、GPB6、GPB8、GPB10分别输出高电平还是低电平? 高电平, 对应的LED灯亮还是灭? 都处于熄灭状态(初始状态) 语句rGPBDAT = ~(1<<8); 执行后,GPB5、GPB6、GPB8、GPB10分别输出高电平还是低电平?对应的LED灯亮还是灭? GPB5、GPB6、GPB10输出高电平,对应的LED灯熄灭;GPB8输出低电平,对应的LED灯点亮 /按键实验***********/ // 公司名称 :保定飞凌嵌入式技术有限公司 // 描 述 :蜂鸣器 // 版 权 :保定飞凌嵌入式技术有限公司 // 网 址 :www.witech.com.cn /***************************************************************/ /* 本实验接口说明 GPB0 ------ 蜂鸣器控制口 */ void Delay(unsigned int); /------------------------地址声明-----------------------------/ #define GPBCON (*(volatile unsigned )0x56000010) #define GPBDAT ((volatile unsigned )0x56000014) #define GPBUP ((volatile unsigned *)0x56000018) /------------------------------------------------------------- 函数名称: BellMain 功能描述: 入口程序 初始化后,进入按键扫描死循环 传 参: 无 返 回 值: int 0 -------------------------------------------------------------/ int BellMain() { GPBUP &= 0XFFFFFFFE; //上拉使能GPB0 GPBCON &= 0XFFFFFFC; //GPB0设为输出 GPBCON |= 0X0000001; while(1) { GPBDAT &= 0xfe; //不能用!(非) Delay(40); GPBDAT |=0x1; //用与或方式,不影响其他位 Delay(40); } return(0); } /------------------------------------------------------------/ 函数名称: Delay 功能描述: 延时函数 延时count毫秒 传 参: int count 返 回 值: 无 -------------------------------------------------------------/ void Delay(unsigned int x ) { unsigned int i,j,k; for(i=0;i<=x;i++) for(j=0;j<=0xff;j++) for(k=0;k<=0xff;k++); } AREA |DATA|,CODE,READONLY ENTRY ldr r13,=0x1000 IMPORT BellMain b BellMain END1. BellMain ()函数中的两条语句rGPBCON &= 0xFFFFFFC; rGPBCON |= 0x0000001;的具体作用是什么? //上拉电阻使能GPB0 2. GPB0端口的上拉电阻有没有使能?判断依据是什么? 3. 语句rGPBDAT &= 0xFE; rGPBDAT |= 0x1; 的作用是什么? 写出实验小结
最新发布
06-09
/**********************按键实验*********************************/ // 公司名称 :保定飞凌嵌入式技术有限公司 // 描 述 :按键控制蜂鸣器 // 版 权 :保定飞凌嵌入式技术有限公司 // 网 址 :www.witech.com.cn /***************************************************************/ /* 本实验接口说明 GPB5 ------ LED0 GPB6 ------ LED1 GPB8 ------ LED2 GPB10 ------ LED3 */ /*------------------------地址声明---------------------------*/ #define GPBCON (*(volatile unsigned *)0x56000010) #define GPBDAT (*(volatile unsigned *)0x56000014) #define GPBUP (*(volatile unsigned *)0x56000018) #define uchar unsigned char #define uint unsigned int /*-----------------------定义全局变量------------------------*/ /*-----------------------函数声明----------------------------*/ void Delay(int x); /*------------------------------------------------------------/ 函数名称: Delay 功能描述: 延时函数 传 参: int x 返 回 值: 无 -------------------------------------------------------------*/ void Delay(int x) { int k, j; while(x) { for (k=0;k<=0xff;k++) for(j=0;j<=0xff;j++); x--; } } /*------------------------------------------------------------- 函数名称: ledMain 功能描述: 入口程序 初始化后,进入跑马灯死循环 传 参: 无 返 回 值: int 0 -------------------------------------------------------------*/ int ledMain(void) { GPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出 GPBDAT = ((1<<5)|(1<<6)|(1<<8)|(1<<10)); //使LED全灭 GPBDAT&=0xffe; //关闭蜂鸣器 GPBUP = 0x00; while (1) // 死循环 { GPBDAT = ~(1<<5); //LED0亮 Delay(500); GPBDAT = ~(1<<6); //LED1亮 Delay(500); GPBDAT = ~(1<<8); //LED2亮 Delay(500); GPBDAT = ~(1<<10); //LED3亮 Delay(500); } return 0; } ; init.s AREA |DATA|,CODE,READONLY ENTRY ldr r13, =0x1000 ;设置堆栈栈顶指针 IMPORT ledMain b ledMain END 1. 预定义语句#define rGPBCON (*(volatile unsigned *)0x56000010)中,关键字volatile的作用是什么?unsigned * 的作用的是什么? 第一个*的作用是什么?rGPBCON代表的是什么特殊功能寄存器?其功能是什么? volatile 不稳定的,易变的,告诉编译器不要对volatile 修饰的变量或存储单元进行优化,其值随时可变,每次都直接访问存储单元。 unsigned * 的作用是强制类型转换,把0x56000010的本来的整数类型强制转换成无符号指针类型 第一个*的作用在地址0x56000010上,是指针运算符,访问地址0x56000010的特殊功能寄存器 GPBCON是 GPIO的B端口的配置寄存器,为每一个GPIO B组的引脚定义功能(用2位定义一个引脚的功能) 00 - 输入 01-输出 10-定义具体硬件模块引脚功能 11 - 保留 2. 把十六进制数0x1dd7fc转换成二进制,配置管脚GPB5的功能是什么?是GPBCON的哪些位段以及什么数值决定的? 3. 语句rGPBDAT = ((1<<5)|(1<<6)|(1<<8)|(1<<10)); 执行后,GPB5、GPB6、GPB8、GPB10分别输出高电平还是低电平? 高电平, 对应的LED灯亮还是灭? 都处于熄灭状态(初始状态) 4. 语句rGPBDAT = ~(1<<8); 执行后,GPB5、GPB6、GPB8、GPB10分别输出高电平还是低电平?对应的LED灯亮还是灭? GPB5、GPB6、GPB10输出高电平,对应的LED灯熄灭;GPB8输出低电平,对应的LED灯点亮
06-08
/**********************按键实验*********************************/ // 公司名称 :保定飞凌嵌入式技术有限公司 // 描 述 :蜂鸣器 // 版 权 :保定飞凌嵌入式技术有限公司 // 网 址 :www.witech.com.cn /***************************************************************/ /* 本实验接口说明 GPB0 ------ 蜂鸣器控制口 */ void Delay(unsigned int); /*------------------------地址声明-----------------------------*/ #define GPBCON (*(volatile unsigned *)0x56000010) #define GPBDAT (*(volatile unsigned *)0x56000014) #define GPBUP (*(volatile unsigned *)0x56000018) /*------------------------------------------------------------- 函数名称: BellMain 功能描述: 入口程序 初始化后,进入按键扫描死循环 传 参: 无 返 回 值: int 0 -------------------------------------------------------------*/ int BellMain() { GPBUP &= 0XFFFFFFFE; //上拉使能GPB0 GPBCON &= 0XFFFFFFC; //GPB0设为输出 GPBCON |= 0X0000001; while(1) { GPBDAT &= 0xfe; //不能用!(非) Delay(40); GPBDAT |=0x1; //用与或方式,不影响其他位 Delay(40); } return(0); } /*------------------------------------------------------------/ 函数名称: Delay 功能描述: 延时函数 延时count毫秒 传 参: int count 返 回 值: 无 -------------------------------------------------------------*/ void Delay(unsigned int x ) { unsigned int i,j,k; for(i=0;i<=x;i++) for(j=0;j<=0xff;j++) for(k=0;k<=0xff;k++); } AREA |DATA|,CODE,READONLY ENTRY ldr r13,=0x1000 IMPORT BellMain b BellMain END1. BellMain ()函数中的两条语句rGPBCON &= 0xFFFFFFC; rGPBCON |= 0x0000001;的具体作用是什么? //上拉电阻使能GPB0 2. GPB0端口的上拉电阻有没有使能?判断依据是什么? 3. 语句rGPBDAT &= 0xFE; rGPBDAT |= 0x1; 的作用是什么?
06-08
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值