OpenEdv-开源电子网

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

关于位带操作的一个问题!

[复制链接]

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
发表于 2013-7-30 13:46:30 | 显示全部楼层 |阅读模式

gpio宏定义追踪如下:
 1、在led.h里定义

//LED端口定义
#define LED0 PAout(8)// PA8
#define LED1 PDout(2)// PD2 
2、在sys.h里定义
//All rights reserved
//********************************************************************************
#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+12) //0x4001080C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

3、在stm32f10x.h里
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)


#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define SRAM_BB_BASE          ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE        ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */

#define FSMC_R_BASE           ((uint32_t)0xA0000000) /*!< FSMC registers base address */

/*!< Peripheral memory map */
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

存在问题:1.为什么加的数字是12和8,这两个数字意味着什么?
                  2.这个是位带操作,即#define LED0 PAout(8)// PA8#define LED1 PDout(2)// PD2 ,PA8和PD2意味着在0X40000000^0X400FFFFC.31这1MB范围里占两个位,而相对应的在等效的别名区即0X42000000.0^0X43FFFFFC.0里占两个32位的寄存器,PD2=0意味着在等效别名区一个32位的寄存器等于0,那么这个32位寄存器控制IO的机理是什么?
                3.若把这段代码应用到STM32F207XXXX上,是否只需设置STM32F207XXXX库函数里stm32f10x.h的响应值,不修改其他文件即可,
尤其是对
#define GPIOA_ODR_Addr    (GPIOA_BASE+12)
#define GPIOD_ODR_Addr    (GPIOD_BASE+12)

#define GPIOA_IDR_Addr    (GPIOA_BASE+8)
#define GPIOD_IDR_Addr    (GPIOD_BASE+8)

里,12和8的数值不变?

纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2013-7-30 14:04:42 | 显示全部楼层
第二个问题弄明白了,网友讲的不错,粘过来了!





纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-30 15:01:01 | 显示全部楼层
回复【楼主位】象牙塔:
---------------------------------
1,12和8是ODR,IDR相对与GPIO寄存器组基址的偏移量.
3,207应该也有stm32f20x.h之类的头文件吧?看看这个头文件的定义了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2013-7-30 15:39:01 | 显示全部楼层
回复【3楼】 正点原子 :
---------------------------------
刚看明白了,和F207确实不同!






纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

11

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2012-4-26
在线时间
70 小时
发表于 2013-8-4 10:53:26 | 显示全部楼层
挺有用的,MARK
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-25
在线时间
9 小时
发表于 2015-9-7 16:12:04 | 显示全部楼层
mark下下
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-8-26
在线时间
20 小时
发表于 2015-9-8 00:15:03 | 显示全部楼层
学习中!感谢!
学以致用!
回复 支持 反对

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2015-11-4 16:33:56 | 显示全部楼层
学习,MARK
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-10-5
在线时间
17 小时
发表于 2016-6-23 10:48:04 | 显示全部楼层
那stm32f030能这样操作吗?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-10-5
在线时间
17 小时
发表于 2016-6-23 10:48:15 | 显示全部楼层
正点原子 发表于 2013-7-30 15:01
回复【楼主位】象牙塔:
---------------------------------
1,12和8是ODR,IDR相对与GPIO寄存器组基址的偏移 ...

那stm32f030能这样操作吗?
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2016-7-6 13:56:43 | 显示全部楼层
yuangt 发表于 2016-6-23 10:48
那stm32f030能这样操作吗?

看数据手册,原理一样,只是具体哪个寄存器还得数据手册说了算
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 13:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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