STM32位带操作控制LED灯(五)

位带简介

位操作就是可以单独对一个比特位进行读和写。

STM32位带示意图:

在这里插入图片描述

位带区和未带别名区地址转换:

对于片上外设位带区的某个位,设它所在字节的地址为A,位序号为n(0~7),那么该位在别名区的地址为:
AliasAddr = 0x42000000 + (A-0x40000000)* 8* 4 + n*4
0x42000000 是外设位带别名区的起始地址。
0x40000000 是外设位带区的起始地址。
(A-0x40000000) 表示改为前面有多少个字节。
一个字节有8位,所以x8,一个位膨胀后是4个字节,所以也x4。
n表示该位在A地址的序号,因为一个位经过膨胀后是4个字节,所以也x4。
对于SRAM位带区的某个位,记它所在字节的地址为A,位序号为n(0~7),则该位在别名区的地址为:
AliasAddr = 0x22000000+(A-0x20000000)* 8* 4 + n*4

统一公式:

//把 “ 位带地址+位序号 ”转化成别名地址的宏
#define BITBAND(addr,bitnum) ((addr & 0xF0000000) +0x02000000+((add &0x00FFFFFF)<<5)+(bitnum<<2))

因为外设的最高地址是:0x20100000,跟起始地址相减的时候,总是低5位才有效。所以屏蔽了高3位。
最后就可以通过指针的形式操作这些位带别名区地址。

// 把一个地址转换成一个指针
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
//把位带别名区地址转换成指针
#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum))

main.c文件

#include "stm32f10x.h"
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DS.小青龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值