历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2019年01月30日 | STM32的位带操作分析

2019-01-30 来源:eefocus

8051单片机可以直接对某一位IO进行读写操作,而Cortex-M3的位带操作是8051位寻址区的加强版。使用位带操作后,可以使用普通的加载/存储指令对单一的比特进行读写操作。

一、相关概念。

位带区:支持位带操作的地址区。

位带别名区:对别名地址的访问最终作用到位带区的访问上。位带别名区对位带区的访问有个地址映射过程。


二、位带操作的原理

位带操作的最终目的是想对位带区的比特位进行独立的读写操作。但它是通过对位带别名区的操作来实现的。

具体过程如下:

对位带别名区进行读写访问,位带别名区通过地址映射关系映射到相应的位带区,对位带区进行原始比特的读写操作。

三、地址映射

上面对位带操作进行了简单的介绍,那么哪些地址支持位带操作?它们对应的位带别名区地址又是多少?两者间的地址映射关系又是怎么样的?

1、支持位带操作的地址

Cortex-M3有两个区支持位带操作。这两个区除了像普通的RAM一样使用外,还可以通过位带别名区进行操作。这两个区(位带区)分别是:

SRAM区中的最低1MB:0x2000 0000 - 0x200F FFFF

片上外设去中的最低1MB:0x4000 0000 - 0x400F FFFF

这两个位带区对应的位带别名区是:

SRAM区中的最低1MB的位带区对应的位带别名区:

片上外设去中的最低1MB的位带区对应的位带别名区:

2、位带区与位带别名区的地址映射关系

位带别名区把位带区的每一个比特位膨胀成32位的字,即位带区的每一个比特位对应位带别名区中一个4个字节大小的地址。

下图示例SRAM区中的最低1MB的位带区与位带别名区的膨胀对应关系:

计算公式:

对于SRAM位带区的某个比特,记它所在字节地址为A,比特位序号为n(0<=n<=7),则该比特位对应的位带别名区的地址为:

对于片上外设位带区的某个比特,记它所在字节地址为A,比特位序号为n(0<=n<=7),则该比特位对应的位带别名区的地址为:

说明:“*4”表示一个字为4个字节,“*8”表示一个字节中有8个比特。


四、读写操作的机制

在位带区中,虽然每个比特位都映射到别名区的一个字,但别名区的字只有LSB(最低位有效)有效,所以读写操作是对别名区字的LSB进行读写,LSB的数值是0或1.

1、读流程:

举例子:

读取SRAM地址0x2000 0000 的第二位的值:

2、写流程:读、改、写

举例子:

将SRAM地址0x2000 0000 的第二位的值置1:


五、位带操作编程实现

在C编译器中并没有直接支持位带操作,比如,C编译器并不知道同一块内存可以用不同的地址来访问,也不知道对位带别名区的访问只对LSB有效。欲在C中使用位带操作,最简单的做法时#define一个位带别名区的地址。

1、位带操作的宏定义

为了简化位带操作,我们可以建议一个把”位带地址+位序号“转换为别名地址的宏,再建立一个把别名地址转换为指针类型的宏:


#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) /* 把”位带地址+位序号“转换为别名地址的宏  */

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) /* 把别名地址转换为指针类型的宏  */

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) /* 某地址某一位的位带操作的宏  */



2、举个例子

下面以STM32F407的GPIOA->ODR寄存器(地址为0x40020014)为例,通过位带操作进行读写,并与传统方式读写比较,并通过串口将信息发送到控制台显示。代码如下:

头文件定义:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#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+20) //0x40020014

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  

main函数:

int main(void)

