1、项目三项目三 数码管显示设计与实现数码管显示设计与实现任务任务6 数码管静态显示设计与实现数码管静态显示设计与实现n 目标目标n 利用利用STM32与数码管的接口技术,完成与数码管的接口技术,完成STM32的数码管静态显示的数码管静态显示电路设计和程序的设计、运行及调试。电路设计和程序的设计、运行及调试。n 任务要求任务要求n 使用使用STM32F103R6芯片的芯片的PC0PC15引脚分别接引脚分别接2个共阴极个共阴极LED数码管数码管。n 个位数码管接个位数码管接PC0PC7;n 十位数码管接十位数码管接PC8PC15。n 采用静态显示方式,编写程序使采用静态显示方式,编写程序使2位数码管
2、上循环显示位数码管上循环显示 020。认识数码管认识数码管n 嵌入式电子产品常用的显示器有嵌入式电子产品常用的显示器有LED和和LCD两种方式两种方式n LED数码显示器价格低廉、体积小、功耗低、而且可靠性好,因数码显示器价格低廉、体积小、功耗低、而且可靠性好,因此得到广泛使用。此得到广泛使用。n 数码管的结构和工作原理数码管的结构和工作原理n 数码管内部是由八个数码管内部是由八个LED(简称位段)组成,其中有七个条形(简称位段)组成,其中有七个条形LED和一个小圆点和一个小圆点LED。n LED导通时,相应的线段或点发光,将这些导通时,相应的线段或点发光,将这些LED排成一定图形,排成一定图
3、形,常用来显示数字常用来显示数字09、字符、字符AG,还可以显示,还可以显示H、L、P、R、U、Y、符号、符号“”及小数点及小数点“.”等。等。n LED数码管可以分为共阴极和共阳极两种结构数码管可以分为共阴极和共阳极两种结构。LED数码管引脚及内部结构数码管引脚及内部结构 管脚排列管脚排列 共阴极数码管共阴极数码管 共阳极数码管共阳极数码管认识数码管认识数码管n 数码管的字型数码管的字型编码编码n 要使数码管上显示某个字符,必须使它的要使数码管上显示某个字符,必须使它的8个位段上加上相应的电个位段上加上相应的电平组合,即一个平组合,即一个8位数据,这个数据就叫该字符的字型编码位数据,这个数据
4、就叫该字符的字型编码。n 通常通常用的位段的编码规则如下用的位段的编码规则如下图所图所示示。D7 D6 D5 D4 D3 D2 D1 D0n 共阴极和共阳极数码管的字型编码是不同的共阴极和共阳极数码管的字型编码是不同的,对于同一个字符,对于同一个字符,共阴极和共阳极的字型编码是反相的。共阴极和共阳极的字型编码是反相的。dpgfedcba认识数码管认识数码管n 数码管的显示方法数码管的显示方法:有静态显示和动态显示两种方法。有静态显示和动态显示两种方法。1.静态显示静态显示n 静态显示是指数码管显示某一字符时,相应的静态显示是指数码管显示某一字符时,相应的LED恒定导通或恒定截恒定导通或恒定截止
5、。止。n 这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接电源(共阳极)。接电源(共阳极)。n 每个数码管的八个位段分别与一个八位每个数码管的八个位段分别与一个八位I/O端口相连。端口相连。I/O端口只要有端口只要有字型码输出,数码管就显示给定字符,并保持不变,直到字型码输出,数码管就显示给定字符,并保持不变,直到I/O口输出口输出新的段码。新的段码。认识数码管认识数码管n 数码管数码管的的显示显示方法方法:有静态显示和动态显示两种方法。有静态显示和动态显示两种方法。n 动态显示动态显示n 动态显示是一种一位一位地轮流点
6、亮各位数码管的显示方式,即在某动态显示是一种一位一位地轮流点亮各位数码管的显示方式,即在某一时段,只选中一位数码管的一时段,只选中一位数码管的“位选端位选端”,并送出相应的字型,并送出相应的字型编码编码;n 在在下一时段按顺序选通另外一位数码管,并送出相应的字型下一时段按顺序选通另外一位数码管,并送出相应的字型编码编码;n 依依此规律循环下去,即可使各位数码管分别间断地显示出相应的字符此规律循环下去,即可使各位数码管分别间断地显示出相应的字符。这这一过程称为动态扫描显示。一过程称为动态扫描显示。数码管静态显示电路设计数码管静态显示电路设计n 按照任务要求,采用静态显示方式,数码管显示电路是由按
7、照任务要求,采用静态显示方式,数码管显示电路是由STM32F103R6、2个个1位的共阴极位的共阴极LED数码管构成。数码管构成。n STM32F103R6的的PC0PC7引脚接个位数码管的引脚接个位数码管的AG七个位段七个位段;n PC8PC15引脚接十位数码管的引脚接十位数码管的AG七个位段七个位段;n 由于小数点由于小数点“.”DP位不用,位不用,PC7和和PC15引脚也就不用了。引脚也就不用了。数码管静态显示电路设计数码管静态显示电路设计A-LG-LA-HG-HA-LG-LB-LC-LD-LE-LF-LB-HC-HD-HE-HF-HA-HG-HB-HC-HD-HE-HF-HB-LC-L
8、D-LE-LF-LBOOT060NRST7PA0-WKUP14OSCIN_PD05OSCOUT_PD16PB861PA216PA115PA317PA420PB962PA521PA622PA723PA841PA942PB1029PA1043PB026PB127PB228PB355PB1130PB456PB557PB658PB759PC19PC210PC08PC424PC525PC311PC738PC839PC637PC1051PC1152PC940PB1233PB1334PB1435PB1536PA1144PA1245PA1346PA1449PA1550PC1253PD254PC13_RTC2P
9、C14-OSC32_IN3PC15-OSC32_OUT4VBAT1U1STM32F103R6A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B711CE19AB/BA1U274LS245A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B711CE19AB/BA1U374LS245数码管静态显示数码管静态显示程序程序设计设计n 数码管显示功能数码管显示功能实现实现n 程序控制数码管内部程序控制数码管内部的不同位段点亮的不同位段点亮,能能显示显示出需要的字符出需要的字符。n 本电路本电路
10、采用采用共阴极结构的数码管,其公共端接地,共阴极结构的数码管,其公共端接地,这样可以控制这样可以控制每一只每一只LED的阳极电平来使其发光或熄灭,阳极为高电平发光,的阳极电平来使其发光或熄灭,阳极为高电平发光,为低电平熄灭为低电平熄灭。n“09”十个字符的字型十个字符的字型编码编码如下:如下:0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6fn 通过通过PC0PC15输出输出“09”十个字符的字型编码十个字符的字型编码,就可以在数码管,就可以在数码管上显示上显示“09”数字。数字。n 数码管静态显示数码管静态显示代码见源程序。
11、代码见源程序。【技能训练【技能训练3-1】共阳极】共阳极LED数码管应用数码管应用n 如何如何使用共阳极使用共阳极LED数码管实现数码管实现020循环显示呢?循环显示呢?n 在在任务任务6电路电路中中,采用的是采用的是共阴极数码管。共阴极数码管。这里使用的是这里使用的是共阳极数共阳极数码管码管,其,其公共公共端端需要需要接电源接电源。n 共阳极数码管共阳极数码管显示显示“09”十个字符的字型十个字符的字型编码编码与与共阴极数码管的共阴极数码管的字型编码字型编码是反相的,是反相的,字型编码字型编码如下:如下:0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0
12、xF8,0 x80,0 x90n 在程序中,若继续使用在程序中,若继续使用共阴极数码管的字型编码共阴极数码管的字型编码,可以,可以通过对共阴极通过对共阴极字型编码取反字型编码取反来来获得获得共阳极数码管的字型编码共阳极数码管的字型编码。n 共阳极共阳极数码管静态显示数码管静态显示代码见源程序。代码见源程序。共阳极数码管静态显示电路设计共阳极数码管静态显示电路设计A-LG-LA-HG-HA-LG-LB-LC-LD-LE-LF-LB-HC-HD-HE-HF-HA-HG-HB-HC-HD-HE-HF-HB-LC-LD-LE-LF-LBOOT060NRST7PA0-WKUP14OSCIN_PD05OS
13、COUT_PD16PB861PA216PA115PA317PA420PB962PA521PA622PA723PA841PA942PB1029PA1043PB026PB127PB228PB355PB1130PB456PB557PB658PB759PC19PC210PC08PC424PC525PC311PC738PC839PC637PC1051PC1152PC940PB1233PB1334PB1435PB1536PA1144PA1245PA1346PA1449PA1550PC1253PD254PC13_RTC2PC14-OSC32_IN3PC15-OSC32_OUT4VBAT1U1STM32F10
14、3R6A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B711CE19AB/BA1U274LS245A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B711CE19AB/BA1U374LS245STM32存储器映射存储器映射n 认识认识Cortex-M3存储器存储器1.Cortex-M3存储器与存储器与STM32存储器之间的关系存储器之间的关系n STM32采用的是采用的是Cortex-M3内核(又称为内核(又称为CM3内核),内核),Cortex-M3内内核是通过核是通过ICode
15、、DCode、System总线与总线与STM32内部的内部的Flash、SROM相连接的,这种连接方式就直接关系到相连接的,这种连接方式就直接关系到STM32存储器的结构组存储器的结构组织。织。n 换句话说,换句话说,Cortex-M3定义了一个存储器结构,定义了一个存储器结构,ST公司是按照公司是按照Cortex-M3的存储器定义,设计出了自己的存储器结构,的存储器定义,设计出了自己的存储器结构,ST公司的公司的STM32的存储器结构必须按照的存储器结构必须按照Cortex-M3定义的存储器结构来进行设定义的存储器结构来进行设计。计。STM32存储器映射存储器映射n 认识认识Cortex-M
16、3存储器存储器2.Cortex-M3存储器存储器n Cortex-M3是是32位的位的内核内核n 其其PC指针可以指向指针可以指向232=4GB的的0 x0000_00000 xFFFF_FFFF地址空间地址空间。n Cortex-M3存储器是存储器是把把程序存储器程序存储器、数据存储器数据存储器、寄存器寄存器、输入输出端输入输出端口口等组织在这个等组织在这个4GB空间的不同区域空间的不同区域,这些区域是被明确的划分了这些区域是被明确的划分了。n Cortex-M3存储器具有以下特点:存储器具有以下特点:Cortex-M3存储器映射是预定义的,并且还规定好了哪个位置使用哪条存储器映射是预定义的
17、,并且还规定好了哪个位置使用哪条总线;总线;Cortex-M3存储器系统支持存储器系统支持“位带(位带(bit band)操作)操作”。通过位带操。通过位带操作,实现了对单一作,实现了对单一bit位的操作。位带操作仅适用于一些特殊的存储器区位的操作。位带操作仅适用于一些特殊的存储器区域中;域中;Cortex-M3存储器支持非对齐访问和互斥访问;存储器支持非对齐访问和互斥访问;Cortex-M3存储器支持小端模式和大端模式。存储器支持小端模式和大端模式。STM32存储器映射存储器映射n Cortex-M3存储器存储器映射映射n 存储器存储器映射是指把芯片中或芯片外的映射是指把芯片中或芯片外的FL
18、ASH、RAM以及外设等进行了统以及外设等进行了统一编址,即用地址来表示对象一编址,即用地址来表示对象。n 这个这个地址绝大多数是由厂家规定好的,用户只能用而不能改地址绝大多数是由厂家规定好的,用户只能用而不能改。n 用户用户只能在接有外部只能在接有外部RAM或或FLASH的情况下可进行自定义。的情况下可进行自定义。1.Cortex-M3存储存储器映射实现器映射实现n 由于由于Cortex-M3对设备的地址进行了重新的映射,当访问存储器或外设时,都对设备的地址进行了重新的映射,当访问存储器或外设时,都是按照映射后的地址进行访问的是按照映射后的地址进行访问的。n Cortex-M3存储器的存储器
19、的4G地址空间被划分为大小相等的地址空间被划分为大小相等的8块块区域区域(是粗线条的是粗线条的),每块区域大小为每块区域大小为512M。主要包括代码、。主要包括代码、SRAM、外设、外部、外设、外部RAM、外部设、外部设备、专用外设总线备、专用外设总线-内部、专用外设总线内部、专用外设总线-外部、特定厂商等。外部、特定厂商等。n Cortex-M3存储器映射存储器映射结构。结构。n 只要只要芯片制造商按照芯片制造商按照Cortex-M3存储器的结构,进行各自芯片的存储器结构设存储器的结构,进行各自芯片的存储器结构设计,就允许芯片制造商灵活的分配存储器空间,以制造出各具特色的基于计,就允许芯片制
20、造商灵活的分配存储器空间,以制造出各具特色的基于Cortex-M3的芯片。的芯片。STM32存储器映射存储器映射n Cortex-M3存储器存储器映射映射2.Cortex-M3存储存储器器映射区域分析映射区域分析 代码区(代码区(0 x0000_00000 x1FFF_FFFF)n 程序可以在代码区、内部程序可以在代码区、内部SRAM区以及外部区以及外部RAM区中执行,通常是把程序放区中执行,通常是把程序放到代码区,从而使取指和数据访问各自使用自己的总线(指令总线与数据总线到代码区,从而使取指和数据访问各自使用自己的总线(指令总线与数据总线是分开的)。是分开的)。SRAM区(区(0 x2000
21、_00000 x3FFF_FFFF)n 这个区域用于片内这个区域用于片内SRAM,是用于让芯片制造商连接片上的,是用于让芯片制造商连接片上的SRAM,这个区通,这个区通过系统总线来过系统总线来访问访问。n 在在SRAM区的底部,还有一个区的底部,还有一个 1MB的位带区,这个位带区还有一个对应的的位带区,这个位带区还有一个对应的32MB的的“位带别名(位带别名(alias)区)区”。也就是说,。也就是说,位带别名区里面的每个字对应位带别名区里面的每个字对应位带区的一个位带区的一个bit位位,每个位变量是每个位变量是32位(既位(既1个字个字4个字节)个字节)。n 位位带操作只适用于数据访问,不
22、适用于取指带操作只适用于数据访问,不适用于取指。通过。通过位带的功能,我们访问一个位带的功能,我们访问一个bit位,可以从位带别名区中,像访问普通内存一样操作位,可以从位带别名区中,像访问普通内存一样操作。STM32存储器映射存储器映射n Cortex-M3存储器存储器映射映射2.Cortex-M3存储存储器器映射区域分析映射区域分析 片上外设区(片上外设区(0 x4000_00000 x5FFF_FFFF)n 这个区域是用于片上外设寄存器的,不能在这个区域执行指令。这个区域是用于片上外设寄存器的,不能在这个区域执行指令。n 在这个区域的底部,也有一个在这个区域的底部,也有一个1MB的位带区,
23、并有一个与其对应的的位带区,并有一个与其对应的32MB的位的位带别名区,用于快捷访问外设寄存器。带别名区,用于快捷访问外设寄存器。外部外部RAM区(区(0 x6000_00000 x9FFF_FFFF)n 这个区域大小是这个区域大小是1GB,是,是用于连接外部用于连接外部RAM的,在这个区域划分为外部的,在这个区域划分为外部RAM区的前半段和外部区的前半段和外部RAM区的后半段区的后半段2部分,每部分大小是部分,每部分大小是512MB。n 外部外部RAM区的前半段(区的前半段(0 x6000_00000 x7FFF_FFFF)。这个区域用于片外)。这个区域用于片外RAM,可以缓存,并且可以执行
24、指令。,可以缓存,并且可以执行指令。n 外部外部RAM区的后半段(区的后半段(0 x8000_00000 x9FFF_FFFF)。这个区域除了不可)。这个区域除了不可以缓存外,其他与前半段相同。以缓存外,其他与前半段相同。STM32存储器映射存储器映射n Cortex-M3存储器存储器映射映射2.Cortex-M3存储存储器器映射区域分析映射区域分析 外部外设区(外部外设区(0 xA000_00000 xDFFF_FFFF)n 这个区域大小是这个区域大小是1GB,是,是用于连接外部设备的,在这个区域划分为外部外设用于连接外部设备的,在这个区域划分为外部外设区的前半段和外部外设区的后半段区的前半
25、段和外部外设区的后半段2部分,每部分大小是部分,每部分大小是512MB。n 外部外部RAM区和外部外设区之间的区别是:外部区和外部外设区之间的区别是:外部RAM区允许执行指令,而外部区允许执行指令,而外部设备区是不允许执行指令的设备区是不允许执行指令的。系统区(系统区(0 xE000_00000 xFFFF_FFFF)n 这个区域是专用外设和供应商指定功能区域,这个区域是不能执行代码的这个区域是专用外设和供应商指定功能区域,这个区域是不能执行代码的。n 系统系统区主要包括区主要包括Cortex-M3内核的系统级组件、内部专用外设总线、外部专用内核的系统级组件、内部专用外设总线、外部专用外设总线
26、,以及由提供者定义的系统外设外设总线,以及由提供者定义的系统外设。n 外部专用外设总线有外部专用外设总线有AHB外设总线和外设总线和APB外设总线外设总线。n AHB外设总线只用于外设总线只用于Cortex-M3内部的内部的AHB外设外设;APB外设总线既用于外设总线既用于Cortex-M3内部的内部的APB设备,也用于外部设备设备,也用于外部设备(“外部外部”是对内核而言)是对内核而言)。STM32存储器映射存储器映射n STM32存储器存储器映射映射n 前面前面介绍的介绍的Cortex-M3存储器映射,只是一个粗线条的模板。下面我们就存储器映射,只是一个粗线条的模板。下面我们就针对针对ST
27、公司的公司的STM32存储器,来介绍存储器,来介绍STM32存储器映射。存储器映射。1.Cortex-M3存储器与存储器与STM32存储器存储器映射映射对对比比n 通过通过Cortex-M3存储器与存储器与STM32存储器存储器映射对比映射对比,可以看出可以看出他们是他们是很很相似,不相似,不同的是同的是STM32加入了很多实际的东西加入了很多实际的东西,如如:Flash、SRAM等等。n 只有只有加入了这些东西,才能加入了这些东西,才能成为可以成为可以工作的工作的STM32芯片芯片。2.STM32存储器存储器映射映射n STM32存储器的地址空间被划分为大小相等的存储器的地址空间被划分为大小
28、相等的8块区域块区域,其中,其中:Peripherals是外设的存储器映射,对该区域操作是外设的存储器映射,对该区域操作,既既对相应外设对相应外设进行操作;进行操作;SRAM是运行时临时存放代码的地方;是运行时临时存放代码的地方;Flash是存放代码的地方;是存放代码的地方;System Memory是是STM32出厂时自带的,只能使用,不能写或擦除;出厂时自带的,只能使用,不能写或擦除;Option Bytes是可以按照用户的需要进行配置是可以按照用户的需要进行配置。【技能训练【技能训练3-2】编写外部设备文件】编写外部设备文件n 在任务在任务6的数码管静态显示中,主文件的数码管静态显示中,
29、主文件smgxs.c 内容太多,没有条理内容太多,没有条理,如何解决呢?,如何解决呢?n 这是由于数码管外部设备的初始化以及其它相关代码,都写在主文件中这是由于数码管外部设备的初始化以及其它相关代码,都写在主文件中了。了。n 可以把外部设备分类单独写一个文件,这样就可以对数码管静态显示可以把外部设备分类单独写一个文件,这样就可以对数码管静态显示的代码进行优化了。的代码进行优化了。n 把延时函数和数码管都分开单独写一个文件和头文件,并保存在其对应的子目录把延时函数和数码管都分开单独写一个文件和头文件,并保存在其对应的子目录里,使得数码管循环显示里,使得数码管循环显示020的主文件变得简洁明了,还
30、具有规范性和可读性。的主文件变得简洁明了,还具有规范性和可读性。n 编写外部设备文件编写外部设备文件的代码,见源程序。的代码,见源程序。任务任务7 数码管动态扫描显示设计与实现数码管动态扫描显示设计与实现n 目标目标n 完成完成STM32的数码管动态扫描显示电路设计和程序的设计、运行的数码管动态扫描显示电路设计和程序的设计、运行及调试。及调试。n 任务要求任务要求n 采用数码管动态扫描方式,使用采用数码管动态扫描方式,使用STM32F103R6芯片和芯片和6个共阴极个共阴极LED数码管,通过数码管动态扫描程序实现数码管,通过数码管动态扫描程序实现6个数码管显示个数码管显示“654321”。任务
31、任务7 数码管动态扫描显示设计与实现数码管动态扫描显示设计与实现n 数码管动态扫描显示电路设计数码管动态扫描显示电路设计n 根据任务要求,数码管动态扫描显示电路是由根据任务要求,数码管动态扫描显示电路是由STM32F103R6、6位数码管和一片位数码管和一片74LS245驱动电路组成。驱动电路组成。n 将所有位的段选控制端并联起来,将所有位的段选控制端并联起来,接到接到PC0PC7引脚引脚。n PC0PC7引脚输出显示段码(包括小数点引脚输出显示段码(包括小数点“.”DP段)段)。n PC0PC7引脚通过一片引脚通过一片74LS245依次接数码管的依次接数码管的AG和和DP引脚引脚。n PB0
32、PB5引脚输出位码,引脚输出位码,PB0PB5引脚依次接数码管的位码引引脚依次接数码管的位码引脚脚16。数码管动态扫描显示电路数码管动态扫描显示电路AGBCDEF162345DPADP61BCDEFG5432BOOT060NRST7PA0-WKUP14OSCIN_PD05OSCOUT_PD16PB861PA216PA115PA317PA420PB962PA521PA622PA723PA841PA942PB1029PA1043PB026PB127PB228PB355PB1130PB456PB557PB658PB759PC19PC210PC08PC424PC525PC311PC738PC839PC
33、637PC1051PC1152PC940PB1233PB1334PB1435PB1536PA1144PA1245PA1346PA1449PA1550PC1253PD254PC13_RTC2PC14-OSC32_IN3PC15-OSC32_OUT4VBAT1U1STM32F103R6A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B711CE19AB/BA1U274LS245数码管动态扫描显示数码管动态扫描显示程序程序设计设计n 数码管动态扫描显示实现数码管动态扫描显示实现分析分析n 动态扫描是采用分时的方法,轮流点亮各位数码管的动态扫描是
34、采用分时的方法,轮流点亮各位数码管的显示方式。显示方式。n 它在某一时间段,只让其中一位数码管的它在某一时间段,只让其中一位数码管的“位选端位选端”(com端)有效端)有效,并送出相应的字型编码,并送出相应的字型编码。n 动态扫描过程如下动态扫描过程如下:从从段选线上送出字型编码,再控制位选端,字符就显示在指定数码段选线上送出字型编码,再控制位选端,字符就显示在指定数码管上,其他位选端无效的数码管都处于熄灭状态;管上,其他位选端无效的数码管都处于熄灭状态;持续持续保持保持1.5ms时间,然后关闭所有数码管显示;时间,然后关闭所有数码管显示;接下来接下来又送出新的字型编码,按照上述过程又显示在另
35、外一位数码又送出新的字型编码,按照上述过程又显示在另外一位数码管上,直到每一位数码管都扫描完管上,直到每一位数码管都扫描完为止。为止。数码管动态扫描显示数码管动态扫描显示程序程序设计设计n 数码管动态扫描显示数码管动态扫描显示关键代码如下:关键代码如下:for(i=1;i7;i+)GPIO_Write(GPIOB,weii-1);/位选,数码管一个一个轮流显示位选,数码管一个一个轮流显示 GPIO_Write(GPIOC,tablei);/输出显示的字型码输出显示的字型码 Delay(20);/保持显示一段时间保持显示一段时间 GPIO_Write(GPIOB,0 x0ff);/使所有数码管都
36、熄灭一段时间使所有数码管都熄灭一段时间 Delay(20);n 数码管动态扫描显示数码管动态扫描显示代码,见源程序。代码,见源程序。IO口的位操作与实现口的位操作与实现n 位带区与位带别名区位带区与位带别名区n 认识位带区与位带别名区认识位带区与位带别名区n 在在SRAM区和片上外设区的底部区和片上外设区的底部,都各有一个,都各有一个1MB的位带区,每的位带区,每个 位 带 区 都 对 应 一 个 自 己 的个 位 带 区 都 对 应 一 个 自 己 的32MB位带别名区。位带别名区。n 位带别名区可以把每个位(位带别名区可以把每个位(bit)扩展成一个扩展成一个32位的字位的字,通过位带通过
37、位带别名区访问这些字时,就可以达别名区访问这些字时,就可以达到访问原来位的目的。到访问原来位的目的。IO口的位操作与实现口的位操作与实现n 位位带区与位带别名区带区与位带别名区n SRAM 区的位带区与位带区的位带区与位带别名区别名区n 在在stm32f10 x.h头文件中,对头文件中,对SRAM 区的位带区和位带别名区的基区的位带区和位带别名区的基址进行了址进行了宏定义宏定义:/宏定义宏定义SRAM区的基址区的基址#define SRAM_BASE (uint32_t)0 x20000000)/宏定义位带别名区的基址宏定义位带别名区的基址#define SRAM_BB_BASE (uint3
38、2_t)0 x22000000)n 从上可以看出,从上可以看出,SRAM区是从地址区是从地址0 x2000_0000开始的开始的1MB位带位带区,其对应的位带别名区的地址是从区,其对应的位带别名区的地址是从0 x2200_0000开始的开始的32MB。IO口的位操作与实现口的位操作与实现n 位位带区与位带别名区带区与位带别名区n 片上外设片上外设区区的位带区与位带的位带区与位带别名区别名区n 在在stm32f10 x.h头文件中,头文件中,对片上外设区对片上外设区的位带区和位带别名区的的位带区和位带别名区的基址进行了基址进行了宏定义宏定义:/宏定义宏定义片上外设片上外设区的基址区的基址#def
39、ine SRAM_BASE (uint32_t)0 x40000000)/宏定义位带别名区的基址宏定义位带别名区的基址#define SRAM_BB_BASE (uint32_t)0 x42000000)n 从上可以看出,从上可以看出,SRAM区是从地址区是从地址0 x4000_0000开始的开始的1MB位带位带区,其对应的位带别名区的地址是从区,其对应的位带别名区的地址是从0 x4200_0000开始的开始的32MB。IO口的位操作与实现口的位操作与实现n 位带操位带操作作n 位带位带地址映射地址映射n Cortex-M3存储器有存储器有二个二个32MB的位带别名区,这二个区被映射为的位带别
40、名区,这二个区被映射为二个二个1MB的位带区。其中的位带区。其中:对对32MB的的SRAM位带别名位带别名区访问区访问,映射为对,映射为对1MB SRAM位带区的访位带区的访问;问;对对32MB的外设的外设位带别名位带别名区访问区访问,映射为对,映射为对1MB外设位带区的访问外设位带区的访问。IO口的位操作与实现口的位操作与实现n 位带位带地址映射地址映射n SRAM区的位带区的位带地址映射地址映射n 假设假设SRAM位带区的某个位(位带区的某个位(bit),此位的所在字节地址记为),此位的所在字节地址记为A,位序号为位序号为 n(n的值为的值为07),则该位在位带别名区的地址为:),则该位在
41、位带别名区的地址为:AliasAddr=0 x2200_0000+(A 0 x2000_0000)*8+n)*4 =0 x2200_0000+(A 0 x2000_0000)*32+n*4n 上式中的上式中的“*4”表示一个字为表示一个字为4个字节,个字节,“*8”表示一个字节有表示一个字节有8个个bit(位)(位)。n 对于对于SRAM区中,位带地址映射区中,位带地址映射关系关系,如表,如表3-3所所示示。IO口的位操作与实现口的位操作与实现n 位带地址映射位带地址映射n 片上外设片上外设区区的位带的位带地址映射地址映射n 假设假设片上外设片上外设位位带区的某个位(带区的某个位(bit),此
42、位的所在字节地址记为),此位的所在字节地址记为A,位序号为,位序号为 n(n的值为的值为07),则该位在位带别名区的地址为:),则该位在位带别名区的地址为:AliasAddr=0 x4200_0000+(A 0 x4000_0000)*8+n)*4 =0 x4200_0000+(A 0 x4000_0000)*32+n*4n 上式中的上式中的“*4”表示一个字为表示一个字为4个字节,个字节,“*8”表示一个字节有表示一个字节有8个个bit(位)(位)。n 对于对于片上外设片上外设区区中,位带地址映射中,位带地址映射关系关系,如表如表3-4所示所示。IO口的位操作与实现口的位操作与实现n 位带操
43、位带操作作n 使用使用位带操作位带操作,可以,可以很容易的通过很容易的通过GPIO的的引脚。引脚。这样,就不需要使用这样,就不需要使用GPIO_SetBits()和和GPIO_ResetBits()函数。函数。n 在在C语言中使用语言中使用位带操作位带操作n 在在C编译器中,不能直接支持位带操编译器中,不能直接支持位带操作。作。n 最最简单的做法就是使用简单的做法就是使用define宏定义一个位带别名区的地址宏定义一个位带别名区的地址。#define DEVICE_REG0 (volatile unsigned long*)(0 x40000000)#define DEVICE_REG0_BI
44、T0 (volatile unsigned long*)(0 x42000000)#define DEVICE_REG0_BIT1 (volatile unsigned long*)(0 x42000004)n 若若对寄存器对寄存器REG0的的bit1位进行置位进行置1,代码如下:,代码如下:n*DEVICE_REG0=*DEVICE_REG0|0 x2;IO口的位操作与实现口的位操作与实现n IO口位带操作的口位带操作的宏定义宏定义n 围绕围绕IO口的输入输出读取和控制,采用逐层地址映射方式,对口的输入输出读取和控制,采用逐层地址映射方式,对IO口位口位带操作的带操作的宏定义宏定义,有以下步
45、骤:,有以下步骤:1.APB2外设基地址映射外设基地址映射宏定义宏定义2.端口基地址映射端口基地址映射宏定义宏定义3.端口寄存器地址映射端口寄存器地址映射宏定义宏定义4.宏定义宏定义BIT_ADDR(addr,bitnum)宏宏名名5.宏定义宏定义IO口输入输出操作的宏口输入输出操作的宏名名n 如读取如读取PB8引脚的输入值引脚的输入值、在在PC10引脚输出一个高电平,代码如下:引脚输出一个高电平,代码如下:temp=PBin(8);/读取读取PB8引脚的输入值引脚的输入值PBout(10)=1;/从从PC10引脚输出引脚输出1IO口的位操作与实现口的位操作与实现n IO口口的位操作实现的位操
46、作实现1.编写编写IO口输入输出位操作的头文件口输入输出位操作的头文件sys.hn 为方便为方便今后今后编程编程需要需要,还要,还要围绕围绕IO口的输入输出位口的输入输出位操作操作编写一个编写一个sys.h头文件头文件,sys.h代码代码见源程序见源程序。2.编写编写IO口输入输出位操作的口输入输出位操作的sys.c文件文件n 将新建的将新建的sys.c文件和前面编写好的文件和前面编写好的sys.h头文件,都保存在头文件,都保存在SYSTEMsys子目录下。子目录下。sys.c的代码如下:的代码如下:#include sys.hn sys.c文件目前只有一句代码,在文件目前只有一句代码,在后面
47、会后面会继续添加一些相关的代码继续添加一些相关的代码。这两个文件编写好后,对。这两个文件编写好后,对IO引脚的操作就更加方便了引脚的操作就更加方便了。【技能训练【技能训练3-2】IO口的位操作应用口的位操作应用n 在在任务任务3的的LED闪烁控制中,采用闪烁控制中,采用IO口的位操口的位操,代码,代码如下:如下:#define LED0 PBout(8)while(1)LED0=0;/PB8输出低电平,输出低电平,LED点亮点亮Delay(100);/延时,保持点亮一段时间延时,保持点亮一段时间LED0=1;Delay(100);/保持熄灭一段时间保持熄灭一段时间n 这里只给出这里只给出LED闪烁控制代码,其它代码都是一样。闪烁控制代码,其它代码都是一样。