菜鸟再次问GPIO编程问题

2019-03-25 20:44发布

菜鸟终于有时间看代码了,又来问题了,请高手指点,感谢!
问题1:
         按照LPC11XX.H的定义,例程里"LPC_GPIO0 -> DATA"的定义是否不符合C语言规范?LPC_GPIO0和DATA域之间貌似还隔着一个结构
问题2:
         关于GPIO的读写操作,datasheet里有描述,读起来能感觉芯片的这个部分设计的比较巧妙、方便,例程里的代码是如何与datasheet里的方法对应起来的?
某个例程的一段代码:
     LPC_GPIO0 -> DATA &=~(1<<LED2); //开LED
     LPC_GPIO1 -> DATA &=~(1<<LED1); //开LED
     LPC_GPIO0 -> DATA &=~(1<<BEEP);//关BEEP
LPC11XX.H关于GPIO的定义
typedef struct
{
  union {
    __IO uint32_t MASKED_ACCESS[4096];  /*!< Offset: 0x0000 to 0x3FFC Port data Register for pins PIOn_0 to PIOn_11 (R/W) */
    struct {
         uint32_t RESERVED0[4095];
    __IO uint32_t DATA;                 /*!< Offset: 0x3FFC Port data Register (R/W) */
    };
  };
       uint32_t RESERVED1[4096];
  __IO uint32_t DIR;                    /*!< Offset: 0x8000 Data direction Register (R/W) */
  __IO uint32_t IS;                     /*!< Offset: 0x8004 Interrupt sense Register (R/W) */
  __IO uint32_t IBE;                    /*!< Offset: 0x8008 Interrupt both edges Register (R/W) */
  __IO uint32_t IEV;                    /*!< Offset: 0x800C Interrupt event Register  (R/W) */
  __IO uint32_t IE;                     /*!< Offset: 0x8010 Interrupt mask Register (R/W) */
  __IO uint32_t RIS;                    /*!< Offset: 0x8014 Raw interrupt status Register (R/ ) */
  __IO uint32_t MIS;                    /*!< Offset: 0x8018 Masked interrupt status Register (R/ ) */
  __IO uint32_t IC;                     /*!< Offset: 0x801C Interrupt clear Register (R/W) */
} LPC_GPIO_TypeDef;

#define LPC_GPIO0             ((LPC_GPIO_TypeDef   *) LPC_GPIO0_BASE )
#define LPC_GPIO1             ((LPC_GPIO_TypeDef   *) LPC_GPIO1_BASE )
#define LPC_GPIO2             ((LPC_GPIO_TypeDef   *) LPC_GPIO2_BASE )
#define LPC_GPIO3             ((LPC_GPIO_TypeDef   *) LPC_GPIO3_BASE )

/* AHB peripherals                                                            */   
#define LPC_GPIO_BASE         (LPC_AHB_BASE  + 0x00000)
#define LPC_GPIO0_BASE        (LPC_AHB_BASE  + 0x00000)
#define LPC_GPIO1_BASE        (LPC_AHB_BASE  + 0x10000)
#define LPC_GPIO2_BASE        (LPC_AHB_BASE  + 0x20000)
#define LPC_GPIO3_BASE        (LPC_AHB_BASE  + 0x30000)
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
zhaojun_xf
1楼-- · 2019-03-26 02:48
_NXP LPC1000_ 这种方式更好啊,结构清晰。至于对应,它的结构体的名字非常清楚,可以一一对应。
evenaye
2楼-- · 2019-03-26 02:54
原帖由 zhaojun_xf 于 2010-7-13 15:38 发表 这种方式更好啊,结构清晰。至于对应,它的结构体的名字非常清楚,可以一一对应。

LPC11XX.H中的定义是和寄存器的定义严格一致的(核对过大小和顺序),结构很清晰,问题是DATA是类型LPC_GPIO_TypeDef中union中的一个struct的成员(有点绕),按C语言语法是不能直接引用的吧?
evenaye
3楼-- · 2019-03-26 04:14
彻底被淹没了。。。
tiankai001
4楼-- · 2019-03-26 08:45
呵呵,这种用法很不错,标准C语言支持这样的用法
tagetage
5楼-- · 2019-03-26 09:47
 精彩回答 2  元偷偷看……
lanyu345
6楼-- · 2019-03-26 13:51
感觉应用的很好&nbsp;, 思路清晰的那种!!LPC_AHB_BASE&nbsp; LPC_GPIO0_BASE&nbsp;&nbsp;定义的很直观, 语法问题,或者结构问题 就谈不好。&nbsp;

一周热门 更多>