STM32F2位带操作

2019-04-02来源: eefocus关键字:STM32F2  位带操作

手册中说:

In the STM32F20x and STM32F21x both the peripheral registers and the SRAM are mapped to a bit-band region, so that single bit-band write and read operations are allowed.

在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。

The operations are only available for Cortex®-M3 accesses, and not from other bus masters (e.g. DMA).

使用局限于M3内核。

A mapping formula shows how to reference each word in the alias region to a corresponding bit in the bit-band region. The mapping formula is:

地址映射公式如下

                               bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)

where:

– bit_word_addr is the address of the word in the alias memory region that maps to the targeted bit

一位扩展成了一个字。

– bit_band_base is the starting address of the alias region

位带基地址是对应位带的起始地址。

– byte_offset is the number of the byte in the bit-band region that contains the targeted bit

这里的偏移值为包含操作位的寄存器偏移值。

– bit_number is the bit position (0-7) of the targeted bit  

这里的位就是目标位。


位带区在SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)

位带识别区在SRAM上的地址范围: 0x22000000 ~ 0x220FFFFF

位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),

位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;

对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;

所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访

问位带区对应的比特位。


举例:

要给GPIO PC15做拉高拉低操作。

首先找到操作寄存器的地址:

GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)

GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)

同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)

然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)


最终得到的地址为 :0x40020818

通常情况下向这个地址赋值即可实现指定位拉高拉低操作:

*((volatile unsigned long *)0x40020818) = 0x80000000  //!<拉高

*((volatile unsigned long *)0x40020818) = 0x00008000  //!<拉低


但通过位带,按照公式获取位带操作地址:

/*这是拉高时寄存器地址*/

 AddrH = *((volatile unsigned long *)((0x40020818 & 0xF0000000)+0x2000000+((0x40020818 & 0xFFFFF)<<5)+(15 << 2)))  

AddrH = 1;   //!<置1就拉高 

/*这是拉低时寄存器地址*/

 AddrL = *((volatile unsigned long *)((0x40020818 & 0xF0000000)+0x2000000+((0x40020818 & 0xFFFFF)<<5)+((15+16) << 2))) 

AddrL = 1;   //!<置1就拉低  


使用宏定义,即:(Addr为GPIOC_BSRR 拉高时BitNum为15 拉低时BitNum是(15+16))

#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2))) 


精简之后,位带操作 :

#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))


关键字:STM32F2  位带操作 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040243687.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:模拟串口UART的实现
下一篇:STM32F207调试记录之串口配置

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f2 从 SD卡里面的读取程序的bootloader
1首先将需要操作stm32 的flash解锁 HAL_FLASH_Unlock();2判断是否存在SD卡 MX_FATFS_Init();3挂载文件系统f_mount(&fs,&a,1);4打开目录,因为我是直接打开的SD卡所以f_opendir(&list,"0:/")5读取目录下的文件目录名f_readdir(&list, &fno)    (名字)6擦除固定位置的flashHAL_FLASHEx_Erase(&ERASEqq_flah,&PageError)7将数据写入flash中
发表于 2020-02-01
STM32F2系列的EXTI使用
; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0x0F;      NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x0F;      NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;      NVIC_Init(&NVIC_InitStructure);}3.1.使能作为外部中断的引脚的GPIO端口时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE
发表于 2019-09-28
STM32F2系列的EXTI使用
关于STM32F2系列项目开发工程文件的建立
最近在开发STM32F205ZET固件,装完Keil uVision5和驱动Keil.STM32F2xx_DFP.2.9.0,接着学习力工程文件的建立(这是教程,可点击),其中介绍STM32F1系列的标准固件库STM32F10x_Stdperiph_Lib和利用Keil uVision5的向导两种方式构建工程,但当我想在ST官网下载STM32F2系列的标准库时只发现STM32CubeF2_V1.7.0的固件库,这时就些蒙了,STM32F10x_Stdperiph_Lib、STM32CubeF2_V1.7.0、Keil.STM32F2xx_DFP.2.9.0这三者有何联系,通过查阅资料以及查看他们的文件系统机构,发现
发表于 2019-09-27
关于STM32F2系列项目开发工程文件的建立
STM32F2系列系统时钟默认配置
新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M呢?单片机外挂的时钟是25M,由于该单片机时钟系统较为复杂,有内部高/低、外部高/低 、PLL锁相环时钟,又有AHB总线时钟、APB1/2时钟,而例子中很少讲到系统时钟的默认配置是怎么配置呢?那么就发点时间研究下这个单片机内部的复杂时钟系统吧。下图是STM32F2系列的时钟树结构图:1、内部高速时钟HSI、外部高速时钟HSE和PLL时钟PLLCLK时钟都接到了SW开关处,通过SW选择哪一路作为SYSCLK,SYSCLK经过AHB分频器进行分频得到
发表于 2018-08-13
STM32F2系列系统时钟默认配置
STM32F2系列之USART学习
F2系列USART初始化注意点:需要用到的外设文件有:stm32f2xx_usart.c;          //串口相应函数stm32f2xx_gpio.c;            //GPIO初始化stm32f2xx_rcc.c;              //时钟初始化misc.c; 
发表于 2017-09-19
STM32:简单位带操作
STM321.说在前面1.最近刚刚在学stm32,第一个问题就是配置文件(HARDWARE)的问题,在HARDWARE中只存储着.c文件,然而以前因为不正确的设置方式,虽然代码逻辑没错但是还是跑不出来,所以,一定要使用标准的配置方式2.位带操作1.以前使用51的时候,设置高低电平的时候只要给相应的引脚设置1或0就可以配置高低电平,对于32而言,要不使用设置库函数,要不直接对寄存器进行操作,但是,通过位带操作,也可以实现相对简单的操作;2.原理:在stm32中对一个引脚进行设置是不存在的,但是可以把一个位膨胀成为32位的地址,然后对地址进行相应的操作;位带区:想操作的相应io口内存所在区位带别名区:内存所在区膨胀后的地址(位带区和位
发表于 2020-04-23
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved