配色: 字号:
STM32F103综合1
2021-06-15 | 阅:  转:  |  分享 
  
第1章嵌入式系统概述1.1嵌入式系统范例1.2嵌入式系统概念1.3ARM发展历程及应用领域1.4嵌入式操作系统1.5μ
C/OS-II与μC/OS-III1.6本章小结1.1嵌入式系统范例相对于通用计算机系统而言,嵌入式系统也称为“嵌入式计算
机系统”,随着物联网技术的飞速发展,普遍认可的“嵌入式系统”的定义为:“以应用为中心,以计算机技术为基础,软硬件可裁剪,满足应用系
统对功能、可靠性、成本、体积和功耗等严格要求的专用计算机系统”。例如,生活中随处可见的天网监控系统、智能家居、汽车、大型家电、数字
机顶盒、医疗设备、银行ATM机、GPS导航仪和交通控制系统等,都集成了大量嵌入式系统。下面通过一个例子进一步阐述嵌入式系统的范畴。
1.2嵌入式系统概念数字技术和软件技术是嵌入式系统的核心技术,其中,数字技术包括数字信号处理技术和数字化芯片技术,软件技术包括
芯片级的程序设计技术和操作系统级的程序设计技术。电路系统由传统的模拟电子系统演化为以可编程数字化芯片为核心,添加必要的外设接口实现
相应功能的嵌入式系统,在三个相互关联又相对独立的技术领域表现突出,即以单片机为核心的嵌入式控制领域;以DSP(数字信号处理器)或F
PGA(现场可编程门阵列)为核心的嵌入式数字信号处理领域;以ARM或SOC(片内系统芯片)为核心的嵌入式操作系统及其应用领域。一般
地,嵌入式系统被理解为一个相对概念,即在硬件上,它是嵌入在更大规模硬件系统中的电路系统,嵌入式系统的本质在于其硬件系统具有灵活的可
编程、可再配置软件等特性,即嵌入式系统必须具有自身的软件系统。1.2.1嵌入式系统与ARM的关系广义上,凡是嵌入到应用系统中的
电子系统可以统称为嵌入式系统,即使通用的计算机系统,如果是嵌入在特定的应用系统中时,也可被称为嵌入式系统。狭义上,嵌入式系统除具有
硬件和软件之外,还要求硬件系统具有体积小、重量轻、功耗低、成本低、可靠性高、可升级等特点,要求软件系统具有体积小、可裁剪性、健壮性
、专用性、实时性等特点。因此,从狭义上讲,嵌入式系统硬件往往是以ARM芯片为核心的硬件平台,嵌入式系统软件为基于芯片级开发的无操作
系统汇编或C语言实时性软件,或者是基于嵌入式实时操作系统开发的图形界面应用程序。而ARM是指ARM公司设计的基于RISC架构的32
位高性能微处理器,一般采用哈佛总线结构,具有高速指令缓存和数据缓存,指令长度固定且多级流水执行,具有MMU(存储器管理单元)和AM
BA(高级微处理器总线结构)总线接口等。ARM芯片除具有ARM核心外,通常还具有丰富的外设接口,例如,外扩RAM(随机访问存储器)
和FLASH控制器、LCD控制器、串行接口、SD接口、USB接口、I2C和I2S总线接口等,此外,ARM芯片还具有低功耗、体积小等
特性。ARM芯片的高性能、多接口特点决定了其比单片机和DSP更适合作为嵌入式系统的核心微处理器,从而,ARM系统几乎成了嵌入式系统
的代名词。1.2.2嵌入式系统与嵌入式操作系统的关系一般地,嵌入式系统是面向特定应用和环境、集成硬件和软件的单板机,嵌入式系统
的硬件资源有限,突出地表现在其具有较小容量的RAM和ROM空间,通过外扩SD卡等存储介质扩展存储空间;嵌入式系统的软件,包括嵌入式
操作系统软件,都固化在FLASH芯片中。因此,嵌入式操作系统软件体积较小,一般在32MB以下。嵌入式系统的软件分为二种:其一为直接
基于ARM芯片开发的汇编或C语言实时性程序,这时的程序代码负责管理ARM片上所有资源,包括存储空间和片上外设,程序除根据需要设计特
定的功能之外,还要编写ARM芯片初始化代码和中断向量表,更重要的是,程序在访问嵌入式系统的硬件时,必须充分考虑硬件接口的时序特点;
其二是为嵌入式系统定制多任务、实时的嵌入式操作系统,嵌入式操作系统抽象了嵌入式系统的硬件访问方式,通过提供API(应用程序接口)函
数的方式,在嵌入式操作系统基础上设计用户应用程序,只需调用相应的API函数即可,使得嵌入式系统的应用程序设计工作更加简单方便。由此
可见,嵌入式操作系统也具有桌面操作系统的特点,即管理硬件资源、调度软件进程、处理软件中断等,嵌入式操作系统通常包括硬件驱动软件、系
统内核、设备驱动接口、文件系统、图形界面等。嵌入式操作系统要求具有实时性、多任务、模块化、可移植性、可定制等特点,流行的嵌入式操作
系统有WindowsCE、嵌入式Linux、μC/OS-II、VxWorks等。因此,嵌入式系统可以表示为:嵌入式系统=ARM硬
件系统+嵌入式操作系统+操作系统级应用软件系统或者嵌入式系统=ARM硬件系统+芯片级应用软件系统1.3ARM发展历程及应用领
域ARM即AdvancedRISCMachine(高级精简指令集机器),它是ARM公司设计的32位总线的高性能微处理器。ARM
公司(WWW.ARM.COM)本身不生产芯片,通过转让或出售ARM技术给OEM(原始设备生产商)专业生产商来生产和销售ARM芯片给
第三方用户。全球内有约200家大型半导体生产厂商购买了ARM知识产权生产具有ARM核的芯片,每秒就有约90个ARM芯片被使用。自1
985年第一个ARM1原型诞生至今(ARM公司成立于1990年),ARM公司设计的成熟ARM体系结构(或称指令集体系结构ISA)有
ARMv4、ARMv4T、ARMv5TE、ARMv5TEJ、ARMv6和ARMv7等,并且版本号还在不断升级,对应的处理器家族有A
RM7、ARM9、ARM9E、ARM10E、ARM11、Cortex、SecurCore和XScale处理器系列等。应用领域涉及商
业、军事、航天航空、网络与无线通信、消费电子、医疗电子、仪器仪表和汽车电子等各行各业。1.3.1ARM发展史及命名规则每个AR
M处理器都对应于一个特定的ARM指令集体系结构版本,例如,ARM920T微处理器支持指令集体系结构ARMv4T。ARM体系结构的发
展史如表1-1所示。版本典型微处理器类型特点ARMv1至ARMv4(1990年ARM公司成立)已退市早期的版本中只有ARMv4目前
在某些ARM7和StrongARM处理器中可见,可以被视为32位寻址的32位指令集体系结构ARMv4T(1995年)ARM7TDM
I、ARM7TDMI-S、ARM920T、ARM922T支持16位的Thumb指令集,比32位的ARM指令集节省约35%的存储空间
ARMv5TE(1999年)ARM946E-S、ARM966E-S、ARM968E-S、ARM996HS增加了ARM与Thumb状
态切换的指令,增强了DSP类型指令,尤其是在语音数字信号处理方面提高了70%以上的性能ARMv5TEJ(2000年)ARM7EJ-
S、ARM926EJ-S、ARM1026EJ-S添加了Java加速技术ARMv6(2001年)ARM1176JZ(F)-S改进了异
常处理,更好地支持多处理器指令,增加了支持SIMD(单指令多数据)的多媒体指令,对视频和音频解码性能提高近四倍ARMv6T2ARM
1156T2(F)-S支持Thumb-2技术ARMv7Cortex-A8、Cortex-A9、Cortex-R4(F)支持NEON
技术,使得DSP和多媒体处理性能提高四倍,支持向量浮点运算,为下一代3D图像和游戏硬件服务ARMv7-MCortex-M3优化了微
控制器,低功耗表1-1ARM体系结构发展史表1-1中列出了一些典型的ARM微处理器名称,ARM微处理器是根据其具有的功能在“
ARM”后添加字母来命名的,目前,这些字母有T、D、M、I、E、J、F、S,依次表示支持Thumb指令集、支持在线JTAG调试、内
嵌乘法器、嵌入式ICE(在线断点和调试)、增强DSP指令、支持Java技术、支持向量浮点处理、可综合。ARM微处理器名称中的数字用
于反映处理器系列、存储管理单元以及高速缓存等信息。1.3.2ARM微处理器系列目前ARM微处理器主要有八个系列,即ARM7系列
、ARM9系列、ARM9E系列、ARM10E系列、ARM11系列、Cortex系列、SecurCore系列、XScale系列等。各
种系列微处理器均各有其特点和应用场合。1.3.3ARM微处理器应用领域ARM微处理器在数据密集型应用(例如视频、图像和数字信号
处理等)以及控制密集型应用(例如流程控制、工业控制等)均得到了广泛的应用,且具有加载嵌入式操作系统和实时操作系统的能力,因此,AR
M系统在完成特定功能的同时,往往具有优美的人机交互界面,有取代传统的单片机和DSP的趋势。1.4嵌入式操作系统微软的Wind
ows视窗多任务操作系统在桌面计算机领域取得了巨大的成功,实际上,微软针对智能设备和PDA(PersonalDigitalAs
sistant)应用,也推出了WindowsCE操作系统。相对于Windows视窗系统而言,WindowsCE称为嵌入式操作系
统,曾流行的WindowsMobile智能手机就是基于WindowsCE嵌入式操作系统的。根据维基百科全书的解释,嵌入式操作
系统是嵌入式系统的操作系统,通常被设计得非常紧凑有效,抛弃了运行在它们之上的特定应用程序所不需要的各种功能。互动百科全书则指出,嵌
入式操作系统负责嵌入式系统的全部软、硬件资源的分配和调度工作,控制协调并发活动,且能通过装卸某些软件模块来达到系统所要求的功能。嵌
入式操作系统往往也是实时操作系统,常见的嵌入式操作系统有WindowsCE、嵌入式Linux、VxWorks、μC/OS-II、
eCos、QNX、Android和Symbian等。μC/OS之父Labrosse指出,实时系统是对逻辑和时序要求非常严格的系统
,如果逻辑和时序出现偏差,将会引起严重后果。即实时系统是必须能在确定的时间内执行特定功能,并能对外部的异步事件做出响应的计算机系统
,实时系统对响应时间有严格要求。实时多任务操作系统是指具有多任务调度和资源管理功能的实时系统,即所谓的嵌入式操作系统,它往往具有以
下特点:(1)实时性,即在确定的时间内执行特定功能和对中断做出响应。(2)体积小,一般为几kB到几百kB。(3)可裁剪,即嵌入式
操作系统采用模块化设计,可根据需要选择特定的功能模块。(4)健壮性,即具有极好的运行稳定性。(5)可移植性,即可以运行于多种嵌
入式系统平台上。(硬件平台)(6)可固化性,即嵌入式操作系统可固化在嵌入式统的Flash芯片内。(7)提供设备驱动和应用程序接口中
,即用户可以借助嵌入式操作系统使用和管理系统资源。(8)提供图形用户界面和网络功能。有些嵌入式操作系统提供了友好的图形用户界面(G
UI)和网络支持。下面介绍一些在嵌入式应用领域占有绝对优势的嵌入式操作系统,而把嵌入式操作系统μC/OS放在第1.5节介绍。1.
4.3嵌入式Linux嵌入式Linux是嵌入式系统领域最重要的实时操作系统,是几乎所有涉足嵌入式操作系统内核领域的人士必学的嵌
入式操作系统。嵌入式Linux是对流行的Linux操作系统进行裁剪和修改,使之能应用于嵌入式计算机系统的一种操作系统,其实时性、稳
定性和安全性均较好,在通信电子、工业控制、信息家电、仪器仪表方面应用广泛。嵌入式Linux具有以下特点:(1)嵌入式Linux是完
全开源的,因此它广泛应用于高校教学。研究嵌入式Linux代码的专家、学者远比其他操作系统都多,而且Internet上的资源丰富,也
有大量的图书、资料,使得学习Linux系统的代价最小。(2)嵌入式Linux是免费的,不涉及任何版权和专利,这一点被商界所看重。因
此,大部分嵌入式产品在初期都使用过嵌入式Linux版本。嵌入式Linux被很多团体和组织二次开发后,形成具有独立知识产权的嵌入式操
作系统,所以,嵌入式Linux变种系统非常多,如WindRiverLinux和μCLinux等。(3)嵌入式Linux与QT相结
合,使嵌入式Linux具有良好的图形人机界面,甚至可以和WindowsCE相媲美,而且QT目前也是开源的。(4)嵌入式Linux
的移植能力强,其变种形式几乎可应用于所有主流嵌入式系统中。嵌入式Linux对外设驱动能力很强,驱动接口程序设计相对容易,网络上有大
量常用设备的驱动代码可供参考借鉴。(5)嵌入式Linux在内核、文件系统、网络支持等方面均有突出的特点。最新的Linux内核,具有
约200多万行源代码,可支持32个CPU,实时性显著提高(但严格意义上不是实时操作系统),采用了更有效的任务调度器,增加了对多种嵌
入式处理器的支持,在多媒体和网络通信方面也有很大提高。1.5.1μC/OS-II特点μC/OS-II是一个完整、可移植、固化、裁
剪的抢先式实时多任务操作系统。μC/OS-II公开全部源代码,大约有1.1万行代码。Labrosse先后出版了三本书介绍μC/OS
-II,使得μC/OS-II在全球范围内迅速流行起来。μC/OS-II具有以下特点:(1)μC/OS-II具有优秀的可移植性。μC
/OS-II的绝大部分源代码由C语言写成,只有一小部分与处理器相关的移植代码使用汇编语言编写,汇编语言代码量压缩到最低限度。一般可
认为支持CPU堆栈操作指令的所有微控制器,均可以移植μC/OS-II,因此,现在流行的单片机、DSP、ARM和FPGA等芯片均可移
植μC/OS-II,这使得μC/OS-II系统的应用领域十分广阔。Micrium网站上有大量可供参考的移植范例,移植工作可以几小时
至一周时间内完成。(2)μC/OS-II系统可固化在嵌入式系统的Flash中。由于μC/OS-II是公开源代码的,因此,往往被添加
到用户应用程序工程文件中,被统一编译和链接为可执行目标文件,该目标文件可被固化到ROM存储器或Flash芯片中。(3)μC/OS-
II系统可裁剪。通过μC/OS-II系统的OS_CFG.H配置文件可以有选择地使用μC/OS-II系统功能组件,μC/OS-II的
可裁剪性是靠条件编译实现的。应根据实际的嵌入式系统的存储空间大小和实现的功能,选择μC/OS-II系统的裁剪情况。(4)μC/OS
-II系统是可抢先型的实时内核,即μC/OS-II总是执行所有处于就绪状态下优先级最高的任务。μC/OS-IIv2.91最多支持
255个任务,并且各个任务的优先级号不能相同,即μC/OS-II不支持同优先级任务间的调度。基于μC/OS-II系统的应用程序由多
个任务组成,每个任务具有独立的堆栈空间,并且允许其堆栈空间大小不同。μC/OS-II系统可对堆栈大小和使用情况作动态检测。(5)μ
C/OS-II系统提供了信号量、互斥信号量、事件标志组、消息邮箱、消息队列等多种服务组件,提供了用于时间管理和内存管理的函数,使用
这些组件可方便地在任务间进行通信和同步。μC/OS-II系统服务的执行时间是确定的,即调用和执行μC/OS-II系统函数的时间是确
定的,对于中断延时的时间也几乎是确定的。(6)μC/OS-II系统具有很高的安全性和可靠性。2000年7月,μC/OS-II取得了
美国联邦航空管理局(FAA)关于RTCADO-178B标准的质量认证,表明μC/OS-II系统可用于与人生命攸关的、安全性要求苛
刻的嵌入式系统中,从而大大提升了μC/OS-II系统的知名度。事实上,美国NASA于2011年发射的“好奇号”(Curiosity
)为火星机器人就搭载了μC/OS-II系统。而且,在我国,有大量的商业应用基于μC/OS-II系统。第2章STM32F103微控
制器2.1STM32F103概述2.2STM32F103ZET6管脚定义2.3STM32F103架构2.4STM3
2F103存储器2.5STM32F103片内外设2.6ST32F103异常与中断2.7本章小结2.1STM32F1
03概述STM32F103ZET6芯片的主要特性如下:(1)集成了32位的ARMCortex-M3内核,最高工作频率可达72MH
z,计算能力为1.25DMIPS/MHz(Dhrystone2.1),具有单周期乘法指令和硬件除法器;(2)具有512kB片内
FLASH存储器和64kB片内SRAM存储器;(3)内部集成了8MHz晶体振荡器,可外接4~16MHz时钟源;(4)2.0V~
3.6V单一供电电源,具有上电复位功能(POR);(5)具有睡眠、停止、待机等三种低功耗工作模式;(6)144管脚LQFP封装(
薄型四边引线扁平封装);(7)内部集成了11个定时器:4个16位的通用定时器,2个16位的可产生PWM波控制电机的定时器,2个16
位的可驱动DAC的定时器,2个加窗的看门狗定时器和1个24位的系统节拍定时器(24位减计数);(8)2个12位的DAC和3个12位
的ADC(21通道);(9)集成了内部温度传感和实时时钟RTC;(10)具有112根高速通用输入输出口(GPIO),可从其中任
选16根作为外部中断输入口,几乎全部GPIO可承受5V输入(PA0~PA7、PB0~PB1、PC0~PC5、PC13~PC15和P
F6~PF10除外);(11)集成了13个外部通信接口:2个I2C、3个SPI(18Mbps,其中复用2个I2S)、1个CAN(2
.0B)、5个UART、1个USB2.0设备和1个并行SDIO;(12)具有12通道的DMA控制器,支持定时器、ADC、DAC
、SDIO、I2S、SPI、I2C和UART外设;(13)具有96位的全球唯一编号;(14)工作温度为-40~105℃;2.2
STM32F103ZET6管脚定义芯片STM32F103ZET6为144管脚LQFP144封装,其外型如图2-1所示。图2-1
STM32F103ZET6外型图2-1可知,芯片STM32F103ZET6包括7个16位的通用目的输入输出口(GPIO),依次称为
PA、PB、PC、PD、PE、PF和PG口,几乎每个GPIO口都复用了其他的功能(PG8和PG15例外)。芯片STM32F103Z
ET6的各个管脚的定义如表2-1所示。表2-1芯片STM32F103ZET6的管脚定义序号管脚编号管脚名称主要功能复用功能重映
射功能PA口134PA0-WKUPPA0WKUP/USART2_CTS/ADC123_IN0/TIM2_CH1_ETR/TIM5_
CH1/TIM8_ETR235PA1PA1USART2_RTS/ADC123_IN1/TIM5_CH2/TIM2_CH2336PA
2PA2USART2_TX/TIM5_CH3/ADC123_IN2/TIM2_CH3437PA3PA3USART2_RX/TIM5
_CH4/ADC123_IN3/TIM2_CH4540PA4PA4SPI1_NSS/USART2_CK/DAC_OUT1/ADC1
2_IN4641PA5PA5SPI1_SCK/DAC_OUT2/ADC12_IN5742PA6PA6SPI1_MISO/TIM8_
BKIN/ADC12_IN6/TIM3_CH1TIM1_BKIN843PA7PA7SPI1_MOSI/TIM8_CH1N/ADC1
2_IN7/TIM3_CH2TIM1_CH1N9100PA8PA8USART1_CK/TIM1_CH1/MCO10101PA9PA
9USART1_TX/TIM1_CH22.3STM32F103架构STM32F103ZET6的内部结构如图2-2所示。图2-2
STM32F103ZET6内部结构框图STM32F103ZET6集成了Cortex-M3内核CPU,工作频率为72MHz,与C
PU紧耦合的为嵌套向量中断控制器NVIC和跟踪调试单元,其中,调试单元支持标准JTAG和串行SW两种调试方式;16个外部中断源作为
NVIC中断控制器的一部分。CPU通过指令总线直接到FLASH取指令,通过数据总线和总线阵列与FLASH和SRAM交换数据,DMA
可以直接通过总线阵列控制定时器、ADC、DAC、SDIO、I2S、SPI、I2C和UART。Cortex-M3内核CPU通过总线阵
列和高性能总线(AHB)以及AHB-APB(高级外设总线)桥与两类APB总线相连接,即APB1总线和APB2总线。其中,APB2总
线工作在72MHz下,与它相连的外设有外部中断与唤醒控制、七个通用目的输入输出口(PA、PB、PC、PD、PE、PF和PG)、定时
器1、定时器8、SPI1、USART1、3个ADC和内部温度传感器。其中,3个ADC和内部温度传感器使用VDDA电源。APB1总
线最高可工作在36MHz频率下,与APB1总线相连的外设有看门狗定时器、定时器6、定时器7、RTC时钟、定时器2、定时器3、定时器
4、定时器5、USART2、USART3、UART4、UART5、SPI2(I2S2)与SPI3(I2S3)、I2C1与I2C2、
CAN、USB设备和2个DAC。其中,512B的SRAM属于CAN模块,看门狗时钟源使用VDD电源,RTC时钟源使用VBAT电源。
STM32F103ZET6芯片内部具有8MHz和40kHz的RC振荡器,时钟与复位控制器和SDIO模块直接与AHB总线相连接。而静
态存储器控制器(FSMC)直接与总线阵列相连接。在图2-2中,各个功能模块都有专用的工作时钟源,通过管理这些时钟源使得这些模块处于
工作状态还是低功耗状态。STM32F103ZET6芯片的时钟管理如图2-3所示。图2-3STM32F103ZET6时钟管理在图
2-3中,内部8MHz的时钟记为HSI,外部输入的4~16MHz(一般是8MHz)时钟记为HSE,内部的40kHz时钟记为LSI,
外部输入的32.768kHz时钟称为LSE。STM32F103ZET6的时钟管理非常灵活。在图2-3的右下角,STM32F103Z
ET6芯片可向外部输出PLLCLK/2、HSE、HSI和SYSCLK四个时钟信号之一。从图2-3的左边向右边看过去,外部可接8MH
z时钟(由OSC_IN和OSC_OUT管脚接入)和32.768kHz时钟(由OSC32_IN和OSC32_OUT管脚接入)。系统时
钟SYSCLK来自HSI、PLLCLK(PLL倍频器输入时钟)和HSE三个时钟源中的一个,其中,PLL倍频器的输入为HSI/2或P
LLXTPRE选通的时钟信号(即OSC输出时钟或其二分频值)。SYSCLK直接送给I2S2、I2S3和AHB预分频器(分频值为1、
1/2、1/3、...、1/512)。AHB预分频器的输出时钟供给SDIO、FSMC、APB1外设、APB2外设和ADC等,同时,
AHB预分频器的输出时钟还直接作为AHB总线、Cortex内核、存储器和DMA的HCLK时钟,并作为Cortex内核自由运行时钟F
CLK,1/8分频后作为Cortex系统定时器时钟源。APB1预分频器的输出时钟作为APB1外设的时钟源,并且经“定时器2~7倍频
器”倍频后作为定时器2~7的时钟源。APB2预分频器的输出时钟作为APB2外设的时钟源,经“定时器1和8倍频器”倍频后作为定时器1
和8的时钟源,经ADC预分频器后作为ADC1、ADC2和ADC3的时钟源。AHB预分频器的输出时钟二分频后,用作SDIO与AHB总
线的接口时钟。此外,RTC定时器的时钟源为HSE/128、LSE或LSI之一,看门狗定时器由LSI提供时钟。需要指出的是,每个外设
的时源受“外设时钟控制”寄存器管理,可以单独打开或关闭时钟源。2.4STM32F103存储器STM32F103ZET6芯片的存
储器配置如图2-4所示。序号APB外设起始偏移地址序号APB外设起始偏移地址1TIM20x0000024AFIO0x10000
2TIM30x0040025EXTI0x104003TIM40x0080026PortA0x108004TIM50x0
0C0027PortB0x10C005TIM60x0100028PortC0x110006TIM70x0140029P
ortD0x114007RTC0x0280030PortE0x118008WWDG0x02C0031PortF0x1
1C009IWDG0x0300032PortG0x1200010SPI2/I2S20x0380033ADC10x124
0011SPI3/I2S30x03C0034ADC20x1280012USART20x0440035TIM10x12C00
13USART30x0480036SPI10x1300014UART40x04C0037TIM80x1340015UART
50x0500038USART10x1380016I2C10x0540039ADC30x13C0017I2C20x0580
040SDIO0x1800018USB0x05C0041DMA10x2000019USB/CAN共享0x0600042DM
A20x2040020BxCAN0x0640043RCC0x2100021BKP0x06C0044FLASH接口0x22
00022PWR0x0700045CRC0x2300023DAC0x07400表2-2APB外设映射的存储空间(基地址为
0x40000000,大小均为1kB,即0x400)在STM32F103ZET6芯片的地址0x1FFFF7E0处的半字存储空间
中保存了芯片FLASH空间的大小,可以使用语句“v=((unsignedshort)0x1FFFF7E0);”读出,这里v
为无符号16位整型变量,对于STM32F103ZET6,v的值为0x0200(表示512kB)。在地址0x1FFFF7E8开始的
12个字节里保存了芯片的身份号,该编号是全球唯一的,可使用语句“v1=((unsignedint)(0x1FFFF7
E8+0x00));v2=((unsignedint)(0x1FFFF7E8+0x04));v3=((
unsignedint)(0x1FFFF7E8+0x08));”读出,此处,v1、v2和v3为无符号32位整型变量,这
里读出的值为:v1=0x05D7FF38,v2=0x39354E4B,v3=0x51236736,即所使用的芯片的96位长唯一身份
号为“5123673639354E4B05D7FF38H”。2.6STM32F103异常与中断STM32F103ZET6微控制
器具有10个异常和60个中断,中断优先级为16级。异常与中断的地址范围为0x0~0x012C,如表2-5所示。中断号优先级地址异常
/中断名描述0x000保留-30x004Reset复位异常-20x008NMI不可屏蔽异常-10x00CHardFault系统硬件
访问异常00x010MemManage存储管理异常10x014BusFault总线访问异常20x018UsageFault未定义指
令异常0x01C~0x02B保留30x02CSVC系统服务调用异常40x030DebugMon调试器异常0x034保留50x038
PendSV请求系统服务异常60x03CSysTick系统节拍定时器异常070x040WWDG加窗看门狗中断180x044PVD可
编程电压检测中断290x048TAMPER备份寄存器篡改中断3100x04CRTC实时时钟中断4110x050FLASHFLASH
中断5120x054RCCRCC中断6130x058EXTI0外部中断07140x05CEXTI1外部中断18150x060EXT
I2外部中断29160x064EXTI3外部中断310170x068EXTI4外部中断411180x06CDMA1_Channel
1DMA1通道1中断12190x070DMA1_Channel2DMA1通道2中断13200x074DMA1_Channel3DM
A1通道3中断14210x078DMA1_Channel4DMA1通道4中断15220x07CDMA1_Channel5DMA1通
道5中断16230x080DMA1_Channel6DMA1通道6中断17240x084DMA1_Channel7DMA1通道7中
断18250x088ADC1_2ADC1和ADC2中断19260x08CUSB_HP_CAN_TXUSB高优先或CAN发送中断20
270x090USB_LP_CAN_RX0USB低优先或CAN接收0中断21280x094CAN_RX1CAN接收1中断22290
x098CAN_SCECANSCE中断23300x09CEXTI9_5外部中断5~924310x0A0TIM1_BRK定时器1中
止中断25320x0A4TIM1_UP定时器1更新中断26330x0A8TIM1_TRG_COM定时器1跳变中断27340x0AC
TIM1_CC定时器1捕获比较中断28350x0B0TIM2定时器2中断29360x0B4TIM3定时器3中断30370x0B8T
IM4定时器4中断31380x0BCI2C1_EVI2C1事件中断32390x0C0I2C1_ERI2C1错误中断33400x0C
4I2C2_EVI2C2事件中断34410x0C8I2C2_ERI2C2错误中断35420x0CCSPI1SPI1中断36430x
0D0SPI2SPI2中断37440x0D4USART1USART1中断38450x0D8USART2USART2中断39460x
0DCUSART3USART3中断40470x0E0EXTI15_10外部中断10~1541480x0E4RTCAlarm实时时钟
报警中断42490x0E8USBWakeUpUSB通过EXTI输入唤醒中断43500x0ECTIM8_BRK定时器8中止中断445
10x0F0TIM8_UP定时器8更新中断45520x0F4TIM8_TRG_COM定时器8跳变中断46530x0F8TIM8_C
C定时器8捕获比较中断47540x0FCADC3ADC3中断48550x100FSMCFSMC中断49560x104SDIOSDI
O中断50570x108TIM5定时器5中断51580x10CSPI3SPI3中断52590x110UART4UART5中断536
00x114UART5UART5中断54610x118TIM6定时器6中断55620x11CTIM7定时器7中断56630x120
DMA2_Channel1DMA2通道1中断57640x124DMA2_Channel2DMA2通道2中断58650x128DMA
2_Channel3DMA2通道3中断59660x12CDMA2_Channel4_5DMA2通道4和通道5中断表2-5STM
32F103ZET6异常与中断向量表表2-5中,优先级号越小,优先级就越高,因此,复位异常的优先级最高(优先级号为-3),并且,R
eset、NMI、HardFault三个异常的优先级是固定的,其余的优先级可以配置。STM32F103ZET6只有16个中断优先级
,但是有60个中断,如果二个中断的优先级号相同,则按表2-5中的自然“优先级”排序,自然优先级号小的优先级高。关于中断的处理方法与
优先级配置等内容将在第5章阐述。当表2-5中的某个异常或中断被触发后,程序计数器指针(PC)将跳转到表2-5中该异常或中断的地址处
执行,该地址处存放着一条跳转指令,跳转到该异常或中断的服务函数中去执行相应的功能。因此,异常和中断向量表只能用汇编语编写,在Kei
lMDK中,有标准的异常和中断向量表文件供使用,例如,对于STM32F103ZET6而言,异常和中断向量表文件为startup_
stm32f10x_hd.s。在文件startup_stm32f10x_hd.s中,异常服务函数的函数名为表1-5中的异常名后添加
“_Handler”,例如,系统节拍定时器异常的服务函数为“SysTick_Handler”;中断服务函数的函数名为表2-5中的中
断名后添加“_IRQHandler”,例如,外中断3的中断服务函数为“EXTI3_IRQHandler”。第3章STM32F10
3学习平台3.1STM32F103核心电路3.2电源电路与按键电路3.3LED与蜂鸣器驱动电路3.4串口通信电路3
.5FLASH与EEPROM电路3.6温湿度传感器电路3.7LCD屏接口电路3.8JTAG与复位电路3.9SR
AM电路3.10本章小结图3-11为按键电路,按键直接与STM32F103ZET6芯片的管脚相连(结合图3-6),三个按键均为
常开按键,当按键被按下时,输入低电平;当按键弹出后,相应的管脚被内部上拉电路拉高,从而相当于输入高电平。按键是最重要的外部输入设备
之一,可以通过按键阵列支持更多的按建输入,或者通过扩展ZLG7289B芯片,支持高达64个按键输入(和64个LED灯显示)。图3-
11按键电路3.3LED与蜂鸣器驱动电路图3-12为LED灯驱动电路,其中,名称为PWR的LED灯为电源指示灯,当+3.3
V电源工作正常时,该LED灯常亮。名称为DS0和DS1的两个LED灯为用户控制LED灯,直接与STM32F103ZET6芯片相连接
(参考图3-3和图3-6),当网络标号LED0连接的管脚为低电平时,LED0灯亮;当网络标号LED0连接的管脚为高电平时,LED0
熄灭。LED1的工作原理与LED0相同,即网终标号LED1为低电平时,LED1灯点亮;当网络标号LED1为高电平时,LED1灯熄灭
。图3-12LED灯电路需要特别指出的是,图3-2~图3-12可视为STM32F103ZET6微控制器的最小系统(这时,图3-
2~图3-9中仅包含网络标号KEY0~KEY2和LED0~LED1以及电源和地相关的网络标号),即STM32F103ZET6微控制
器的最小系统应包括电源电路、用户按键电路、LED灯指示电路、复位电路(内部复位)、晶体振荡器电路和相应的核心电路。图3-13为蜂鸣
器驱动电路,这里使用了有源蜂鸣器(即内部有振荡器和发声器,只需要施加电源输入就可以固定频率鸣叫),通过网络标号BEEP与STM32
F103ZET6相连(参考图3-3),当BEEP为高电平时,NPN型三极管S8050导通,使得蜂鸣器鸣叫;当BEEP为低电平时,三
极管S8050截止,蜂鸣器关闭。图3-13蜂鸣器电路3.4串口通信电路图3-14为串口通信电路模块。在图3-14中,通过电
平转换芯片SP3232实现STM32F103ZET6与上位机的串行通信,SP3232具有两个通道,这里仅使用了通道1。STM32F
103ZET6微控制器的串口外设(参考图2-2)通过网络标号U2_RX和U2_TX按RS-232标准与上位机进行异步串行通信。图3
-14串口通信电路3.5FLASH与EEPROM电路图3-15为STM32F103ZET6微控制器外接的128Mb(即16
MB)大小的FLASH存储器W25Q128电路,通过SPI方式与芯片STM32F103ZET6相连接(参考图3-3)。图3-15
FLASH芯片W25Q128电路图3-16为2Kb大小(即256字节)的EEPROM存储器AT24C02电路,通过I2C方式与
芯片STM32F103ZET6相连接(参考图3-3)。图3-16EEPROM芯片AT24C02电路3.9SRAM电路STM
32F103ZET6学习实验板上还扩展了一个1MB大小的SRAM存储器IS62WV51216,该高速静态SRAM的访问速度可达55
ns,其电路连接如图3-21所示。图3-21SRAM芯片IS62WV51216电路图3-18TFTLCD屏接口电路在图3
-18中,,MISO、MOSI、T_CS和CLK为触摸屏的数据读入、数据输出、片选和时钟端,T_PEN是触摸屏的中断输出端。STM
32的8种GPIO输入输出模式STM32的8种GPIO输入输出模式输入模式-输入浮空(GPIO_Mode_IN_FLOATING
)-输入上拉(GPIO_Mode_IPU)-输入下拉(GPIO_Mode_IPD)-模拟输入(GPIO_Mode_AIN)输
出模式-开漏输出(GPIO_Mode_Out_OD)-开漏复用功能(GPIO_Mode_AF_OD)-推挽式输出(GPIO_
Mode_Out_PP)-推挽式复用功能(GPIO_Mode_AF_PP)在STM32中选用IO模式:(1)浮空输入--浮空输
入,可以做KEY识别,RX1(2)带上拉输入--IO内部上拉电阻输入(3)带下拉输入--IO内部下拉电阻输入(4)模拟输入-
-应用ADC模拟输入,或者低功耗下省电(5)开漏输出--IO输出0接GND,--IO输出1,悬空,需要外接上拉电阻,才能实现输出
高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读
IO输入电平变化,实现C51的IO双向功能在STM32中选用IO模式:(6)推挽输出IO输出0-接GND,IO输出1-接VCC
,读输入--是未知的(7)复用功能的推挽输出--片内外设功能(I2C的SCL,SDA)(8)复用功能的开漏输出--片内外设功能(
TX1,MOSI,MISO,SCK,SS)GPIO的主要寄存器:每个GPIO端口都有-两个32位配置寄存器(GPIOx_CRL
?,GPIOx_CRH)-两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)-一个32位置位/复位寄存器(GPIO
x_BSRR)-一个16位复位寄存器(GPIOx_BRR)-一个32位锁定寄存器(GPIOx_LCKR)每个I/O端口位可以自
由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)端口配置低寄存器(GPIOx_CRL):端口配置高寄存器(
GPIOx_CRH):端口输入数据寄存器(GPIOx_IDR):端口输出数据寄存器(GPIOx_ODR):程序段4-2自定义
GPIOB_ODR寄存器23GPIOB->ODR&=~(1uL<<5);4GPIOB->ODR|=(1uL<<5);程序
段4-2中,第1行定义寄存器GPIOB_ODR,第3行PB5输出低电平,第4行PB5输出高电平。上述的程序段4-1和程序段4-2
中都直接使用了寄存器进行程序设计,这类程序称为基于寄存器的程序,简称寄存器类型程序。如果进行寄存器类型程序设计,需要对stm32f
10x.h文件的内容进行全面的学习(该文件在KeilMDK创建新工程时自动产生)。除了寄存器类型程序外,STM32F103还支
持一种抽象的程序类型,称为借助库函数的工程程序,简称库函数类型程序。相对于工程01的文件,工程02只需要修改led.c文件,如
程序段4-11所示。程序段4-11文件led.c1//Filename:led.c23#include
"includes.h"45voidLEDInit(void)6{7GPIO_InitTypeDefg;
8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Peri
ph_GPIOE,ENABLE);910g.GPIO_Pin=GPIO_Pin_5;11g.GPIO_Mode=GPIO
_Mode_Out_PP;12g.GPIO_Speed=GPIO_Speed_50MHz;13GPIO_Init(GPIOB,
&g);1415g.GPIO_Pin=GPIO_Pin_5;16g.GPIO_Mode=GPIO_Mode_Out_PP
;17g.GPIO_Speed=GPIO_Speed_50MHz;18GPIO_Init(GPIOE,&g);19}
2021voidLED(Int08Uw,LEDStates)//w-which(1or2),s-state(L
ED_ONorLED_OFF)22{23 switch(w)24 {25 case0:26
if(s==LED_ON)27GPIO_ResetBits(GPIOB,GPIO_Pin_5);28 els
e29GPIO_SetBits(GPIOB,GPIO_Pin_5);30 break;31 case1:
32 if(s==LED_ON)33GPIO_ResetBits(GPIOE,GPIO_Pin_5);34
else35GPIO_SetBits(GPIOE,GPIO_Pin_5);36 break;37 def
ault:38 break;39 } 40}对比程序段4-9可知,这里的程序段4-11中,第8行调
用RCC_APB2PeriphClockCmd库函数打开PB口和PE口的时钟源。第7行定义变量g,第10~12行为结构体变量g赋值
,这里的类型GPIO_InitTypeDef定义在库函数头文件stm32f10x_gpio.h中,如下所示:程序段4-12头
文件stm32f10x_gpio.h中的类型GPIO_InitTypeDef定义1typedefenum2{3
GPIO_Speed_10MHz=1,4GPIO_Speed_2MHz,5GPIO_Sp
eed_50MHz6}GPIOSpeed_TypeDef;78typedefenum9{GPIO_Mode
_AIN=0x0,GPIO_Mode_IN_FLOATING=0x04,11GPIO_Mode_IPD=0x28,12
GPIO_Mode_IPU=0x48,13GPIO_Mode_Out_OD=0x14,14GPIO_Mode_Out_PP
=0x10,15GPIO_Mode_AF_OD=0x1C,16GPIO_Mode_AF_PP=0x1817}G
PIOMode_TypeDef;1819typedefstruct20{21uint16_tGPIO_P
in;22GPIOSpeed_TypeDefGPIO_Speed;23GPIOMode_TypeDefGPIO_Mode;
24}GPIO_InitTypeDef;2526#defineGPIO_Pin_5((uint16
_t)0x0020)第5章按键与中断处理5.1NVIC中断工作原理5.2GPIO外部输入中断5.3用户按键中断实例5.
4本章小结上述代码对应着表2-5,由于IRQn_Type为指定了成员值的枚举类型,因此,可以用强制类型转换将IRQn_Typ
e类型的变量转化为整型,例如,程序段5-1第24行的(uint32_t)(IRQn),就是将IRQn转化为无符号32位整型。如果I
RQn为EXTI2,则(uint32_t)(IRQn)为8。现在,可以直接调用CMSIS库中关于中断的函数实现对NVIC中断的管理
。例如,关闭EXIT2中断、开放EXTI2中断和清除EXTI2中断标志位的语句依次为:NVIC_DisableIRQ(EXTI2_
IRQn);NVIC_EnableIRQ(EXTI2_IRQn);NVIC_ClearPendingIRQ(EXTI2_IRQn)
;5.2GPIO外部输入中断根据寄存器AFIO_EXTICR1~4(见表4-3),可从GPIO口中选择16个管脚配置为16个外
部中断的输入端,如图5-2所示。图5-2外部中断输入端管脚配置方法程序段5-14文件key.c1//Filen
ame:key.c23#include"includes.h"45voidKEYInit(void)6
{7GPIO_InitTypeDefg;8 RCC_APB2PeriphClockCmd(RCC_APB2Pe
riph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);910g.GPIO_Pin=GPIO_Pi
n_2|GPIO_Pin_3|GPIO_Pin_4;11g.GPIO_Mode=GPIO_Mode_IPU;12g.
GPIO_Speed=GPIO_Speed_10MHz;13GPIO_Init(GPIOE,&g);1415GPIO_Set
Bits(GPIOE,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);16}第5~16行为K
EYInit函数。按键KEY0~2占用PE4、PE3和PE2口,同时,需要开启AFIO功能,所以,第8行调用库函数RCC_APB2
PeriphClockCmd开启PE口和AFIO口的时钟源。第10~13行初始化PE2~PE4为上拉有效的输入口,且工作频率为10
MHz。第15行使PE2~PE4口出高电平,相当于为PE2~PE4提供强上拉功能。程序段5-15文件exti.c1
//Filename:exti.c23#include"includes.h"45voidEXTIKey
Init(void)6{7EXTI_InitTypeDefe;889GPIO_EXTILineConfig(GPIO_
PortSourceGPIOE,GPIO_PinSource2);//PE2asEXTI210GPIO_EXTILineCo
nfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);//PE3asEXTI311GPIO_
EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//PE4asEX
TI41213e.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line4;14e.EXT
I_Mode=EXTI_Mode_Interrupt;15e.EXTI_Trigger=EXTI_Trigger_Fall
ing;16e.EXTI_LineCmd=ENABLE;17EXTI_Init(&e);1819NVIC_EnableIRQ(EXTI2_IRQn);//OpenEXTI2,3,420NVIC_EnableIRQ(EXTI3_IRQn);21NVIC_EnableIRQ(EXTI4_IRQn);22NVIC_SetPriority(EXTI2_IRQn,5);23NVIC_SetPriority(EXTI3_IRQn,6);24NVIC_SetPriority(EXTI4_IRQn,7);25}26第5~25行为外部输入中断的初始化函数EXTIKeyInit。第9~11行调用库函数GPIO_EXTILineConfig依次将PE2、PE3和PE4配置为外部中断EXTI2、EXTI3和EXTI4。第13~17行配置外部输入中断EXTI2、EXTI3和EXTI4工作在中断模式,且为下降沿触发方式。第19~21行为调用CMSIS库函数NVIC_EnableIRQ开放外部中断EXTI2、EXTI3和EXTI4,第22~24行调用CMSIS库函数NVIC_SetPriority配置外部中断EXTI2、EXTI3和EXTI4的优先级号依次为5、6和7。27voidEXTI2_IRQHandler()28{29 LED(0,LED_ON);30EXTI_ClearFlag(EXTI_Line2);31NVIC_ClearPendingIRQ(EXTI2_IRQn);32}3334voidEXTI3_IRQHandler()35{36 LED(0,LED_OFF);37EXTI_ClearFlag(EXTI_Line3);38NVIC_ClearPendingIRQ(EXTI3_IRQn);39}4041voidEXTI4_IRQHandler()42{43 BEEP();44EXTI_ClearFlag(EXTI_Line4);45NVIC_ClearPendingIRQ(EXTI4_IRQn);46}对比程序段5-11,这里的三个中断服务函数中,清除中断标志使用了库函数EXTI_ClearFlag,如第30、37和44行所示,依次清零EXTI2、EXTI3和EXTI4的中断请求标志。在上述库函数方式的工程程序中,新出现了结构体类型EXIT_InitTypeDef和新的库函数GPIO_EXTILineConfig、EXTI_Init和EXTI_ClearFlag,它们均被定义在stm32f10x_exti.c或stm32f10x_exti.h中,因此需要将stm32f10x_exti.c添加到工程管理器的“LIB”分组中。关于这些新结构体类型和新库函数的具体描述请参考STM32F10x库函数手册,或直接从头文件stm32f10x_exti.h中查看。可在不同的硬件上进行移植的,导致在不同的设备上需要自己定义引脚,定义时钟,定义输入输出端口嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值嵌位:就是将某一点的电位固定在不超过某一数值
献花(0)
+1
(本文系新用户0398M...首藏)