历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32F2位带操作

2019-04-02 来源:eefocus

手册中说:

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)))


推荐阅读

史海拾趣

Corstat Containers公司的发展小趣事

Corstat Containers公司在电子行业中崭露头角,始于一次技术突破。当时,公司研发团队成功开发出一种新型的防静电电子元件包装盒,有效解决了电子产品在运输过程中因静电导致的损坏问题。这一创新产品迅速获得了市场的认可,许多知名电子品牌纷纷与Corstat Containers公司建立合作关系。随着订单量的不断增加,公司的规模逐渐扩大,生产线也更加完善。

埃派克森微电子(Apexone)公司的发展小趣事

自2002财年以来,埃派克森微电子的业绩呈现出连续增长的态势。公司凭借出色的产品性能和市场竞争力,成功打入多家国内外知名企业,逐渐在目标市场占据了一席之地。经过数年的发展,埃派克森在全球模拟芯片供应商中已占据重要地位,其产品在通讯核心芯片、多媒体电子、消费电子、汽车电子等领域均有着广泛的应用。

Corex Intervest Inc公司的发展小趣事

随着技术的不断发展,Corex Intervest Inc公司意识到要想在竞争激烈的电子行业中脱颖而出,必须不断进行技术创新和产品升级。因此,公司加大了研发投入,引进了一批高端人才,积极研发新型电子产品。经过多年的努力,公司成功开发出了一系列具有创新性和市场竞争力的产品,如智能传感器、高性能电源模块等,为公司的发展奠定了坚实的基础。

Condor公司的发展小趣事

随着技术的不断发展,Corex Intervest Inc公司意识到要想在竞争激烈的电子行业中脱颖而出,必须不断进行技术创新和产品升级。因此,公司加大了研发投入,引进了一批高端人才,积极研发新型电子产品。经过多年的努力,公司成功开发出了一系列具有创新性和市场竞争力的产品,如智能传感器、高性能电源模块等,为公司的发展奠定了坚实的基础。

General Microcircuits Corp公司的发展小趣事
选择低噪声的运算放大器,以提高系统的信噪比。
AND Displays公司的发展小趣事

随着公司规模的扩大和实力的增强,AND Displays开始实施国际化战略。公司在全球范围内设立了多个研发中心和生产基地,以便更好地满足不同地区客户的需求。同时,公司还加强了与国际同行的交流与合作,共同推动显示技术的创新与发展。通过全球布局和资源整合,AND Displays逐渐成为了全球显示行业的领军企业之一。

以上五个故事从不同角度展示了AND Displays公司在电子行业中的发展历程和成就。这些故事不仅反映了公司的技术实力和市场竞争力,也体现了公司对环保、可持续发展等社会责任的关注和担当。

问答坊 | AI 解惑

求职面试,不被招聘官喜欢的几种人

我们知道,求职面试,招聘者比较看重应试人员的某些优点。如果你具有这些优点,那就可能捷足先登,有被优先择用的可能;用样,招聘者也比较关注应聘者的某些缺点,如果你具有这些缺点,那就可能名落孙山,有被淘汰出局的危险。所以,求职者应该了解 ...…

查看全部问答>

C8051 FO20 SPI口怎么配置

C8051 FO20 SPI口怎么配置 最好有源代码 …

查看全部问答>

uclinux jedce_probe探测ID,变成flash的内容

Flash:两片SST39VF3201 ,一片挂CS0:地址0x80000000 一片挂CS1:地址0x81000000 使用jecdec探测 static struct map_info lpc24xx_map[2] = { {     .name =        \"LPC24XX\",     .bankw ...…

查看全部问答>

现在有一份作51单片机的工作机会,不知该不该去做?

我目前是作java 企业计算方面的软件开发,现在有一份作51单片机的工作机会,不知该不该去做?我想往嵌入式方向转,我的定位是linux+arm,  看网上讲51和arm相差很大,不知我从51开始接近嵌入式开发有没有什么问题?有没有走弯路?   ...…

查看全部问答>

转发:请教:Linux驱动程序中的llseek函数

在Linux下写了一个存储器的驱动程序,需要对这个存储器进行片内寻址(片内地址为16位,分为高8位和低8位两段),用llseek函数实现。 static loff_t   llseek (struct  file* mfile,  loff_t  offset,&nbs ...…

查看全部问答>

USB键盘驱动的问题

在Windows XP下,我插入USB键盘后看到系统在设备管理器中变化了两个,一个是键盘下的KeyBoard Device,一个是人体输入设备下的USB人体输入设备,请问这两个相互之间是怎样联系的啊?? 再者:我在写一个键盘的驱动程序,要求是读取USB键盘数据 ...…

查看全部问答>

evc下怎么编写扩展DLL

我在VC60下面做了个扩展的DLL。VC下一直用得挺好。 但现在要把那个程序移植到EVC下面,界面部分已经移植好了,现在就差这个DLL了, 我按照VC60下面的方法做,不行。 哪位大侠知道EVC下怎么做扩展DLL。…

查看全部问答>

tffs问题.

在shell中,调用tffsshow报告说"通信失败". 问题出在调用i28f128Identify函数卡在flmap上. 什么原因啊?…

查看全部问答>

MTK异常重启分析工具

基于ARM体系,能够自动检测并且记录异常发生位置(非打印trace),并能分析出调用函数栈,误差率…

查看全部问答>

有需要在嵌入系统上接USB无线网卡的吗?

提供专为嵌入系统应用的USB WIFI模块 描述: 华邦处理器,USB 接口,802.11g,提供LINUX 2.4 2.6内核, WINCE 4.2和5.0的驱动。linux的驱动有量的话可提供源码。 联系方式: mail: snfmtc@163.com msn: mikehorse@homail.com …

查看全部问答>