1. 什么是位带操作以及STM32中位带操作的区域
什么是位带操作?简单来说就是通过宏定义封装一些操作,让你可以像51单片机上去操作IO口,从而不用麻烦的去配置各种寄存器,在STM32中有两个地方实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。
下图就是STM32中可以用于位带操作的区域了,片上SRAM的0x2000 0000到0x2010 0000和片上外设的0x4000 0000到0x4010 0000;
2.位带区与位带别名区的膨胀对应关系
其中在位带区,操作每一个bit都可以通过操作对应的映射的一个地址位来进行实现,就是你想去给一个位高电平,实际上在代码上你去操作这个32bit的地址就行了,
举例:欲设置地址 0x2000_0000 中的比特 2,则使用位带操作的设置过程如下图所示:
3.公式计算
支持位带操作的两个内存区的范围是:
0x2000_0000-0x200F_FFFF(SRAM区中的最低1MB )
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB )
位带操作简单地说,就是把每个比特膨胀成一个 32位的字。当访问这些字时,就可以达到访问原始比特的目的(这种说法比较绕,我觉着其实就是给每一位都有一个对应的地址,想访问这一位,就直接访问这个地址就行了,上面那个宏恰好就是计算这个地址的公式) ,比如BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问这32个地址就可以达到访问32个比特的目的。
//IO¿Ú²Ù×÷ºê¶¨Òå
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //addr&0xF0000000:¼ÙÉèÊǼÆËãGPIOAµÄij¸ö룬0x4001080C,ÄÇôÕâ¸ö¼ÆËãÖµ¾Í»á°Ñ²»Ïà¸ÉµÄλÆÁ±Îµô£¬±ä³É0x4000 0000
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO¿ÚµØÖ·Ó³Éä
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!
//È·±£nµÄֵСÓÚ16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //Êä³ö
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //ÊäÈë
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //Êä³ö
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //ÊäÈë
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //Êä³ö
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //ÊäÈë
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //Êä³ö
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //ÊäÈë
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //Êä³ö
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //ÊäÈë
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //Êä³ö
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //ÊäÈë
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //Êä³ö
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //ÊäÈë
最主要的是这一段:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
从CM3权威指南我们知道:
对于SRAM位带区的某个比特,记它所在字节地址为 A,位序号为n(0<=n<=7),则
该比特在别名区的地址为:
**AliasAddr = 0x22000000+((A-0x20000000)8+n)4=0x22000000+(A-0x20000000)32+n4
对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则
该比特在别名区的地址为:
**AliasAddr = 0x42000000+((A-0x40000000)8+n)4=0x42000000+(A-0x40000000)32+n4
上式中,“*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。
这个宏定义后面的算式(addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2)
addr&0xF0000000取出最高的四位,其实就是用于区别SRAM(0x20000000)还是片上外设(0x40000000)的。
+0x2000000对于SRAM位带区则得到 0x22000000,对于片上外设位带区则得到0x42000000
(addr&0xFFFFF)等效于(addr&0x000FFFFF),就是屏蔽掉高12位(个人认为屏蔽高12位和屏蔽高4位效果是一样的,
地址范围是0x2000_0000-0x200F_FFFF和0x4000_0000-0x400F_FFFF,他无非就是不要那个“2”和“4”)
<<5就等效于乘以32 ( 同样<<2等效于乘以4 )。
上一篇:STM32 - GPIO 的位带操作
下一篇:STM32 进阶教程 8 - 位带操作
推荐阅读
史海拾趣
ESS一直将技术创新作为公司发展的核心动力。通过不断投入研发资源,ESS在音频芯片、视频技术、传真/调制解调器技术等领域取得了多项重要突破。这些技术创新不仅提升了ESS产品的性能和品质,还为公司在市场中赢得了更多竞争优势。同时,ESS还积极与全球知名企业和研究机构合作,共同推动半导体芯片技术的创新和发展。正是这种持续的技术创新和不懈的追求卓越,使ESS在电子行业中始终保持领先地位。
随着企业实力的不断增强和产品质量的不断提升,博众电气开始积极寻求市场扩张的机会。公司凭借优质的产品和服务,成功开拓了多个国内外市场,并与众多知名企业建立了长期稳定的合作关系。
同时,博众电气还注重品牌建设和推广。公司积极参与各类行业展会和论坛,展示公司的最新产品和技术成果;还通过广告宣传、社交媒体等多种渠道提升品牌知名度和影响力。这些举措使得博众电气的品牌形象和市场地位得到了进一步提升。
以上只是博众电气在电子行业发展的几个可能的关键阶段和事实的概括性描述。实际上,博众电气的发展历程可能远比这复杂和丰富。作为一家在电子行业中崭露头角的企业,博众电气未来的发展值得期待。
在稳步发展国内市场的同时,CST积极拓展国际市场。公司建立了分布世界各地的销售渠道,与多家国际知名企业建立了长期稳定的合作关系。通过不断的市场拓展和品牌建设,CST在国际市场上树立了良好的企业形象和品牌形象。
背景:进入数字化时代,企业面临着前所未有的挑战和机遇。Hisetec Electronic Co Ltd公司深知数字化转型的重要性,开始积极探索数字化转型之路。
发展:公司引入了先进的智能制造系统和大数据分析技术,实现了生产过程的智能化和精细化管理。同时,公司还建立了数字化营销平台,通过精准营销和个性化服务提升客户满意度。数字化转型的成功实施,使Hisetec公司在激烈的市场竞争中保持了领先地位。
Doodle Labs非常重视企业文化的建设和发展。公司倡导开放、创新、协作、共赢的价值观,为员工提供良好的工作环境和发展机会。同时,Doodle Labs还积极参与公益事业和社会活动,为社会做出贡献。在未来,Doodle Labs将继续秉承这些价值观和精神,致力于成为全球领先的无线通信技术提供商和物联网解决方案提供商。
工业控制计算机(简称工控机)是工业自动化设备和信息产业基础设备的核心。中国工控机技术的发展经历了上世纪80 年代的第一代STD总线工控机,90年代的第二代IPC工控机,现在进入了第三代CompactPCI 总线工控机时期。以 CompactPCI 总线工控机技术为核 ...… 查看全部问答∨ |
|
1、汽车电子产品概述 近年来,越来越严格的安全、环保技术法规和用户苛刻的个性化使用要求使得制造商不得不依赖电子技术不断改进其产品的性能,可以说汽车技术所取得的每一项进步都离不开电子技术在汽车上的应用。电子技术的应用几乎已经深入到汽 ...… 查看全部问答∨ |
|
好久没来这里啦,大家好哇。 最近调试一个东东,老大说要预留内存给这个驱动,以前是HalAllocateCommonBuffer动态申请连续内存空间的。 我想问下,这个预留的好处在哪里呢? 能节约内存空间吗? 谢谢啦… 查看全部问答∨ |
我整理一份比较表格,方便大家参考. RampageII vs GENE照片如下. Extreme-Vcore GENE-Vcore Extreme-IO GENE-IO PCB Layer compare … 查看全部问答∨ |