1、第四章 ARM硬件系统,第一节 STM32微控制器,必备资料,Cortex-M3权威指南 -经典M3教程指导 STM32F10x DATA SHEET 器件参数 Reference Manual 参考手册芯片使用方法 意法半导体官网 ST代理商论坛,STM32F103 VBT6,STM32F103 VBT6,基本特性: 内核:ARM 32位的Cortex-M3 CPU 最高72MHz工作频率 存储器 128K字节的闪存程序存储器 高达16K字节的SRAM 时钟、复位和电源管理 2.03.6伏供电(I/O引脚) 上电/断电复位(POR/PDR)、可编程电压监测器(PVD) 416MHz晶体振
2、荡器 内嵌经出厂调校的8MHz的RC振荡器 内嵌带校准的40kHz的RC振荡器 产生CPU时钟的PLL 带校准功能的32kHz RTC振荡器,低功耗 睡眠、停机和待机模式 VBAT为RTC和后备寄存器供电,STM32F103 VB,睡眠模式 在睡眠模式下,CPU时钟处于停止状态,但是所有的外设继续运行,除非它们被关闭。电源功耗相应地减少。任一中断或唤醒事件可将微处理器从睡眠模式中唤醒。在睡眠模式下,所有的SRAM和寄存器内的内容被保存下来。,停止模式 停止模式是在Cortex-M3的睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的
3、的所有时钟都被停止,PLL、HIS和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。 在停止模式下,通过设置电源控制寄存器(PWR_CR) 使内部调节器进入低功耗模式,能够降低更多的功耗。,待机模式 待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。,RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器( 电池供电)。,2个12位模数转换器 转换范围:0至3.6V 双采样和保持功能 温度传感器,外部接口,
4、DMA: 7通道DMA控制器 支持的外设:定时器、ADC、SPI、I2C和 USART 80个I/O端口(100pins) 26/37/51/80个I/O口,所有I/O口可以映像到 16个外部中断;几乎所有端口均可接受5V信 号,外部接口,调试模式 串行单线调试(SWD)和JTAG接口7个定时器 3个16位定时器 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器 2个看门狗定时器(独立的和窗口型的) 系统时间定时器:24位自减型计数器(systick),外部接口,9个通信接口 2个I2C接口 3个USART接口 2个SPI接口(18M位/秒) CAN接口(2.0B 主动) U
5、SB 2.0全速接口,外部接口,再议GPIO口,回顾:什么是GPIO? GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。,二、STM32F103 GPIO 1、PAPE,共五组GPIO 2、Px0Px15
6、,每组16位,即16个管脚 3、端口复用,并支持重映射,IO口的基本结构,Example:端口配置寄存器,端口配置低寄存器(GPIOx_CRL) (x=AE) 偏移地址:00h 复位值:4444 4444h 用于配置每组端口中的低8位端口,当I/O端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同, 弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态,当I/O端口被配置为输出时: 输出缓冲器被激活 开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高
7、阻状态(P-MOS从不被激活)。 推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。,当I/O端口被配置为复用功能时: 在开漏或推挽式配置中,输出缓冲器被打开 内置外设的信号驱动输出缓冲器(复用功能输出) 密特触发输入被激活 弱上拉和下拉电阻被禁止 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到I/O口状态
8、 在推挽模式时,读输出数据寄存器时可得到最后一次写的值。,跑马灯实验,硬件资源分配: PC6-PC9分别连到4个LED,定义为LED14需将端口配置为输出模式,跑马灯实验,控制过程,点亮LED,相应管脚输出高电平 即相应管脚置1,管脚如何控制?,特殊寄存器(端口配置寄存器),控制GPIO端口用到的寄存器有: 两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH), 两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR), 一个32位置位/复位寄存器(GPIOx_BSRR), 一个32位复位寄存器(GPIOx_BRR) 一个32位锁定寄存器(GPIOx_LCKR)。,端口配置寄存
9、器,端口配置低寄存器(GPIOx_CRL) (x=AE) 偏移地址:00h 复位值:4444 4444h 用于配置每组端口中的低8位端口,端口配置高寄存器(GPIOx_CRH) (x=AE) 偏移地址:04h 复位值:4444 4444h 用于配置每组端口中的高8位端口,例:配置端口C的第6,7,8,9管脚为: 1、通用推挽输出 2、输出速度为50MHzGPIOC-CRL=0x3300 0000 GPIOC-CRH=0x0000 0033,端口输入数据寄存器(GPIOx_IDR) (x=AE) 地址偏移:08h 复位值:00000000h,端口输出数据寄存器(GPIOx_ODR) (x=AE)
10、 地址偏移:0Ch 复位值:00000000h,端口位设置/复位寄存器(GPIOx_BSRR) (x=AE) 地址偏移:10h 复位值:00000000h,端口位复位寄存器(GPIOx_BRR) (x=AE) 地址偏移:14h 复位值:00000000h,例:要求在以上配置的基础上,读出GPIOC管脚的状态,并将其状态反转temp=GPIOC-ODR; GPIOC-ODR=temp;GPIOC-ODR=GPIOC-ODR,if (GPIOx-ODR ,端口配置锁定寄存器(GPIOx_LCKR) (x=AE) 当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位15:0
11、用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP15:0。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。 地址偏移:18h 复位值:0000 0000h,控制过程,点亮LED,相应管脚输出高电平 即相应管脚置1,管脚如何控制?,特殊寄存器(端口配置寄存器) 写入相应值即可控制,定位特殊寄存器,存储器地址,系统总线构架,四个主动单元:Cortex-M3 内核的 ICode 总线(I-bus)、DCode 总线(D-bus)、System 总线(S-bus)和通用 DMA(GP-DMA
12、)。三个被动单元:内部SRAM、内部Flash 存储器、AHB 到 APB 的桥(AHB2APBx,连接所有的 APB 设备)。,总线,ICode总线 该总线将Cortex-M3内核的指令总线与Flash指令接口相连接。指令预取在此总线上完成,DCode总线 该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。,系统总线 连接内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。,总线矩阵 此总线矩阵由三个驱动部件(CPU的DCode、系统总线和DMA总线)和三个被动部件(闪存存储器接口、SRAM和AHB2APB桥)构成。,AH
13、B外设通过总线矩阵与系统总线相连,允许DMA访问,外设寄存器求法,#define PERIPH_BASE (u32)0x40000000),寄存器地址=总线基址+外围总线基址+外设地址偏移量+寄存器偏移量,#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000),#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (
14、APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000),外设寄存器求法,寄存器地址=总线基址+外围总线基址+外设地址偏移量+寄存器偏移量,typedef struct vu32 CRL;vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR; GPIO_TypeDef;,#define GPIOC (GPIO_TypeDef *) GPIOC_BASE),GPIOC-BSRR = 0x0040;,GPIO_SetBits(GPIO_LED, GPIO_
15、Pin_6);,void GPIO_SetBits (GPIO_TypeDef* GPIOx, u16 GPIO_Pin) GPIOx-BSRR = GPIO_Pin; ,typedef struct vu32 CRL;vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR; GPIO_TypeDef;,#define GPIO_LED GPIOC,GPIOC-BSRR = GPIO_Pin_6;,#define GPIO_Pin_6 (u16)0x0040),GPIOC-BSRR = (u16)0x0040),GPIO 端口复用 AFI
16、O,AFIO Alternative Function IO 同一管脚,不仅作为GPIO,也可作为其他特殊功能使用 即 同一管脚,多种应用,使用默认复用功能前必须对端口位配置寄存器编程。对于复用的输入功能,端口可以配置成: 输入模式(浮空、上拉或下拉) 复用功能输出模式:输入驱动器被配置成浮空输入模 式对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。注意: 1、如果把一端口配置成复用输出功能,将使引脚和输出寄存器断开,并和片上外设的输出信号连接。 2、如果软件把一个GPIO脚配
17、置成复用输出功能,但是外设没有被激活,它的输出将不确定。,软件重新映射I/O 复用功能 为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成这时,复用功能就不再映射到它们的原始引脚上了。,当I/O端口被配置为复用功能时: 在开漏或推挽式配置中,输出缓冲器被打开 内置外设的信号驱动输出缓冲器(复用功能输出) 密特触发输入被激活 弱上拉和下拉电阻被禁止 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器,例,采用串口1进行通信,进行必要AFIO的设置,例,采用串口1进行通信,进行必要AFIO的设置GPIO
18、A-CRH=0xB0; GPIOA-CRH=0x0400;或GPIOA-CRH=0x04B0;,复用重映射和调试I/O 配置寄存器(AFIO_MAPR)地址: #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AFIO_BASE (APB2PERIPH_BASE + 0x0000),typedef struct vu32 EVCR;vu32 MAPR;vu32 EXTICR4; AFIO_TypeDef;,地址偏移:04h,如:可以把串口1重新映射到PB6和7口AFIO-MAPR |= 0x04;GPIOB-CRL=0x0B00 0
19、000; GPIOB-CRL=0x4000 0000;或GPIOB-CRL=0x4B00 0000,外部中断/唤醒线 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。,外部中断配置寄存器1-4 (AFIO_EXTICR1-4)分别配置各个端口的外部中断方式,GPIO AFIO固件库,GPIO寄存器结构以及GPIO_TypeDef和AFIO_TypeDef,在文件“stm32f10x_map.h”中定义如下:typedef struct vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; GPIO_TypeDef;,typedef struct vu32 EVCR;vu32 MAPR; vu32 EXTICR4; AFIO_TypeDef;,