OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8254|回复: 2

关于sys.h文件中位带操作的问题

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-6-13
在线时间
1 小时
发表于 2015-3-3 18:51:51 | 显示全部楼层 |阅读模式
5金钱
文件中通过 bitband 实现 GPIOx_ODR 和 GPIOx_IDR 两个寄存器的单位操作

 GPIOx_ODR 的某位输出写1我能理解,但 GPIOx_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)) 
//IO?????·????
#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 
 
//IO????×÷,??????????IO??!
//?·±?n????????16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //???? 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //???? 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //???? 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //???? 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //???? 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //???? 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //???? 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //???? 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //???? 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //????

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //???? 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //????

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //???? 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //????

#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //???? 
#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //????

#define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //???? 
#define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //????


最佳答案

查看完整内容[请看2#楼]

犯二了,仅仅是对位操作,方便提出读取和赋值。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-6-13
在线时间
1 小时
 楼主| 发表于 2015-3-3 18:51:52 | 显示全部楼层
犯二了,仅仅是对位操作,方便提出读取和赋值。
回复

使用道具 举报

81

主题

541

帖子

0

精华

高级会员

Rank: 4

积分
760
金钱
760
注册时间
2014-9-30
在线时间
131 小时
发表于 2015-3-7 00:48:26 | 显示全部楼层
推广一下::请问:定时器? USART 等 外设 寄存器,,可以 位带 操作 吗??

最好 也能 都 给 定义 出来。。。比 库 方便 高速。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-19 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表