{

u8 Temp;

u16 Data;

Data = 0;

Stm32_Clock_Init(336,8,2,7);//初始化时钟为 168Mhz

delay_init(168);  //初始化延时函数

uart_init(84,115200);  //串口初始化为 115200

 

printf("init finished\r\n");

GPIOA->ODR = 0xffff; /* 传统方式写:将GPIOA->ODR各个位写1 */

printf("Tratidional operate: GPIOA->ODR[0x%x]:0x%x\r\n", &GPIOA->ODR, GPIOA->ODR);

GPIOA->ODR = 0x0; /* 将GPIOA->ODR清零 */

printf("Clear GPIOA->ODR: GPIOA->ODR[0x%x]:0x%x\r\n", &GPIOA->ODR, GPIOA->ODR);

 

for(Temp = 0; Temp < 16; Temp++)

{

PAout(Temp) = 1; /* 位带操作写:通过位带别名区写GPIOA->ODR每一位为1 */

}

printf("Bit-band write: GPIOA->ODR[0x%x]:0x%x\r\n", &GPIOA->ODR, GPIOA->ODR); /* 可以看到位带操作写后,GPIOA->ODR各位的值 */

 

for(Temp = 0; Temp < 16; Temp++)

{

Data |= (PAout(Temp) << Temp); /* 位带操作读:通过位带别名区读GPIOA->ODR每一位的值,并存在Data中 */

}

printf("Bit-band read: GPIOA->ODR[0x%x]:0x%x\r\n", &GPIOA->ODR, Data); /* 可以看到位带操作读后,GPIOA->ODR各个比特位对应的别名区的值 */

while(1)

{

}

return 1;

}


串口打印的信息:


本文主要参考以下资料编写:

·《CM3权威指南》第五章(87页~92页)

·《STM32F4xx中文参考手册》


推荐阅读

史海拾趣

AKM [Asahi Kasei Microsystems]公司的发展小趣事
  1. 成立与发展: Asahi Kasei Microsystems(AKM)成立于1983年,是日本旭化成集团旗下的一家子公司,总部位于东京。该公司主要致力于集成电路和半导体解决方案的研发和生产。AKM的创始目标是为市场提供高质量、高性能的模拟芯片和数字芯片,以满足消费电子、通信、汽车和工业等行业的需求。

  2. 产品创新: AKM在模拟和数字领域取得了一系列创新成果。其中,其声音处理技术尤为突出,涵盖了高保真音频、语音识别和声音传感器等领域。AKM的音频解决方案在高端音响、耳机、智能手机和汽车音响系统中得到广泛应用,为用户带来出色的听觉体验。

  3. 市场扩展: 随着技术的不断创新和产品线的拓展,AKM逐渐在全球范围内建立了广泛的客户群体。除了日本市场外,其产品远销亚洲、欧洲和美洲等地区。AKM的产品在全球范围内备受认可,并赢得了众多合作伙伴的信任与支持。

  4. 技术合作: 为了保持在市场上的竞争优势,AKM积极寻求与其他公司和机构的技术合作。通过与声学专家、电子设备制造商和汽车制造商等行业领先企业的合作,AKM不断吸收和借鉴先进的技术理念,推动产品创新和技术进步。

  5. 未来展望: 面对日益激烈的市场竞争和技术变革,AKM将继续加强研发投入,不断提升产品质量和技术水平。同时,AKM将积极应对全球经济形势和市场需求的变化,拓展新的业务领域,为客户提供更加全面和专业的解决方案。

Holmes Co Inc公司的发展小趣事

面对日益增长的全球市场需求,Holmes Electronics决定实施全球化战略。他们首先在亚洲建立了生产基地,利用当地的成本优势和供应链资源,大幅提高生产效率并降低成本。随后,公司又在欧洲和美国设立了研发中心和销售网络,以更好地服务当地客户并捕捉市场机会。这一全球化战略不仅使Holmes Electronics的产品遍布全球,还增强了公司的市场响应能力和品牌影响力。

力芯微(ETEK)公司的发展小趣事

在2009至2012年的培育期,力芯微公司准确把握下游市场更迭,快速推出的双SIM卡电源控制芯片得到了三星电子的认可。此后,公司陆续开发了负载开关、电池开关和LDO等产品,并在三星电子的手机上得到广泛应用。这一合作不仅提升了力芯微在业界的知名度,也为公司带来了可观的订单和利润。

CMOSIS公司的发展小趣事

在追求经济效益的同时,CMOSIS公司也注重可持续发展和社会责任。公司积极采用环保材料和工艺,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与社会公益活动,为推动社会进步和可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事是基于一般性的电子行业发展趋势和CMOS图像传感器市场的特点构建的,并未涉及CMOSIS公司的具体内部情况。如果需要更详细和准确的信息,建议直接查阅CMOSIS公司的官方资料或相关新闻报道。

