第3章〓STM32F1系列处理器 3.1STM32F1系列处理器简介 STM32系列处理器是意法半导体(ST)公司推出的基于CortexM3内核的32位MCU。目前这个系列包含多个子系列,分别是STM32小容量产品、STM32中容量产品、STM32大容量产品和STM32互联型产品。在众多STM32系列产品中,STM32F1系列基础型处理器无疑占据了极其重要的地位。该系列产品功能强大,满足了工业、医疗和消费类市场的各种应用需求。凭借该系列的产品,意法半导体公司在全球ARM CortexM微控制器领域处于领先地位。 STM32F1系列处理器包含5个产品线,分别为STM32F10024MHz、STM32F10136MHz、STM32F10248MHz、STM32F10372MHz和STM32F105/10772MHz。它们的引脚、外设和软件均兼容。STM32系列产品命名规则如图3.1所示。 图3.1STM32系列处理器产品命名规则 3.2STM32F103ZET6处理器架构和主要特性 3.2.1芯片和引脚定义 STM32F103ZET6处理器采用LQFP144封装,其引脚图如图3.2所示。从封装类别和引脚图均可以看出,STM32F103ZET6芯片总共引出了144个引脚,就引脚数量而言比51系列的单片机复杂很多。 图3.2STM32F103ZET6的引脚图 STM32F103ZET6的各个引脚都有其特定的功能及特性。由于其引脚数量较多,故在此仅列出其中编号为1~50的引脚定义,具体如表3.1所示。如果需要使用其他的引脚或者查找详细的引脚信息,请自行查阅意法半导体公司的官方手册和说明书。 表3.1STM32F103ZET6的部分主要引脚定义 引脚 编号引 脚 名 称类型I/O电平复位后的 主要功能复 用 功 能 默 认 情 况重 映 射 后 1PE2I/OFTPE2TRACECK/FSMC_A23— 2PE3I/OFTPE3TRACED0/FSMC_A19— 3PE4I/OFTPE4TRACED1/FSMC_A20— 4PE5I/OFTPE5TRACED2/FSMC_A21— 5PE6I/OFTPE6TRACED3/FSMC_A22— 6VBATS—VBAT—— 7PC13TAMPER RTCI/O—PC13TAMPERRTC— 8PC14OSC32_INI/O—PC14OSC32_IN— 9PC15OSC32_ OUTI/O—PC15OSC32_OUT— 10PF0I/OFTPF0FDMC_A0— 11PF1I/OFTPF1FDMC_A1 — 12PF2I/OFTPF2FDMC_A2— 13PF3I/OFTPF3FDMC_A3— 14PF4I/OFTPF4FDMC_A4— 15PF5I/OFTPF5FDMC_A5— 16VSS_5S—VSS_5—— 17VDD_5S—VDD_5—— 18PF6I/O—PF6ADC3_IN4/FSMC_NIORD— 19PF7I/O—PF7ADC3_IN5/FSMC_NREG— 20PF8I/O—PF8ADC3_IN6/FSMC_NIOWD— 21PF9I/O—PF9ADC3_IN7/FSMC_CD— 22PF10I/O—PF10ADC3_IN8/FSMC_INTR— 23OSC_INI—OSC_IN— — 24OSC_OUTI—OSC_OUT—— 25NRSTI/O—NRST—— 26PC0I/O—PC0ADC123_INI0— 27PC1I/O—PC1ADC123_INI1— 28PC2I/O—PC2ADC123_INI2— 29PC3I/O—PC3ADC123_INI3— 30VSSAS—VSSA—— 31VREF-S—VREF-—— 32VREF+S—VREF+—— 33VDDAS—VDDA—— 34PA0WKUPI/O—PA0WKUP/USART2_CTS ADC123_IN0 TIM2_CH1_ETR TIM5_CH1/TIM8_ETR— 35PA1I/O—PA1USART2_RTS ADC123_IN1 TIM5_CH2/TIM2_CH2— 36PA2I/O—PA2USART2_TX/TIM5_CH3 ADC123_IN2/TIM2_CH3— 37PA3I/O—PA3USART2_RX/TIM5_CH4 ADC123_IN3/TIM2_CH4— 38VSS_4S—VSS_4—— 39VDD_4S—VDD_4—— 40PA4I/O—PA4SPI1_NSS USART2_CK DAC_OUT1/ADC12_IN4— 41PA5I/O—PA5SPI1_SCK DAC_OUT2/ADC12_IN5— 42PA6I/O—PA6SPI1_MISO TIM8_BKIN/ADC12_IN6 TIM3_CH1TIM1_BKIN 43PA7I/O—PA7SPI1_MOSI TIM8_CH1N/ADC12_IN7 TIM3_CH2TIM1_CH1N 44PC4I/O—PC4ADC12_IN14— 45PC5I/O—PC5ADC12_IN15— 46PB0I/O—PB0ADC12_IN8/TIM3_CH3 TIM8_CH2NTIM1_CH2N 47PB1I/O—PB1ADC12_IN9/TIM3_CH4 TIM8_CH3NTIM1_CH3N 48PB2I/OFTPB2/Boot1— — 49PF11I/OFTPF11FSMC_NIOS16— 50PF12I/OFTPF12FSMC_A6— 注意: (1) I=输入(Input); O=输出(Output),S=电源(Supply)。 (2) FT=可容忍5V电压。 如表3.1所示,处理器在复位后通常保留引脚的默认功能,即大部分都是作为普通的输入/输出引脚使用。芯片提供的强大的引脚复用功能是其灵魂所在,比如可以用作串口通信引脚、ADC采集引脚以及定时器通道引脚等。在STM32F103ZET6这款处理器芯片中,复用功能还可分为默认情况下的复用功能和重映射后的复用功能。这些复用功能的使用都需要提前对引脚的输入/输出模式以及时钟等进行正确的配置,而重映射的配置则比默认复用功能的配置多一些步骤。可能有读者了解过STC12或者STC15系列的单片机,这些单片机的引脚在使用时也需要对输入/输出模式等进行配置,但是配置寄存器数目相对较少,就其复杂程度和功能而言远不如STM32系列处理器。 3.2.2系统架构 STM32F103ZET6的系统架构如图3.3所示,其主要由以下部件构成: (1) CortexM3内核DCode总线和系统总线。 (2) 通用DMA1和通用DMA2。 (3) 内部SRAM。 (4) 内部闪存存储器。 (5) FSMC。 (6) AHB到APB的桥(AHB2APBx),它连接所有的APB设备。 图3.3STM32F103ZET6的系统架构 这些部件都是通过一个多级的AHB总线架构相互连接的,该总线架构的主要组成部分及其功能如表3.2所示。 表3.2AHB总线架构的主要组成部分及其功能 名称功能 ICode总线此总线将CortexM3内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成 DCode总线此总线将CortexM3内核的DCode总线与闪存存储器的数据接口相连接(用于常量加载和调试访问) 系统总线此总线连接CortexM3内核的系统总线(外设总线)到总线矩阵,总线矩阵负责协调内核和DMA间的访问 DMA总线此总线将DMA的AHB主控接口与总线矩阵相连,总线矩阵负责协调CPU的DCode和DMA到SRAM、闪存和外设的访问 总线矩阵总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁采用轮换算法。在互联型产品中,总线矩阵包含5个驱动部件(CPU的DCode、系统总线、以太网DMA、DMA1总线和DMA2总线)和3个从部件(闪存接口FLITF、SRAM和AHB2APB桥)。在其他产品中总线矩阵包含4个驱动部件(CPU的DCode、系统总线、DMA1总线和DMA2总线)和4个被动部件(FLITF、 SRAM、 FSMC和AHB2APB桥) AHB/APB桥(APB)两个AHB/APB桥在AHB和两个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2全速操作,最高为72MHz 3.2.3主要特性 STM32F103ZET6的处理性能优越,应用广泛。下面列出该处理器的主要特性。 (1) 内核。 ① 基于ARM的CortexM3架构的32位处理器,最高工作频率为72MHz。 ② 能做单周期乘法和硬件除法。 (2) 存储器。 ① 512KB的闪存。 ② 64KB的SRAM。 ③ 带有4个片选信号的灵活的静态存储器控制器(FSMC),可支持Compact Flash、SRAM、PSRAM、NOR和NAND存储器扩展。 (3) 时钟、复位和电源管理。 ① 芯片和I/O引脚的供电电压为2.0~3.6V。 ② 上电/断电复位(POR/PDR)、可编程电压检测器(PVD)。 ③ 4~16MHz晶体振荡器。 ④ 内嵌有经过出厂调校的8MHz的RC振荡器。 ⑤ 内嵌有带校准的40kHz RC振荡器。 ⑥ 带校准功能的32kHz RTC振荡器。 (4) 低功耗。 ① 支持睡眠、停机和待机模式。 ② VBAT为RTC和后备寄存器供电。 (5) 拥有3个12位模数转换器(ADC)。 (6) 拥有2个12位数模转换器(DAC)。 (7) DMA控制器。 ① 12通道DMA控制器。 ② 支持的外设包括定时器、ADC、DAC、SDIO、I2S、SPI、I2C和USART。 (8) 调试模式。 ① 串行单线调试(SWD)和JTAG接口。 ② CortexM3嵌入式跟踪宏单元(ETM)。 (9) 快速I/O接口(PA~PG)。 拥有多达7个快速I/O接口,每个接口包含16根I/O引脚,所有I/O引脚都可以映像到16个外部中断。几乎所有接口均可容忍5V信号。 (10) 多达11个定时器。 拥有4个16位通用定时器、2个16位PWM定时器、2个看门狗定时器、系统滴答定时器和2个16位基本定时器。 (11) 多达13个通信接口。 拥有2个I2C接口、5个USART接口、3个SPI接口、1个CAN接口、1个USB 2.0全速接口和1个SDIO接口。 (12) 拥有循环校验码(CRC)计算单元。 (13) 工作温度: -40~+105℃。 由上述特性可以看出,STM32F103ZET6处理器的内部资源非常丰富,尤其是定时器和通信接口等资源。STM32F103ZET6芯片由于功能强大,且具有的低功耗等特点,非常适合用于医疗器械和工业控制等应用领域。 3.3STM32F103ZET6的时钟树 时钟结构是处理器整体结构的重要组成部分。STM32系列处理器共有5个时钟源,分别为高速内部时钟(High Speed Internal,HSI)、高速外部时钟(High Speed External,HSE)、低速内部时钟(Low Speed Internal,LSI)、低速外部时钟 (Low Speed External,LSE)和锁相环倍频输出(Phase Locked Loop,PLL)。由于STM32F103ZET6的时钟系统为树状结构,故也称为时钟树,具体如图3.4所示。在STM32F103ZET6处理器中主要的时钟及其简要说明如表3.3所示。由如图3.4所示的时钟树结构,可得出以下结论: 图3.4时钟内部结构与原理图 (1) HSI、HSE 或PLL可用来驱动系统时钟(SYSCLK)。 (2) LSI、LSE作为二级时钟源。40kHz低速内部RC时钟(LSI)可以用于驱动独立看门狗和通过程序选择驱动RTC。 (3) 用户可通过多个预分额器配置AHB、高速APB(APB2)和低速APB(APB1)的频率。其中,AHB和APB2的最高频率是72MHz,APB1的最高频率是36MHz。 (4) RCC将AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。 (5) ADC时钟由高速APB2时钟经2分频、4分频、6分频或8分频后获得。 (6) SDIO 接口的时钟频率固定为HCLK/2。 (7) 定时器时钟频率分配由硬件分为两种情况自动设置。如果相应的APB预分额系数是1,定时器的时钟频率与所在APB总线频率一致; 否则定时器的时钟频率被设为与其相连的APB总线频率的2倍。 (8) 当某个部件不被使用时,任一个时钟源都可被独立地启动或关闭,由此可优化系统功耗。 表3.3STM32F103ZET6的主要时钟及其简要说明 时 钟 名 称简 要 说 明 HSE时钟高速外部时钟(HSE)可以由外部晶体或陶瓷谐振器产生,也可以由用户外部时钟产生。一般采用外部晶体或陶瓷谐振器产生HSE时钟。在OSC_IN和OSC_OUT引脚之间连接4~16MHz外部振荡器为系统提供精确的主时钟 HSI时钟HSI时钟由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟,并且它的启动时间比HSE晶体振荡器短。然而由于其时钟频率精度较差,HSI时钟常作为备用时钟源 PLL时钟内部PLL可以用来倍频HSI RC的输出时钟或HSE晶体输出时钟。PLL的设置必须在其被激活前完成。在PLL被激活之后,这些参数不能被改动。如果需要在应用中使用USB接口,那么PLL必须被设置为输出48MHz或72MHz时钟,用于提供48MHz的USBCLK时钟 LSE时钟LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源 LSI时钟LSI RC担当着低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率约为40kHz(在30~60kHz) 系统时钟(SYSCLK)系统复位后,HSI振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生 RTC时钟通过设置备份域控制寄存器(RCC_BDCR)中的RTCSEL[1:0]位,RTCCLK时钟源可由HSE/128、LSE或LSI时钟提供 看门狗时钟如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG 由图3.4和表3.3可看出,STM32F103ZET6处理器具有多个时钟频率,分别供给内核和不同外设模块使用。其中高速时钟用于中央处理器等高速设备,低速时钟用于外设等低速设备。STM32处理器因为低功耗的需要,各个模块可分别独立开启时钟。因此,当需要使用某个外设模块时,就要先使能该模块对应的时钟。这一点也需要格外注意,在实际开发中很容易因时钟设置的疏忽而导致外设不能工作。 3.4STM32F103ZET6存储器组织及其映像 程序存储器、数据存储器、寄存器和输入/输出接口被组织在同一个4GB的线性地址空间范围内。可访问的存储器空间被分成8个主要块,每个块大小为512MB,具体如表3.4所示。其他没有分配给片上存储器和外设的存储器空间都是保留的地址空间。同时数据字节以小端格式存放在存储器中。一个字中的最低地址字节是该字的最低有效字节,而最高地址字节是最高有效字节。 表3.44G存储器空间划分 序号用途地 址 范 围 Block0Flash0x0000 0000~0x1FFF FFFF(512MB) Block1SRAM0x2000 0000~0x3FFF FFFF(512MB) Block2片上外设0x4000 0000~0x5FFF FFFF(512MB) Block3FSMC bank1 & bank20x6000 0000~0x7FFF FFFF(512MB) Block4FSMC bank3 & bank40x8000 0000~0x9FFF FFFF(512MB) Block5FSMC寄存器0xA000 0000~0xCFFF FFFF(512MB) Block6未使用0xD000 0000~0xDFFF FFFF(512MB) Block7CortexM3内部外设0xE000 0000~0xFFFF FFFF(512MB) 8个主要块中最重要的是Block0、Block1和Block2,Block0用于设计Flash。STM32F03ZET6处理器的Flash最大为512KB,包含Flash、预留、系统存储器、选项字节、boot设置。Block1用于设计SRAM,STM32F103ZET6处理器的SRAM最大为64KB; Block2用于片内外设,包括APB1、ABP2、AHB和部分预留空间。STM32F103ZET6中内置外设的地址范围如表3.5所示。除去部分保留未使用的地址空间外,大部分地址范围均可以供给用户开发使用。 表3.5内置外设的地址范围 地 址 范 围外设总线 0x5000 0000~0x5003 FFFFUSB OTG 全速 0x4003 0000~0x4FFF FFFF保留 0x4002 8000~0x4002 9FFF以太网 0x4002 3400~0x4002 3FFF保留 0x4002 3000~0x4002 33FFCRC循环校验码 0x4002 2000~0x4002 23FF闪存存储器接口 0x4002 1400~0x4002 1FFF保留 0x4002 1000~0x4002 13FF复位和时钟控制(RCC) 0x4002 0800~0x4002 0FFF保留 0x4002 0400~0x4002 07FFDMA2 0x4002 0000~0x4002 03FFDMA1 0x4001 8400~0x4001 7FFF保留 0x4001 8000~0x4001 83FFSDIO AHB 0x4001 4000~0x4001 7FFF保留 0x4001 3C00~0x4001 3FFFADC3 0x4001 3800~0x4001 3BFFUSART1 0x4001 3400~0x4001 37FFTIM8定时器 0x4001 3000~0x4001 33FFSPI1 0x4001 2C00~0x4001 2FFFTIM1定时器 0x4001 2800~0x4001 2BFFADC2APB2 0x4001 2400~0x4001 27FFADC1 0x4001 2000~0x4001 23FFGPIO接口G 0x4001 2000~0x4001 23FFGPIO接口F 0x4001 1800~0x4001 1BFFGPIO接口E 0x4001 1400~0x4001 17FFGPIO接口D 0x4001 1000~0x4001 13FFGPIO接口C 0x4001 0C00~0x4001 0FFFGPIO接口B 0x4001 0800~0x4001 0BFFGPIO接口A 0x4001 0400~0x4001 07FFEXTI 0x4001 0000~0x4001 03FFAFIO APB2 0x4000 7800~0x4000 FFFF保留 0x4000 7400~0x4000 77FFDAC 0x4000 7000~0x4000 73FF电源控制(PWR) 0x4000 6C00~0x4000 6FFF后备寄存器(BKP) 0x4000 6800~0x4000 6BFFbxCAN2 0x4000 6400~0x4000 67FFbxCAN1 0x4000 6000~0x4000 63FFUSB/CAN共享的512B SRAM 0x4000 5C00~0x4000 5FFFUSB全速设备寄存器 0x4000 5800~0x4000 5BFFI2C2 0x4000 5400~0x4000 57FFI2C1 0x4000 5000~0x4000 53FFUART5 0x4000 4C00~0x4000 4FFFUART4 0x4000 4800~0x4000 4BFFUSART3 0x4000 4400~0x4000 47FFUSART2 0x4000 4000~0x4000 3FFF保留 0x4000 3C00~0x4000 3FFFSPI3/I2S3 0x4000 3800~0x4000 3BFFSPI2/I2S2 0x4000 3400~0x4000 37FF保留 0x4000 3000~0x4000 33FF独立看门狗(IWDG) 0x4000 2C00~0x4000 2FFF窗口看门狗(WWDG) 0x4000 2800~0x4000 2BFFRTC 0x4000 1800~0x4000 27FF保留 0x4000 1400~0x4000 17FFTIM7定时器 0x4000 1000~0x4000 13FFTIM6定时器 0x4000 0C00~0x4000 0FFFTIM5定时器 0x4000 0800~0x4000 0BFFTIM4定时器 0x4000 0400~0x4000 07FFTIM3定时器 0x4000 0000~0x4000 03FFTIM2定时器 APB1 表3.5中每个地址范围的第一个地址为对应外设的首地址,该外设的相关寄存器地址都可以用“首地址+偏移量”的方式找到其绝对地址。 3.5最小系统 处理器CPU的最小系统就是让处理器能正常工作并发挥其功能时所必需的组成部分,也可理解为处理器能正常运行的最小环境。最小系统一般分为5个部分,分别为: (1) 处理器芯片。运行任务程序及执行相应的控制动作。 (2) 时钟电路。为处理器运行程序提供时钟源。 (3) 复位电路。使处理器内部各个模块处于确定的初始状态。 (4) 系统电源。提供系统工作电源。 (5) 调试电路。提供运行程序的下载和运行监控。 要使STM32处理器能正常运行,必须具备以上5个电路。由于STM32处理器内部已经集成了时钟电路和调试电路,所以STM32处理器只需带有复位电路和提供工作电源,便可正常运行。但是为了让STM32处理器能提供灵活、可靠、稳定、抗干扰性较强的控制动作,最小系统可能还需具备其他附加电路。在此以STM32F103ZET6处理器为例,介绍一个完整的最小系统实例。 3.5.1复位电路 图3.5复位电路 如图3.5所示,最简单的复位电路可由电容串联电阻构成,其基本原理为电容的充放电过程。我们知道,电容的电压不能突变,当系统上电时处理器的RST脚将会出现一个持续的高电平,并且这个高电平持续的时间由电路的电容值的充电过程决定。STM32处理器的RST脚检测持续20μs以上的高电平后,就会对处理器进行复位操作。所以适当组合RC的取值就可以保证系统可靠的复位。 3.5.2时钟电路 如图3.6所示,为了提供更为精准的时钟信号,处理器可采用外置时钟电路,其主要由晶振、电容和电阻构成。处理器内部振荡器在外部接续晶振和电容的作用下产生自激振荡,为处理器提供8MHz的正弦信号。时钟电路相当于处理器的心脏,它的每次跳动,也称振荡节拍,都控制着处理器执行代码的工作节奏。振荡节拍慢时系统工作速度就慢,振荡节拍快时系统工作速度就快。 图3.6主时钟电路 在很多控制系统中都要用到实时时钟(Real Time Clock,RTC)电路,而确保RTC工作计时准确的关键部分就是32.768kHz的晶体振荡电路。STM32F1处理器除了具有主时钟电路外,还内置了RTC时钟。只需要在OSC32IN和OSC32OUT两引脚间外接晶振即可实现。如图3.7所示,可采用基于EPSON的FC135/FC135R贴片音叉晶振或使用C2系列圆柱体晶振(32.768kHz)搭建的晶振电路产生32.768kHz的正弦波以提供实时时钟信号。 图3.732.768kHz RTC晶振外接电路图 3.5.3电源DCDC转换电路 由于STM32F1处理器电源采用3.3V供电。一般常用的电源是5V。如TTL电平也为5V,市场售卖的电源和USB接口提供的均是5V,所以需要对电压进行降压处理。此DCDC电路使用了AMS11173.3 DCDC转换芯片,可将5V转换为3.3V提供处理器使用。其具体DCDC转换电路如图3.8所示。 图3.8直流DCDC电源转换电路 3.5.4系统调试电路JTAG 系统调试电路JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议,主要用于芯片内部测试以及对系统进行仿真和调试。JTAG技术是一种嵌入式调试技术,它在处理器芯片内部封装了专门的测试电路TAP(Test Access Port,测试访问口),通过专用的 JTAG 测试工具对内部节点进行测试。目前大多数比较复杂的器件都支持 JTAG协议,如ARM、DSP和FPGA器件等均支持JTAG。标准的JTAG接口具有4线数据信号: TMS、TCK、TDI和TDO,分别对应为测试模式选择、测试时钟、测试数据输入和测试数据输出。JTAG测试也允许多个器件通过JTAG接口串联在一起联调,形成一个JTAG链,能分别实现对各个器件的测试。JTAG接口还常用于实现ISP(InSystem Programmable,在系统编程)功 图3.9JTAG 14针接口定义和信号名称 能,如对Flash器件进行编程等。通过JTAG接口,可对芯片内部的所有部件进行访问,因而它是开发调试嵌入式系统的一种简洁高效的手段。目前 JTAG 接口的连接器有两种标准,即 14 针接口和 20 针接口连接标准,其具体引脚定义分别如图3.9与图3.10以及表3.6与表3.7所示。 图3.10JTAG 20针接口定义引脚 表3.6JTAG 14针接口引脚定义 引脚和信号信 号 定 义 1、13VREF接电源 2、4、6、8、10、14GND 接地 3TRST_N测试系统复位信号 5TDI测试数据串行输入 7TMS测试模式选择 9TCK测试时钟 11TDO测试数据串行输出 12SRST_N目标系统复位信号 表3.7JTAG 20 针接口定义引脚名称描述 引脚和信号信 号 定 义 1 VREF目标板参考电压,接电源 2 nc未连接 3 TRST_N测试系统复位信号 4、6、8、10、12、14、16、18、20GND 接地 5 TDI测试数据串行输入 7 TMS测试模式选择 9 TCK测试时钟 11 RTCK测试时钟返回信号 13 TDO测试数据串行输出 15 SRST_N目标系统复位信号 17、19 nc未连接 3.5.5其他辅助电路 通常在设计控制系统时,为保证系统稳定工作,常在所有的电源引脚旁边放置一个0.1μF的电容滤波,用来滤除电源的噪声杂波。具体连接如图3.11所示。 图3.11电源高频噪声杂波滤波电路 在复位后程序启动,如图3.12所示,通常可使用Boot0/Boot1均置为0,即均为低电平。CortexM3内核的器件有3种启动方式,CortexM4有4种,可通过Boot0、Boot1引脚的电平进行选择。如第2章所述,STM32的3种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存(芯片内置的Flash); SRAM(芯片内置的RAM区),也称为内存; 系统存储器,即芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,也就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区,它是使用USART1作为通信接口。 图3.12Boot0/Boot1设置和对应启动模式 应用系统通常还需要设计状态LED指示电路。如图3.13所示,两盏状态指示灯LED1和LED2进行系统工作状态的显示。LED1和LED2分别与主芯片的GPIO引脚连接,串联电阻为限流电阻,防止电流过大损坏发光二极管。LED指示灯数量可根据应用需求增减。 图3.13状态指示灯LED1和LED2电路 键盘是用于操作设备运行的一种指令和数据输入装置,也指经过系统安排操作一台机器或设备的一组功能键。键盘是计算机最常用也是最主要的输入设备,通过键盘可以将英文字母、数字以及标点符号等输入到系统中,从而向处理器发出命令以及输入数据等。如图3.14所示,键盘的设计非常简单,但是必须配以处理器驱动程序才能完成相关功能。另外,为防止按键抖动,常常还配以防抖动辅助电路。防抖动辅助功能可以采用硬件电路或软件来实现。 图3.14键盘4×4矩阵电路示意图 数码管显示电路也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,由管内的气体种类决定,一般都是橙色或绿色。如图3.15所示,数码管动态显示器是应用系统中最为广泛的一种显示器,常用数码管引脚定义如图3.15所示。数码管的8个显示笔画A、B、C、D、E、F、G、DP,用于显示日常生活和工作中实用的数字和小数点。也可利用多个数码管排列显示各种数值。 图3.15数码管示意图 如图3.15中的A、B、C、D、E、F、G、DP分别可与处理器的GPIO接口或驱动IC集成电路相连,用来控制显示数字的形状。Q3、Q4、Q5、Q6、Q7、Q8这6个三极管是用来驱动和片选数码管,用于打开或关闭某一位数码管的显示。RA1、RA0、RA3、RA2、RA5、RA4分别接在处理器的其他GPIO接口上,通过控制这些三极管的基极电平来打开或关闭数码管的显示,即起到“使能”作用。其电路原理如图3.16所示。 图3.16多位数码管设计电路 3.6STM32最小系统和拓展实验平台 如图3.17所示为一款简单实用完整的最小系统。在该最小系统电路中,除处理器CPU电路、晶振电路、电源电路等必要的电路外,还设计了LED电路、数码管电路、按键电路和LCD电路等拓展辅助功能电路。 LED电路包含12个可编程使用的LED灯,其分别连接于CPU芯片的PE5、PE6、 PF0~PF8和PF12接口 引脚。另外,LED灯可以根据颜色分为3组,分别对应红、绿、黄这3种颜色,可用于编程模拟交通灯的功能。由电路图可以看出,发光二极管LED0~LED11的正极均通过限流电阻连接于3.3V电源,负极则直接连在GPIO引脚上。因此在用户编程时,若使某个GPIO引脚输出信号为低电平,则对应的LED灯亮; 反之输出高电平,则LED灯灭。 数码管电路包含两个可供编程使用的数码管,每个数码管通过移位寄存器74HC595芯片连接于CPU芯片的GPIO引脚。其中74HC595芯片的引脚功能描述如表3.8所示。例如,数码管P1连接74HC595芯片U6的1~7脚,U6的11、12、14脚连接CPU芯片的PA7、PA6、PA5。如此便可以通过CPU芯片来控 制74HC595芯片的输出,再以此 图3.17实验最小系统电路图 输出来驱动数码管显示。此外,还需要注意,此电路中使用的是共阴极数码管,因此其公共端需要接地处理。 表3.874HC595 IC引脚功能描述 符号引脚描述 Q0~Q715脚、1~7脚8位并行数据输出 GND8脚地 SOUT9脚串行数据输出 MR#10脚主复位(低电平有效) SH_CP11脚数据输入时钟线 ST_CP12脚输出存储器锁存时钟线 OE#13脚输出有效(低电平有效) SIN14脚串行数据输入 VCC16脚电源 按键电路包含4个独立按键,即KEY_UP、KEY1、KEY2、KEY3。由电路图可以看出,4个按键的一端分别连接于CPU芯片的PA0、PE2、PE3、PE4引脚,而另一端的接法稍有区别。其中,按键KEY_UP的另一端直接连接于3.3V电源,而按键KEY1~KEY3的另一端则直接接地。因此,当我们使用按键时,对于电路接法不同的按键常常要使用不同的初始化配置。就STM32F103ZET6这款芯片而言,如果需要使用这4个按键,则要提前将PA0配置为下拉输入模式,并将PE2~PE4配置为上拉输入模式。LCD电路提供了一组LCD接口用于外接LCD显示屏。当需要使用LCD模块时,只需要将特定的LCD模块插入如图3.17所示的LCD接口,然后即可通过GPIO引脚初始化和控制LCD模块的显示,操作起来非常方便实用。 3.7STM32实验环境构建 由于STM32开发板上已经设计了一键下载电路,因此硬件实验环境构建特别简单,主要分为以下几步: (1) 置启动模式。Boot1接GND,Boot0接VCC,配置从系统存储器启动。Boot原理图如图3.18所示,也就是将1脚和3脚、4脚和6脚分别短接。一般来说,也就是为了从串口下载程序。 (2) 连接USB转串口芯片与主芯片的对应引脚。串口接线原理如图3.19所示。转串口芯片的TXD和RXD这两个引脚并未直接与STM32F103ZET6的USART1对应引脚相连,中间隔了一个标准的排针接口。因此,如果想要利用USART1下载程序,需要将1脚和2脚、3脚和4脚分别短接。 (3) 用USB线连接开发板与PC端。USB接口原理图如图3.20所示。由于使用了一键下载电路,我们只需要利用一根USB线就可以实现供电和通信这两大功能,接线特别方便、简单,不需要额外连接串口线。开发板的USB接口采用的是mini USB,该接口和信号线的实物图分别如图3.21和图3.22所示。 图3.18Boot原理图 图3.19串口接线原理图 图3.20USB接口原理图 图3.21mini USB接口 经过上述的几个步骤以后,STM32的硬件实验环境已经构筑完成,下面只需要进行软件开发环境的配置。实际开发系统的实物如图3.23所示。 图3.22mini USB信号连接线 图3.23实验系统连接与开发示意图 3.8STM32软件开发与仿真环境构建 1. MDK软件安装 首先从Keil官网获取MDK软件安装包。安装包是一个扩展名为.exe的可执行文件,本节中均以MDK5.27版本为例。下载完成之后,单击mdk527.exe文件进行安装,如图3.24所示。 图3.24MDK5.27安装界面 然后单击Next按钮,进入License Agreement界面,如图3.25所示,选择同意协议内容。 图3.25License Agreement界面 接着单击Next按钮,选择软件安装路径,如图3.26所示。这里选择创建一个Keil_v5文件夹,同时应注意文件夹不要命名为中文或带有空格。 再单击Next按钮,填写个人信息,如图3.27所示。 填完信息之后再单击Next按钮就正式开始了软件安装,安装界面如图3.28所示。 软件安装成功后单击Finish按钮会弹出Pack Installer界面,如图3.29所示。这里单击关闭按钮即可,因为我们后面会通过已下载好的包进行安装。 图3.26安装路径选择 图3.27填写个人信息 图3.28软件安装界面 图3.29Pack Installer界面 2. STM32F1器件包安装 我们需要从Keil官网获取STM32F1系列芯片的器件包,下载完成后如图3.30所示。双击其中的Keil.STM32F1xx_DFP.2.3.0文件即可进行安装。安装界面如图3.31所示,单击其中的Next按钮开始安装,过程也比较简单。 图3.30STM32F1系列芯片的器件包 图3.31STM32F1器件包安装 在用Keil创建实际工程时都会弹出如图3.32所示的设备选择界面。如果器件包安装成功了,其中就会有STM32F1系列芯片供选择。 图3.32设备选择界面 3. 安装USB转串口驱动 本节中使用的转串口芯片是CH340系列,驱动文件可以从沁恒微电子官网获取。下载成功后得到一个名为CH341SER.INF的文件,双击该文件进行安装。驱动安装界面如图3.33所示,单击“安装”按钮即可。如果没有安装驱动会导致计算机无法识别串口,也就无法通过串口下载程序。 安装成功后会弹出提示对话框,如图3.34所示。 图3.33驱动安装 图3.34驱动安装成功 4. FlyMcu软件配置 通常使用FlyMcu软件利用串口将程序下载至STM32中。其中FlyMcu是免安装的,直接双击打开即可,软件界面如图3.35所示。同时还需要打开STM32的电源,这样串口才能被检测到并用于下载程序。 图3.35FlyMcu软件界面 此外,使用该软件时有以下几点需要注意: (1) 对于STM32F1系列芯片来说波特率可设置为任意值。 (2) 选中“校验”和“编程后执行”这两个选项,不要选中“编程到FLASH时写选项字节”。 (3) 在界面下方选择“DTR高电平复位,RTS高电平进BootLoader”。当单击打开FlyMcu的下拉列表框时,可以看到有很多不同的配置方案,如图3.36所示。这里之所以这样选择,其实是与一键下载电路的电路结构有关,如图3.37所示。FlyMcu通过USB信号线控制CH340转串口芯片的DTR和RTS引脚的输出,这两个输出进而控制Q1和Q2的导通与截止,从而进一步影响RESET和BOOT0这两个引脚的电平。这样就实现了一键下载功能。 图3.36DTR和RTS配置 图3.37一键下载电路原理图 5. 固件库文件下载 固件库文件可以从ST的官网处获取,用于移植到STM32工程中。本节中使用的是V3.5.0版本,固件库解压后文件夹名称为STM32F10x_StdPeriph_Lib_V3.5.0,其目录结构如图3.38所示。 图3.38固件库文件目录结构 其中,_htmresc文件夹中是一些官方的logo图片,Project文件夹中是官方模板工程示例,Utilities文件夹中是官方评估模板例程,Libraries文件夹中则是移植工程时需要用到的固件库的相关源码。 6. 新建工程模板 (1) 首先新建一个文件夹,后面所建立的工程都可以放在这个文件夹中,这里将之命名为STM32_Project。 (2) 单击Project→New μVision Project菜单命令,如图3.39所示。然后将目录定位到刚才建立的STM32_Project文件夹之下。先在这个文件夹下建立子文件夹Project,再定位到Project文件夹下,将工程命名为Template,单击“保存”按钮,如图3.40所示。 图3.39新建工程 图3.40定义工程名称 接下来会出现一个选择CPU的界面,也就是选择芯片型号,如图3.41所示。因为使用的主芯片CPU为STM32F103ZET6,所以在这里选择STMicroelectronics→STM32F1 Series→STM32F103→STM32F103ZET6。 图3.41选择芯片型号 (3) 单击OK按钮,MDK会弹出Manage RunTime Environment对话框,如图3.42所示。 图3.42Manage RunTime Environment对话框 这是 MDK5新增的一个功能,在这个界面中可以添加自己需要的组件,从而方便构建开发环境。在这里直接单击Cancel按钮即可,然后得到如图3.43所示的界面。 图3.43工程初步建立 至此,我们只是创建了一个框架,还需要添加启动代码,以及相关的.c文件等。 (4) 现在可以看到Project文件夹下包含2个文件夹和2个文件,如图3.44所示。 图3.44工程Project目录文件 在此必须说明,Template.uvoptx是工程文件,不能轻易删除。Listings和 Objects文件夹是MDK自动生成的文件夹,用于存放编译过程产生的中间文件。为了与MDK5.1之前版本工程兼容,在此把两个文件夹删除。新建一个OBJ文件夹,用来存放编译中间文件。 (5) 在STM32_Project文件夹下新建3个文件夹,分别是CORE、OBJ和STM32F10x_FWLib,如图3.45所示。CORE用来存放核心文件和启动文件,OBJ用来存放编译过程文件以及.hex文件,STM32F10x_FWLib用来存放ST官方提供的库函数源码文件。已有的Project文件夹除了用来放工程文件外,还用来存放主函数文件main.c以及system_stm32f10x.c 等其他文件。 图3.45工程目录 (6) 将官方固件库中的源码文件复制到建立的工程目录下面。打开官方固件库包,定位到之前准备好的固件库包的目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下面,将该目录下面的src、inc文件夹复制到刚才建立的STM32F10x_FWLib文件夹下面,如图3.46所示。其中src存放固件库的相关.c文件,inc存放对应的.h文件。 图3.46官方库源码文件夹 (7) 将固件库中相关的启动文件复制到工程目录CORE之下,具体如表3.9所示。复制成功后CORE文件夹如图3.47所示。 表3.9CORE文件夹所需文件 源文件所在目录文件名 STM32F10x_StdPeriph_Lib_V3.5.0\\ Libraries\\CMSIS\\CM3\\CoreSupportcore_cm3.c、core_cm3.h STM32F10x_StdPeriph_Lib_V3.5.0\\ Libraries\\CMSIS\\CM3\\DeviceSupport\\ ST\\STM32F10x\\startup\\armstartup_stm32f10x_hd.s 图3.47CORE文件夹 (8) 将固件库中的相关文件复制到Project文件夹下,具体如表3.10所示。复制成功后Project文件夹如图3.48所示。 表3.10Project文件夹所需文件 源文件所在目录文件名 STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\ CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10xstm32f10x.h、system_stm32f10x.c、system_stm32f10x.h STM32F10x_StdPeriph_Lib_V3.5.0\\Project\\ STM32F10x_StdPeriph_Templatemain.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 图3.48Project文件夹中的文件 (9) 前面8个步骤,将需要的固件库相关文件复制到了自己的工程目录下面。下面再将这些文件加入自己的工程中去。右击Target1,选择Manage Project Items,如图3.49所示。 图3.49选择Manage Project Items (10) 弹出如图3.50所示界面后,在Project Targets一栏中将Target名字修改为Template,然后在Groups一栏删掉SourceGroup1,新建3个分组: PROJECT、CORE和FWLIB。最后单击OK按钮,可以看到自己的Target名字以及Groups的情况,如图3.51所示。 图3.50新建分组 图3.51工程主界面 (11) 下面向分组中添加自己工程需要的文件。按照步骤(10)的方法,右击Template,选择Manage Project Items,然后选择需要添加文件的分组。这里第一步选择FWLIB,然后单击右下角的Add Files按钮,定位到刚才建立的目录STM32F10x_FWLib/src,将里面所有的文件选中并单击Add按钮,最后单击Close按钮。可以看到 Files 列表中包含了添加的文件,如图3.52所示。 (12) 用同样的方法,定位到CORE和PROJECT分组,添加需要的文件。这里CORE下面需要添加的文件为core_cm3.c、startup_stm32f10x_hd.s(注意,默认添加时文件类型为.c,也就是添加startup_stm32f10x_hd.s启动文件时,需要选择文件类型为All files才能看得到这个文件),PROJECT下面需要添加的文件为main.c、stm32f10x_it.c和system_stm32f10x.c,分别如图3.53和图3.54所示。如此就把需要添加的文件添加到自己的工程中了,最后单击OK按钮,回到工程主界面。最终的工程结构如图3.55所示。 (13) 接下来选择编译中间文件存放目录。右击Template,单击Options for Target 'Template',如图3.56所示。然后在如图3.57所示的界面中,选择上面新建的OBJ文件夹。注意,如果不设置 Output 路径,那么默认的编译中间文件存放位置就是MDK自动生成的Objects文件夹和Listings文件夹。另外,需选中Create HEX File复选框,这样编译项目代码时才会生成.hex文件。 图3.52添加文件到FWLIB分组 图3.53添加文件到CORE分组 图3.54添加文件到PROJECT分组 图3.55工程结构 图3.56单击Options for Target 'Template' 图3.57选择编译后的存放目录 (14) 接下来还需要配置工程代码的头文件路径。回到工程主菜单,右击Template,单击Options for Target 'Template'。然后选择C/C++选项卡,单击Include Paths 右边的“…”按钮,如图3.58所示。接着会弹出一个添加路径的对话框,如图3.59所示,将图上面的3个目录添加进去,最后单击OK按钮。 图3.58C/C++选项卡 图3.59添加头文件路径 (15) 配置宏定义变量。因为Version 3.5版本的库函数在配置和选择外设时是通过宏定义完成的,所以需要配置一个全局的宏定义变量。按照步骤(14),定位到C/C++选项卡,然后填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”到Define输入框中,如图3.60所示。最后单击OK按钮。 图3.60添加全局宏定义标识符到Define输入框 经过上述的步骤后,工程模板建立完成。下面就可以开始编写代码和调试程序工作了。 7. 编译和下载程序 在进行编译之前,需要打开Project下的main.c文件,编写好主程序,之后可以进行编译。编译结果如图3.61所示,结果显示没有错误。 图3.61编译代码 工程编译成功以后,就可以下载程序到开发板了。下载程序时,只需要在FlyMcu中选择好对应的.hex文件,并且确保配置正确,然后单击“开始编程”按钮就可以进行下载了。如图3.62所示,可以从进度条看到程序下载成功。 运行程序,结果如图3.63所示,可控制点亮12个LED显示灯。 图3.62下载程序 图3.63在基础开发实验板上观看程序运行结果