2,014年3月 安庆师范学院学报(自然科学版) Journal of Anqing Teachers College(Natural Science Edition) Mar.2014 V0I.2O NO.1 第2O卷第1期 网络出版时间:2014—3—12 10:43网络出版地址:http://www.cnki.net/kcms/detail/34.1150.N.20140312.1043.014.html 位带技术在STM32程序设计中的应用 唐 飞,王陈宁,查长礼 (安庆师范学院物理与电气工程学院,安徽安庆246133) 摘要:STM32系统的c语言中并未提供直接操作位的方法,需要使用复合语句实现位操作,程序执行效率低。位 带技术是一种内存映射技术,将位带区的一“位”映射到位带别名区的一个“字”,通过对位带别名区“字”的读取和写入 来改变位带区“位”的数值。在嵌入式程序设计中使用位带技术,可以降低代码占用空间,提高程序执行效率,特别适合 于大量使用标志位或频繁操作IO口单个引脚的场合。 关键词:位带;嵌入式;STM32;映射 中图分类号:TP368.1 文献标识码:A 文章编号:1007—4260(2014)01—0054—04 位操作是程序设计中直接针对数据的二进制 位进行操作,在嵌入式系统的程序设计中尤为常 见,如设置标志位、读取数据某位进行判断、将数 1.1 51单片机C语言的位操作 在51单片机中,有两个区域的存储空间可以 进行位操作,分别是数据存储器RAM中的位寻 址区和特殊功能寄存器的SFR区。这两个区的 存储空间,既有字节地址,又有位地址,既可以通 据某位清0置1等,均需要通过位操作来实现。 在汇编语言中,指令操作的对象是寄存器,通过位 寻址指令可直接访问寄存器中的位,而在c语言 中,运算符操作对象是变量,没有直接用于访问变 量位的方法,位操作需要通过编写程序实现。例 过字节地址访问,也可以通过位地址访问。51单 片机将两个区域存储单元的字节地址映射成位地 址,字节的每个位扩展用8位地址表示。位操作 如,将8位无符号整形变量 最高位置1的语句为 I=1<<7。由C语言知识可知,该语句为复合 语句,语句执行时先进行移位运算1<<7,将整 时直接访问位地址,通过简单的赋值运算就可实 现两个区域的位操作,避免了“读一改一写”的过 程,提高了程序的执行效率。 1.2 STM32系统的位带技术 STM32是基于Cortex—M3架构的32位微处 数1左移7位得到0x80,接着读取变量 原值并与 移位运算结果按位或,最后使用赋值运算将结果 送入变量 保存…。整条语句运行时需要对变量 进行“读一改一写”的操作,编译后形成多条指 理器,在进行系统开发时主要使用C语言进行编 令,花费时钟周期多,代码占用空间大,程序执行 效率低。尤其是嵌入式系统对IO口进行频繁读 写时,由于IO口控制的外设速度普遍偏低,这种 “读一改一写”的操作需要多次访问外设,会极大 的降低系统的运行速度,这一点在高速的STM32 系统中表现的尤为明显。因此需要研究新的方法 程,而c语言没有提供直接用于位操作的方法。 若在系统设计时引入新的指令或新的过程实现位 操作,会增加系统的复杂度。为此,Cortex—M3 系统引入了一种“位带”(Bit—Band)技术,用来 解决程序设计时的位操作问题。 在STM32的内部存储器中设计了两个“位带 区”,位于这两个区域内的变量可以通过“位带” 来提高嵌入式系统中c语言的位操作效率。 1位带的定义 技术实现位操作。这两个位带区是“SRAM位带 收稿日期:2013—11—01 基金项目:安徽省自然科学基金资助项目(KJ2013B130)资助。 作者简介:唐飞,男,安徽安庆人,硕士,安庆师范学院物理与电气工程学院实验师,主要研究方向为机械电子。 第1期 唐飞,王陈宁,查长礼:位带技术在STM32程序设计中的应用 ・55・ 区”和“外设位带区”,分别位于STM32内部的 位带区的存储单元按“位”映射到对应位带别名 SRAM区和外设存储区的低1MB空间,SRAM位 区的“字”(32位)上,相当于为位带区的每一 带区的地址范围为0x20000000~0x200FFFFF,外 “位”绑定了一个位带别名区的“字”。按“字”访 设位带区的地址范围为0x40000000~ 问位带别名区的存储单元时,就可以达到访问位 0x40OFFFFF。与此对应,STM32还设置了两个 带区“位”的效果。通俗的说,也就是为位带区的 “位带别名区”,分别是“SRAM位带别名区”和 “位”取了别名,使位带区的存储单元既具有真实 “外设位带别名区”,每个位带别名区大小为 地址,又具有等效的别名地址,通过别名地址访问 32MB,SRAM位带别名区的地址范围为 位的效果等同于通过位的真实地址访问。位带别 0x22000000—0x23FFFFFF,外设位带别名区的地 名区的“字”只有最低位(LSB)有效,其他位均无 址范围为0x40000000—0x43FFFFFF 。 效。位带区与位带别名区的映射关系如图l所 位带操作实质是进行一种内存映射,系统将 示。 SRAM位带区 SRAM位带别名区 图I SRAM位带区与位带别名区映射关系 通过位带技术映射存储空间之后,编写程序 特位 引。 时可以轻易快捷的实现位操作。位带区存储单元 的“位”对应位带别名区的“字”,当对位带别名区 2位带技术的应用方法 某个“字”存储空间赋值0时,对应位带区的“位” 在STM32系统的程序设计中,主要使用c语 即会被清0,当对位带别名区某个“字”存储空间 言进行编程。目前,c语言的编译器不直接支持 赋值1时,对应位带区的“位”也会被置l。通过 位带操作,编译器无法使用不同地址来访问同一 位带功能,可以使用普通的读写指令对单一位进 块内存,也未定义对位带别名区的访问只有最低 行操作,将位操作的“读一改一写”过程就变为只 位(LSB)有效【5 J。因此,在C语言中应用位带技 有“写”的操作,提高了程序的运行效率。位带技 术还需要特殊的方法,最简单的做法就是使用宏 术允许用户在不加入任何特殊指令的前提下实现 对内存读写操作进行封装。 位操作,保持了Cortex~M3系统的简单性。 根据STM32系统位带区“位”与位带别名区 2.1 SRAM位带别名区的访问方法 “字”的对应关系,位带别名区地址的计算方法 对于位于SRAM位带区的数据,可以根据 为:位带别名区地址:位带别名区基地址+位带 SRAM位带别名区的地址公式,通过计算出对应 区字节偏移量 32+位偏移量 4。对于SRAM 的位带别名区地址,并使用赋值语句对该地址的 位带区的数据,设所在的地址为A,位序号为n 存储单元进行读写,实现对数据的位操作。例如, (O≤n≤7),则该位对应的位带别名区地址为: 将位于SRAM区地址0x20000004的32位无符号 AliasAddr=0x22000000+((A一0x20000000)% 整形变量最高位(第31位)置l,其他位数据不 8+n):Ic4=Ox220O0OO0+(A—Ox20000000)木32 变。通常的做法是使用语句( (volatile unsigned +n 4;对于外设位带区的寄存器,设所在的地址 int )(0x20(0)0(O4))l=(unsigned int)1<< 为A,位序号为n(0≤n≤7),则该位对应的位带 31;该语句为复合语句,需要执行“读一改一写” 别名区地址为:AliasAddr=0x42000000+((A一 的操作,程序执行效率低。 0x40000000) 8+n)¥4=0x42000000+(A一 若使用位带技术,根据STM32开发手册查询 0x40000000) 32+fl木4。其中,“%4”表示一个 出SRAM位带区基地址为Ox20000000,SRAM位 字占4个字节,“ 8”表示一个字节中有8个比 带别名区基地址为0x22000000,根据位带别名区 ・56・ 安庆师范学院学报(自然科学版) 2014疰 地址公式计算出该变量最高位对应的位带别名区 地址为AliasAddr=0x22000000+(0x20000004— 0x20000000) 32+31 4=0x220OOOFC。使用简 单的赋值语句( (volatile unsigned int ) (0x2200OOFC))=l;即可达到置位的目的,无需 使用复合语句。 为增强程序的可读性,可以使用带参数的宏 来封装位带操作: #define SRAM~BASE((uint32一t) 0x20000000)//SRAM位带区基地址 #define SRAM—BB—BASE((uint32一t) 0x22000000)//SRAM位带别名区基地址 #define BITSRAM(A,N,S)(%(volatile till— signed int )(SRAM—BB—BASE+((A)一SRAM —BASE)女32+(N)女4)=(S)) 其中,A为要写入数据的SRAM区地址,N为要写 入位的编号(0~31),S是要写人的数值(0或 1)。在编写程序时使用宏BI RAM (0x20000004,31,1),就可以将该变量的最高位 置位。封装后位操作的使用类似于函数调用,不 易出错,使用方法更加友好。 2.2外设位带别名区的访问方法 对于位于外设位带区的寄存器,根据STM32 开发手册,查询出需要访问的外设位带区寄存器 地址,然后计算出对应的位带别名区地址,使用赋 值语句对该地址的存储单元进行读写,实现对寄 存器的位操作。例如,要求STM32的GPIOA口 最高位(第15位)输出高电平,其他位电平不变。 通过查阅STM32开发手册得知,要使GPIOA.15 引脚输出高电平,只需将GPIOA的寄存器ODR 第l5位置l,该寄存器地址为0x4001080C。通常 的做法是使用语句GPIOA一>ODR I=1<< 15;或:Ic(volatile unsigned int:Ic)(0x40010800+ 0x0C)J=1<<15。这两条语句均为复合语句, 需要执行“读一改一写”的操作,程序执行效率 低。 若使用位带技术,根据STM32开发手册查询 出外设位带区基地址为0x40000000,外设位带别 名区基地址为0x42000000,GPIOA的基地址为 0x40010800,寄存器ODR的偏移量为0C。根据 位带别名区地址公式计算出该寄存器第15位对 应的位带别名区地址为AliasAddr=0x42000000 +(0x40010800+0xOC一0x40000000)}32+15¥ 4=0x422101BC。使用简单的赋值语句(}(vol- atile unsigned int¥)(0x422101BC)):1;即可 使其置位并输出高电平,无需使用复合语句。 为增强程序的可读性,可以使用带参数的宏 来封装位带操作: #define PERIPH—BASE((uint32一t) Ox4OOOOOOO)//91-设位带区基地址 #deftne PERIPHBB——BASE((uint32一t) Ox4ZOOOOOO)//外设位带别名区基地址 #define BITGPIO(A,N,S)( (volatile an— singed int:Ic)(PERIPH—BB—BASE+((A)一PE— RIPH—BASE)%32+(N) 4)=(S)) 其中,A为要写人数据的外设寄存器地址,N为要 写入位的编号,s是要写入的数值(0或1)。在编 写程序时使用宏BITGPIO(GPIOA—BASE+0xOC, 15,1),就可以将GPIOA的最高位置1。 2.3应用位带技术时注意的问题 在c语言程序设计中使用位带技术时,需要 访问的存储器单元变量必须采用volatile来定义。 因为c语言编译器并不知道由于位带技术的使 用,对于位带区的同一个位有两个不同的地址,通 过使用关键字volatile使得编译器每次都如实地 把数值读取写入存储器,而不会出于优化的考虑 使用数据的复本,避免出现错误。 3应用位带技术的优势 在STM32系统的中引入位带技术,在保持 STM32系统简洁的基础上,减少了代码占用空 间,提高了程序的执行效率,主要体现在以下几个 方面: 1)便于控制IO口的单个引脚,为使用串行 器件提供了很大的便利; 2)简化了位的判断问题,对编写使用硬件 IO密集的底层程序和大范围的使用位标志位的 程序十分有利; 3)在多任务系统中实现共享资源在任务间 的“互锁”访问,避免出现紊乱的现象。 下面通过实例来说明位带技术在IO口单个 引脚控制方面的优势。 GPIO(General Purpose Input Output)是 STM32的输入输出接口,设STM32的GPIOA口 的最低位(第0位)接水位传感器,最高位(第15 位)接水泵控制系统,要求程序读取GPIOA口第 第1期 唐飞,王陈宁,查长礼:位带技术在STM32程序设计中的应用 ‘57・ 0位信息,若为1说明已到达规定水位,关闭水 泵,第15位清零;若为0则说明水位较低,开启水 泵,第l5位置1。编写程序对GPIOA口的进行控 制,可以采用多种方法: 1)寄存器法 读取GPIOA口寄存器ODR的第0位进行判 断,然后设置ODR第l5位的电平,语句如下: if(GPIOA一>ODR&0x00000001==1) GPIOA一>ODR&=一(1<<15); else GPIOA一>ODR I=1<<15: 此方法直接控制寄存器,编译后代码占用空 间小,程序执行效率高,但需要编程者熟悉STM32 系统的各种寄存器的用法,程序的可读性和可维 护性都较差。 2)库函数法 调用库函数读取GPIOA口的第0位信息,然 后控制第15位的电平 J,语句如下: if(GPIO—ReadInputDataBit(GPIOA,GPIO— Pin_0)==1)GPIO—ResetBits(GPIOA,GPIO—Pin _l5); else GPIO—SetBits(GPIOA,GPIO—Pin一15); 此方法需要调用库函数控制IO口,编译后代 码占用空间大,程序执行效率较低,但经过函数的 封装,程序的可读性和可维护性高,易于阅读,是 编程者常用的方法。 3)位带法 通过宏封装位带的使用方法,达到直接控制 IO口单个引脚的目的,语句如下: #define GPIOBITREAD(A,N)( (volatile unsigned int )(PERIPH—BB—BASE+((A)一 PERIPH—BASE),Ic 32+(N) 4))//位读取 #define GPIOBITWRITE(A,N,S)( (vola— tile unsigned int )(PERIPH—BB—BASE+((A) 一PERIPH—BASE) 32+(N);Ic4)=(S))//位 写入 if(GPIOBITREAD(GPIOA—BASE+0xOC,0) ==1)GPIOBITWRITE(GPIOA—BASE+OxOC, 15,0); else GPIOBITWRITE(GPIOA—BASE+0xOC, 15,1); 此方法通过位带技术实现位操作,编译后代 码占用空间小,程序执行效率高,可读性和可维护 性都较好,但是程序的健壮性和移植性较差。 使用Keil MDK软件对三种方法的程序进行 编译,并在MDK环境中仿真运行。仿真时采用 STM32F103VE处理器,晶振设置为8MHz。将每 段程序各仿真运行100 000次,测量程序运行所 需的时间如表1所示。 表1 三种方法程序仿真运行时间表 由表1可见,三种方法中位带法所花费的时 间最短,其程序执行效率最高。虽然表中的运行 时间是由软件仿真得到的,与真实系统运行情况 有很大差距,尤其是没有考虑外设的运行速度普 遍较慢等情况,但是也能够反映出,在嵌入式程序 设计中使用位带技术可以有效地降低代码占用空 间、减少程序运行时间、提升程序运行效率。 4 总 结 本文介绍了位带技术及其在STM32系统上 的应用方法,通过实例验证了位带技术的优越性。 将位带技术引入STM32的程序设计中后,可以有 效地降低程序编译后的代码量,减少程序的运行 时间,提高程序的执行效率。通过宏定义的方法 对位带操作进行封装,提高了程序的可读性和可 维护性,减少了程序开发和维护的时问。位带技 术特别适用于嵌入式系统中对单个IO口引脚操 作和大范围使用标志位的场合,是一种适合工程 实际应用的程序设计技术。 参考文献: [1]蒙博宇.STM32自学笔记[M].北京:北京航空航天大学出版 社,2012:354—358. [2]刘火良,杨森.STM32库开发实战指南[M].北京:机械工业 出版社,2013:30—61. [3]Codex—M3 Technical Reference Manual[J/OL].WWW.aim. com/documentation/ARMProcessor—Cores/index.html,2008:41 —48. [4] STMicreelectronics Ltd. RM0008 Reference manual: STM32FlO1xx,sTM32Fl02xx,STM32F103xx,STM32Fl05xx and STM32F107xx advanced ARM—based 32一bit MCUs Rev 14 [J/OL].http://www.st.com/STM32.2011:53—54. (下转第76页) ・76・ 安庆师范学院学报(自然科学版) 2002,24(6):750—758. 2014,正 [60]Denton,G.H.,Karlen,W..Holcene cleimatic variations— their pattern and possible cause[J].Quaternary Research,1973, 3:155—205. [63]刘健,陈星,于革,等.小冰期气候变化主控因子的模拟试 验[J].湖泊科学,2003,15(4):297—304. [64j徐馨,耿丽华.中国东部小冰期气候特征与环境变迁[J]. 贵州地质,1990,7(1):35—45. [61]Bryson,R.A.,Goodman,B.M..Volcanic activity and eli- mate change[J].Science,1980,207:l 041—1 044. [62]王立国,钟巍.全球小冰期的气候变化[J].冰川冻土, Study of Mutation Climate Events of PJ Core in the South Wing of the Yangtze River Dela in Holocene tWU Yong—hong (The Geography Science Department of MinJiang University,Fuzhou 350108,China) Abstract:There are periodic mutation climate change events in Holocene which has been COnfirmed by a number of studies. But there has been contoversry about the driving factors of mutations climate event.Depending on the study of PJ drilling sediments in southern wing of the Yangtze River Delta,we try to rebuild several times mutation climate change events during the Holocene. There are several signiifcant mutation events around the 500,1900,2900,3800,4500,5800,68007800,8500 cal yr BP that ,have a good contrast with other research results of the world.This paper considers that these mutation climate change events ale u— niversal in the world which may be due to cyclical changes in global climate factor,rather than caused by local climatic factors. Key words:Yangtze River Delta,Holocene,climate variability,mutation climate events (上接第57页) [5]Joseph Yiu.ARM Cortex—M3权威指南[M].宋岩,译.北京 北京航空航天大学出版社,2009:48—56. [6]STMicmelectmnics Ltd.STM32FlOx Standard Peripherals Library [J/OL].www.st.eom/STM32,201 1:256—258. The Application of Bit-Band in STM32 Programming TANG Fei,WANG Chen—ning,ZHA Chang—li (School of Physics and Electronic Engineering,Anqing Teachers College,Anqing 246133,China) Abstract:It§very diiculft to single bit write and road operations in C programming.The low eficifency of program execution is associated with the read—write operation.The Cortex-M3 memory map includes two bit—band regions.These regions map each wordin analias region ofmemoryto a bitin a bit-band region ofmemory.Writingto awordinthealias region hasthe same effect s a read—awrite operation on the targeted bit in the bit・band region.It can reduce the code space and improve the efifciency of pro・ ragm execution by using the bit-band technology. Key words:bit・band,embedded system,STM32,mapping