STM32第一天之GPIO寄存器与位带操作相关注意事项

1.STM32存储器映射地址

 

 

2.常用到的基地址如下

3.系统框架结构

 4.对于地址定义的时候需要加小括号保持整体性

/* 片上外设基地址 */
2 #define PERIPH_BASE ((unsigned int)0x40000000)
3
4 /* 总线基地址,GPIO 都挂载到 APB2 上 */
5 #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
6
7 /*GPIOB 外设基地址 */
8 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) 

5.对于寄存器操作需要对其进行强制类型转换为unsigned int*指针进行操作

/* GPIOB 寄存器地址, 强制转换成指针 */
11 #define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)
12 #define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04)
13 #define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08)
14 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
15 #define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10)
16 #define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14)
17 #define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18)
18
19 /*RCC 外设基地址 */
20 #define RCC_BASE (AHBPERIPH_BASE + 0x1000)
21 /*RCC 的 AHB1 时钟使能寄存器地址, 强制转换成指针 */
22 #define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
对于 寄存器中进行清零和置位采用。为了在配置寄存器某个位的时
候不影响其它位,推荐使用“ &=~ ”和“ |= ”这两种操作方式,其中“ &=~ ”用于清 0 ,“ |= ”用于
1。

寄存器置位:寄存器地址|= ( (1) << (4*0)) 以4位为一组进行控制,与寄存器有关系

寄存器清零:寄存器地址&=~(1<<0)  1(与寄存器的位数相同)左移0位再取反与寄存器地址取与

 

// 开启 GPIOC 端口时钟
4 RCC_APB2ENR |= (1<<4);
5//清空控制 PC2 的端口位
7 GPIOC_CRL &= ~( 0x0F<< (4*2));
8 // 配置 PC2 为通用推挽输出,速度为 10M
9 GPIOC_CRL |= (1<<4*2);
10
11 // PC2 输出 低电平
12 GPIOC_ODR &= ~(1<<2);
13

6.位带操作

#位带操作IO口也可以操作其他的寄存器位,但需要知道寄存器的地址
#SRAM位带区与位带别名区的地址统一用一个公式
eg:#操作IO时使用的是ODR寄存器和IDR寄存器

外 设 外 带 区 的 地 址 为 0X40000000~0X40100000 , 大 小 为 1MB, 外 设 位 带 区 经 过 膨 胀 后 的 位 带 别 名 区 地 址 为 : 0X42000000~0X43FFFFFF,这个地址仍然在 CM3 片上外设的地址空间中。
SRAM 的位带区的地址为: 0X2000 0000~X2010 0000 ,大小为 1MB ,经过膨胀后的位带别名区 地址为:0X2200 0000~0X23FF FFFF

 AliasAddr= =0x42000000+ (A-0x40000000)*8*4 +n*4)

0X42000000 是外设位带别名区的起始地址, 0x40000000 是外设位带区的起始地址, ( A-
0x40000000 )表示该比特前面有多少个字节,一个字节有 8 位,所以 *8 ,一个位膨胀后是 4 个字 节,所以 *4 n 表示该比特在 A 地址的序号,因为一个位经过膨胀后是四个字节,所以也 *4
#define  adddr          (APB1_BASE+0X10) 基地址加上寄存器偏移 
#define  PAout(n)       *(unsigned int*)(addr&0XF0000000+0X02000000+((addr&0x00FFFFFF)<<5)+(n<<2))
#define  PAin(n)        *(unsigned int*)(addr&0XF0000000+0X02000000+((addr&0x00FFFFFF)<<5)+(n<<2))

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值