位绑定操作

  • 总存储空间4 GByte,0x0000 0000~0xFFFF FFFF

  • 位带区:   支持位带操作的地址区
  • 位带别名:对别名地址的访问最终作用到位带区的访问上(注意:这中间有一个地址映射过程)
  • 支持位绑定区域:

    1、SRAM区1 MByte, 位带区字节地址  A=0x2000 0000~0x200F FFFF,位序号  n=0~7

            别名区地址  AliasAddr = 0x2200 0000 + ((A-0x2000 0000)*8 + n)*4

                      = 0x2200 0000 + (A-0x2000 0000)*32 + n*4

     说明:A为所在字节,每个字节8位,再加第n位。最后乘4因为一位的地址有4个字节。只能一次处理32位数据,故每个位绑定的地址是32位。

如果A是ODR寄存器基址(ODR为32位,低16位有效),也可以n=0~15,详见例程绑定公式计算。

    2、片上外设1 MByte, A=0x4000 0000~0x400F FFFF

        AliasAddr = 0x4200 0000 + (A-0x4000 0000)*32 + n*4

  • 代码实现

     1 #define GPIOA_ODR_A  (GPIOA_BASE+0x0c)//A口输出寄存器 ODR 基地址
     2 #define GPIOA_IDR_A  (GPIOA_BASE+0x08)
     3 #define GPIOB_ODR_A  (GPIOB_BASE+0x0c)
     4 #define GPIOB_IDR_A  (GPIOB_BASE+0x08)
     5 #define GPIOC_ODR_A  (GPIOC_BASE+0x0c)
     6 #define GPIOC_IDR_A  (GPIOC_BASE+0x08)
     7 #define GPIOD_ODR_A  (GPIOD_BASE+0x0c)
     8 #define GPIOD_IDR_A  (GPIOD_BASE+0x08)
     9 #define GPIOE_ODR_A  (GPIOE_BASE+0x0c)
    10 #define GPIOE_IDR_A  (GPIOE_BASE+0x08)
    11
    12 #define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x02000000 + ((Addr&0x000FFFFF)<<5) + (BitNum<<2)))//BitNum=0~15
    13
    14 #define PAOut(n) BitBand(GPIOA_ODR_A,n)
    15 #define PAIn(n)  BitBand(GPIOA_IDR_A,n)
    16 #define PBOut(n) BitBand(GPIOB_ODR_A,n)
    17 #define PBIn(n)  BitBand(GPIOB_IDR_A,n)
    18 #define PCOut(n) BitBand(GPIOC_ODR_A,n)
    19 #define PCIn(n)  BitBand(GPIOC_IDR_A,n)
    20 #define PDOut(n) BitBand(GPIOD_ODR_A,n)
    21 #define PDIn(n)  BitBand(GPIOD_IDR_A,n)
    22 #define PEOut(n) BitBand(GPIOE_ODR_A,n)
    23 #define PEIn(n)  BitBand(GPIOE_IDR_A,n)
时间: 2024-10-27 00:41:52

位绑定操作的相关文章

STM32_位绑定

位绑定的概念:对于51单片机只有8位,对于M3来说,有32位,也就是说把32位中的某一位通过一个简单的地址的变换的算法来实现对该位的操作,它能够映射到一个地址的空间,也就是说一个位它占一个地址,就好比如把惠州放在广东省的某一个地址,叫做惠州市,通过搭去惠州的车票就可以来到惠州市这个地址,别去东莞哈.但是这个位只有在地址的最低位有效,因为地址可能是指向一个32位的内存单元..因为是LSB 有效..所以对其操作的时候就大可不必通过屏蔽其他位来对绑定的位进行操作.也正是最低位有效,所以只要看最低位即可

STM32位带操作总结---浅显易懂

正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种"低能儿"来说,你不把它说的白一点,就是感觉理解的不够透彻,于是今天又一次,查阅了各种手册,也算是基本弄懂了,鉴于博主的个人特点,所以本人的介绍也会十分浅显易懂,希望能帮到各位! 首先,抛砖引玉,来两个问题: 1)为什么STM32里面会有位带操作? 2)STM32里面的位带操作是什么意思? 我也

Cortex-M3中GPIO位输出操作的几种方法

1.端口位设置/清除 在STM32F1xx系列芯片中,可对BSRR.BRR寄存器相应的位置1,以实现置位和清零操作,如: GPIOA->BSRR = (1<<3); // 设置端口A的位3为1 GPIOA->BRR = (1<<3); // 清除端口A的位3为0 在LPC17xx系列芯片中,可对FIOSET.FIOCLR寄存器相应的位置1,以实现置位和清零操作,如: LPC_GPIO2->FIOSET = (1<<3); // 设置端口2的位3为1 L

《快速创建网站》 2.2 负载均衡简介和域名绑定操作

本文是<快速创建网站>系列的第3篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 1. 网站管理平台WordPress和云计算平台Azure简介 (6分钟 本文) 2.1 在Azure上创建网站及网站运行机制 (13分钟) 2.2 域名绑定操作和Azure负载均衡机制 (12分钟) 2.3 WordPress 初始化和网站管理功能 (11分钟) 3.1 WordPress 数据导入 (12分钟) 3.2 WordPress 多站点支持和Azure在线代码编辑

STM32F030系列实现仿位带操作

1.闲言 最近开发的时候,用到了STM32F030F4P6型号的单片机,它只有20个引脚,价格非常便宜,但是功能齐全:定时器.外部中断.串口.IIC.SPI.DMA和WWDG等等,应用尽有,非常适合用来做小设备.可是有个问题是,它是Cortex-M0内核的,不像M3,M4内核一样,可以支持位带操作(就是一位一位地操作,像80C51单片机一样),这就给程序移植或者开发带来了一点点小麻烦,因此我就利用C语言结构的位段操作,实现了个访位带操作,只是在效率可能会稍逊于真正的位带操作,但是代码上可以兼容,

STM32之GPIO端口位带操作

#ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //把该地址转换成一个指针 #define MEM_ADDR(addr) *((volatil

Duanxx的STM32学习:GPIO的位带操作

支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围.这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的"位带别名区",位带别名区把每个比特膨胀成一个 32 位的字.当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的. 关于位带操作的博客说明有很多,这里主要将代码贴出来,并做详细的注释 /** ************

c#32位程序操作64位注册表

1 RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 2 try 3 { 4 localKey = localKey.OpenSubKey( 5 @"SOFTWARE\Macromedia", true); 6 if (localKey != null) 7 { 8 localKey.DeleteSubKe

用bis和bic实现位级操作

20世纪70年代末至80年代末,DigitalEquipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,仅仅有bis(位设置)和bic(位清除)这两种指令.两种指令的输入都是一个数据字x和一个掩码字m. 他们生成一个结果z.z是有依据掩码m的位来改动x的位得到的.使用bis指令.能够在m为1的每一个位置上,将z相应的位置设为1. 使用bic指令.能够在m为1的每一个位置上,将z相应的位置设为0. 为了弄清bis和bic运算与C语言位级运算的关系,如果我们有两个函数bi