EUPEC [eupec GmbH]公司的发展小趣事

EUPEC,全称欧洲电力半导体与电子公司(European Semiconductors and Electronics Company),成立于1990年。它是由西门子和德国另一家大型电器公司AEG生产电力半导体器件的两个部门合并而成。这次合并标志着EUPEC正式进入电力半导体领域,凭借其强大的技术背景和丰富的行业经验,EUPEC迅速在市场中占据了一席之地。

Chiplus Semiconductor Corp公司的发展小趣事

Chiplus自成立以来,始终致力于技术创新和产品研发。公司团队不断深入研究SRAM和LED驱动IC的设计与开发,成功推出了多款高速度、低功率的产品。这些产品以其卓越的性能和稳定性,赢得了全球客户的广泛认可。同时,Chiplus还积极投入研发资源,探索新的应用领域,不断拓展产品线,为客户提供更多元化的解决方案。

问答坊 | AI 解惑

UPS电源在操作员站的使用

火电厂的供电系统并不是连续而且恒定的,大型设备的启停、开关操作,电气工作段上负载长时间较大,故障情况下电气工作段的切换都会影响电力的正常供应,对计算机和微处理器产生干扰或破坏。   我公司的自动化程度较高,其设计安装采用的人机接口 ...…

查看全部问答>

频率变化时电源板上的变压器会发出响声是什么原因?

大侠,为什么很多IP整合电源在开关频率发生变化时变压器会发出较大的声音???…

查看全部问答>

请教一个CE6.0下的hook问题

我使用g_hHook = QASetWindowsJournalHook(WH_JOURNALRECORD, MouseProc, &msg);返回成功了 LRESULT  MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {         NKLOG(L\"that\'s it!!\");     ...…

查看全部问答>

BIOS与引导区探究群,群号67286087,欢迎加入啊!

联络一切对BIOS与引导区技术感兴趣的人士,注重理论与实践的结合,交流技术资料与实践心得,对重要贡献者给予现金等奖励!当 前以80X86为主要探究方向!…

查看全部问答>

请教wince中加载自己的开机界面问题

  我想在我的开机界面上加载一幅自己的图片,打开开发板电源系统启动显示我的开机界面是是我自己设计的图片,谢谢!…

查看全部问答>

关于开放式数控系统

要做一个开放式数控铣床这么一个系统,PC上位机 单片机是下位机,要实现数控系统的基本的插补功能...那现在是这么个思路,在PC上建立人机交互界面,如果输入数控代码,自动实现译码,刀补,差补..进而与单片机通信 去控制步进电机的运动.那译码,刀补,差补 ...…

查看全部问答>

STM8L操作DS18B20失败,求范例

                                 郁闷啊,今天弄了一天DS18B20,先是18B20的初始化都不通过,发送了低电平之后释放,等待DS18B20的低电平应答都检测 ...…

查看全部问答>

免费的NI- Multisim11无认证码

本帖最后由 dontium 于 2015-1-23 13:28 编辑 昨晚再此分贴下看到一个广告,说是NI- Multisim11免费,点击后就看到了下载路径,试探着花了2个小时下载了300多M的安装文件,安装了10多分钟,运行时还是提示要么注册,要么输入20位的认证码!而解压 ...…

查看全部问答>

【我给XILINX资源中心做贡献】FPGA设计指南:器件、工具和流程

FPGA设计指南:器件、工具和流程  很好的书籍 内容简介 本书用简洁的语言向读者展示了什么是FPGA、FPGA如何工作、如何对FPGA编程以及FPGA设计中遇到的各种概念、器件和工具,如传统的基于 HDL/RTL的仿真和逻辑综合 ...…

查看全部问答>

单片机C语言程序设计实训100例(基于8051+Proteus仿真)

听说有人要“单片机C语言程序设计实训100例(基于8051+Proteus仿真)”分享给需要的人了,希望对你们有点帮助。…

查看全部问答>