三、STM32F429IGT6 位带操作

参考资料:

  • STM32F4xx中文参考手册

一、STM32F429位带区与位带别名区

在这里插入图片描述

  • 片上外设(Peripheral)和SRAM都有1MB的位带区。
  • 位带区中的每个位,都可以通过位带别名区中的地址来访问。
  • 位带区中的一个位,对应位带别名区中的4个字节。
    在这里插入图片描述

二、地址转换

  • 外设位带区与外设位带别名区的地址转换:
AliasAddr = 0x42000000 + (A - 0x40000000)*8*4 + n*4
  • SRAM位带区与SRAM位带别名区的地址转换:
AliasAddr = 0x22000000 + (A - 0x20000000)*8*4 + n*4

其中,AliasAddr表示位带别名区地址,A表示我们要操作的位所在寄存器的地址,n为位号。

  • 将上述两个公式统一为一个:
((addr & 0xF0000000) + 0x02000000 + ((addr & 0x000FFFFF) << 5) + (bitnum << 2))

其中,addr表示要操作的位所在寄存器的地址,bitnum表示位号,即寄存器中的第几位。

三、应用

目标:通过位带操作控制LED

  • 新建位带操作头文件bitband.h,并添加至工程
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 编写bitband.h
    在这里插入图片描述
#define GPIOB_ODR_ADDR            (GPIOB_BASE + 0x14)

#define BITBAND(addr, bitnum)     ((addr & 0xF0000000) + 0x02000000 + ((addr & 0x000FFFFF) << 5) + (bitnum << 2))

#define PBout(n)                  (*(volatile unsigned long *)(BITBAND(GPIOB_ODR_ADDR, n)))
  • main.c
#include "stm32f4xx.h"
#include "led.h"
#include "bitband.h"

int main(void) 
{
	  GPIO_Config(); 
	
		PBout(1) = 0;           // 点亮 LED0
	  PBout(0) = 0;           // 点亮 LED1
	
		while(1)
		{
			
		}
}
  • 编译运行即可
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值