STM32 IO口位带操作

M4中有4GB的访问空间,访问空间有两个比较重要的地址,寄存器映射地址,又叫别名地址(范围32MB),寄存器地址(范围1MB,固定的)
使用库函数对IO引脚操作比较费时间,需要进行现场保护和现场恢复操作,不能一步到位。使用位带操作能够一步到位,方便快捷。
每个端口都有对应的寄存器地址,查看库函数可以看到对寄存器的的操作。
如:

void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  GPIOx->ODR ^= GPIO_Pin;		
}

GPIOx->ODR ^= GPIO_Pin; 就是对ODR寄存器的操作,通过右键 go to definition of 'ODR’可以追寻到寄存器所在的结构体,注释中有说明该寄存器在结构体中的偏移量,ODR的地址是结构体首地址偏移0x14.

宏定义 GPIOF 实际上是一个地址,通过右键 go to definition of …可以逐步追寻到端口的寄存器地址

#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region         

所以GPIOF的地址为
GPIOF = 0x40000000 + 0x00020000 + 0x1400 = 0x40021400
GPIOF的ODR寄存器地址还需要偏移0x14个字节,所以
GPIOF->ODR = GPIOF + 0x14 = 0x40021414

GPIOF地址是寄存器地址,将该地址转换为寄存器映射地址,可以实现端口的位操作,即直接对引脚操作。
转换公式

AliasAddr = 0x42000000 + (A - 0x40000000) * 8 * 4 + n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值