stm32位带操作的理解
来源:互联网 发布:sql多表联合查询 编辑:程序博客网 时间:2024/05/17 02:59
首先要了解一个基本的概念:STM32单片机的一个地址(如:0x20000000)是一个字节,即8bit。
STM32的位带操作简单的说就是把一个地址A的8个位,分别单独的重新定义8个地址,
操作一个地址等同于操作一个位,形象的理解即为取别名。
位带区中的地址除了可以同RAM一样使用外,还带有自己的“位带别名”。 将每个位拓展为32位的字,既成了位带别名。
如:0x20000000(一个字节)拓展到32位可得8个32位的字分别是: 0x220000000 x220000040 x220000080 x2200000c 0x220000100 x220000140 x220000180 x2200001c
由此可得“位带区” 上任意地址的 “位带别名地址” SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 既:0x22000000+ (A‐0x20000000)*32 + n*4 0x42000000+ (A‐0x40000000)*32 + n*4 别名区地址 = 位带别名区起始地址+偏移量 备注 :字节的地址: A位序号 :n(0<n<7)
例 :0x22000000 + ((0x20000000 - 0x20000000 )*8+4)*4 = 0x22000010 既 :0x20000000第4位带别名区地址 "位带地址+位序号" 转换别名地址
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //计算bit区地址偏移
#define MEM_ADDR(addr) (*((vu32 *)(addr) )) //强制转换为指针 #define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) ) 再来一个宏重命名一下
是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,
MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 就是这样把P1口的第三个脚(BIT2)置0置。
而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。
它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。
这样呢,1MB SRAM就 可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT 变为1个字)
我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。
STM32的位带操作简单的说就是把一个地址A的8个位,分别单独的重新定义8个地址,
操作一个地址等同于操作一个位,形象的理解即为取别名。
位带区中的地址除了可以同RAM一样使用外,还带有自己的“位带别名”。 将每个位拓展为32位的字,既成了位带别名。
如:0x20000000(一个字节)拓展到32位可得8个32位的字分别是: 0x220000000 x220000040 x220000080 x2200000c 0x220000100 x220000140 x220000180 x2200001c
由此可得“位带区” 上任意地址的 “位带别名地址” SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 既:0x22000000+ (A‐0x20000000)*32 + n*4 0x42000000+ (A‐0x40000000)*32 + n*4 别名区地址 = 位带别名区起始地址+偏移量 备注 :字节的地址: A位序号 :n(0<n<7)
例 :0x22000000 + ((0x20000000 - 0x20000000 )*8+4)*4 = 0x22000010 既 :0x20000000第4位带别名区地址 "位带地址+位序号" 转换别名地址
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //计算bit区地址偏移
#define MEM_ADDR(addr) (*((vu32 *)(addr) )) //强制转换为指针 #define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) ) 再来一个宏重命名一下
#define PA0 BIT_ADDR(GPIOA_ODR_Addr, 0)
是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,
MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 就是这样把P1口的第三个脚(BIT2)置0置。
而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。
它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。
这样呢,1MB SRAM就 可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT 变为1个字)
我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。
- stm32位带操作的理解
- STM32的位带操作
- stm32 位带操作
- STM32位带操作
- STM32位带操作
- stm32位带操作
- STM32 Contex-M的位带操作
- STM32的位带操作分析
- STM32位带操作详解
- STM32位带操作举例
- stm32之位带操作
- STM32位带操作公式详解
- STM32位带操作----待更
- Stm32位带操作分析-浅显易懂
- M4的位带操作
- 位带操作在stm32中的C语言实现
- 位带操作
- stmf103 位带操作
- storm入门教程 第一章 前言
- VC命令行编译中出现Invalid switch错误的解决办法
- 【D的小L 366 排列】
- 智能标题
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- stm32位带操作的理解
- C++编译器无法捕捉到的8种错误
- 手动修改工程名......完美实现(VS2005 MFC)
- 想成为嵌入式程序员应知道的0x10个基本问题
- java密钥字符串byte[]传递问题
- eclipse中配置tomcat
- UL LI结构实现二级导航菜单(HTML+CSS+JS)
- java 枚举
- 为什么转置512×512矩阵,会比513×513矩阵慢很多?