查看: 1694|回复: 0

【赚周年币】技术贴Week1-Day5——找GPIO寄存器 

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-1-2 20:17:52 | 显示全部楼层 |阅读模式
    分享到:
    1.png

    手把手教你找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;



    评分

    参与人数 2 +25 收起 理由
    EEboard爱板网 + 15 3周发帖养成记 奖励
    loveeeboard + 10

    查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-27 02:00 , Processed in 0.117575 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.