TA的每日心情 | 难过 2021-2-27 22:16 |
---|
签到天数: 1568 天 连续签到: 1 天 [LV.Master]伴坛终老
|
手把手教你找GPIO寄存器 IODIR 定义
手把手教你找寄存器定义
一直就很纳闷,没有一个 向 c8051f410.h的头文件定义特殊功能寄存器,找不见定义,使用起来就无从下手 ,心里总是不舒坦 ;
从网上看了一些帖子,都说就是在头文件里(我也是这么认为的,肯定要有定义的,不然无法调用)
StartUp{ ……….. ……….
GEL_MapAdd(0x3400u,2,0x0400u,1,1); /* GPIO 1KW */ ……….. }
这段映射 0x3400u 为 GPIO空间,其实只是表示这段 i/o空间可读可写;
下面是我一步一步地追踪,这些都是要用到的宏定义;
#define PREG16(addr) (*(volatile ioport Uint16*)(addr))
从一个 ioport Uint16*类型的 地址中取出 地址内容,就是IODIR寄存器的值了
#define _GPIO_IODIR_ADDR (0x3400u) //定义了IO地址常量
#define _GPIO_IODIR PREG16(_GPIO_IODIR_ADDR) //得到寄存器的地址
#define _IODIR _GPIO_IODIR 定义了 _IODIR 常量
#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 两个变量合并 #define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val #define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val)
从这个宏定义开始
1:GPIO_RSET(IODIR,1)
这句很明显了,把IODIR寄存器的值置 1
2:_PREG_SET(GPIO_ADDR(##IODIR),1) 利用这两个宏
#define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val) #define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 分解的到
a:GPIO_ADDR(IODIR) _GPIO_##Reg##_ADDR _GPIO_ IODIR _ADDR
b:_PREG_SET(_GPIO_ IODIR _ADDR,1)
3:接下来
#define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val
PREG16(_GPIO_ IODIR _ADDR) =1;
4::#define PREG16(addr) (*(volatile ioport Uint16*)(addr)) *
*(_GPIO_ IODIR _ADDR) = 1;
5: 这句就简单了 *(0x3400u) = 1;
究竟 IODIR 是在哪里定义的呢?
开始我也很迷惑,仔细想想后,惶然大悟,快乐!!
问题出在,这些都是宏语句,执行编译前,就已经把 GPIO_RSET(IODIR,1) 翻译成*(0x3400u) = 1;
编译器不认识IODIR ,而 IODIR在直到
#define GPIO_ADDR(Reg)
_GPIO_##Reg##_ADDR 两个变量合并
前就是个字符串,连个常量都算不上(不知道这么说确切不,完全是因为它在语句的位置,赋予了它意义)
跟单片机 类比 SFR IODIR = 0X3400;
|
评分
-
查看全部评分
|