当前位置: 代码迷 >> 单片机 >> 这是一段简略的实例代码,注释说明了功能。但是还是不懂,请高手讲解一下
  详细解决方案

这是一段简略的实例代码,注释说明了功能。但是还是不懂,请高手讲解一下

热度:53   发布时间:2016-04-28 15:05:30.0
这是一段简单的实例代码,注释说明了功能。但是还是不懂,请高手讲解一下

/* 以下定义是将PA0管脚所涉及到的IDR输入寄存器的状态值取出来,该寄存器是只读的寄存器 */
/* 通过查看IDR寄存器就可以判断按键是否按下了  */
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n) 
#define KEY15  PAin(15) //定义PA0
 

------解决方案--------------------
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) // addr地址偏移计算,具体做什么用没太看出来
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))  这个是获得add的地址的unsigned long型值
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 上两个函数的组合
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)    获取第n个管脚
#define KEY15  PAin(15)    //定义PA0     定义15管脚为KEY15
  相关解决方案