当前位置:首页 >> 信息与通信 >>

STM32F2系列技术培训-全集2


STM32F2 新增外设

STM32F2新增功能和外设
? 高速USB OTG模块

? 视频接口
? 加解密功能
? 加密处理器 ? 哈希处理器 ? 随机数产生器

2

STM32F2 USB OTG高速模块
? ? ? ? ? 主机模式下支持高速/全

速/低速 从机模式下支持高速/全速 内嵌专用DMA,支持突发传输 专用4K字节FIFO 支持三种PHY接口
? 片上内嵌全速PHY(和全速OTG模块一样) ? 以I2C接口连接外部全速PHY ? 以ULPI接口连接外部高速PHY

3

STM32F2 USB OTG高速模块 – 主机模式
? 和全速主机模式一样的性能
? 多达12个通道

? 高速协议特有的特性
? PING协议
主机发起PING协议以周期性检查从机是否准备好

? SPLIT协议
主机通过高速HUB连接全速/低速设备时,无须等待设备应答;可 以先作其他通信,过段时间再来检查是否受到外设的应答

? 多传输协议
125uS的微帧时间内对同步传输使用DATA0、DATA1、DATA2 和 MDATA等多种数据PID

4

STM32F2 USB OTG高速模块 – 从机模式
? 和全速从机性能一样

? 新增以下扩展特性
? 多达5个IN端点 ? 多达5个OUT端点 ? EP1_IN和EP1_OUT有各自的中断向量入口

? NYET
? 高速模式下从机收到数据包,如果在接收FIFO中没有 找到足够的空余空间,返回NYET握手信号

5

STM32F2 照相机接口
? 主要性能
? 8/10/12/14位并行接口 ? 连续和快照模式,裁减功能 ? 支持的数据格式有:
? ? ? ? 8/10/12/14逐行扫描视频信号 YCbCr4:2:2逐行扫描视频信号 RGB565逐行扫描视频信号 压缩数据支持JPEG格式

? 在48MHz时钟和8位宽度数据接口配置下可接收
? 15fps的SXGA分辨率每像素2字节的未压缩数据流 ? 30fps的VAG分辨率每像素2字节的未压缩数据流

6

STM32F2 照相机接口(2)
? 外部引脚和框图
? ? ? ? 数据线DCMI_D[0:13] 像素时钟线(极性可编程配置),最快48MHz 行同步信号DCMI_HSYNC 场同步信号DCMI_VSYNC

7

STM32F2 加密处理器原理
? 发送方
? 要发送的明文 ? 加密用的对称密钥

? 接收方
? 解密用的对称密钥
发送方 接收方

明文

加密

密文

密文

解密

明文

对称性密钥

对称性密钥

8

STM32F2 加密处理器特性
? 支持加解密算法
? DES、TDES和AES

? 加解密工作模式
? 电子密码本(Electronic codebook)模式 ? 密码段链接(Cipher block chaining)模式 ? 计数(Counter)模式

? 加解密处理器是AHB2上的外设
? 最高工作频率120MHz

? 支持DMA传输 ? 输出/输出端各有8个字的FIFO
9

STM32F2 加解密处理器框图
产生输入数据 DMA请求 产生输出数据 DMA请求

AES TDES

ECB

CBC

CTR

密钥宽度: 128-, 192- and 256-位

数据交换

数据交换

密钥宽度: 64-, 128- and 192-位

DES

ECB

CBC

密钥宽度: 64-位

加解密处理器
INRIS IFEM
INMIS

IFNF

BUSY

OFFU

OFNE

OUTRIS
OUTMIS

标志

INIM

OUTIM

输出 FIFO
CRYPTO Global interrupt (NVIC)

输入 FIFO

ECB

CBC

10 10

STM32F2 加解密算法特性比较
AES 密钥宽度 数据块大小 128/192/256 位 128 bits DES/TDES 64 位(8位交验) 192/128/64位 (14/16/8位校验) 64 bits 共同特性

处理单块数 据的时间
支持的算法 加密类型 算法结构

14/16/18个 HCLK周期
ECB/CBC/CTR 块加密 迭代-组合网络

16个HCLK周期 48个HCLK周期
ECB/CBC/CTR 块加密 Feistel网络

>> 输入/输出端内嵌各自 FIFO(8*32位) >> 支持数据流自动管理 – DMA >> 内嵌数据交换逻辑以支 持1/8/16/32位数据

11 11

加解密算法各自的应用
? AES加解密算法
? 安全网络路由 ? 无线通信 ? 加密后的数据保存,包括安全智能卡

? DES/TDES加解密算法
? 安全数据/文件传输 ? 电子资金转帐 ? 门控:防止用户的密码和个人信息被非法访问

12

STM32F2 随机数产生器
? 主要特性
? ? ? ? ? 基于连续模拟噪声的随机数产生器 提供32位的随机数 工作于PLL48CLK时钟下 两个连续随机数之间隔为40个PLL48CLK周期 为降低功耗可以关闭它

13

STM32F2 随机数产生器框图
PLL48CLK

RNG
32位随机 数寄存器
LFSR (线形反馈 移位寄存器)

错误管理 时钟检查 错误监测

模拟种子

中断使能位

IM

DRDY

SECS SEIS CECS

CEIS

标致

RNG中断矢量

14 14

STM32F2 哈希处理器
? 主要特性
? 适用于数据完整性和有效性检查 ? AHB2上的外设,最高工作频率120MHz ? SHA-1和MD5算法的快速计算
? SHA-1:66个HCLK周期;MD5:50个HCLK周期

? 32位的输入数据,支持32位/16位/8位/1位的比特流输 入,要求小端对齐方式输入 ? 数据自动交换以遵循SHA1计算的大端输入要求 ? 对输入比特流自动填充到512位以做哈希计算

15

STM32F2 哈希处理器框图
DMA request

HASH

数据交换

输入 FIFO

MD5

SHA-1

哈希值 H0..H4
5x32位

16 x 32位

HMAC 哈希处理器
DINIS BUSY DMAS DCIM DINIM DCIS 标志

HASH Global interrupt (NVIC)

16 16

哈希的应用
? 校验文件或信息的完整性
? 安全哈希算法一个重用应用就是校验信息的完整性,确 定其是否被恶意修改或破坏过。比如可以通过比较传输 之前和之后数据的哈希值来校验 ? 检查信息哈希值的有效真实性,从而确定信息本身的有 效真实性。通常密码都不是以明文形式存储,而是以哈 希值的形式。要确实用户是否合法,只需把用户输入的 密码做哈希运算,再把所得哈希值和存储的密码哈希值 比较即可。

17

STM32F2增强功能和外设
? 外设性能进一步增强
? ? ? ? ? ? 更快的模数转换速度 更低的ADC/DAC工作电压 带日历功能的实时时钟 4K字节的电池备份SRAM 32位定时器 更快的USART和SPI通信速度 更快

更省电 更方便

? JTAG引脚熔断保护 ? 更多的GPIO

更安全

18

串行外设接口 SPI

1

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
2

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
3

SPI总线简介
? SPI(Serial Peripheral Interface)由Motolora提出的一种三 线同步接口,可实现全双工通信。
? 数据传送以字节为单位 ? 并采用高位在前的格式(MSB)

? 硬件接口
? ? ? ?
SCK MOSI MISO CS
MSB MSB LSB LSB

SCK:起同步作用的串行移位时钟 SDO:串行数据输出(MOSI) SDI:串行数据输入(MISO) CS:使能从设备的片选信号

(1) 这种情况下,双方的NSS都配置成输入

4

STM32F2的SPI模块引脚及重映射
SCK SPI1 MOSI MISO NSS SCK SPI2 MOSI MISO NSS SCK SPI3 MOSI MISO NSS PA.5 PA.7/ PB.6 PA.6 PA.4 PB.10/ PB.13/PI.1 PC.3/ PB.15/PI.3 PC.2/ PB.14/PI.2 PB.12/ PI.0/PB.9 PC.10 PC.12/ PB.5 PC.11 PA.4 PB.4/NJTRST PA.15/JTDI PB.3/JTDO PB.4/NJTRST PA.15/JTDI PB.3/JTDO

SPI1和SPI3上某些引脚和JTAG 接口的功能引脚复用,发生冲突: >>把冲突的SPI引脚重映射到其 它GPIO上 >>关闭JTAG调试接口,改用 SWD在开发过程中进行调试烧写 >>调试成功后的应用,关闭JTAG /SWD接口

5

主从设备引脚GPIO配置
? 主从设备都软件管理片选信号时,可以方便动态 地切换主/从关系 ? 引脚配置列表

6

从设备片选引脚的用法(软件控制)
? 软件片选管理
? ? ? ? 片选信号由寄存器控制,对应NSS引脚可作它用 无需配置NSS引脚的GPIO 一旦配置好寄存器,该从设备立马被有效片选 寄存器标志
? SSM @ CR1=1 SSI @ CR1=0

? 库函数使用
? SPI_InitStruct.SPI_NSS = SPI_NSS_Soft ? SPI_InitStruct.SPI_Mode = SPI_Mode_Slave
NSS

从 设 备

SI
SO SCK

7

从设备片选引脚的用法(硬件控制)
? 硬件控制
? 片选信号由引脚外部电平控制 ? NSS引脚GPIO配置为浮空/下拉输入
? NSS引脚可固定接到外部低电平,片选立刻生效 ? NSS引脚可由主设备来控制,何时片选生效取决主设备

? 寄存器标志
? SSM @ CR1=0 SSI @ CR1无意义

? 库函数使用
? SPI_InitStruct.SPI_NSS = SPI_NSS_Hard ? SPI_InitStruct.SPI_Mode = SPI_Mode_Slave
NSS

从 设 备

SI SO SCK

配置成下拉输入, 引脚连接固定的 低电平

NSS

从 设 备

SI SO SCK

配置成浮空输入, 由主设备控制何时 拉低电平

8

主设备片选引脚的用法(软件控制)
? 软件片选管理
? ? ? ? 片选信号由寄存器控制,对应NSS引脚可作它用 无需配置NSS引脚的GPIO 一旦配置好寄存器,该设备立马主有效 寄存器标志
? SSM @ CR1=1 SSI @ CR1=1 ? MSTR @ CR1=1
主 设 备
NSS

MI
MO SCK

? 库函数使用
? SPI_InitStruct.SPI_NSS = SPI_NSS_Soft ? SPI_InitStruct.SPI_Mode = SPI_Mode_Master

? 此时NSS引脚可以配置成普通GPIO去控制从设备(如 果从设备配置成硬件管理片选),那么从设备的片选信 号由主控制
9

主设备片选引脚的用法(硬件控制.方式1)
? 硬件控制
? 片选信号由引脚外部电平控制 ? NSS引脚GPIO配置为浮空/上拉输入
? NSS引脚固定接到外部高电平,立刻主有效 ? NSS引脚可由第三方来控制,何时片选生效取决第三方

? 寄存器标志
? SSM @ CR1=0 SSI @ CR1=无意义 MSTR @ CR1=1

? 库函数使用
? SPI_InitStruct.SPI_NSS = SPI_NSS_Hard ? SPI_InitStruct.SPI_Mode = SPI_Mode_Master
VDD

NSS

主 设 备

MI MO SCK

配置成上拉输入, 引脚连接固定的 高电平

NSS

主 设 备

MI MO SCK

配置成浮空输入 ,由第三方控制 何时拉高电平

注意:拉高之前不能置位MSTR,否则出错?MODF
10

主设备片选引脚的用法(硬件控制.方式2)
? 硬件控制
? ? ? ? 片选该环境中所有其它配置成硬件管理片选的从设备 常用于广播应用 NSS引脚GPIO配置为推拉复用 不适用于多主环境
? 若已有主设备在通信, NSS不能被拉低,并将产生Hard Fault

? 寄存器标志
? SSM @ CR1=0 SSI @ CR1=无意义 MSTR @ CR1=1 ? SSOE @ CR2=1

? 库函数使用
? ? ? ? SPI_InitStruct.SPI_NSS = SPI_NSS_Hard SPI_InitStruct.SPI_Mode = SPI_Mode_Master SPI_SSOutputCmd (SPIx, ENABLE) 如上配置完成后,一旦使能SPI,NSS拉低
? SPI _Cmd(SPIx, ENABLE)

11

主设备片选引脚硬件控制.方式2示意图
主设备配置1:
主设备模式

Slave1
开启SS输出性能
SCK MISOMOSI NSS

Slave2

片选硬件管理 NSS配置成可编程推挽输出 使能NSS输出

SCK MISOMOSI NSS

主设备配置2:
主设备模式 片选软件管理

SCK MISOMOSI NSS

SCK MISOMOSI NSS

NSS配置成GPIO的输出 GPIO控制输出低电平

三个从设备配置:
Master Slave3
从设备模式 片选硬件管理 NSS配置成浮空输入

12

时钟极性和相位
? 四种数据采样时钟延
? CPOL决定时钟空闲时的稳定电平,对主/从都有效
? CPOL=0:空闲时低电平 ? CPOL=1:空闲时高电平

? CPHA决定数据采样时刻
? CPHA=0:第一个时钟延开始采样MSBit ? CPHA=1:第二个时钟延开始采样MSBit

? 注意事项
? 修改CPOL/CPHA之前先要通过复位SPE来关掉SPI ? 主/从通信双方要配置成相同的时钟模式 ? SCK空闲时的电平要和CPOL的设置一致
? CPOL=0:需要下拉SCK引脚 ? CPOL=1:需要上拉SCK引脚

13

四种时钟模式
空闲时间高电平 CPOL=1 空闲时间低电平 CPOL=0

第二个时钟延采样 CPHA=1

空闲时间高电平 CPOL=1 空闲时间低电平 CPOL=0

第一个时钟延采样 CPHA=0

14

SPI时钟波特率
? 主设备决定SPI时钟波特率
? BR[2:0]@SPI_CR1
? fPCLK /i(i=2、4、8、16、32、64、128、256) ? 8个分频因子 ? fPCLK不是CPU频率,而是外设总线频率

? STM32F2的SPI最快时钟30MHz,芯片设计时决定的
? SPI1在APB2上,可获得最高设计频率,30MHz 不同于STM32F1 ? SPI2/3在APB上,可获得的最高频率只有15MHz ? 最高波特率会随着扇出数的增加而相应下降,需增加外部缓冲

? 从设备时钟来自于主设备,但是不能超过自身所 在APB总线频率的一半(max fPCLK/2)
? SPI模式下从设备,无须配置BR[2:0] ? TI模式下从设备,对BR[2:0]的设置,控制trelease

15

STM32F2的SPI支持的数据格式
? LSBFIRST决定MSB还是LSB先移位出去
? LSBFIRST@SPI_CR1= 1:LSB先移位出去 ? LSBFIRST@SPI_CR1= 0:MSB先移位出去

? DFF决定数据帧是8位还是16位
? DFF@SPI_CR1= 0:8位数据帧格式 ? DFF@SPI_CR1= 1:16位数据帧格式

? STM32F2的SPI新增对TI格式的支持
? 寄存器标志 FRF@SPI_CR2 = 1 ? 函数库使用 SPI_TIModeCmd (SPIx, Enable)

16

TI帧格式
? TI模式特性
? 主/从设备的NSS引脚相互连接 ? 主设备在时钟上升沿,驱动NSS产生一个周期的正脉冲后,数据 才开始传输 ? 时钟上升沿驱动输出数据;下降沿锁存数据 ? 四线全双工通信
TI模式下,无论主/从设备: >> 时钟极性/相位自动遵循TI协议要求,无需配置 >> 片选信号自动遵循TI协议,无需配置

17

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
18

主/从模式配置
时钟输入信号
从设备 BR不影响数据传输率 1)设置DFF定义帧长度 2)设置CPOL&CPHA定义时钟模式 3)设置LSBFIRST定义帧格式 4)硬件片选:在通信过程中NSS引脚连到 低电平;软件片选:置位SSM并清零SSI 5)设置FRF选择Moto模式或TI模式 6)清零MSTR并置位SPE 1)标有下划线的步骤都不需要 2)BR不控制数据传输率,但控制MISO 引脚上数据保持时间trelease 主设备 BR决定数据传输率 0)设置BR来决定时钟波特率 1)设置DFF定义帧长度 2)设置CPOL&CPHA定义时钟模式 3)设置LSBFIRST定义帧格式 4)硬件片选:在通信过程中NSS引脚连 到高电平;软件片选:置位SSM和SSI 5)设置FRF选择Moto模式或TI模式 6)置位MSTR和SPE

时钟输出信号

静态配置

TI模式备注

标有下划线的步骤都不需要

备注

在使能主/从之前,就要把时钟空闲电平设置到稳定状态

19

主/从设备收/发操作
从设备 时钟输入信号 BR不影响数据传输率 主设备 时钟输出信号 BR决定数据传输率

发送 接收

写操作时数据被并行装入Tx buffer;收到时 钟信号以及MSB的同时发送。剩余位装入 移位寄存器,TxE置位并产生中断

数据写入Tx buffer则开始发送。发送 MSB的同时其余位送到移位寄存器, TxE置位并产生中断

接收完一帧,数据从移位寄存器送到Rx buffer,RxNE置位并产生中断。读操作返 回buffer中的数据,并清除RxNE 为了保证发送数据流的连续:可以在TxE置位时写入下一个待发送的数据,此时上 一个数据还在移位寄存器和总线上发送。写操作之前,必须确认TxE标志置位; 参见“全双工时序和标志图”。 主设备发送时钟之前就要使能从设备并且把它待发送的数据放在数据寄存器中;

备注

20

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
21

通信模式
全双工 两条数据线,收发同时进行

单工 一条数据线

原来的输出线作为唯一的数据线 >> 主设备:使用MOSI 单线&双向分时 >>从设备:使用MISO BIDIMODE=1 由BIDIOE控制数据方向 >> BIDIOE=1:输出 >> BIDIOE=0:输入
只发送 和全双工类似,只是接收引脚可以作GPIO 发送引脚可作它用 启动通信:配置并使能SPI(无须发送数据,时 钟信号会自动送出) * 关闭通信: >> 主设备:清零SPE >> 从设备:片选无效或SCK停止

单线&单向 BIDIMODE=0

只接收 RXONLY=1

22

“全双工”收发操作序列
? 主/从设备都适用:
? ? ? ? ? ? ? (1) 置位SPE使能SPI (2) 往SPI_DR写入第一个待发送数据 (3) 等待TxE置位后写入第二个带发送数据 (4) 等待RxNE置位后从SPI_DR读取第一个收到的数据 重复以上两个步骤,直到收到倒数第二个数据 (5) 等待RxNE置位,读取最后一个数据 (6) 等待TxE置位后,再等待BSY清零,再关闭SPI

? 以上步骤也可以用RxNE和TxE中断完成 ? 注意主/从设备方各自BUSY标志的不同

23

“全双工”时序和标志

主设备 从设备

2

3

4

3

4

5

loop

24

“只发送”操作序列
? BIDIMODE =0 RXONLY =0 ? 主从设备都适用:
? ? ? ? ? (1) 置位SPE使能SPI (2) 往SPI_DR写入第一个待发送数据 (3) 等待TxE置位后写入第二个带发送数据 重复以上步骤,直到所有数据都写入SPI_DR (4) 等待TxE置位后,再等待BSY清零,再关闭SPI

? 以上步骤也可以用TxE中断完成 ? 该模式发送完两个数据,OVR会合理地置位

25

“只发送”时序和标志

主设备 从设备

软件等待TxE=1,再等待BSY=0,关闭SPI

2

3

4

3

4

4

26

“只接收”操作序列
主设备 初始化序 列 开始序列 置位RXONLY,使能“只接收”模式 BIDIMODE =0,RXONLY =1 置位SPE,使能SPI 一旦使能了SPI,立即产生时钟信号,以 接收数据 片选有效,并且时钟信号到来, 才开始接收数据 从设备

接收数据

等待RxNE置位,以读取数据
SPI模式: 等到读取完倒数第二个数据,再使用软件 循环等待一个SPI时钟周期,关闭SPI; 等待最后一个RxNE置位,读取最后一个 数据,再关闭SPI时钟

结束序列

TI模式: 等到读取完倒数第二个数据;再等待一个 SPI时钟周期,在最后一个数据的最后一 位开始传输之前,关闭SPI; 等待最后一个RxNE置位,读取最后一个 数据,再关闭SPI时钟

任何时候都可以关闭SPI,线 上的当前传输还是能完成; 若要进一步关闭时钟或进入低 功耗模式,还要等到BSY清零

27

“只接收”时序和标志

主设备 从设备

28

双向单线模式
? 双向单线之发送
? 和“只发送”模式类似 ? 设置BIDIMODE =1 BIDIOE =1,再使能SPI

? 双向单线之接收
? 和“只接收”模式类似 ? 设置BIDIMODE =1 BIDIOE =0,再使能SPI ? BSY标志的异常表现

29

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
30

SPI的CRC计算单元
? 内嵌硬件CRC计算单元以支持可靠通信
? 收、发独立的CRC计算单元 ? 根据数据帧长度,提供不同的计算公式(CRC8/16)

? 涉及到的寄存器
? ? ? ? SPI_CR1:CRCEN、CRCNext SPI_SR:CRCERR SPI_CRCPR:供CRC计算的多项式寄存器 SPI_TXCRCR/SPI_RXCRCR ? 只读寄存器( BSY位置时读取的值可能有误) ? 包含从CRC单元使能后,所发送/接收到的所有数据的CRC值 ? 低8位或全部16位有效,取决于数据长度

? 使能CRC / 发送CRC
? 寄存器:CRCEN@SPI_CR1 / CECNext@SPI_CR1 ? 函数库操作:
? SPI_CalculateCRC(SPIx, ENABLE) ? SPI_TransmitCRC(SPIx)

31

使用CRC功能的SPI通信流程
? 配置通信模式
? CPOL、CPHA、LSBFirst、BR、SSM、SSI、MSTR

? ? ? ?

配置CRC多项式: SPI_CRCPR 使能CRC计算以复位CRC寄存器:CRCEN 使能SPI:SPE 开始数据通信,直到完成倒数第二个数据:
? 全双工或单工发送模式
? 最后一个数据写进SPI_DR之后,置位CRCNEXT ? 最后一个数据发送完成后,就发送CRC

? 单工接收模式
? 收到倒数第二个数据之后,置位CRCNEXT

? CRC发送完成后CRCNext复位

? CRC检验
? 全双工和单工只收模式:
? 收到的CRC数值和SPI_RXCRCR比较 ? 不一致则报错:CRCERR@SPI_SR

32

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
33

SPI的DMA功能
? 每个SPI模块有两个DMA请求
? 发送请求、接收请求 ? 可以同时或分别打开

? 使能CRC和DMA模式后,会在数据发送完成后自 动发送CRC值
? 无须CPU在特定时间置位CRCNext

? DMA发送完成后的标志检查,确保通信完成
? 等到TCIF=1 ? 再等TXE=1 ? 再等BSY=0
使能控制 触发信号 DMA通道

SPI发送请求
SPI接收请求

TXDMAEN
EXDMAEN

TXE置位
RXNE置位

参见《参考手册》 表格22&23

34

DMA发送示例图

DMA模式发送:关闭SPI之前要等待这些标志

35

DMA接收示例图

DMA模式接收: 关闭SPI之前只要等待这个标志

36

培训内容 – SPI模块
? SPI协议简介
? ? ? ? STM32F2的SPI模块GPIO占用和配置 片选信号的管理 时钟极性和相位 数据格式(F2新增对TI格式的支持)

? 主/从设备模式的收/发配置 ? 不同通信模式下的操作序列和状态时序
? 全双工通信 ? 单工通信

? CRC特性 ? DMA特性 ? 状态、错误标志以及中断管理
37

状态标志
? 发送缓冲空 TxE ? 发送缓冲的数据已经移到移位寄存器了 ? CPU/DMA可以往发送缓冲写数据了(写SPI_DR) ? 接收缓冲空 RxNE ? 移位寄存器收到的数据以及移到接收缓冲了 ? CPU/DMA可以从接收缓冲读数据了(读SPI_DR) ? 总线忙 Busy ? 常用于应用要关掉SPI并进入低功耗模式前检测通信是否结束 ? 在多主通信环境中可用于避免写冲突 ? 发生主模式错误(MODF),硬件清除该标志
Busy位 主设备 从设备 连续通信 通信期间一直保持置位 每字节/半字之间,BSY被拉低 一个SPI的时钟周期 间隔通信 备注 例外:主模式(MSTR=1)的 单线双向(BIDIMODE=1)之 接收(BDOE=0)时,BSY保 持低电平

间隔期间被拉低

38

错误标志
错误类别 何时发生 主设备:硬件管理片选时 NSS引脚被拉低;软件管理 片选时SSI位清零 多主环境下的从设备:发生 多主冲突 从设备还未清除RxNE(上一 个数据还未读取),主设备 又发送了新数据 移位寄存器中收到的校验数 据和 RXCRCR中计算出来 的数值不一致 配置成TI模式的从设备:在 通信过程中出现NSS引脚上 的脉冲(参见图258) 影响 如何清除 在MODF置位时对 SPI_SR执行读或写 操作;写SPI_CR1 主模式错误 MODF 置位MODF并产生中断; 硬件清除SPE和MSTR

溢出错误 OVR 校验错误 CRCERR

置位OVR并产生中断;接 读取SPI_DR,再 收缓冲中仍是上一个数据, 读取SPI_SR 随后的数据都丢失 软件写0清零 置位TIFRFE并产生中断。 SPI不会被关掉,而是忽 略掉该脉冲,继续等待下 读取SPI_SR 一个NSS脉冲,再发起下 一次传输。数据会丢失

帧格式错误 TIFRFE

39

中断管理
状态和错误标志 中断事件 中断使能控制

TxE
RxNE BUSY MODF OVR CRCERR

发送缓冲空
接收缓冲满 主模式错误 溢出错误 CRC校验错误

TxEIE
RxNEIE

ERRIE

TIFRFE

TI帧格式错误

40

注意要点杂项
? 数据帧格式
? 只支持8位或16位长度 ? 非常规帧长度的处理
? GPIO模拟 ? 拼接发送数据,剩余位用GPIO模拟

? 必须在主/从设备使能之前,根据时钟极性把SCK设置到相 应水平
? 设置时钟空闲高(低)电平,则SCK最好上(下)拉

? 作为从设备,必须在主设备的时钟来临之前使能好SPI, 并且把数据放进数据寄存器 ? 波特率较高时建议使用DMA
? 减少字节/字之间的空闲时间,从而提高带宽

41

复位和时钟控制 RCC

1

培训内容
? 复位源
? 系统复位 ? 电源复位 ? 备份域复位

? 时钟模块
? 时钟树
? 各时钟信号及其特性 ? PLL的配置以及扩频技术(新增)

? 时钟测量 ? 时钟信号的输出 ? STM32F1和STM32F2时钟特性比较

2

培训内容
? 复位源
? 系统复位 ? 电源复位 ? 备份域复位

? 时钟模块
? 时钟树
? 各时钟信号及其特性 ? PLL的配置以及扩频技术(新增)

? 时钟测量 ? 时钟信号的输出 ? STM32F1和STM32F2时钟特性比较

3

复位源和复位电路
复位类型 复位源
低功耗管理复位 软件复位(SW reset)

不被复位的部分
备份域和用于查询复位源 的RCC_CSR中的复位标志

备注
通过选项字节使能 SYSRESEREQ

系统复位

独立看门狗计数器溢出 窗口看门狗计数器溢出 NRST引脚上的低电平

电源复位

上电掉电复位 (POR/PDR/BOR)
退出待机模式 软件置位BDRST复位

备份域 BKPSRAM只能通 过把闪存读保护级 别从1降到0来复位

备份域复位 VDDVBAT之前都关闭,现在
任一个又来电了

备份SRAM

4

复位电路简图
? nRST引脚上的滤波和产生的输出脉冲

? 复位电路简图和推荐的外部引脚连接

5

复位电路注意事项
? 外部复位信号低脉冲至少保持300ns ? 系统复位信号不影响备份域的工作 ? NRST复位引脚是CMOS工艺的开漏电路
? 在产生内部复位信号时,NRST引脚会输出一个低电平

6

培训内容
? 复位源
? 系统复位 ? 电源复位 ? 备份域复位

? 时钟模块
? 时钟树
? 各时钟信号及其特性 ? PLL的配置以及扩频技术(新增) ? 时钟信号的输出

? 时钟测量 ? STM32F1和STM32F2时钟特性比较

7

时钟模块框图
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
MCO2 /1..5 PLLCLK / 2, 20 HSE

PLLI2S

Ethernet PHY

USB2.0 PHY

8

时钟源
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
MCO2 /1..5 PLLCLK / 2, 20 HSE

PLLI2S

Ethernet PHY

USB2.0 PHY

9

外部高速时钟HSE
? 外部高速时钟源(1MHz~50MHz)
? 方波、正弦波和三角波,占空比[45%,55%] ? 设置 HSEBYP&HSEON @ RCC_CR

? 外部高速晶振(4MHz~26MHz)
? 使能/关闭控制:HSEON @ RCC_CR ? 就绪标志:HSERDY @ RCC_CR ? 晶振和负载电容要尽可能靠近晶振引脚
? 减少输出失真和启动稳定时间 ? 典型稳定时间:2ms

参见AN2867获得更多关 于晶振设计的方法和技巧

10

外部低速时钟LSE
? 外部低速时钟源
? 典型值:32.768KHz;最大值:1000KHz ? 方波、正弦波和三角波,占空比[45%,55%] ? 设置 LSEBYP&LSEON @ RCC_BDCR

? 外部低速晶振(32.768KHz)
? ? ? ? 使能/关闭控制:LSEON @ RCC_BRCR 就绪标志:LSERDY @ RCC_BDCR 低功耗:最大1uA 典型稳定时间:2s

? 外部连接同HSE
? 参见前页

11

内部高速时钟HSI
? 16MHz的内部高速RC
? 使能/关闭控制:HSION @ RCC_CR ? 就绪标志:HSIRDY @ RCC_CR ? 可直接作为系统时钟SYSCLK
? 从停止模式唤醒或复位后,默认作为系统时钟

? 或通过PLL间接作为系统时钟

? 比HSE启动速度快,但精确度略差
? 典型启动稳定时间:2.2us ? 精度校准
? 出厂校准值,存放在HSICAL[7:0] @ RCC_CR ? 应用中,用户可以用HSITRIM[4:0] @ RCC_CR来调整 ? 参见AN2868获得HSI校准详情和技巧

12

内部低速时钟LSI
? 低功耗时钟源
? 使能/关闭控制:LSION @ RCC_CSR ? 就绪标志:LSIRDY @ RCC_CSR ? 可以停止和待机模式下继续工作
? 为RTC和IWDG提供时钟

? 典型值32KHz,范围[17KHz,47KHz] ? 功耗典型值:0.65uA ? 启动稳定时间典型值:85uS

13

总线时钟和时钟失效管理
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
MCO2 /1..5 PLLCLK / 2, 20 HSE

PLLI2S

Ethernet PHY

USB2.0 PHY

14

时钟安全管理CSS
? 目标:对HSE时钟的监测,防止因时钟失效造成 系统出错甚至死机的严重后果
? 不仅监测外部晶振HSE ? 旁路HSE时,也监测外部时钟源

? 一旦HSE失效:
? 自动关闭HSE
? 如果系统时钟直接或间接来自HSE,则它被自动切换到HSI ? 如果HSE是PLL的输入,则PLL和PLLI2S也被关闭如果使能 ? HSE恢复后,需重新配置PLL等

? 该事件送到高级定时器TIM1和TIM8的刹车控制
? 常用于电机控制

? 产生CSSI中断,告知用户作相应处理
? 该中断连至NMI不可屏蔽中断 ? 用户需要通过设置CSSC@RCC_CIR来清除中断标志
15

CSS应用举例:系统时钟的监控和切换
? 启动时钟失效检测
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RCC_ClockSecuritySystemCmd(Enable); (失效事件连到不可屏蔽的NMI) Void NMIException(void) { if (RCC_GetITStatus(RCC_IT_CSS) != RESET) { // HSE、PLL已被硬件自动关闭 …….. // 用户可以在此添加应用相关的保护代码 /* 下面为HSE恢复做准备,一旦HSE恢复将产生对应中断 */ /******************************************************************/ RCC_HSEConfig(RCC_HSE_ON); // 再次手动打开HSE RCC_ITConfig(RCC_IT_HSERDY, ENABLE); RCC_ITConfig(RCC_IT_PLLRDY, ENABLE); /******************************************************************/ RCC_ClearITPendingBit(RCC_IT_CSS); // 清除中断挂起位 } }

? HSE时钟失效时,产生NMI中断

? 在RCC的中断处理程序中,再对HSE和PLL作相应处理
? 使能PLL ? 配置系统时钟来自HSE或PLL输出

16

PLL
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
HSE MCO2 /1..5 PLLCLK

PLLI2S

主PLL输出1产生高速系统时钟; 输出2产生48MHz给USB; PLL2产生I2S专用精准时钟

Ethernet PHY

/ 2, 20

USB2.0 PHY

17

两个PLL各司其职
? 两个PLL
? 主PLL
? 输出1:PLLCLK (SYSCLK的三个备选之一, 24MHz~120MHz) ? 输出2:PLL48CK(供USB FS、 SDIO和RNG使用48MHz)

? 专供音频I2S使用的PLLI2S
? 输出:PLLI2SCLK

? 两个PLL时钟源相同:均来自HSI或者HSE ? 进入低功耗模式或者HSE失效,两个PLL自动关闭 ? PLL的倍频、分频因子要在使能PLL之前配置

18

PLL的配置和使用
输入频率的范围: 0.95~2MHz

PLL
/Q *N VCO output clock

PLL48CLK
Max = 48MHz

HSE HSI
PLL input clock /M VCO input clock

/P

PLLCLK
[24MHz,120MHz]

PLLSRC
输入频率的范围: 0.95~1.05MHz

*N

VCO output clock

/R

PLLI2SCLK
Max =216MHz

PLLI2S
两个PLL 共用的配置

19

PLL扩频时钟产生器(SSCG)
? 只针对主PLL的SSCG
? 目的:控制和减小EMI ? 原理:采用一个频率很低的信号(典型范围在30KHz到 60KHz之间)对系统时钟进行频率调制。由此产生一个 具有边带谐波的频谱。窄带周期性时钟被有意扩展到宽 带,在基频和谐波频率中包含的峰值能量就相应减小
? 中心扩频调制 ? 向下扩频调制

? 举例: 100MHz的时钟信号,0.5%的调制
? 99.5MHz~100.5MHz之间进行调制,称为“中心0.5%的调制” ? 为避免超出系统的最高频率,时钟信号通常在 99.5MHz~100MHz范围之间变化,称为“向下扩展频谱”

? 控制寄存器

20

SSCG的应用示意

21

时钟信号输出
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
MCO2 /1..5 PLLCLK / 2, 20 HSE

PLLI2S

两个MCO输出
Ethernet PHY USB2.0 PHY

22

时钟输出
时钟输出 引脚 分频因子 MCO1PRE[2:0] /1… /5 时钟信号 HSI LSE HSE PLL HSE MCO2 PC.9 MCO2PRE[2:0] /1… /5 PLL 备注

MCO1

PA.8

1.对应GPIO应该配置 成AF-PP模式 2. 受限于GPIO本身输 出带宽,输出时钟信 号不能超过100MHz

SYSCLK
PLLI2S

23

实时时钟和独立看门狗时钟
OSC32_IN OSC32_OUT LSI RC ~32KHz IWDGCLK TIM5 IC4 16MHz HSI /M HSE Osc HSE PLLCLK CSS PCLK1 up to 30MHz /8 SysTick HCLK up to 120MHz 32.768KHz LSE OSc HSE /2, to 31 RTCCLK

HSI RC 4 -26 MHz OSC_OUT OSC_IN

SYSCLK AHB Prescaler 120 MHz max
/1,2…512

APB1 Prescaler /1,2,4,8,16

If (APB1 pres =1) Else

x1 x2

TIMxCLK TIM2..7,12..14

PCLK2 up to 60MHz VCO /P PLL48CLK (USB FS, SDIO & RNG) /Q xN /R APB2 Prescaler /1,2,4,8,16
If (APB2 pres =1)

x1

Else

x2

TIMxCLK TIM1,8..11

PLL

VCO

/P

HSI HSE MCO1 /1..5 PLLCLK LSE

/Q xN /R

Ext. Clock SPI2S_CKI N I2SCLK PLLI2SCLK MACTXCLK MACRXCLK MACRMIICL K

PLLI2S

USB HS ULPI clock

SYSCLK
MCO2 /1..5 PLLCLK / 2, 20 HSE

PLLI2S

Ethernet PHY

USB2.0 PHY

24

RTC和IWDG的时钟
? RTC时钟源,三个可选
? LSE
? 只有LSE属于电池备份域 ? 低功耗下可配置是否仍然工作 ? 即使VDD掉电只要VBAT还在RTC仍然工作

? LSI
? 一旦VDD掉电,RTC和AWU不能工作

? HSE分频
? 不超过1MHz ? 一旦VDD掉电,RTC和AWU不能工作

? IWDG唯一时钟源
? LSI
? 低功耗模式下可配置是否仍然工作 ? 一旦IWDG被打开,LSI就强制使能,不能关闭
25

培训内容
? 复位源
? 系统复位 ? 电源复位 ? 备份域复位

? 时钟模块
? 时钟树
? 各时钟信号及其特性 ? PLL的配置以及扩频技术(新增) ? 时钟信号的输出

? 时钟测量 ? STM32F1和STM32F2时钟特性比较

26

内外时钟的测量
TIM5
IC4

GPIO
RTC_OUT LSE LSI

LSE连到T5C4,可用来精确测量HSI
>> HSI作为系统时钟,驱动TIM5的计数器 >> 通过两个LSE上升沿之间的counter计数值获得HSI当前精确 频率(和一样的LSE精度) >> 用户校准存放在HSITRIM[4:0]

counter
TI4RMP@TIM5_OR

>> LSI连到T5C4,可被HSI或HSE测量
>> LSI典型值32KHz,有较大离散性[17KHz,47KHz] >> HSI或者HSE作为系统时钟,驱动TIM5的计数器,以HSI或 HSE的精度测量LSI频率,由此计算IWDG最大喂狗周期

HSI或HSE 驱动TIM的 时基计数器

TIM11
GPIO IC1 HSE_RTC

HSE_RTC连到T11C1
>> HSI作为系统时钟,可以粗略测量外部晶振的值

counter
TI1RMP@TIM11_OR

27

培训内容
? 复位源
? 系统复位 ? 电源复位 ? 备份域复位

? 时钟模块
? 时钟树
? 各时钟信号及其特性 ? PLL的配置以及扩频技术(新增) ? 时钟信号的输出

? 时钟测量 ? STM32F1和STM32F2时钟特性比较

28

时钟模块特性比较
STM32 F-2 HSE晶振 4~26MHz 晶振和负载电容要尽可能靠近引脚以 减小输出失真和启动稳定时间;负载值的选择 取决于所选的晶振 1~50MHz Typ. = 8MHz 外部时钟信号(占空比 50%的方波/正弦波/三角波)从OSC_IN引脚输入; OSC_OUT悬空高阻 32.768KHz 低功耗但精确度高的时钟源 Max = 1000KHz typ. = 32.768KHz外部时钟信 号从OSC_IN引脚输入;OSC_OUT悬空高阻 16MHz 比HSE启动时间快,但即使校准后精确 度仍不及HSE;HSICalib[7:0] & HSITrim[4:0] HSE失效后该HIS可以作为备份时钟 ? CSS 8MHz 32.768KHz STM32 F-1 4~16MHz & 3~25MHz

HSE外部时钟源 LSE晶振

LSE外部时钟源
HSI谐振器

LSI谐振器

32KHz 低功耗时钟,在Stop或Standby模式下 仍可工作,用来驱动IWDG**和自动唤醒

40KHz

** 一旦通过硬件选项字节或者软件开启了IWDG,LSI就被强制使能且不能关闭;稳定时间后,LSI向IWDG提供时钟

29

时钟模块特性比较(2)
STM32 F-2 AHB/APB1/APB2 总线最高频率 PLL 时钟输出引脚 扩频时钟发生 内外时钟校准 120MHz/30MHz/60MHz PLL1输出系统时钟和48MHz时钟; PLL2输出专供音频I2S使用的时钟 MCO1(PA.8) MCO2(PC.9) 最高输出频率100MHz 支持,以减小设备产生的EMI 通过T5C4和T1C11可以校准板上多 个时钟源输出 通过T5C4校准LSI STM32 F-1 72/36/72MHz 一个PLL或者三个PLL MCO(PA.8) 最高输出频率50MHz

时钟安全系统CSS

检测到HSE失效: ?产生NMI中断并通知TIM1/8的刹车输入 ?切换到HSI(如果HSE产生系统时钟) ?关闭PLL(如果HSE驱动PLL并产生系统时钟)

30

寄存器组比较
STM32F2
CR PLLCFGR 主PLL和音频PLL的使能和就绪标志

STM32F1
唯一一个PLL的使能和就绪标志

CSS使能 / HSI出厂校准值和用户调整值 / HSI使能和就绪标志 / HSE使能-旁路-就绪标志 两个PLL共用的分频因子M和时钟源选择 / 主PLL的N-Q-P因子 两个MCO各自的选择和分频因子 / I2S时钟源选择 / HSE给RTC提供时钟的分频因子 唯一一个MCO的选择 / USB-ADC的预分频因子 / PLL的时钟源选择-预分频-倍频因子

CFGR

系统时钟选择和标志 / APB1-APB2-HCLK时钟各自的分频因子 CIR XRSTR XENR XLPENR BDCR CSR SSCGR PLLI2SCFGR

两个PLL(主PLL和音频PLL)

只有唯一一个PLL

PLL-HSE-HIS-LSE-LSI 准备就绪的标志位(r)-中断使能控制(rw)-清除标志位(w) / CSS标志-清除 AHB1-AHB2-AHB3-APB1-APB2 RSTR AHB1-AHB2-AHB3-APB1-APB2 ENR * AHB1-AHB2-AHB3-APB1-APB2 LPENR * 备份域软件复位 / RTC使能-时钟选择 / LSE旁路-使能-就绪标志 ** BOR复位标志 低功耗管理-窗口/独立看门狗-软件-POR/PDR-外部引脚复位标志 / 清除复位标志 / LSI使能-就绪信号 作用于主PLL的时钟频谱延展控制 对音频PLL的N-R因子控制 APB1-APB2 RSTR AHB-APB1-APB2 ENR

* 参见低功耗章节的“时钟门控技术” ** 下划线标志出的寄存器处于备份域,复位后被写保护;不会被内部或外部复位影响;只受备份域复位影响

31

灵活的静态存储控制器 FSMC

1

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

2

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

3

FSMC特性简介
? FSMC管理1GB空间,拥有4个Bank连接外部存储器
? 每个Bank有独立的片选信号 ? 每个Bank有独立的时序配置

? 同步批量传输访问最高频率可达60MHz
? fCLK = HCLK /2

? 支持的存储器类型
? 静态地址映射存储器
? ? ? ? SRAM PSRAM NOR/ONENAND ROM
可以在这些外部存储执行代码

? LCD接口
? 支持8080和6800模式

? NANDFlash和16位PCCard
? NAND Flash具有硬件ECC

4

FSMC框图
四个子模块:
1. 包含FSMC配置寄存器的 AHB接口 2. NOR Flash/PSRAM控制 器 3. NAND Flash/PC Card控 制器 4. 和外部存储器的接口信号

5

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

6

Cortex-M3预定义存储器映射图
6

5

STM32F2实现了外部存储器接口FSMC

4

STM32F2实现了外部存储器区域

3 2 1

STM32F2实现了多种高性能外设

STM32F2实现了128K字节的SRAM STM32F2根据不同芯片实现了 128K~1024K字节的片上闪存

7

STM32F2的存储器映射实现
6

5

4 3 2 1

8

外挂设备的地址映射
? 4个Bank各占256M字节空间
? Bank1分为4个region
? 各占64M字节,有各自的片选 ? 用来连接NOR、PSRAM、LCD等
地址 连接的存储 器类型

? Bank2和Bank3
? 用来连接NAND Flash ? 每个Bank连接一块NAND

? Bank4
? 用来连接PC Card

? 每个Bank和Region有独立的 寄存器对所连存储器进行配置

9

映射地址空间和两个存储设备控制器

内部控制器 NOR Flash 控制器

Bank号 Bank1

管理的地址范围 支持的设备类型 0x6000,0000~ 0x6FFF,FFFF 0x7000,0000~ 0x7FFF,FFFF 0x8000,0000~ 0x8FFF,FFFF SRAM/ROM NOR Flash PSRAM

配置寄存器 FSMC_BCR1/2/3/4 FSMC_BTR1/2/3/4 FSMC_BWTR1/2/3/4 FSMC_PCR2/3/4 FSMC_SR2/3/4 FSMC_PMEM2/3/4 FSMC_PATT2/3/4 FSMC_PIO4

Bank2 NAND Flash /PC Card 控制器 Bank3 Bank4

NAND Flash

0x9000,0000~ 0x9FFF,FFFF

PC Card

10

NOR/PSRAM地址映射
? NOR/PSRAM是”static memory map”设备:256M字节的空间需要28根地 址线寻址 ? HADDR是内部AHB地址总线 ? HADDR[25:0]来自外部存储器地址FSMC[25:0] 28根地址线 ? HADDR[26:27]对4个region分别寻址 ? 无论外接8位/16位宽度设备,FSMC_A[0]永远连接外部设备的地址A[0] ? 外接16位宽度存储器:HADDR[25:1] ? FSMC_A[24:0] ? 外接8位宽度存储器:HADDR[25:0] ? FSMC_A[25:0]
所选的Bank Bank1.region1 Bank1.region2 Bank1.region3 Bank1.region4 片选信号 FSMC_NE1 FSMC_NE2 FSMC_NE3 FSMC_NE4 地址范围 [27:26] 0x6000,0000~63FF,FFFF 0x6400,0000~67FF,FFFF 0x6800,0000~6BFF,FFFF 0x6C00,0000~6FFF,FFFF 00 01 10 11
11

HADDR [25:0]

FSMC_A[25:0]

FSMC外接SRAM、NOR、NAND

12

NOR/PSRAM地址映射的使用(1)
? 举例1:在Bank1的region2挂了一个8位宽度的NOR Flash
? FSMC_NOR_WriteByte(u32 WriteAddr, u8 Data)
? ? ? ? ? ? ? ? /* 1. */ NOR_WRITE(ADDR_SHIFT(0x5555), 0xAA); NOR_WRITE(ADDR_SHIFT(0x2AAA), 0x55); NOR_WRITE(ADDR_SHIFT(0x5555), 0xA0); /* 2. 往目标地址写入目标数据 */ NOR_WRITE((Bank1_NOR2_ADDR + WriteAddr), Data); /* 3. 等待NOR内部写逻辑完成 */ ……

? #define Bank1_NOR2_ADDR ((u32)0x64000000) ? #define ADDR_SHIFT(A) (Bank1_NOR2_ADDR + (1 * (A))) ? #define NOR_WRITE(Address, Data) (*(vu8 *)(Address) = (Data))

13

NOR/PSRAM地址映射的使用(2)
? 举例1:在Bank1的region2挂了一个16位宽度的NOR Flash
? FSMC_NOR_WriteByte(u32 WriteAddr, u8 Data)
? ? ? ? ? ? ? ? /* 1. */ NOR_WRITE(ADDR_SHIFT(0x5555), 0xAA); NOR_WRITE(ADDR_SHIFT(0x2AAA), 0x55); NOR_WRITE(ADDR_SHIFT(0x5555), 0xA0); /* 2. 往目标地址写入目标数据 */ NOR_WRITE((Bank1_NOR2_ADDR + WriteAddr), Data); /* 3. 等待NOR内部写逻辑完成 */ ……

? #define ADDR_SHIFT(A) (Bank1_NOR2_ADDR + (2 * (A))) ? #define NOR_WRITE(Address, Data) (*(vu16 *)(Address) = (Data))

14

NAND/PC Card地址映射
? NAND/PC Card控制器管理3个Bank
? 每个Bank占据256M存储空间(64*4) ? Bank2、Bank3挂NAND Flash
? 每个Bank又分成两个section:Common和Attribute

? Bank4挂PC Card
? 该Bank分成三个section:Common、Attribute和I/O
FSMC Bank Bank2 (NAND) Bank3 (NAND) Bank4 (PC Card) 存储空间 Common Attribute Common 时序寄存器 FSMC_PMEM2 FSMC_PATT2 FSMC_PMEM3 空间大小 64MB 64MB 64MB 地址范围 0x7000,0000~73FF,FFFF 0x7800,0000~7BFF,FFFF 0x8000,0000~83FF,FFFF

Attribute
Common Attribute I/O

FSMC_PATT3
FSMC_PMEM4 FSMC_PATT4 FSMC_PIO4

64MB
64MB 64MB 64MB

0x8800,0000~8BFF,FFFF
0x9000,0000~93FF,FFFF 0x9800,0000~9BFF,FFFF 0x9C00,0000~9FFF,FFFF

15

NAND/PC Card地址映射(2)
? NAND的Common和Attribute空间又可细分为
? Data section(第一个64KB空间)
? 软件从这个空间的任何地方执行读、写数据操作

? Command section(第二个64KB空间)
? 软件往这个空间里任何地方写入命令字节 ? 这个空间任何地址都是Addr[16]=1(CLE为高电平)

? Address section(下一个128KB空间)
? 软件往这个空间的任何地方写入地址字节序列 ? 这个空间任何地址都是Addr[17]=1(ALE为高电平)
Section 数据 命令 地址 HADDR[17:16] 00 01 1x 外部信号 ALE=CLE=0 ALE=0,CLE=1 ALE=1,CLE=0 地址范围 0x00,0000~0,FFFF 0x01,0000~01,FFFF 0x02,0000~03,FFFF

注意:ALE就是FSMC_A[17];CLE就是FSMC_A[16]

16

FSMC外接SRAM、NOR、NAND

17

NAND地址映射的使用
? 举例:在Bank2上挂了一块NAND512W3A2
? FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
? ? ? ? ? ? ? ? ? ? /* 1. Send Command to the command area */ *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = 0x90; *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; /* 2. Sequence to read ID from NAND flash */ data = *(__IO uint32_t *)(Bank_NAND_ADDR | DATA_AREA); /* 3. process returned data */ #define Bank_NAND_ADDR ((uint32_t)0x70000000) #define DATA_AREA ((uint32_t)0x00000000) #define ADDR_AREA (uint32_t)(1<<17) /* A17 = ALE high */ #define CMD_AREA (uint32_t)(1<<16) /* A16 = CLE high */

18

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

19

FSMC模块的AHB接口
? AHB总线上的主设备通过它访问外部静态存储器
? 32位的AHB读写访问转换成连续的
? 8位读写操作,如果访问8位宽度存储器 ? 16位读写操作,如果访问16位宽度存储器

? FSMC模块的参考时钟:HCLK
? 所有输出控制信号都在HCLK的上升沿改变

? 可能的错误情况
错误原因 对没有使能的Bank进行读写操作 读写的NOR所在region禁止访问: FACCEN@ FSMC_BCRx=0 读写的PC Card对应的FSMC_CD (卡在检测)引脚电平为低 出错的影响 CPU DMA

产生hard fault中断

产生DMA传输中断 该DMA通道自动关闭

20

AHB操作宽度和存储器宽度
? DMA/CPU要求的AHB传输宽度
? 8、16、32位
存储器宽度 8位 8位 16位 32位 AHB A B B 16位 C A B

? 外部存储器设备宽度
? 8、16位

? 普遍的传输规则
? CASE A:传输宽度等于存储器宽度
? 没有问题

访 问 宽 度

? CASE B:传输宽度大于存储器宽度
? 分成若干次连续的小传输

? CASE C:传输宽度小于存储器宽度
? 访问的存储设备有高低字节片选(SRAM、ROM、PSRAM) ? 通过FSMC的字节选择控制BL[1:0]来访问对应字节 ? 访问的存储设备没有高低字节片选(NOR、NAND) ? 不允许写操作 ? 允许读操作(硬件读回整个16位数据,用户根据需要使用相应字节)

21

FSMC配置寄存器
? 配置NOR Flash/PSRAM控制器
? FSMC_BCR1/2/3/4:控制寄存器 ? FSMC_BTR1/2/3/4:时序寄存器 ? FSMC_BWTR1/2/3/4:写操作时序寄存器
? 只有选择扩展模式时,该寄存器才有意义; ? 表示读、写操作的时序分别单独配置

? 配置NAND Flash/PC Card控制器
? ? ? ? ? ? FSMC_PCR2/3/4:控制 FSMC_SR2/3/4:FIFO状态和控制寄存器 FSMC_PMEM2/3/4:common memory space时序寄存器 FSMC_PATT2/3/4:attribute memory space时序寄存器 FSMC_PIO4:I/O space时序寄存器 FMSC_ECCR2/3:ECC结果寄存器

22

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

23

NOR Flash/PSRAM控制器外部信号
FSMC信号名称 CLK A[25:0]* D[15:0]* I/O O O I/O NOR 复用 x x x 非复用 x x x PSRAM/SRAM 复用 x x x 非复用 x x x 功能 同步突发模式下的时钟信号 地址总线 双向数据总线

NEx NOE NWE
NL(nADV) NWAIT

O O O
O I

x x x
x x

x x x
x

x x x
x x

x x x
x

对四个region的片选信号 读使能控制 写使能控制
数据/地址线复用时的地址锁存 外部存储器等待输入信号

NBL[1]
NBL[0]

O
O

x
x

x
x

高字节选择
低字节选择

注意:复用模式下,地址低16位和16位的数据线复用,通过NL信号区别地址还是数据;地址高10位独立

24

支持的存储器传输模式(1)
? NOR Flash支持的传输模式
? 以16位NOR Flash为例
模式 读/写 读 写 异步访问 读 写 读 写 异步页访问 读 读 同步访问 读 读 AHB传输宽度 8 8 16 16 32 32 8 16 32 存储器宽度 16 16 16 16 16 16 16 16 16 16 支持与否 X X X X X X X 不支持 注释

FSMC分解成两个 连续的读/写操作
不支持

25

支持的存储器传输模式(2)
? PSRAM支持的传输模式
? 以16位PSRAM为例
模式 读/写 读 写 异步访问 读 写 读 写 异步页访问 读 读 AHB传输宽度 8 8 16 16 32 32 8 存储器宽度 16 16 16 16 16 16 16 16 支持与否 X X X X X X FSMC分解成连续 两次读/写访问 不支持 使用NBL[1:0]选择 注释


同步访问 读 写 写

16
32 8 16/32

16
16 16 16

X
X X X
26

使用NBL[1:0]选择

支持的存储器传输模式(3)
? SRAM/ROM支持的传输模式
? 以16位SRAM/ROM为例
模式 读/写 读 写 异步访问 读 写 读 写 AHB传输宽度 8 8 16 16 32 32 存储器宽度 16 16 16 16 16 16 支持与否 X X X X X X 注释 使用NBL[1:0]选择

FSMC分解成两个 连续的读/写操作

27

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

28

异步通信模式1:SRAM/CRAM

读访问

读 写 操 作 配 置 一 致

/

写访问

29

异步通信模式A: SRAM/PSRAM(CRAM) OE翻转 ? 和模式1的区别在于
? NOE的翻转 ? 读、写操作独立的时序配置
? FSMC_BTRx:读操作时序配置寄存器 ? FSMC_BWTRx:写操作时序配置寄存器

读访问

读 写 操 作 配 置 不 同

/

写访问

30

异步通信模式2:NOR Flash
? 与模式1的区别
? NADV翻转

读 写 操 作 配 置 一 致

/

31

异步通信模式B:NOR Flash
? 与模式1的区别
? NADV的翻转 ? 读、写操作独立的时序配置
? FSMC_BTRx:读操作时序配置寄存器 ? FSMC_BWTRx:写操作时序配置寄存器

读 写 操 作 配 置 不 同

/

32

异步通信模式C:NOR Flash OE翻转
? 与模式1的区别
? NADV和NOE的翻转 ? 读、写操作独立的时序配置
? FSMC_BTRx:读操作时序配置寄存器 ? FSMC_BWTRx:写操作时序配置寄存器

读 写 操 作 配 置 不 同

/

33

异步通信模式D:
? 与模式1的区别
? NADV和NOE不在同一时刻的翻转 ? 读、写操作独立的时序配置
? FSMC_BTRx:读操作时序配置寄存器 ? FSMC_BWTRx:写操作时序配置寄存器

读 写 操 作 配 置 不 同

/

34

异步通信NOR Flash地址/总线复用模式
? 与模式D的区别
? 复用数据线上先后出现低半字地址和数据信息

读 写 操 作 配 置 一 致

/

35

各种异步模式的联系
SRAM

1
nADV 翻转

nOE翻转

A

NOR Flash

2
nOE和年ADV 同一时刻翻转
nOE和年ADV 同一时刻翻转 地址低16位和 数据总线复用

B C D
字母表示的模式中,读、写 操作的配置是独立分开的

复用模式

36

异步通信中的等待管理
? 异步模式下的等待控制
? 目的:存储器把WAIT信号拉到有效电平告诉FSMC它 还未准备好接收数据或者发送数据
? WAIT是FSMC模块的输入信号

? 使能:ASYNCWAIT@FSMC_BCRx ? WAIT信号的极性:WAITPOL@FSMC_BCRx

? 数据建立阶段被延迟,直到WAIT信号无效
? DATAST规定了数据建立时间

? 地址建立阶段不受影响
? 地址阶段包括 ADDRSET + ADDRHLD

37

数据阶段和延迟的关系
? 在结束访问4个HCLK之前必 须检测出WAIT变化
? wait信号和nOE/nWE对齐
? 数据阶段 >= 4*HCLK + twait

? wait信号和NEx片选对齐并 且等待时间长于地址阶段
? 数据阶段 >= 4*HCLK + t2

? wait信号和NEx片选对齐并 且等待时间短于地址阶段
? 数据阶段 >= 4*HCLK

WAIT twait WAIT twait t2 WAIT twait

38

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 时序规则 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

39

NOR Flash/PSRAM控制器的同步突发通信
? 同步时钟
? CLK=HCLK / (CLKDIV+1)
? CLKDIV@FSMC_BTR1/2/3/4 ? CLK的第一个上升沿出现 在NADV低(有效)电平时期
同步复用突发读操作举例

? 数据的延迟(latency)
? 一般从NADV拉高后开始计算
? 延迟 = DATLAT+ 2

? 有些从NADV低时就开始计算
? 延迟 = DATLAT+ 3

? 数据的等待(wait)
? 突发访问模式下等待使能
? WAITEN@FSMC_BCR

? 等待信号极性(有效电平)
? WAITPOL@FSMC_BCR

? 等待信号配置
? 定义等待信号有效时刻和数据 无效时刻的关系 ? WAITCFG@FSMC_BCR

? 等待信号有效时,FSMC仍旧发送时钟信号,并保持片选有效
40

单次突发传输(Single Burst)
? 所选Bank配置成同步突发模式
? AHB发起单次突发传输
16位数据:FSMC执行一次突发传输 32位数据:FSMC执行两次突发传输 最后一个数据传输后拉高片选
同步复用突发写操作举例

? 和异步读操作比较
需要先编程配置访问模式 总的所需周期数会更多

41

NOR/PSRAM控制器寄存器组
? 控制寄存器可以配置
? 存储器类型:
? MTYP
? NOR、OneNand、CRAM、SRAM

? 时序寄存器可以配置
? 地址建立持续时间
? ADDSET

? 存储器宽度:
? MWID
? 8位或16位

? 地址保持持续时
? ADDHLD

? 同步或者异步模式 ? 地址/数据复用否:
? MUXEN

? 数据持续时间
? DATAST

? 总线空闲间隔时间
? BUSTRURN

? 同步访问下等待使能
? WAITEN

? 时钟分频比例
? CLKDIV

? 扩展模式使能:
? EXTMOD

? 突发写访问/等待插入
? CBURSTRW

? 同步突发访问NOR的数据延迟
? DATLAT

? 异步访问的等待使能
? ASYNCWAIT

? 访问模式
? ACCMOD

42

NOR Flash/PSRAM控制器时序配置小结
参数 ADDSET 功能 地址建立时间 访问模式 异步 单位 HCLK 最小值 0 最大值 15

ADDHLD
DATAST BUSTURN CLKDIV DATLAT 时序模型 Mode1 异 步 ModeA Mode2/B ModeC ModeD 同步突发

地址保持时间
数据建立时间 总线空闲间隔 同步时钟分频 数据延迟 简单描述

异步复用
异步 读操作 同步 同步

HCLK
HCLK HCLK HCLK CLK

1
1 0 2 2 时间参数

15
255 15 16 17

SRAM/CRAM时序 SRAM/CRAM OE选通型时序 NOR Flash时序 NOR Flash OE选通型时序 延长地址保持时间的异步时序 根据同步时钟FSMC_CK读取 多个顺序单元的数据

DATAST、ADDSET DATAST、ADDSET DATAST、ADDSET DATAST、ADDSET DATAST、ADDSET、ADDHLK CLKDIV、DATLAT
43

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

44

NAND Flash/PC Card控制器外部信号
FSMC信号名称
A[17] A[16] A[10:0] D[7:0] D[15:8] NCEx NCE 4_x NOE NWE NWAIT/INTx NIOS16

I/O
O O O I/O I/O O O O O I I

8位 NAND
x x x x x x x

16位 NAND
x x

16位PC Card

功能描述
NAND Flash地址锁存(ALE) NAND Flash命令锁存(CLE)

x x x x x x x x x x x x x

16位PC Card地址总线 双向数据总线 NAND Flash片选:x=2、3 PC Card片选:x=1、2 读使能(NRE) 写使能 存储器表示自身是否就绪: x=2、3 必须短路到GND

NIORD
NIOWR NREG INTR CD

O
O O I I

x
x x x x

I/O空间的输出使能
I/O空间的写使能 寄存器信号,访问通用还是属性空间 PC Card中断输入引脚 PC Card存在检测,高电平有效
45

支持的存储器传输模式
模式 读/写 读 写 8位NAND 异步访问 读 AHB传输宽度 8 8 16 存储器宽度 8 8 8 支持与否 X X X 注释


读 写 读 写

16
32 32 8 8 16 16

8
8 8 16 16 16 16

X
X X X X X X

FSMC分解成2个 连续的读/写操作 FSMC分解成4个 连续的读/写操作

不支持

16位NAND 异步访问

读 写




32
32

16
16

X
X

FSMC分解成2个 连续的读/写操作

46

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

47

NAND操作:时序配置
? 三个时序配置寄存器
? FSMC_PMEMx ? FSMC_PATTx ? FSMC_PIOx

? 每个寄存器包含
? ? ? ? MEMxSET MEMxWAIT MEMxHOLD 写操作时的MEMxHIZ

48

NAND操作举例:一个典型的页读操作
? 配置并使能相应Bank
? FSMC_PCRx: ? FSMC_PMEMx:三个时序参数 ? 对于某些设备还要配置FSMC_PATTx

? CPU在common memory空间执行一次字节写操作
? 该字节是Flash的一个命令字节 ? 通过CLE有效表示这是给NAND的命令

? CPU发送读操作的起始地址
? 在common memory或attribute空间执行写操作 ? 4个地址字节,或3个地址字节 ? 通过ALE有效表示这是给NAND的地址信息

? CPU等待NAND Flash的就绪信号
? R/NB信号变成高电平 ? 等待期间FSMC保持片选信号NCE一直有效

? CPU在common memory空间执行字节读操作来读取页数据
? 数据和冗余信息

? 下一个页数据的读取可以不用再发送命令和地址
? 直接重复以上读操作即可

49

NAND操作:一个典型页读时序图
? 以ST的NAND512R3A为例
命令锁存

地址锁存

读取的数据随着不断的读脉冲被读出来

50

NAND Flash:预等待特性
? 有些NAND Flash对片选信号的特殊要求
? 最后一个地址字节发送完成到R/nB再次拉高之前,片选一直有效
(1) CPU往0x7001,0000的地址写入 命令字节0x00 common space的命令section (2) CPU往0x7002,0000的地址写入 地址字节A7~A0 common space的地址section (3) CPU往0x7002,0000的地址写入 地址字节A16~A9 common space的地址section (4) CPU往0x7002,0000的地址写入 地址字节A24~A17 common space的地址section (5) CPU往0x7802,0000的地址写入 地址字节A25 attribute space的地址section

MEMHOLD@FSMC_PMEM ATTHOLD@FSMC_PATT

51

NAND Flash/PC Card空间映射回顾
FSMC Bank Bank2 (NAND) Bank3 (NAND) Bank4 (PC Card) 存储空间 Common Attribute Common Attribute Common Attribute 时序寄存器 FSMC_PMEM2 FSMC_PATT2 FSMC_PMEM3 FSMC_PATT3 FSMC_PMEM4 FSMC_PATT4 空间大小 64MB 64MB 64MB 64MB 64MB 64MB 地址范围 0x7000,0000~73FF,FFFF 0x7800,0000~7BFF,FFFF 0x8000,0000~83FF,FFFF 0x8800,0000~8BFF,FFFF 0x9000,0000~93FF,FFFF 0x9800,0000~9BFF,FFFF

I/O

FSMC_PIO4

64MB

0x9C00,0000~9FFF,FFFF

Section 数据 命令 地址

HADDR[17:16] 00 01 1X

外部信号 ALE=CLE=0 ALE=0,CLE=1 ALE=1,CLE=0

地址范围 0x00,0000~0,FFFF 0x01,0000~01,FFFF 0x02,0000~03,FFFF

52

培训内容
? ? ? ? FSMC特性简介和FSMC框图 外挂存储器地址映射 AHB接口 NOR/PSRAM控制器
? ? ? ? ? ? ? ? ? 接口信号 支持的存储器和访问方式 异步传输 同步突发传输 接口信号 支持的存储器和访问方式 NAND操作 ECC计算 PC card/Compact Flash操作

? NAND/PC card控制器

53

NAND Flash的ECC特性
? 两个挂NAND Flash的Bank拥有各自的硬件ECC计算单元
? 当系统要求处理ECC时,用来减少CPU负载

? ECC只监测并计算对NAND Flash读写的数据字节,对写 入的命令和地址字节不予计算 ? ECC操作参数
? 使能控制:ECCEN@FSMC_PCRx ? 页大小:ECCPS@FSMC_PCRx (256字节~8K字节) ? ECC计算值:ECC@FSMC_ECCR

? ECC的使用
? 一个页的数据读、写完成后,CPU必须从ECCR寄存器读取计算出 来的ECC值,并和记录在冗余区的ECC值进行比较,以确定该页 的数据是否有效;再通过复位ECCEN来清除旧的计算值。重新置 位ECCEN来计算下一页待读、写的数据

54

NAND/PC Card控制器寄存器组
? 控制寄存器可以配置
? 存储器类型
? PC Card、CF Card ? NAND

? 时序寄存器可以配置
? FSMC_PMEM2/3/4 ? FSMC_PATT2/3/4 ? FSMC_PIO4

? 存储器宽度
? 8位或16位

? ? ? ?

Bank访问的使能控制 等待状态使能控制 ECC使能和页大小配置 ALE/CLE到RE的延迟

? ECC结果寄存器
? FSMC_ECCR2/3

? FIFO状态和中断寄存器
? FSMC_SR2/3/4

55 55

硬件连接示意图

56

FSMC引脚分布(1)
? STM32F2系列产品中只有100引脚以上的封装才 有FSMC模块

57

FSMC引脚分布(2)

58

100引脚封装上的FSMC
100 引脚
NE1 NE2 NE3 NE4 NL(NADV) NBL[1:0] CLK NCE2

144 引脚

176 引脚

NOR PSRAM SRAM ROM

Bank1

X X X

无论哪种封装:
X X X X X X X X X X X X

NAND

Bank2

INT 2 NCE3

NAND

Bank3

INT 3 NCE4_1 NCE4_2 INTR

NE1和NCE2不能同时使用; NE2和NCE3不能同时使用; NE3和NCE4_1不能同时使用;

PC Card

Bank4

CD NIORD NIOWR NREG A[0:15] A[16:23] A[24:25]

共用信号

D[15:0]
NOE NWE

NWAIT

59

100引脚封装上的FSMC
NE1

NOR PSRAM SRAM ROM

Bank1
NL(NADV) NBL[1:0] CLK NCE2

1. 100引脚封装的FSMC只有Bank1的 region1或Bank2可以使用,不能同时使用

NAND

Bank2

NAND

Bank3

PC Card

Bank4

2. 100引脚封装的FSMC地址低16位和数据 线复用,即AD[0~15],A[16~23]单独,没 有A[24:25],即可以访问的NOR/ PSRAM 最大容量为16MB。 数据地址复用时,通过NL来控制地址和数 据的区分。

A[16:23]

共用信号

A/D[15:0]
NOE NWE

地址/数据复用

NWAIT

60

100引脚通过复用方式外接16位SRAM
Addr
nADV

Data

FSMC_ADV

非门

FSMC_A/D

FSMC_A

FSMC_D

STM32F2

16373

SRAM

61

100引脚复用外接16位SRAM(原理图)

62

100引脚复用连接8位SRAM
? 8位数据 ? A/D[7:0] ? 20位地址 ? A/D[7:0] +A/D[15:8]+ A[19:16] ? 显然A/D[7:0]需要经过锁存;那么A/D[15:8]是否可以不经 过latch,是否只包含地址信息?
? 地址阶段(nADV低电平)时A/D[8:15]有中8位的地址信息 ? 数据阶段(nADV高电平)时A/D[8:15]保持高电平 ? 因此:仍需要16位宽度的锁存,因为中8位地址在数据阶段不保持
A/D[23:16] A/D[15:8] A/D[7:0] nADV nOE/nWE

高8位Addr
中8位Addr 低8位Addr 0xFF 8位Data
尽管8位数据宽度,地 址锁存器宽度仍需16位

63

波形图示意
? NOR_WRITE(ADDR_SHIFT(0x5555), 0xAA); NOR_WRITE(ADDR_SHIFT(0x2AAA), 0x55); NOR_WRITE(ADDR_SHIFT(0x5555), 0xF0); return (*(vu8 *)((0x60000000 + 0x8000)));

64

模数转换 ADC

1

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

2

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

3

ADC特性简介
? 3个ADC模块
? 高达19个逻辑通道
? 16个逻辑外部通道 ? 3个内部通道:温度传感器、VREFINT、VBAT(仅针对ADC1)

? 三个ADC在24个外部通道上复用

? ADC转换精度可配置
? 12位、10位、8位和6位:降低精度用于提高转换速度 ? 12位精度下ADC转换速度最快可达2M采样/秒
? 转换速度随供电电压下降而减慢

? 工作模式
? 单次转换、连续转换、多通道扫描、间断转换

? 多ADC协同工作模式
? 双ADC模式 ? 三ADC模式

? 模拟看门狗和电池监测
4

ADC功能框图
VREF+ VREFVDDA VSSA

ADCCLK

ADC Prescalers: /2, /4, /6 and /8

PCLK

ADCx_IN0

. . .

. . .
ADCx_IN15

GPIO Ports

Up to 4 Conv

ADCx
Injected Channels Regular Channels

DMA Request Address/data bus
Injected data registers (4x12bits) Regular data register (12bits)
End of injected conversion event event End of conversion

ANALOG MUX

Temp Sensor (ADC1)

Up to16 Conv

VBAT (ADC1) VREFINT (ADC1)

TIM1_CH4 TIM1 TRGO TIM2 CH1 TIM2 TRGO TIM3 CH2 TIM3 CH4 TIM4 CH1 TIM4 CH2 TIM4 CH3 TIM4 TRGO TIM5 CH4 TIM5 TRGO TIM8 CH2 TIM8 CH3 TIM8 CH4

Over Run event

Start Trigger (injected group) JEXTRIG bit

Analog watchdog event

JSTRT

STRT OVR

EOC

JEOC

AWD

Flags

Ext_IT_15 JEXTSEL[3:0] bits
TIM1 CH1 TIM1 CH2 TIM1 CH3 TIM2 CH2 TIM2 CH3 TIM2 CH4 TIM2 TRGO TIM3 CH1 TIM3 TRGO TIM4 CH4 TIM5 CH1 TIM5 CH2 TIM5 CH3 TIM8 CH1 TIM8 TRGO

Interrupt enable bits
Start Trigger (regular group) EXTRIG bit EXTSEL[3:0] bits

OVRIE

EOCIE JEOCIE AWDIE
Analog Watchdog High Threshold register (12bits) ADC123 interrupt to NVIC Low Threshold register (12bits)

Ext_IT_11

5

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

6

ADC引脚与通道
引脚名称 VREF+ VDDA VREFVSSA ADCx_IN[15:0] 信号类型 输入,模拟参考正电压 输入,模拟电源 输入,模拟参考负电压 输入,模拟电源地 模拟输入信号 备注 ADC模块的参考电压:[1.8V, VDDA] 和VDD相同电压的模拟电源 ADC模块的参考负电压,和VSSA连接 模拟模块的地,和VSSA连接 16个模拟输入通道(引脚分布参看下页)

CADC:内部采保电容 RADC:采样切换电阻 RAIN:外部电路阻抗

数值参见数据手册

7

3个ADC复用19个逻辑通道
ADC1 通道0 通道1 通道2 通道3 通道4 通道5 通道6 16个外部信号源 通道7 通道8 通道9 通道10 通道11 通道12 通道13 通道14 PC.4 PA.4 PA.5 PA.6 PA.7 PB.0 PB.1 PC.0 PC.1 PC.2 PC.3 PF.4 ADC2 PA.0 PA.1 PA.2 PA.3 PF.6 PF.7 PF.8 PF.9 PF.10 PF.3 ADC3

注意: 1. PortA、PortB和PortC在 所有引脚封装上都有; 2. PortF只在144引脚及以上 的封装上才有 3. 3个ADC模块上共有外部 通道:16+8 = 24个,供每 个ADC的16个外部逻辑通道 复用 4. 只有ADC1模块上还有3个 内部通道

通道15
2个内部信号源 VBAT 温度传感器 VREFINT 通道18

PC.5

PF.5

8

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

9

ADC模块时钟
? 给模拟电路的时钟:ADCCLK
? 三个ADC模块共有 ? 经过APB2分频,最高30MHz

? 给数字接口的时钟:APB2时钟
? 用于对在APB2上的3个ADC模块进行寄存器访问 ? 每个ADC的数字接口时钟可单独使能/关闭
? ADC1EN / ADC2EN / ADC3EN@RCC_APB2ENR
SYSCLK
(120MHz max)

AHBCLK
(120MHz max) AHB_PRESC /1,2,..512

APB2CLK
(60MHz max) APB2_PRESC /1,2,4,8,16 ADC_PRESC /2,4,6,8

ADC_CLK
(30MHz max)

10

ADC模块开关和转换时序
? 初次设置ADON@ADC_CR2:唤醒ADC模块
? 3us的稳定时间后,方可正确转换

? 置位SWSTART/JSWSTART@ADC_CR2:启动ADC转换
? ADON复位的情况下,置位SWSTART/JSWSTART无效

? 复位ADON:停止转换并关闭ADC模拟功耗

11

ADC通道转换时间
? 每个通道总的转换时间 = TSampling + Tconversion
? TSampling可配置:SMP@ADC_SMPRx
? 需要和外部电路的输入阻抗匹配

? Tconversion取决于转换精度:RES@ADC_CR1
? 降低转换精度可提高转换速度
ADCx
3 cycles 15 cycles

Sample Time

精度 12 bits 10 bits

TConversion 12 *ADCCLK 10 *ADCCLK

28 cycles

Selection

PCLK

Prescaler

ADCCLK

58 cycles

/2, /4, /6 or /8

84 cycles
112 cycles

144 cycles
480 cycles

8 bits
6 bits

8 *ADCCLK
6 *ADCCLK

SMPx[2:0]

12

ADC转换时间
? Ttotal = (SMP + RES) * ADCCLK
? SMP:采样时间,需要和外部输入阻抗搭配 ? RES:转换精度,降低精度可提高速度 ? ADCCLK:ADC模块工作时钟
? ADCCLK = APB2时钟分频(2,4,6,8) ? ADCCLK最大值还受限于工作电压 ? VDDA=1.8~2.4V fADCmax = 15MHz ? VDDA=2.4~3.6V fADCmax = 30MHz

? 举例:
? ? ? ? fADC = 30MHz, SMP = 3:3周期采样 RES = 12:12位转换精度 总的转换时间 = (12+3)/30MHz = 0.5us
13

外部输入阻抗和采样时间
? 为了保证精度在1/4个LSB,不同ADC配置下允许的最大外部输入阻抗计 算公式如下 Symbol Min Max Unit ? K:采样周期 f 0.6 30 MHz ? N:转换精度 R 1.5 6 KΩ C 4 TBD pF ? fADC取决于工作电压 R 50 KΩ ? CADC和RADC参考数据手册 ? 举例:30MHz的ADC时钟;12位转换精度;3周期采样 允许的最大外部输入阻抗 = [(3-0.5)/(30M*4*14*ln2)] – 1.5KΩ= 0.65KΩ ? 30MHz的ADC时钟;12位转换精度;15周期采样 允许的最大外部输入阻抗 = [(15-0.5)/(30M*4*14*ln2)] – 1.5KΩ= 11KΩ
ADC ADC ADC AIN

14

转换数据及其对齐规则
? 数据寄存器16位
? ADC_DR:存放规则组的转换数据 ? ADC_JDRx(x=1..4):存放注入组每个通道的转换数据
? 存放的是转换数据减去用户定义的偏移量,结果可以是负数 ? 用户定义偏移量:ADC_JOFRx ? SEXT位表示扩展符号位

? 转换数据最多12位
? 对齐方式由ALIGN@ADC_CR2控制
左对齐 注入组的扩 展符号位

右对齐

15

对齐规则特例
? 左对齐时,多数情况下(12位/10位/8位精度)数据 以半字对齐 ? 特例:6位精度左对齐时,数据以字节对齐,如下:

16

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

17

ADC转换的通道选择
? 每个ADC模块有16个复用的外部通道:IN0~IN15
? ADC1上还有3个内部通道:IN16/17/18

? 可以把通道上的转换分成两个组
? 组里的转换可以以任何顺序来自任何通道
? e.g ADCx的通道IN13?IN8?IN2?IN0?IN2?IN2?IN15

? 规则组(Regular group)
? 最多由16次转换组成 ? 在ADC_SQRx中指定组里转换的顺序和所来自的通道 ? 在L@ADC_SQRx中指定转换的次数

? 注入组(Injected group)
? 最多由4次转换组成 ? 在ADC_JSQRx中指定组里转换的顺序和所来自的通道 ? 在L@ADC_JSQRx中指定转换的次数

? 规则组的转换可被注入组的触发信号打断,反之不能
18

ADC转换组序列设定
? 规则组(注入组)中最多可包含16(4)次转换
? ? ? ? 每次转换来自哪个通道 每个通道的采样时间 转换的次序 支持对同一个通道多次采样
都可以设置,@ADC_SQRx 或@ADC_JSQRx

? 举例:
? 转换通道及次序:0 ?2 ?8 ?4? 7?3 ?3 ?3 ?11 ? 不同的采样时间,对通道3过采样
Ch.0 Ch.2 Ch.8 Ch.4 Ch.7 Ch.3 Ch.3 Ch.3 Ch.11

3 cycles

15 cycles

3 cycles
28 cycles 58 cycles

28 x 3 cycles

28 cycles

19

注入组通道的转换
? 触发式注入 JAUTO@ADC_CR1 =0
? 通过外部触发事件或软件触发(SWSTART)来启动规则 组通道的转换 ? 如果规则组转换过程中出现了注入组的外部触发事件或 软件(JSWSTART)触发,当前转换中止,转向对注入组 里的通道进行“单次扫描”的转换
? 从触发事件到转换开始,有延迟(max latency) ? 用户要确保注入组的触发事件间隔大于注入序列的转换时间 ? 规则组的转换再从被中止的地方继续后续的转换

? 自动注入 JAUTO@ADC_CR1 =1
? 注入组通道的转换在规则组转换结束后自动进行 ? 常用于进行一系列20次的转换 ? 若CONT=1,注入组转换后又开始连续转换规则组

20

外部事件触发转换
1. EXTEN和JEXTEN控制外部 事件触发使能以及触发边沿选 择 >> 触发极性可动态修改 >> 动态修改后的1个APB时钟 周期内,触发检测不工作

注入组的外 部触发信号 选择注入组外 部触发信号源

规则组的外 部触发信号 选择规则组外 部触发信号源

2. EXTSEL和JEXTSEL控制外 部触发事件源 >> 来自片上定时器的内部信 号和外部中断线EXTI

控制触发使能 及触发边沿

3. 可设置SWSTART或 JSWSTART来软件触发规则 组或注入组的转换

21

规则组和注入组的区别与联系
规则组 Regular group 包含的转换次数 次序指定寄存器 最多包含16次转换 ADC_SQR1/2/3 注入组 Injected group 最多包含4次转换 ADC_JSQR

数据寄存器
软件触发 转换 启动 外部事件触发 触发源选择 自动注入 JAUTO=1 两组转换的联系

所有通道公用ADC_DR
置位SWSTART 来自6个片上定时器的信号 EXTI_11引脚上的外部信号 EXTSEL[3:0]

每个通道单独的ADC_JDRx
置位JSWSTART 来自6个片上定时器的信号 EXTI_15引脚上的外部信号 JEXTSEL[3:0] 规则组转换结束后自动开始

规则组的转换可以被注入组的触发信号打断

22

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

23

ADC转换模式图示
单次转换@CONT=0
Start

连续转换@CONT=1
Start

单通道 SCAN=0

CHx
Stop Start

CHx
EOC EOC
Start

多通道扫描 SCAN=1

EOC (EOCS=1)
EOC (EOCS=1) EOC (EOCS=1)

CHx
. . .

EOC (EOCS=1) EOC (EOCS=1) EOC(EOCS=0) EOC (EOCS=1)

CHx
. . .

CHn
Stop

CHn
EOC(EOCS=0)
Start
trigger

多通道扫描 SCAN=1 + 间断模式 DISCEN=1 或者 JDISCEN=1

Start trigger

CHa/b/c …… CHx/y/z
Stop

CHa/b/c …… CHx/y/z

trigger

trigger

trigger

24

工作模式:单次转换和连续转换
单次(Single)转换 CONT=0
规则组 对所选的单个通道进行转换,完成后ADC停止 注入组

单通道

转换数据放到ADC_DR; 置位标志EOC; 如果置位了EOCIE产生中断

转换数据放到ADC_JDR1; 置位标志JEOC; 如果置位了JEOCIE产生中断

扫描SQRx和JSQRx中规定的通道,每个通道转换一次,完成后ADC停止

多通道扫描 SCAN=1

推荐使用DMA把每个通道转换完成的数据从ADC_DR转移到SRAM; EOCS=0:整个组都转换结束,置位EOC;ADC_DR保存最后一个通道的转换数据 EOCS=1:每个通道转换结束都置位EOC;置位EOC并条件性地产生中断

转换数据分别放到 ADC_JDR1/2/3/4; 置位标志JEOC并条 件性产生中断

连续(Continuous)转换 CONT=1
规则组 对所选的单个通道进行转换 注入组

单通道

转换完成后数据放到ADC_DR;置位EOC并条件性地产生中断
继续对该通道进行转换 扫描SQRx中规定的通道并挨个进行转换 1. 注入组本身不支持 连续转换 2. 附在规则组转换之 后的“自动注入”是 支持连续转换的

多通道扫描 SCAN=1

推荐使用DMA把每个通道转换完成的数据从ADC_DR转移到SRAM; EOCS=0:整个组都转换结束,置位EOC;ADC_DR保存最后一个通道的转换数据 EOCS=1:每个通道转换结束都置位EOC;置位EOC并条件性地产生中断

继续对该组中的各个通道进行转换
25

工作模式:间断模式
? 间断模式:把规则组或注入组中的转换序列分成若干个子 序列进行,每次由同一个外部事件触发
规则组通道 使能间断模式 序列指定寄存器 序列总长度 子序列长度 备注 DISCEN@ADC_CR1 ADC_SQRx L@ADC_SQR1 DISCNUM@ADC_CR1 注入组通道 JDISCEN@ADC_CR1 ADC_JSQR JL@ADC_JSQR 固定是1

1. 对注入组来说,不能同时使用自动注入和间断模式 2. 不能对规则组和注入组同时使用间断模式 DISCNUM=3, L=8 序列:0,1,2,3,6,7,9,10 1st触发:转换0,1,2 2nd触发:转换3,6,7 3rd触发:转换9,10,产生EOC 4th触发:转换0,1,2 JL=3 序列:1,2,3 1st触发:转换1 2nd触发:转换2 3rd触发:转换3,产生EOC 4th触发:转换1

举例

26

各转换模式的应用
? 单通道单次转换
? 对一个通道进行一次转换,然后ADC停止 ? 应用举例:启动系统功能之前测量电压

? 多通道单次转换
? 对多个通道进行逐个的独立转换,然后ADC停止 ? 可对多达16个通道的转换配置不同采样时间和顺序
? 无需中途停止ADC来配置下一个通道的采样时间 ? 节省CPU负载

? 应用举例:启动系统之前测量多个参数
? 电压、温度、压力等 ? 机器人操作臂的坐标 ? 物体所受扭力和形变的方向以及受力

27

各转换模式的应用(2)
? 单通道连续转换
? 对一个规则通道进行连续转换 ? 通常可用于后台,无需CPU干涉的连续转换; 配合DMA的循环模式,进一步减少CPU负载 ? 应用举例:监测电池电压,测量并调节炉温等

? 多通道连续转换
? 对多个通道进行连续的独立转换 ? 可对多达16个通道的转换配置不同采样时间和 顺序 ? 应用举例:多电池充电器中监测多个电压和温 度的信息

28

各转换模式的应用(3)
? 注入转换
? 优先级高于规则组,可打断规则组通道的当前转换 ? 应用举例:用事件来同步转换的开始
? 马达控制系统中,转子的切换会产生噪声,从而影响ADC测量, 导致错误的ADC转换值。这种情况下,可以使用定时器在转子 切换完成后启动ADC转换

29

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

30

ADC独立工作情况下的DMA管理
? 仅针对规则组:DMA@ADC_CR2
? 三个ADC都具有独立工作情况下的DMA功能

? 每个通道转换完毕都会产生DMA请求 ? DMA模式下,如果数据丢失
? 置位OVR@ADC_SR,并条件性地产生中断 ? DMA传输被关闭,不再响应后续DMA请求
? 已经传输到RAM中的数据都是有效的

? 正在进行的转换被中止放弃,不再响应后续的转换触发 ? 复位OVR和对应DMAEN;重新初始化DMA和AD ? ADC转换和数据传输才能继续

? DMA传输结束(DMA_NDTR自减到0)
? DDS=0:不再往DMA控制器发送DMA请求
? 需要用户复位并重新置位DMA来开始下一次传输

? DDS=1:只要有数据还在转换,继续往DMA控制发送DMA请求
? 配合DMA控制器使用双缓冲循环模式(double-buffer circular)

31

ADC独立工作下DMA图示
DMA Request DMA Request DMA Request DMA Request DMA Request DMA Request DMA Request DMA Request DMA Request

Channel 0

Channel 1

Channel 2

Channel 3

Channel 4

Channel 5

Channel 6

Channel 7

Channel 8

ConvertedValue_Tab[9]
Channel8 conversion result Channel7 conversion result Channel6 conversion result ADCx DR
. . .

例如:- 规则通道的转换:0、1、2、3、4、5、6、7、8 - 转换数据保存在数组ConvertedValue_Tab[9]中 - DMA传输使能(目标地址自动增加)

Channel5 conversion result Channel4 conversion result Channel3 conversion result Channel2 conversion result Channel1 conversion result Channel0 conversion result

注:在规则通道转换结束,DMA访问ADC1 的数据寄存器后EOC标志被清除。

32

ADC独立工作DMA管理比较
? ADC转换配置成连续模式(continous) ? DMA配置成
? 循环模式(circular) ? DMA_NDTR=1

? STM32F1
? DMA_NDTR自减到0,自动重装载初始值 ? 继续响应ADC的DMA请求

? STM32F2
? 必须置位DDS @ADC_CR2 ? DMA_NDTR自减到0,自动重装载初始值 ? 继续响应ADC的DMA请求
33

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

34

ADC的模拟看门狗
? 检测待转换的模拟电压
? 电压超出检测范围就置位AWD@ADC_SR,如果AWDIE置位还将 产生中断 ? 检测范围由上下门限寄存器指定
? 12位的ADC_HTR和ADC_LTR有效值,和对齐方式无关

? 对规则组和注入组的检测使用不同使能控制
? AWDEN和JAWDEN@ADC_CR1 ? 检测所有通道还是单个通道由AWDSEL@ADC_CR1决定 ? 检测哪个单个通道由AWDCH@ADC_CR1决定
AWDEN和JAWDEN使能规则组和注入组通道的检测
ADC_IN0 ADC_IN1 .

19个逻辑通道

. .

Analog Watchdog
Status Register

AWD

Temp Sensor VREFINT

. . .
ADC_IN15

Low Threshold High Threshold
AWDSEL和AWDCH选择检测哪个/哪些通道

35

模拟看门狗监测的通道
模拟看门狗监测的通道 AWDEN 不监测任何通道 所有注入通道 只一个(注入)通道* 所有规则通道 只一个(规则)通道* 所有规则+注入通道 只一个通道* 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 ADC_CR1控制寄存器 JAWDEN AWDSEL 0 1 0 1 0 1 0 1 监测的目标通道编号 无意义 监测的目标通道编号 无意义 监测的目标通道编号 无意义 AWDCH[4:0]

36

ADC1上的三个内部转换通道
TSVREFE@ADC_CCR

温度传感器

VSENSE VREFINT

ADC1_IN16 地址/数据总线

内部电源模块

ADC1_IN17

转换数据

电池电压

VBAT/2

ADC1_IN18

VBATE@ADC_CCR

注意事项: 1. 对温度传感器的采样时间必须长于2.2us >> 为减少延迟,建议同时置位ADON和TSVREFE 2. 测量的温度范围在[-40oC,125oC],精度+/-1.5oC 3. 温度数值(oC) = {(V25-VSENSE) /Avg_Slope} +25 >> V25和VSNESE参见数据手册 4. 不使用内部通道时,应该复位相应控制位以节约功耗

37

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

38

多个ADC协同工作
? 多个ADC协同工作
? ADC1是主模块,其余ADC是从模块
? 由主ADC向从ADC发出转换开始的触发信号 ? 这个信号同时触发主ADC和从ADC (simultaneously) ? 这个信号交替触发主ADC和从ADC (alternatively) ? 如果是ADC1外部事件作为触发,用户需要关掉从ADC的外部触发

? 双ADC协同工作:Dual ADC mode ? 三个ADC协同工作:Triple ADC mode

? Dual和Tripe ADC转换下,分别有六种模式
? ? ? ? ? ? 同时注入(Injected simultaneous)模式 同时规则(Regular simultaneous)模式 交替(Interleaved)模式 交替触发(Alternative trigger)模式 同时注入+同时规则 同时规则+ 交替触发
在MULTI@ADC_CCR中设 置独立工作还是协同工作, 以及哪种协同工作模式

? 多ADC协同工作模式下使用的公用(Common)寄存器
? 多模式控制寄存器:ADC_CCR ? 多模式数据寄存器:ADC_CDR ? 多模式状态寄存器:ADC_CSR

39

双ADC协同工作框图
? ADC1作为主设备,ADC2作为从设备, ADC3独立工作 ? 转换的开始由ADC1触发。根据不同模式,这个触发信号可以同时触 发ADC2的转换,或者交替触发2个ADC的转换 ? 6种工作模式:MULTI@ADC_CCR,MULTI[4] = 0
ADC_IN15 ADC_IN0 ADC_IN1

Temp Sensor



Up to 4 injected channels

VREFINT External event (Regular group) External event (Injected group)

GPIO Ports


ANALOG MUX
Up to 16 regular channels

Common part Dual/Triple mode control

ADC1 Analog
External event synchronization

ADC2 Analog
External event synchronization Data register

Digital Master

Data register

Digital Slave

EOC/JEOC

EOC/JEOC

40

三个ADC协同工作框图
? ADC1作为主设备,ADC2和ADC3作为从设备 ? 转换的开始由ADC1触发。根据不同模式,这个触发信号可以同时触 发ADC2和ADC3的转换,或者交替触发3个ADC的转换 ? 6种工作模式:MULTI@ADC_CCR,MULTI[4] = 1
ADC_IN15 Temp Sensor ADC_IN0 ADC_IN1

ADC3 Analog



Up to 4 injected channels

VREFINT External event (Regular group) External event (Injected group)

GPIO Ports


Digital Slave

ANALOG MUX
Up to 16 regular channels

Common part Dual/Triple mode control

ADC1 Analog
External event synchronization

External event synchronization

ADC2 Analog

Digital Master

Data register

Data register

Digital Slave

EOC/JEOC

EOC/JEOC

41

同时注入转换:MULTI=x0101
? 对两组/三组注入组通道进行转换
? 启动的触发信号来自主ADC(ADC1)
? JEXTSEL@ADC1_CR2

? 该触发信号被同步送给从ADC(ADC2或/和ADC3)

? ADC上可以有规则组转换,会被注入转换打断而已
转换结束后数据存放 数据在每个ADC模块各自的注入转 换数据寄存器ADC_JDRx中 双ADC
4个通道上的同时注入转换

中断信号的产生 所有通道转换完成后,如果至少一个ADC模 块的JEOC中断使能,则产生JEOC中断

三ADC

42

同时规则转换:MULTI=x0110
? 对两组/三组规则组通道进行转换
? 启动的触发信号来自主ADC(ADC1)
? EXTSEL@ADC1_CR2

? 该触发信号被同步送给从ADC(ADC2或/和ADC3)

? 必须关闭ADC上的注入转换
转换结束后数据存放 双ADC 中断信号的产生 所有通道转换完 成后,如果至少 一个ADC模块的 EOC中断使能, 则产生EOC中断

[选择DMA模式2] 同样序号的2个通道都转完时产生DMA请求,把分别存放在 ADC_CDR高/低半字的ADC2和ADC1转换数据传输到SRAM中
[选择DMA模式1] 同样序号的3个通道都转完时产生3个DMA请求,依次把存放在 ADC_CDR中的三个ADC转换数据传输到SRAM中

三ADC 图示

和同时注入转换类似,只是组内的通道数可多达16个

43

间隔转换:MULTI=x0111
? 只能对一个规则组(通常仅一个通道)进行
? 转换启动来自ADC1的触发:EXTSEL@ADC1_CR2

? 触发信号出现时
? ? ? ? ADC1立即开始转换 经过用户设置的延迟后,ADC2开始转换 再经过用户设置的延迟后,ADC3开始转换 如果协同工作的ADC都设置了连续模式,重复以上步骤

? 间隔模式的用途
? 双ADC间隔模式可以加快转换速率1倍(*2) ? 三ADC间隔模式可以加快转换速率2倍(*3)

44

间隔规则转换的延迟设置
? 同一个通道不能同时被多个ADC采样
? 间隔延迟的设置: DELAY@ADC_CCR ? 规则通道的采样时间: SMPx@ADC_SMPR1/2

? 间隔设置、采样时间和实际间隔
? 采样时间长于设置的间隔
? 实际间隔 = 采样时间 + 2 (ADC时钟周期) ? e.g. sampling time = 15, DELAY = 5 ? ? 不同ADC转换的实际间隔 = 15+2 = 17
15 8 15 5 2 8

? 采样时间短于设置的间隔
? 实际间隔 = 设置的间隔 ? e.g. sampling time = 3, DELAY = 6 ? ? 不同ADC转换的实际间隔 = 6
3 8 3 6 8

45

间隔转换图示及DMA管理数据
ADC1 EOC ADC1 EOC

ADC1
ADC2 delay

CH0
CH0

CH0
CH0 ADC2 EOC

……
……

CH0
CH0

连续转换:CONT@ADC1=1 CONT@ADC2=1 DMA模式2: DMA[1:0]@ADC_CCR=0b10

ADC2 EOC 32位的DMA请求,把ADC_CDR中的32位数据)传输到SRAM 每次DMA请求: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]

ADC1 EOC

ADC1
ADC2 ADC3

CH0
CH0 CH0 delay delay

CH0 ……
…… CH0 ADC2 EOC CH0 ADC3 EOC

……
……

……

连续转换:CONT@ADC1=1 CONT@ADC2=1 CONT @ADC3=1 DMA模式2: DMA[1:0]@ADC_CCR=0b10

32位的DMA请求,把ADC_CDR中的32位数据传输到SRAM

第一次DMA请求: ADC_CDR[31:0]=ADC2_DR[15:0]|ADC1_DR[15:0] 第二次DMA请求: ADC_CDR[31:0]=ADC1_DR[15:0]|ADC3_DR[15:0] 第三次DMA请求: ADC_CDR[31:0]=ADC3_DR[15:0]|ADC2_DR[15:0]

46

交替触发转换MULTI=x1001
? 只能转换注入组通道
? 外部触发事件来自ADC1 ? 在同一个外部事件触发下,两/三个ADC交替转换各自 的注入组通道
? 1st触发:转换ADC1所有注入通道,产生JEOC中断 ? 2nd触发:转换ADC2所有注入通道,产生JEOC中断 ? 3rd触发:转换ADC3所有注入通道,产生JEOC中断
若后续还有触发 ,重复这些步骤

不同ADC 转换的触发 事件最小时 间间隔是: 1个 ADCCLK

? 如果两/三个ADC都使能了间断模式
? ? ? ? 1st触发:转换ADC1第一个注入通道,产生JEOC中断 2nd触发:转换ADC2第一个注入通道,产生JEOC中断 3rd触发:转换ADC2第一个注入通道,产生JEOC中断 每个ADC上所有注入通道转换完成,产生各自的JEOC
若后续还有触发 ,重复这些步骤

? 转换数据保存在ADC各自的注入数据寄存器中
47

交替触发转换图示和应用
? 图示举例
? 双ADC交替触发: MULTI=0b01001 ? 间断转换:JDISCEN=1 ? 每个ADC的注入组包含4个通道

48

同步注入转换+同步规则转换: MULTI=x0001
? 举例:3个ADC协同工作
? 各自的注入组包含2个通道(最多4个通道) ? 各自的规则组包含4个通道(最多16个通道)
被打 断 ADC1 ADC2 ADC3
CH0 CH1

重新开始
CH1 CH2 CH3

Sampling Conversion

CH3

CH2

同步规则转换被同 步注入转换打断

CH2

CH1

CH0

CH1

CH3

CH3

CH0

CH2

三个EOC上的EOC中断 来自ADC1的触 发信号,同时触 发三个ADC的转 换

ADC1 ADC2 ADC3

CH10

CH11

CH15

CH14

注: 同一个通道不能同时被多个ADC采样
三个EOC上的JEOC中断

CH8

CH9

来自ADC1的触发信号, 同时触发三个ADC的转换

49

同步规则转换+交替触发转换: MULTI=x0010
? 举例:三个ADC协同工作 ? 注意:在注入转换过程中出现的注入触发被忽略
交替触发注入转换模式,打断同步规则转换
ADC1 reg
End of Conversion on ADC1, ADC2 and ADC3

CH0

CH1

CH1 CH10

CH2

CH2

CH3

CH3

ADC1 inj
ADC2 reg
CH3 CH0

End of Injected Conversion on ADC1
CH0 CH1 CH1 CH11 CH2 CH2

ADC2 inj ADC3 reg
CH1 CH2 CH2 CH3

End of Injected Conversion on ADC2 CH3 CH0 CH0 CH12 End of Injected Conversion on ADC3

ADC3 inj
Trigger for regular channels

来自ADC1的第 一次注入触发

来自ADC1的第 二次注入触发

来自ADC3的第三次注入触发

50

多ADC协同工作模式小结
转换触发源都来自ADC1 MULTI Dual ADC Triple ADC

同步规则转换
同步注入转换 交替转换 (通常连续转换一个通道) (可以选择是否连续@ CONT) 交替触发 (可以选择是否间断@ DISCEN) 同步规则+同步注入 同步规则+交替触发

10110
10101

DMA mode2

DMA mode1

10111

DMA mode2 (转换精度10、12位) DMA mode3 (转换精度6、8位)

11001 10001 10010

浅橙色表示在规则通道上的转换,需要使用DMA管理转换数据; 深橙色表示在注入通道上的转换,有每个通道独立的数据寄存器,无DMA支持;

51

多ADC工作模式下的数据管理
? DMA工作模式1:适用于3个ADC的同步规则转换
? 每次DMA请求有一个半字的转换数据就绪,传输16位数据 ? 举例:三个连续的DMA请求
? 1stDMA请求:ADC_CDR[31:0]=ADC1_DR[15:0] ? 2ndDMA请求:ADC_CDR[31:0]=ADC2_DR[15:0] ? 3rdDMA请求:ADC_CDR[31:0]=ADC3_DR[15:0]

? DMA工作模式2:适用于交替转换模式以及2个ADC的同步规则转换
? 每次DMA请求有两个半字的转换数据就绪,传输32位数据 ? 举例:2个ADC交替转换
? 每次DMA请求:ADC_CDR[31:0]=ADC2_DR[15:0] | ADC1_DR[15:0]

? 举例:3个ADC交替转换
? 1stDMA请求:ADC_CDR[31:0]= ADC2_DR[15:0] | ADC1_DR[15:0] ? 1stDMA请求:ADC_CDR[31:0]= ADC1_DR[15:0] | ADC3_DR[15:0] ? 1stDMA请求:ADC_CDR[31:0]= ADC3_DR[15:0] | ADC2_DR[15:0]

? DMA工作模式3
? 每次DMA请求有两个字节的转换数据就绪,传输16位数据 ? 适用于8位/6位精度的交替转换模式 ? 其余类似DMA工作模式2
52

培训内容
? ADC特性简介与框图 ? ADC功能引脚与逻辑通道 ? ADC工作原理
? 模块工作时钟 ? 通道转换时间 ? 转换数据的存储

? ADC的通道选择
? 规则组和注入组 ? 外部事件触发ADC转换

? ADC转换模式
? 单次转换、连续转换和间断转换

? 转换数据的管理 ? ADC其他特性
? 模拟看门狗、ADC1上的三个内部转换通道

? 组合工作模式
? 双DMA模式、三个DMA共同工作

? 标志与中断

53

ADC的标志与中断

寄存器标志
AWD EOC 状 态 寄 存 器 JEOC JSTART

备注
转换值超过设置的门限由硬件置位;软件可复位 规则组中全部通道或没给通道转换完成后由硬件置位(取 决于EOCS);可通过软件或读取ADC_DR来复位 注入组中全部通道转换完成后由硬件置位;软件可复位 注入通道开始转换时由硬件置位;软件可复位

中断使能位
AWDIE EOCIE JEOCIE

START
OVR

规则通道开始转换时由硬件置位;软件可复位
数据丢失时由硬件置位;软件可复位; OVRIE

54

ADC的中断和DMA请求不是完全对应的
? DMA请求只针对规则通道的转换
? 在每个规则通道的转换完成都有相应的DMA请求
? 只要使能了DMA功能: ? 单DMA模式:DMA@ADC_CR2 ? 多DMA模式:DMA[1:0]@ADC_CCR

? 根本原因在于众多规则通道共享一个数据寄存器

? 中断请求在规则和注入转换都有
? 在EOC/JEOC@ADC_SR置位时才产生中断 ? 规则通道转换
? EOCS=0:规则组中所有通道都转换完成,才置位EOC标志 ? EOCS=1:规则组中每个通道转换完成,都会置位EOC标志

? 注入通道转换
? 注入组中所有通道转换完成,才置位JEOC标志 ? 每个注入通道有各自的数据寄存器
55

STM32F2 片上闪存

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
2

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
3

片上闪存主要特性
? STM32F2系列产品中最高容量可达1M字节 ? 片上闪存宽度:128位(16个字节) ? 独创的自适应闪存加速器
? 预取址指令队列 ? I-Code总线上的指令高速缓存(STM32F2新增) ? D-Code总线上的数据高速缓存(STM32F2新增)

? 单独的编程供电引脚(STM32F2新增)
? 编程宽度可高达64位

? 增强的读保护级别(STM32F2新增)
? JTAG引脚熔断

? 512字节OTP区域(STM32F2新增)
4

在系统架构中的闪存接口

128位宽度

1MB

5

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
6

片上闪存的组织结构
? 最高1M字节用户闪存
? 12个扇区容量不均匀
? 4个16K字节的扇区 ? 1个64K字节的扇区 ? 7个128K字节的扇区

? 30K字节系统闪存
? 出厂前存放bootloader
? USART1/3 ? CAN2 ? USB OTG FS

? 512字节OTP
? 一次性编程区域

? 选项字节
? 读、写保护使能和控制 ? BOR电平设置 ? 低功耗模式下,软、硬件看门狗的行为

7

一次性编程区域(OTP)
? 528字节OTP区域
? ? ? ? 528 = 32 * 16 + 16 * 1 16个数据Block,每个Block有32个字节 1个上锁Block,包含16字节LOCKBi (0<=i<=15) 以上内容都不能被擦除

? 上锁Block中的每个字节用来给数据Block上锁
? 上锁字节被写入0x00之后,对应数据Block不能再被修改 ? 上锁字节的值只能是0x00或者0xFF ? OTP区域的编程和用户闪存的编程流程一样(后详述)
数据Block 块号 0 1 15 … 0x1FFF,79E0 … 32字节

上锁Block 0x1FFF,7A00
16字节

起始地址
容量大小 OTP起始地址

0x1FFF,7800
32字节

0x1FFF,7820
32字节

0x1FFF,7800

8

选项字节
? 16字节空间的选项字节
? 目前只有4字节有应用意义 ? 其余空间保留
地址 描述 读保护控制 位域 15:8 7 描述 RDP nRST_STDBY nRST_STOP WDG_SW BOR_LEV 功能 0xAA表示没有保护;0xCC表示高 级别保护;其他值表示普通保护 置位表示进入待机模式就产生复位 置位表示进入停止模式就产生复位 选择硬件还是软件开启独立看门狗 设置BOR电平;四个值对应四个供 电电压范围下的BOR电平

0x1FFF,C 000

6 用户选项字节 5 4 3:2 1:0

15:12
0x1FFF,C 008 写保护控制 i (0<=i<=11) nWRP 每个bit对应一个闪存扇区的写保护 控制,低电平表示写保护有效

9

选项字节的访问控制
? 修改和擦除之前,必须先解锁
? 通过往选项字节键值寄存器写入正确的字节序列来解锁
? FLASH_OPTKEY1 = 0x08192A3B ? FLASH_OPTKEY2 = 0x4C5D6E7F

? 以上序列完成后,解锁位被硬件清零
? OPTLOCK@FLASH_OPTCR

? 选项字节修改流程
? ? ? ? ? 确认闪存空闲:BSY@FLASH_SR 更新选项字节内容:FLASH_OPTCR 启动内部写逻辑:OPTSTRT@FLASH_OPTCR 等待写操作完成: BSY@FLASH_SR 用户可置位OPTLOCK来对更新的内容加上写保护
10

选项字节相关寄存器

? 选项字节控制寄存器
? 选项位的值在复位后从闪存的选项字节区域拷贝 ? OPTSTAT:软件置位(开启写过程),硬件清零 ? OPTLOCK:软件置位(上锁),解锁序列后硬件清零

? 选项字节键值寄存器
? 往此寄存器写入解锁序列 ? OPTKEYR = 0x08192A3B ? OPTKEYR = 0x4C5D6E7F
11

选项字节和闪存接口寄存器中的OPTCR
……

512MB Block 2 Periphrals
0x4000,0000

BKPSRAM (size = 4KB)
0x4002,3C00

Flash接口寄存器组 @ AHB
RCC接口寄存器组 @ AHB ……
偏移0x14处

0x3FFF,FFFF

512MB Block 1 SRAM
15:0
0x2000,0000 0x1FFF,FFFF

RDP & USR

512MB Block 0 Code
0x0000,0000

0x1FFF,C000

选项字节 (size = 16B) OTP (size = 528B) 系统闪存 (size = 30KB) 片上用户闪存 (size = 1MB)
0x1FFF,7800~0x1FFF,77FF 0x1FFF,0000~0x1FFF,77FF

nWRP

0x0800,0000~0x080F,FFFF

别名区 (用户闪存/系统闪存/用户SRAM) Size = 1MB

0x0000,0000~0x000F,FFFF

12

15:0

修改选项字节

RDP & USR

上电装载选项字节信息

修改Flash_OPTCR,置位 OPTSTRT来启动选项字节写 逻辑:先擦除选项字节区域再 把寄存器中的值更新过去

nWRP

复位后,从选项字节区域 装载信息到闪存接口寄存 器Flash_OPTCR中

13

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
14

闪存读接口的等待周期
? 快速CPU和相对慢速闪存之间的平衡
? 等待周期LATENCY@FLASH_ACR

? 等待周期与HCLK以及供电范围的关系
? 片上闪存属于VDD域 ? VDD的电压范围影响闪存的工作性能 ? 复位后CPU频率默认16MHz
等待周期(WS) LATENCY 0WS (1 CPU周期) 1WS (2 CPU周期) 2WS (3 CPU周期) 3WS (4 CPU周期) 4WS (5 CPU周期) 5WS (6 CPU周期) 6WS (7 CPU周期) 7WS (8 CPU周期) HCLK (MHz) 电压范围:2.7V ~3.6V 0< HCLK <=30 30< HCLK <=60 60< HCLK <=90 90< HCLK <=120 电压范围:2.4V ~2.7V 0 < HCLK <=24 24 < HCLK <=48 48 < HCLK <=72 72 < HCLK <=96 96 < HCLK <=120 电压范围:2.1V ~2.4V 0 < HCLK <=18 18 < HCLK <=36 36 < HCLK <=54 54 < HCLK <=72 72 < HCLK <=90 90 < HCLK <=108 108 < HCLK <=120 电压范围:1.8V ~2.1V 0 < HCLK <=16 16 < HCLK <=32 32< HCLK <=48 48< HCLK <=64 64 < HCLK <=80 80 < HCLK <=96 96 < HCLK <=112 112 < HCLK <=120

15

读接口等待周期的动态调整
? 复位后CPU默认跑在16MHz ? 提升CPU频率,必须修改等待周期的个数 ? 写入更多的等待周期:LATENCY@FLASH_ACR ? 读出LATENCY以确定写入成功 ? 提高CPU频率
? SW@RCC_CFGR (选择系统时钟源:HSI、HSE、PLL) ? HPRE@RCC_CFGR (AHB时钟分频因子:1~512)

? 读出以上修改后的域以确保修改成功 ? 降低CPU频率,也应该修改等待周期的个数 ? 降低CPU频率
? SW@RCC_CFGR ? HPRE@RCC_CFGR

注意:对等待周期以 及CPU时钟的配置不 一定会马上生效。需 要通过读取修改后的 域来由用户确认已经 修改成功

? 读出以上修改后的域以确保修改成功 ? 写入更少的等待周期 ? 读出LATENCY以确定写入成功

16

片上闪存读接口(1)
? 假设顺序读取都是32位的指令
-M3
with MPU
120MHz

FLASH

F E T C H

I-32-bit 128-bit

I1- 32-bit I2- 32-bit I3- 32-bit

I4- 32-bit
I5- 32-bit

? 假设等待周期设置 LATENCY=3
? 在120MHz的CPU频率下,需要4个周期读取闪存 ? 但是在要求第5条指令时,CPU又需要4个周期才能获得

17

没有预取指令的示意图
? 假设顺序读取都是32位的指令 ? 假设等待周期设置 LATENCY=3

只要流水线空闲就可以执行相应的F操作,无须 等待指令从闪存读取出来,因为它们对应的指 令2/3/4都已经在 current instruction line了 CPU第一次读 片上闪存 读出的4条指令放在 current instruction line

CPU第二次读 读出的4条指令放在 current instruction line 片上闪存

18

片上闪存读接口(2)
? 假设顺序读取都是32位的指令
FLASH

PFQ
4x32-bit / 8x16-bit

-M3
with MPU
120MHz

F E T C H

buffer CPU clk I-32-bit PFQ clk 128-bit I1- 32-bit I2- 32-bit I3- 32-bit I4- 32-bit

? 使能预取指PFQ:PRFEN@FLASH_ACR
? 当CPU通过I-Bus从current ins. Line获得数据时,PFQ可 以提前从闪存中读取下一个128位的数据放在prefeched ins. line ? 在执行顺序代码的情况下,CPU之后就无需等待了
19

带预取指令功能的示意图
? 假设顺序读取都是32位的指令 ? 假设等待周期设置 LATENCY=3

CPU第一次读 片上闪存 读出的4条指令放在 current instruction line

闪存加速器把下4个 指令预先读取出来

读出的4条指令放在 prefetched instruction line

20

片上闪存读接口(3)
? 如果指令发生跳转
PFQ
FLASH

-M3
with MPU
120MHz

F E T C H

4x32-bit buffer 8x16-bit buffer I-32-bit 128-bit I1- 32-bit I2- 32-bit I3- 32-bit

D-32-bit

I4- 32-bit
64*128 bit

BC

8*128 bit

BC

储存经常用到的literal pool

储存经常用到的指令,跳转发生又缓存击 中的情况下,无需任何延迟地执行代码

21

片上闪存读接口寄存器

? FLASH_ACR
? 等待周期的配置:LATENCY@FLASH_CR ? 预取指使能:PRFEN@FLASH_CR ? 指令高速缓存
? 复位:ICRST ? 使能:ICEN

? 数据高速缓存
? 复位:DCRST ? 使能:DCEN

22

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
23

片上闪存写接口特性
? 擦除和编程操作要求HCLKMIN=1MHz ? 擦除和编程操作之前需要解锁
? FLASH_KEYR = 0x45670123 ? FLASH_KEYR = 0xCDEF89AB

? 擦除和编程操作的并行宽度
? 取决于VDD范围以及是否有外部编程电压VPP ? 需要在PSIZE@FLASH_CR中由用户指明
? PSIZE设置和外部电压条件不符,擦除或编程操作会导致不能预料的 错误,即使读出来正确也不能保证

? VPP:8~9V,最好只用于生产线上最初的编程
? 引脚上供电不能超过1个小时,否则损坏片上闪存
2.7~3.6V & VPP 64位 2.7~3.6V 32位 2.4~2.7V 16位 VDD 最大并行宽度 2.1~2.4V 1.8~2.1V 8位

PSIZE[1:0]

11

10

01

00

24

片上闪存写接口特性(2)
? 擦除操作
? 以扇区为单位(16KB、64KB和128KB) ? 全部擦除
? 不影响OTP和选项字节

? 擦除之后最好清空高速缓存
? disable cache ? reset cache ? enable cache

? 编程操作
? 编程单位取决于PSIZE(8b、16b、32b和64b) ? 编程流程适用于OTP和用户闪存区域 ? 可能的编程错误
? 跨越128位边界的写操作 ? PGAERR@FLASH_SR ? 写操作的单位和PSIZE不符 ? PGPERR@FLASH_SR ? 编程软件序列不符合 ? PGSERR@FLASH_SR
25

擦除和编程操作流程
检查BSY@SR 0 1

设置SER/SNB@CR

设置MER@CR

设置PG@CR

编写新选项字节 到OPTCR

设置STRT@CR

根据PSIZE进行字节/ 半字/字/双字写操作

设置OPTSTRT@OPTCR

擦除操作仅针对用户闪存; OTP不可擦除; 选项字节在编程时自动先擦除

检查BSY@SR 0

1

用户闪存的编程操作和 OTP相同; 和选项字节不同
置位OPTLOCK@ FLASH_OPTCR 来对更新的内容保护

置位LOCK@FLASH_CR 来对更新的内容保护 页擦除 全擦除 闪存编程(用户闪存和OTP区域) 选项字节编程

26

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
27

片上闪存的写保护
? 保护的目标:用户闪存 ? 12个扇区的写保护分别由选项字节中的12位控制
? 低电平表示写保护有效
? 不能对对应扇区进行编程或擦除 ? 只要一个扇区被写保护,芯片就不能执行全片擦除

? 对保护的部分写操作会导致错误
? 比如,写操作的目标是: ? 写保护位置位的扇区、上锁的OTP数据块、ICP ? 置位错误标志WRPERR@FLASH_SR

28

片上闪存读保护的三个级别
? 保护的目标:用户闪存和备份SRAM ? Level 0:没有读保护
? 选项字节中的RDP域 = 0xAA ? 所有启动配置下,对用户闪存和备份SRAM的读操作都允许 ? 写保护由选项字节中的nWRP域控制

? Level 1:
? 选项字节中的RDP域 = 非0xAA或0xCC的值 ? 用户闪存和系统闪存启动下,对闪存的访问无限制
? 用户代码可以运行自己的IAP ? 可以通过ISP(bootloader)来更新代码,或修改选项字节解除读保护

? 调试模式下(JTAG/SWD)和SRAM启动时,对片上闪存的访问限制:
? 不能读、编程和擦除(读、写都被保护),即使nWRP=1 ? 但是可以通过SRAM运行代码修改选项字节来取消保护

? 修改选项字节从Level1降低到Level0,硬件先对用户闪存和备份 SRAM进行全部擦除, 选项字节其他域不受影响
29

片上闪存的读保护(2)
? Level 2
? 选项字节中的RDP域 = 0xCC ? 除了Level 1级别的保护,用户选项字节也不能再修改 ? 调试功能被永久性禁止 ? JTAG熔断,不再能做边界扫描 ? 系统闪存启动被禁止,不能通过bootloader修改选项字节
蓝色路线:保护级别升级 >> 擦除选项字节 >> 写入新的选项字节 紫色路线:保护级别降级 >> 闪存和选项字节全部擦除 >> 写入新的选项字节 绿色路线:保护级别不变 >> 擦除选项字节 >> 写入新的选项字节
此保护级别下, 选项字节的其他 域也不能修改
30

培训内容
? 片上闪存特性和系统框图 ? 存储空间组织架构
? ? ? ?
? ? ? ?

用户闪存 系统闪存 OTP 选项字节
等待周期 指令预取 指令高速缓存 数据高速缓存

? 闪存读接口

? 擦除和编程操作 ? 读保护和写保护 ? STM32F2和STM32F1的闪存特性比较
31

片上闪存特性比较
STM32 F-2
用户Flash总容量 Flash读宽度 多达1M字节 128位

STM32 F-1
多达1M字节 64位

用户Flash扇区/页大小
系统Flash总容量 选项字节 OTP 预取指(可开关) Half access 读接口 高速缓冲Cache 等待周期 擦除单位 写接口

16K、64K、128K字节
30K字节 16字节 528字节 2*128位 跳转指令/常用数据缓冲 取决于HCLK和供电电压 全部擦除/扇区擦除 8位/16位/32位/64位 取决于供电电压和编程电压引脚 外部供电(8V~9V )

1K/2K字节
2K/6K/18K字节 16字节 2*64位 Yes 取决于HCLK 全部擦除/页擦除

编程单位
Vpp

16位

32

编程速度比较:STM32F2

没有外部VPP引脚 上的编程电压

外部VPP引脚上的编 程电压可以加快闪 存编程和擦除速度

33

编程速度比较:STM32F1
? 只能以半字为单位编程闪存 ? 闪存扇区容量均匀

34

寄存器组比较
偏移量 0x00 寄存器 ACR[32] 速度性能 KEYR[32] OPTKEYR[32] SR[32] 解锁闪存控制器CR,以允许对其的写访问 解锁对选项字节的写/擦除访问 STM32F2 STM32F1

0x04 0x08 0x0c

0x10

CR[32]

0x14

OPTCR[32]选项字节

AR[32]地址寄存器

0x1c

OBR[32]选项字节

0x20

WRP[32]

35

选项字节区域及内容比较
STM32F-2 选项字节区域起始地址 选项字节区域大小 选项字节区域结构 读保护(8) 选项字节 区域内容 写保护 复位/看门狗 4字节内容; 12字节保留 读保护级别 12位分别对应12个扇区的 保护 0x1FFFC000 16字节 8字节内容; 8字节对应补码 读保护功能 8位/32位分别负责几个页 的保护 STM32F-1 0x1FFFF800

低功耗模式下复位/软硬件WDG

用户数据
BORLEVRL 对应选项字节寄存器

*
4个层次选择 OPTCR[32]

DATA0/1(8)
OBR&WRPR[32]

* STM32F-2在电池备份域有4K字节的SRAM可以在低功耗模式下保持数据

36

选项字节区域及内容比较(2)
? STM32F2的选项字节区域

? STM32F1的选项字节区域

37

中断和错误比较
SR状态寄存器 EOP PGAERR PGPERR PGSERR WRPERR CR控制寄存器 EOPIE 说明 写操作完成,BSY置位 编程对齐出错(128位) 编程并行大小出错(PSIZE) ERRIE 编程序列出错 写保护出错

OPERR

SR状态寄存器 EOP PGERR WRPERR OPTERR

CR控制寄存器 EOPIE

说明 编程目的地址非0xff 写保护出错 选项字节和对应补码不匹配

ERRIE

38

实时时钟 RTC

1

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
2

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
3

RTC框图
AFI_TAMPER AFI_TIMESTAMP RTC Reference Clock RTCSEL [1:0]
Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag

512 Hz clock output Alarm A

AFO_CALIB

HSE (1 MHz) LSE LSI

RTCCLK
ss, mm, HH/date
Asynchronous 7bit Prescaler

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

4 4

RTC框图
AFI_TAMPER AFI_TIMESTAMP RTC参考时钟 参考时钟 RTC RTCSEL [1:0] 512 Hz clock output Alarm A HSE (1 MHz) LSE LSI
Asynchronous 7bit Prescaler Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag AFO_CALIB

RTCCLK
ss, mm, HH/date

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration RTC 数字校准

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

5 5

AFI_TAMPER AFI_TIMESTAMP RTC Reference Clock RTCSEL [1:0]

Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag

512 Hz clock output Alarm A

AFO_CALIB

HSE (1 MHz) LSE LSI

RTCCLK
ss, mm, HH/date
Asynchronous 7bit Prescaler

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

6 6

时钟源和分频器
? RTC时钟源:RTCCLK
? LSE (属于备份域)
? 即使系统供电消失,只要备 份域供电还在RTC仍可工作

? 两个可编程分频器
? 7位的PREDIV_A
? 默认因子 = 128,不能为0

? LSI ? HSE (max= 1MHz)
? 通过HSE_RTC分频调节 ? /2 ~ /31

? 13位的PREDIV_S
? 默认因子= 256

@RCC_BDCR
LSE OSC 32.768 KHz

? 最小因子:2 ? 最大因子:222

@RCC_CFGR

HSE OSC 4~26 MHz

7

使用不同时钟源产生1Hz信号给日历模块
预分频因子 RTCCLK时钟源 PREDIV_A[6:0] HSE_RTC = 1MHz LSE = 32.768KHz LSI* = 32KHz 124 (div 125) 127 (div 128) 127 (div 128) PREDIV_S[12:0] 7999 (div 8000) 255 (div 256) 249 (div 250) 1 Hz 1 Hz 1 Hz Ck_spre

注意:LSI精度不适用于日历应用

8

AFI_TAMPER AFI_TIMESTAMP RTC Reference Clock RTCSEL [1:0]

Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag

512 Hz clock output Alarm A

AFO_CALIB

HSE (1 MHz) LSE LSI

RTCCLK
ss, mm, HH/date
Asynchronous 7bit Prescaler

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

9 9

硬件日历和警报
? 带夏令时调整的硬件日历
? 真实寄存器 ? 影子寄存器 RTC_TR & RTC_DR
? ? ? ? 用户访问的是影子寄存器,而非真实寄存器 影子寄存器每2个RTCCLK被更新一次,并置位RSF标志 低功耗模式下,影子寄存器不再被更新 影子寄存器内容会被所有系统复位信号给复位

? SUB1H、ADD1H、BKP@ RTC_CR调整夏令时

? 两个可编程警报(闹钟)
? 各自的使能、中断使能、匹配标志信号 ? 各自的掩码寄存器,控制各自的报警时刻
? 若以秒匹配报警,PREV_S的值必须>=3

? 报警信号可从输出引脚导出,且极性可配置 ? 可把MCU从停止和待机模式下唤醒 (EXTI17)
10

日历和闹钟寄存器
礼拜



年 日



12/24小时制

时 秒

日 礼拜

12/24小时制

时 秒

11

日历模块的时钟同步
? 用户以APB1的时钟读取日历寄存器
? 读取RTC_TR时硬件会锁定RTC_DR ? 先读取RTC_TR,再读取RTC_DR,保证时间连续性

? 要保证fPCLK1 ≥4*fRTCCLK
1秒 RTCCLK
time 1 COPY COPY COPY time 1 COPY time 2 COPY COPY time 1

Real registert

Shadow register

time 1

time 1

time 1

time 1

RSF

RSF在影子寄存器被更新后由硬件置位; RSF可通过软件复位,也可在初始化模式时 被硬件复位

12

特殊情况下读取影子寄存器的特殊操作
? 从低功耗模式唤醒后,软件要读取日历信息
? 因为:低功耗模式下不更新影子寄存器 ? 所以:先复位RSF标志,再等待RSF置位

? 系统复位后,软件要读取日历信息
? 因为:系统复位信号会复位影子寄存器 ? 所以:先复位RSF标志,再等待RSF置位

? 日历模块初始化后,软件要读取日历信息:
? 因为:硬件已经在初始化模式下复位RSF ? 所以:只需等待RSF置位

13

硬件日历初始化流程
Step
1 2 3

What to do
关闭RTC寄存器的写保护 进入初始化模式 等待进入初始化模式的确认 对预分频因子编程 装载时间和日期值 配置时间格式(12/24小时)

How to do it
先后往RTC_WRP写入 0xCA和0x53 置位INIT@RTC_ISR 查询INITF@RTC_ISR直到 它置位

Comments
RTC寄存器可以被修改了 日历计数器停止以便于修 改

4 5 6

编程寄存器RTC_PRER: RTCCLK=32.768 KHz时, 先写同步分频因子,再写异 预分频因子默认产生1Hz 步因子 时钟 编程RTC_TR和RTC_DR 置位或复位 FMT@RTC_CR 清零INIT@RTC_ISR 往RTC_WPR写入0xFF FMT=0:24小时制 FMT=1:AM/PM制

7 8

退出初始化模式 使能RTC寄存器写保护

自动载入当前日历计数器 值,4个RTCCLK后开始计 数
RTC寄存器不能被修改

14

闹钟的设置非常灵活
Step What to do How to do it Comments

1
2 3 4

关闭RTC寄存器的写保护
关闭警报A 等待访问允许的确认 设置闹钟

先后往RTC_WRP写入 0xCA和0x53
复位ALRAE@RTC_CR 查询ALRAWF@RTC_ISR 直到它置位 设置RTC_ALRMAR

RTC寄存器可以被修改了

FMT格式要和日历一致 RTC寄存器不能被修改

5
6

重新使能警报A
使能RTC寄存器写保护

置位ALRAE@RTC_CR
往RTC_WPR写入0xFF

举例1:每个周一的23:15:07产生闹钟 >> WDSEL = 1 >> MSKx = 0000b >> s = 7 (ST=0b,SU=0111b) >> mm = 15 (MT=01b,MU=0101b) >> hh = 23 (HT=10b,HU=11b) >> AM/PM = 0 (24小时制) >> D = 1 举例2:每个月1号的23:15:07产生闹钟 >> WDSEL = 0 >> 其余设置都一样

15

AFI_TAMPER AFI_TIMESTAMP RTC Reference Clock RTCSEL [1:0]

Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag

512 Hz clock output Alarm A

AFO_CALIB

HSE (1 MHz) LSE LSI

RTCCLK
ss, mm, HH/date
Asynchronous 7bit Prescaler

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

16

周期唤醒定时器
? 16位自装载向下计数器
? 使能控制 WUTE@RTC_CR ? 可扩展到17位计数器 WUCKSEL=11x @RTC_CR

? 计数器输入时钟
? RTCCLK分频 WUCKSEL@RTC_CR
? 分频因子 = 2、4、8、16

? 和硬件日历模块相同的输入时钟:ck_spre
? 通常是1Hz

? 唤醒标志可从输出引脚导出,且极性可配置 ? 低功耗特性
? 系统复位和低功耗模式,不影响计数器运行 ? 可把MCU从停止和待机模式下唤醒 (EXTI22)

17

自动唤醒定时器配置流程
Step
1 2 3 4

What to do
关闭RTC寄存器的写保护 关闭唤醒定时器 等待确认 设置自装载值

How to do it
先后往RTC_WRP写入 0xCA和0x53 复位WUTE@RTC_CR

Comments
RTC寄存器可以被修改了

查询WUTWF@RTC_ISR 直到它置位
设置WUT@RTC_WUTR

5
6 7

选择时钟源
重新使能定时器 使能RTC寄存器写保护

设置WUCKSEL@RTC_CR
置位WUTE@RTC_CR 往RTC_WPR写入0xFF

参见“定时器的精度和范 围” 唤醒定时器开始自减 RTC寄存器不能被修改

18

定时精度和范围
? 一旦使能唤醒定时器,即从WUTR的数值开始自减直到0, 触发WUTF标志;并自动重装载WUTR,继续自减:
? 定时器时钟源是RTCCLK/2时,WUTR的值至少为1 ? WUCKSEL[2:1]=11,16位定时器扩展成17位
? MSB=1,低16位可配置,装载值范围[0x10000,0x1FFFF]
定时器输入时钟 LSE分频2/4/8/16 WUCKSEL 0xx 10x 11x ck_spre 16位自装载 定时器 (WUTR) WUTF 定时精度 [61us,488us] 定时范围 [122us,32s] [1s,18.2h] [18.2h,36.4h] 备注 短时间唤醒 中等时间间隔 长时间唤醒

ck_spre

精度一般为1s

LSE 32.768KHz HSE 1MHz(max) LSI around 32KHz

RTCCLK

4位分频 (2/4/8/16)

19

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟
不能同时使用

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
20

STM32F2 RTC校准原理
? 每分钟往ck_apre输出的时钟脉冲序列中
? 增加2个脉冲(DCS=0),调快RTC晶振 ? 减少1个脉冲(DCS=1),调慢RTC晶振 ? 该调整过程持续2*DC分钟
? ? ? ? DC[4:0] @ RTC_CALIBR 最短调整时间:2分钟 最长调整时间:62分钟 整个校准周期持续64分钟

21

STM32F2 RTC校准数据 (假设RTCCLK=32.768KHz PREDIV=127) ? 调整精度
? 正向调整: 4/(64*15360) = +4.069 ppm ? 负向调整: 2/(64*15360) = -2.035 ppm ? 一个月调快10.5秒;或调慢5.27秒

? 精度

? 调整范围 [-63 ppm, 126 ppm]
? 正向调整:126 ppm ? 负向调整:63 ppm ? 一个月可以调快327秒;调慢163秒

? 范围

? 调整周期:64分钟 ? 注意事项:
? 进行校准时,必须保证PREDIV_A>=6
22

参考时钟检测
? 参考时钟输入引脚:PB.15
? 更高精度的时钟(通常50Hz或60Hz) ? 该引脚配置成浮空输入模式:input floating

? 如果检测到参考时钟,则以此校准ck_spre;参考 时钟停止或消失,则继续由LSE来更新日历模块
? 使能控制:REFCKON@RTC_CR ? 分频因子必须设置到它们的默认值
? PREDIV_A = 0x7F & PREDIV_S = 0xFF

23

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
24

AFI_TAMPER AFI_TIMESTAMP RTC Reference Clock RTCSEL [1:0]

Backup Registers and RTC Tamper Control registers TimeStamp Registers

Tamper Flag TimeStamp Flag

512 Hz clock output Alarm A

AFO_CALIB

HSE (1 MHz) LSE LSI

RTCCLK
ss, mm, HH/date
Asynchronous 7bit Prescaler

=

Alarm A Flag

Calendar

RTC_CR_OSEL[1:0]

PREDIV_A [6:0] AFO_ALARM

Calibration

Day/date/month/year HH:mm:ss (12/24 format)

=
Alarm B Flag

Alarm B
Synchronous 13bit Prescaler

PREDIV_S [12:0]

ss, mm, HH/date
Wake-Up

Asynchrone 4bit Prescaler

WUCKSEL [2:0]

16bit autoreload Timer

Periodic wake up Flag

25 25

外部引脚上的导出和导入
AF1(PC.13) AFO_CALIB 使能控制:COE@CR AFO AFO_ALARM 使能:OSEL[1:0] 极性控制:POL@CR 模式:ALARMOUTTYPE AFI_TIMESTAMP 使能控制:TSE@CR AFI _TAMPER1 使能控制:TAMP1E@CR RTCCLK/64_Output ALARM_A_Output ALARM_B_Output Wakeup_Output 所有封装都有该 引脚 只有176引脚封 装有该引脚 AF2(PI.8)

AFI

Time stamp
Tamper

TSINSEL和TSEDGE分别控制检测 哪个引脚和边沿 TAMP1INSEL和TAMP1TRG控制检 测哪个引脚和边沿

? 导出信号RTC_AFO
? 如果二者都使能, AFO_ALARM优先级高于AFO_CALIB ? 使能以上功能时,PC.13自动配置成“可编程功能输出”
? 对于AFO_ALARM还可配置OD或PP

26

导入信号 RTC_AFI
? 当TSINSEL指定的引脚上检测到time-stamp事件
? 当前日历信息保存到RTC_TSTR和RTC_TSDR ? 标志TSF置位
? 由于同步的原因,延迟2个ck_apre时钟周期置位标志 ? TSF置位的情况下,又检测到time-stamp事件 ? TSOVF标志置位,置位无延迟

? 如果使能了中断(TSIE),还触发对应中断

? 当TAMP1INSEL指定引脚上检测到入侵事件
? 复位所有备份寄存器:RTC_BKPxR ? 标志TAMP1F置位;如置位了TAMP1E还会触发中断 ? 侵入检测功能在VDD关闭情况下仍然有效
? RTC_AFIO属于电池供电域 ? VDD上电或掉电情况下,入侵检测引脚上电平要保持一致
27

时间戳功能的使用
Step
1 2 3 4 5 备注

What to do
使能时间戳 选择有效边沿 把该功能映射到某个引脚 (PC13或者PI8) 中断检测时间戳事件 轮询检测时间戳事件

How to do it
置位TSE@RTC_CR 设置TSEDGE@RTC_CR 设置TSINSEL@RTC_TAFCR 置位TSIE@RTC_CR 查询TSF@RTC_ISR1)

Comments

时间戳事件发生时产生中 断 给TSF写0来清除标志2)

1) 由于同步过程,时间戳事件发生后2个ck_apre周期后才置位TSF; 2) 为避免屏蔽掉同时发生的时间戳事件,用户必须在读到TSF为1后再写0清除该标志 给TSOVF写0来清除标志; 时间戳寄存器还保持着之 前事件对应的时间信息;

6

检测时间戳溢出事件3)

查询TSOVF@RTC_ISR 4)

备注

3) 时间戳溢出事件不和任何中断相连 4) TSOVF的置位没有任何延迟。如果两个事件间隔太近,会看到TSF还是0时TSOVF 已经置位。因此推荐用户在TSF置位后再去查询TSOVF
28

侵入检测注意事项
? 用于侵入检测的引脚无需进行GPIO配置,只要
? 配置好具体的引脚(PC13还是PI8) ? 配置好检测的边沿(上升沿还是下降沿) ? 使能入侵检测功能

? 入侵事件的检测
? 使能之后,引脚上有设定的边沿变化,就能监测到该入 侵事件(边沿检测) ? 使能之前,如果已经达到非法电平,使能后立刻触发入 侵事件
? 如果在入侵检测的ISR中重新写入备份寄存器,必须在之前先 关闭再使能该入侵检测功能:这样可以保证一直处在非法电平 的情况下,即使写进去也会被立马清除掉 ? 相当于电平检测

29

防入侵功能的使用
Step 1 2 3 4 5 备注 What to do 使能防入侵功能 选择入侵有效电平 把该功能映射到某个引脚 (PC13或者PI8) 中断检测入侵事件 轮询检测入侵事件 How to do it 置位TAMP1E@RTC_TAFCR 设置 TAMP1TRG@RTC_TAFCR 设置 TAMP1INSEL@RTC_TAFCR 置位TAMPIE@RTC_TAFCR 查询TAMP1F@RTC_ISR 入侵事件发生时产生中断 给TAMP1F写0来清除标志 Comments

发生入侵事件时,复位80字节的备份寄存器RTC_BKPxR (x=0,1…19)

30

导出信号RTC_AFO:CALIB
? RTC_CALIB:产生外部时钟
? 输出控制:COE@RTC_CR ? 输出频率由RTCCLK进行分频
? 7位异步分频因子PREDIV_A[6:0]的低6位,最高位没用 ? PREDIV_A[5]必须为0,否则没有RTC_CALIB输出 ? 分频系数范围:[32(10,0000b),64(11,1111b)]

? RTCCLK = 32.768 KHz RTC_CALIB= 32768 /(0x3F+1) = 512Hz PREDIV_A[6:0] = 0x7F ? 输出时钟占空比失准,推荐使用上升沿
AFO_CALIB (512 Hz)
Ck_apre (256 Hz)

31

导出信号RTC_AFO:ALARM
RTC_ALARM来自闹钟和唤醒信号 的复用输出 >> 由OSEL@RTC_CR决定在 RTC_ALARM引脚输出哪个信号
01 10

>> 当闹钟到来或唤醒信号到来时, 引脚输出高电平或低电平,该电平 保持到对应标志被清零再翻转
OSE[1:0]= 01 或者10

>> 输出电平极性由POL@RTC_CR 决定

OSE[1:0]= 11

11

32

RTC导入、导出功能的优先级

RTF_AF1:PC.13

RTF_AF2:PI.8

33

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
34

RTC的低功耗特性
? RTC属于电池供电域
? 常用于在没有外界中断的情况下,把MCU从低功耗模 式唤醒 ? 自唤醒模式(Auto-wakeup)

? RTC的三个时钟源中只有两个能达到以上目的
? 32.768KHz的LSE
? 属于电池供电域,即使VDD掉电仍可工作

? 约32KHz的LSI
? 系统进入低功耗模式,只要VDD还在,仍可工作

? 唤醒源
? RTC报警(RTC alarmA&B):EXTI17 ? RTC唤醒(RTC wakeup):EXTI22 ? RTC入侵:EXTI21
Auto-wake mode

35

停机和待机模式的唤醒源
唤醒信号源
EXTI 0~15 EXTI 16 (PVD output) EXTI 17 (RTC alarm)***

停止模式

待机模式

外部中断线

EXTI 18 (OTG FS Wakeup)
EXTI 19 (Ethernet Wakeup) EXTI 20 (OTG HS Wakeup) EXTI 21 (RTC tamper & timestamp)*** EXTI 22 (RTC wakeup)***

其它内部信号

IWDG复位 WKUP引脚上的上升沿 (PA.0)*** NRST引脚上的复位信号 (独立引脚)

其它I/O引脚

* 要使用RTC把MCU从低功耗模式唤醒,RTC的时钟源必须是LSE(备份域电路)或者LSI(待机电路) ** 使用RTC相关功能把MCU从停止模式唤醒,相应EXTI必须配置成上升沿 *** 会置位 WUF@PWR_CSR

36

唤醒配置
Alarm EXTI EXTI_17 Tamper/stamp EXTI_21 Wakeup EXTI_22

从Stop模式唤 b) 在RTC_CR或RTC_TAFCR使能报警/时间戳/侵入/唤醒中断 醒的配置 c) 配置RTC使得产生报警或唤醒信号/检测侵入或时间戳事件
从Standby模 式唤醒的配置 b) 在RTC_CR或RTC_TAFCR使能报警/时间戳/侵入/唤醒中断 c) 配置RTC使得产生报警或唤醒信号/检测侵入或时间戳事件

a) 配置EXTI_i以中断或事件模式检测上升沿

a) 关闭报警/唤醒/侵入/时间戳事件的中断
进入/退出低功 b) 清除报警/唤醒/侵入/时间戳事件的标志 耗模式的正确 c) 清除电源唤醒标志WUF* 序列 d) 打开报警/唤醒/侵入/时间戳事件的中断

e) 进入低功耗模式
事件标志 中断使能 ALRAF/ALRBF ALRAIE/ALRBIE TSF/TAMP1F TSIE/TAMPIE WUTF WUTIE

37

培训内容
? RTC系统框图和组件
? 时钟源和分频器 ? 硬件日历和警报 ? 自动唤醒定时器

? 特色功能
? 数字粗略校准 ? 参考时钟

? 外部引脚上的导出和导入功能
? 输出:警报、定时信号、校准时钟 ? 输入:入侵检测

? 低功耗特性 ? STM32F2和STM32F1的RTC比较
38

RTC特性比较
STM32F2 计数器 以日历形式表达 STM32F1 简单32位计数器

定时唤醒 参考时钟源 中断/事件
报警信号 备份寄存器 GPIO输出

16位自装载计数器 50/60Hz以提高日历精度 周期唤醒/报警/入侵检测/ 时间戳 中断 AlarmA AlarmB
80字节 报警/校准时钟/唤醒输出

周期/报警/溢出/入 侵检测 中断 AlarmA 20字节/84字节 校准时钟输出

GPIO输入
复位后访问

入侵/时间戳检测

入侵检测

复位后RTC寄存器都写保护,但不同解锁序列
39

数字音频接口 I2S

1

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
2

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
3

I2S协议简介
? I2S是Philips为数字音频设备之间的音频数据传输 而制定的一种总线标准 ? 主 / 从设备模式
? 主设备:提供并控制CK和CS信号;可收/发/第三方 ? 从设备:收/发数据
CK

? 数据信号线
? CK:串行时钟 ? SD:串行数据
? 分时复用的数据通道

? WS:字段(声道)选择 ? MCK:主时钟(系统时钟)
? 主设备输出,可选项,为了使系统间更好地同步 ? MCK 频率 = 256(或者384)* 采样频率
4

I2S协议 – 串行时钟
? CK:由主设备输出,输入给从设备
? 每个时钟脉冲对应数据线上每个位

? 串行时钟频率 = 采样位数 * 通道数 * 采样频率
? e.g. CD采样频率44.1KHz,32位精度的立体声道 ? 所需时钟频率= 2*32*44.1KHz = 2.8224MHz

5

I2S协议 – 串行数据
? SD:数据长度不固定(通常16/20/24/32/64位)
? 发送方,数据在SCK的上升/下降沿同步 ? 接收方,数据在SCK的下降沿同步

? I2S格式的信号无论有多少位有效数据,最高位总是被最先 传输,在WS变化(也是一帧开始)后的第二个SCK脉冲 开始传输。 ? 数据最高位拥有固定的位置;而最低位的位置则依赖于数 据的有效位数。这使得接收端和发送端的有效位数可以不 同。
? 如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余 的低位数据; ? 如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位 (常补足为零) ? 这种同步机制使得不同精度的设备间互联更方便,且不会数据错位
6

I2S协议 – 字段(声道)选择
? WS:主设备输出,输入给从设备
? 表明正在传输的声道
? WS =1,表示正在传输左声道的数据 ? WS =0,表示正在传输右声道的数据

? WS的变化表明新一个采样数据即将开始
? 立体声系统:声道选择信号是一个占空比50%的方波 ? 单通道系统:一个位时钟长度的脉冲

? 标准I2S协议下,WS总在MSB前一个时钟周期改变

? WS可以在串行时钟的上升沿或下降沿发生改变 ? 从设备的WS总在时钟上升沿被锁存

7

时序变种
? 随着技术发展,I2S接口下出现了不同时序
? 标准I2S时序
WS SCK 标准I2S 16位数据 标准I2S 24位数据

? LSB右对齐
? 日本格式

WS SCK LSB右对齐 16位数据

? MSB左对齐
? 少用

LSB右对齐 20位数据
LSB右对齐 24位数据 MSB左对齐 24位数据

8

STM32F2的I2S占用的引脚及配置
I2S模块 引脚 SD SCK I2S2 MCK WS CKIN SD GPIO PC.3-PB.15-PI.3 PB.10-PB.13-PI.1 PC.6 PB.12-PI.0-PB.9 PC.9 PC.12-PB.5 PC.10-PB.3 PC.7 PA.4-PA.15 备注 双向数据线 主设备输出给从设备 主设备可选择性输出固定频率(256*Fs) 主设备输出给从设备 外部时钟源输入给主设备,以产生SCK输出 双向数据线 主设备输出给从设备 主设备可选择性输出固定频率(256*Fs) 主设备输出给从设备

I2S3

SCK MCK WS

9

STM32F2的I2S支持多种数据格式
? 一根数据线上分时复用两个通道的数据
? 16位寄存器 SPI_DR[16] ? 由CHSIDE @ SPI_SR区分左右通道 ? 由用户保证写入/读出足够的数据(一次/两次DR访问)

? 支持多种数据/帧长度
? ? ? ? ? DATLEN[2:0] & CHLEN @ SPI_I2SCFGR 16位数据/16位帧长度 只需一次CPU或DMA访问SPI_DR[16] 16位数据/32位帧长度 24位数据/32位帧长度 需要两次CPU或DMA访问SPI_DR[16] 32位数据/32位帧长度
10

STM32F2的I2S支持多种音频标准
? 支持四种音频标准
? ? ? ? ? I2SSTD[2:0] @ SPI_I2SCFGR 标准I2S格式 MSB左对齐格式(少用) LSB右对齐格式(日本常用) PCM格式
? 两种同步帧:PCMSYNC @ SPI_I2SCFGR ? 短帧同步 ? 长帧同步

11

STM32F2的I2S支持的标准Philips时序
? WS电平表示当前传输哪个通道的数据
? WS = 0:传输左通道数据 ? WS = 1:传输右通道数据

? WS在MSB传输之前的一个时钟周期变化 ? 发送方在CK下降沿锁存数据 ? 接收方在CK上升沿读取数据

16/32位数据,16/32位帧长度

24位数据,32位帧长度
12

STM32F2的I2S支持的MSB左对齐格式
? WS和第一位数据(MSB)传输同时
? 发送方在CK下降沿锁存数据 ? 接收方在CK上升沿读取数据
16/32位数据, 16/32位帧长度

24位数据, 32位帧长度

16位数据, 32位帧长度

13

STM32F2的I2S支持的LSB右对齐格式
? 和MSB左对齐格式类似
? 对于全精度帧来说是一样的
16/32位数据, 16/32位帧长度

24位数据, 32位帧长度

16位数据, 32位帧长度

14

STM32F2的I2S支持的PCM格式标准
? 没有左右通道的分别 ? 两种PCM同步方式
? 短帧同步 PCMSYNC =0 ? 长帧同步 PCMSYNC =1

16位数据,16位帧长度

16位数据,32位帧长度

15

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
16

I2SCLK信号源
? 为取得高精度音频时钟,I2SCLK时钟源:
? PLLI2S输出(参考RCC章节) ? 外部引脚I2S_CKIN
? PC.9 / I2S2_CKIN / I2S3_CKIN

输入频率的范围: 0.95~2MHz

PLL
/Q *N VCO output clock /P

PLL48CLK

HSE HSI
PLL input clock /M VCO input clock

PLLCLK

PLLSRC
输入频率的范围: 0.95~1.05MHz

*N VCO output clock

/R

PLLI2SCLK

PLLI2S

17

I2S主设备的时钟配置(16位帧长度)
? 主时钟输出使能 MCKOE =1
? CK引脚输出
? I2SCLK / ([2*I2SDIV + ODD]*4*2) = 2 *16 *FS

? 同时MCK引脚输出:
? I2SCLK / (2*I2SDIV + ODD) = 256 *FS

两个引脚同时输 出的信号相差8倍

? 主时钟输出关闭 MCKOE =0
? 只有CK引脚输出:
? I2SCLK / (2*I2SDIV + ODD) = 2 *16 *FS’
同样配置下,FS’是FS的8倍

? 是主时钟使能时CK输出的8倍 ? 和主时钟使能时MCK输出一样

CHLEN =0 (16位帧长度)

18

I2S主设备的时钟配置(32位帧长度)
? 主时钟输出使能 MCKOE =1
? CK引脚输出
? I2SCLK / ([2*I2SDIV + ODD]*4) = 2 *32 *FS

? 同时MCK引脚输出:
? I2SCLK / (2*I2SDIV + ODD) = 256 *FS

两个引脚同时输 出的信号相差4倍

? 主时钟输出关闭 MCKOE =0
? 只有CK引脚输出:
? I2SCLK / (2*I2SDIV + ODD) = 2 *32 *FS’
同样配置下,FS’是FS的4倍

? 是主时钟使能时CK输出的4倍 ? 和主时钟使能时MCK输出一样

CHLEN =1 (32位帧长度)

19

时钟配置举例

20

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
21

I2S主/从模式配置
CK&WS引脚输入 CD&WS引脚输出

从设备

无需配置时钟

主设备

I2SDIV、ODD、MCKOE、 CHLEN决定位时钟CK频率

静态配置

2)置位I2SMOD激活I2S功能,并通过I2SSTD和 PCMSYNC来选择时序标准。 3)设置DATLEN和CHLEN确定数据长度以及通道长 度 4)设置I2SCFG来确定主/从的收/发模式 5)在CR2配置需要的中断源和DMA使能 6)置位I2SE使能I2S模块

0)设置I2SDIV和ODD来决定时钟波特率 1)设置CPOL定义时钟空闲电平。若要输出主时钟还需 置位MCKOE 2)置位I2SMOD激活I2S功能,并通过I2SSTD和 PCMSYNC来选择时序标准。 3)设置DATLEN和CHLEN确定数据长度以及通道长度 4)设置I2SCFG来确定主/从的收/发模式 5)在CR2配置需要的中断源和DMA使能 6)置位I2SE使能I2S模块

发送

在主设备的时钟到来之前至少2个PCLK周期就要使 能从设备并放好待发送的数据。首个写入的数据对 应左通道。 时钟来了数据还未放好,会触发UDR错误;必须关 闭I2S以重新从左通道开始发送数据 等到TxE置位且BSY清零后,复位I2SE来关闭I2S

TxE置位,根据CHSIDE写相应通道的数据到SPI_DR; 为保证音频数据的连续发送,必须在当前发送完成之前, 下一个数据已经写入SPI_DR; 等到TxE置位,且BSY清零后,清零I2SE以关闭I2S

22

主/从设备收/发操作
从设备 接收 时钟输入信号 BR不影响数据传输率 主设备 时钟输出信号 BR决定数据传输率

接收完一帧,数据从移位寄存器送到Rx buffer,RxNE置位并产生中断。读操作返 回buffer中的数据,并清除RxNE 为了保证发送数据流的连续:可以在TxE置位时写入下一个待发送的数据,此时上 一个数据还在移位寄存器和总线上发送。写操作之前,必须确认TxE标志置位; 参见“全双工时序和标志图”。 主设备发送时钟之前就要使能从设备并且把它待发送的数据放在数据寄存器中;

备注

23

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
24

STM32F2的SPI和I2S模式相互转换
? I2S接口是在SPI模块上实现的 ? 两个I2S,分别和SPI2/SPI3复用 ? 模式选择:I2SMODE @ SPI_I2SCFGR
? 必须在SPI和I2S都关闭时选择

? 模块使能:
? SPE @ SPI_CR1 ? I2SE @ SPI_I2SCFGR
SPE @CR1 =0

SPI

I2SMODE @ I2SCFGR =1 I2SE @CR1 =0 I2SMODE @ I2SCFGR =0

I2S

25

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
26

DMA特性
? 和SPI模式下的DMA特性一样 ? 唯一区别:没有CRC的传输

27

培训内容 – I2S模块
? I2S协议简介
? STM32F2的I2S模块GPIO占用和配置 ? STM32F2的I2S模块支持多种数据格式 ? STM32F2的I2S模块支持多种音频标准

? 主I2S的时钟配置
? I2S模块时钟源 ? 主设备的时钟配置和产生

? ? ? ?

主/从设备的配置和操作 STM32F2上SPI模式和I2S模式的切换 DMA特性 状态、错误标志以及中断管理
28

状态标志
? 发送缓冲空 TxE ? 发送缓冲的数据已经移到移位寄存器了 ? CPU/DMA可以往发送缓冲写数据了(写SPI_DR) ? 接收缓冲空 RxNE ? 移位寄存器收到的数据以及移到接收缓冲了 ? CPU/DMA可以从接收缓冲读数据了(读SPI_DR) ? 总线忙 Busy ? 常用于应用要关掉SPI并进入低功耗模式前检测通信是否结束 ? 通道标志 CHSIDE ? 发送:在TxE置位时刷新,表明要发送的数据属于哪个通道 ? 接收:在数据收到SPI_DR时刷新 ? 对PCM标准没有意义
Busy位 主设备 从设备 连续通信 通信期间一直保持置位 每字节/半字之间,BSY被拉低 一个I2S的时钟周期 间隔期间被拉低 间隔通信 备注 例外:主接收模式时,BSY 保持低电平(I2SCFG=1)

29

错误标志和中断管理
错误类别 下溢错误 UDR 上溢错误 OVR 何时发生 I2S模式的从设备发送:主 设备的时钟到来了,从设备 还未把数据放进SPI_DR 还未读取前一个数据,又收 到了新的数据 影响 置位UDR并产生中断 如何清除 读取SPI_SR清除 该标志

SPI_DR包含的还是前一 读取SPI_DR,再 个数据。后续的数据丢失。读取SPI_SR,清 除该标志 置位OVR并产生中断

状态和错误标志 TxE

中断事件 发送缓冲空

中断使能控制 TxEIE

RxNE
OVR UDR

接收缓冲满
上溢错误 下溢错误

RxNEIE
ERRIE

30

使用外部音频Codec播放音频文件
? I2S协议广泛用于MCU/DSP和音频Codec之间传 输音频数据,例如:
? 播放存储的音频文件 ? 从麦克风捕获模拟声音信号

? 常见应用框图
STM32F2

31

应用实例
? 标准固件库中I2S驱动音频播放Demo
? STM32F2xx_StdPeriph_Lib_V1.0.0\Project\STM32F2 xx_StdPeriph_Examples\I2S\Audio ? 播放存储在偏上闪存的音频文件
? 立体声、16位采样、48KHz

? 模拟输出到喇叭或耳机,自动切换

? 音频Codec驱动包含独立三层:
? STM32F2xx_StdPeriph_Lib_V1.0.0\Utilities\STM32_E VAL\STM3220F_EVAL\stm3220f_eval_audio_codec.c ? Codec硬件层:控制板上CS43L22以及通信 ? MAL:控制存储媒介来提供音频文件/音频流 ? 用户层:提供基本用户音频操作API
? 初始化、播放、暂停、继续、停止 ? 音量控制、文件指针管理
32

评估板上音频Codec:CS43L22
? 和MCU接口
? I2C接口配置Codec ? I2S接口专用传输音频数据 ? 复位控制

? 输出:耳机/单个喇叭,自动切换

33

Same as STM32F-1

通信接口 I2C

1

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

2

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

3

I2C协议回顾
? 协议背景
? 1980年由Philips开发 ? 开发原因:MCU的并行地址和数据总线造成PCB板上过多走线, 更容易受到EMI/ESD干扰 ? 解决方案:2线通信接口 – I2C

? 协议版本
? 早期版本@1982年
? 标准模式(100Kb/s)和7位地址

? 1.0版本@1992年
? 增加快速模式(400Kb/s和10位地址)

? 2.0版本@1998年
? 增加高速模式(3.4Mb/s)

? 2.1版本@2000年
? 放松在高速模式下对一些时序参数的要求

4

I2C协议基本概念
? 2根总线实现半双工通信
? SDA:双向数据线 ? SCL:时钟线,由主设备发出

? 总线上设备的角色
? 主设备
? 发出时钟信号SCL、起始位和停止位 ? 控制数据流

? 从设备
? 地址检测和停止位检测

? 每个设备拥有自己的地址
? 在作为从设备被寻址时用到

? 每个设备都可以发送或接收数据

5

I2C通信流程
? 通信开始
? 主设备发送起始条件 ? 主设备发送要寻址的从设备的地址以及通信方向

? 通信过程中
? 主设备发送数据,从设备发送应答 ? 或,从设备发送数据,主设备发送应答

? 通信结束
? 主设备发送停止条件

主设备 从设备

起 方 始 目标从设备地址 向

数据 数据

应 答 应 答

数据 数据

应 答 应 答

数据 数据

应 答 应 答

停 止

6

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

7

STM32F2的I2C特性总览
? 符合I2C版本1.0规范
? 支持7位和11位地址模式以及广播地址模式 ? 支持标准速度通信和快速通信

? 支持多主
? 默认都是从设备。发送了起始位后自动切换到主模式; 发送了停止位或者仲裁丢失,则自动切换回从模式

? ? ? ?

作为从设备支持双地址 可配置的时钟延展特性 可配置的PEC产生和验证 兼容SMBus和PMBus

8

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

9

主设备通信:时钟配置和发送起始位
? 主设备负责时钟信号的发送
? 配置APB1时钟 :FREQ@I2C_CR2
? 标准速度下,最小外设输入时钟 = 2MHz ? 快速模式下,最小外设输入时钟 = 4MHz

? 配置时钟控制寄存器:I2C_CCR ? 配置上升沿时间寄存器:I2C_TRISE ? 库函数I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
? I2C_InitStruct->I2C_ClockSpeed= (e.g 100000、400000、200000) ? I2C_InitStruct->I2C_DutyCycle= (16:9、2:1)

? 发送起始位
? 软件置位Start@I2C_CR1
? BUSY@I2C_SR2置位

? 起始位发送完成后
? SB@I2C_SR1置位,并产生中断如果ITEVFEN置位 ? MSL@I2C_SR2置位 ? Start@I2C_CR1清零

10

起始位发送的相关寄存器
? Start@I2C_CR1
? ? ? ? 可由软件置位、清零; 起始位发送出去后或PE=0时被硬件清零 主模式:置位表示当前数据传输完成后发送重复起始位 从模式:置位表示当总线空闲时发送起始位

? SB@I2C_SR1
? 只在主模式有效的只读域 ? 起始位发送后置位 ? 软件读SR1和写DR后清零;PE=0时也可由硬件清零

? BUSY@I2C_SR2
? 只读域 ? 检测到SDA或SCL线低电平时,硬件置位 ? 检测到停止位后由硬件清零

? MSL@I2C_SR2
? 只读域 ? 进入主模式后置位(SB=1) ? 检测到停止位后,或仲裁失败后,或当PE=0时,由硬件清零

11

主设备通信:发送目标从地址
? 发送目标从设备地址
? 10位地址模式
? 通过写I2C_DR,发送地址头(0b1111,0xxy) ? xx是10位地址的高2位;y表示通信方向,读还是写 ? ADD10@I2C_SR1置位,并产生中断如果ITEVFEN置位 ? 等到ADD10置位后,写I2C_DR发送地址字节(8位地址) ? ADDR@I2C_SR1置位,并产生中断如果ITEVFEN置位

? 7位地址模式
? 通过写I2C_DR,发送地址字节(0bxxxx,xxxy) ? xxxxxxx是7位地址;y表示通信方向 ? ADDR@I2C_SR1置位,并产生中断如果ITEVFEN置位

12

目标地址发送示意图
? 7位地址模式
起始 7位地址 0(发送) ACK/NAK 如果收到应答,置位ADDR@SR1 起始 7位地址 1(接收) ACK/NAK

? 10位地址模式
起始 11110, 地址高2位 0(发送) ACK

如果收到应答,置位ADD10@SR1 如果收到应答,置位ADDR @SR1 低8位地址字节 ACK

起始

11110, 地址高2位

0(发送) A

低8位地址字节 A

重复起始

11110, 地址高2位

1(接收) A

13

发送地址相关寄存器
? ADD10@I2C_SR1
? ? ? ? 只有主模式下有效的只读域 10位地址模式下地址首字节发送完毕后由硬件置位 软件读SR1再写DR清零;PE=0时也可由硬件清零 收到NACK后不置位

? ADDR@I2C_SR1
? 主模式下地址发送完成后置位该位
? 收到NACK后不置位

? 从模式下地址匹配后由硬件置位 ? 软件读SR1和SR2后清零;也可由硬件在PE=0时清零

? TRA@I2C_SR2
? 地址发送完毕后根据方向位置位
? TRA=0:接收数据 ? TRA=1:发送数据

? 检测到停止位、重复起始位,或仲裁失败、PE=0时由硬件清零

14

主设备通信:发送数据
? 开始发送
? 清除ADDR标志后,往I2C_DR中写入第一个数据

? 发送过程中
? 在当前数据发送完成之前,写入下一个待发送的数据

? 结束通信
? BTF置位时,软件置位STOP来发送停止位
注意: 红色箭头标志的事件 :如果软件未完成相 应操作,SCL会被拉 低延展 绿色箭头标志的事件 :如果软件未在当前 数据传输完成之前, 完成相应操作,SCL 会被拉低延展

15

主设备通信:接收数据
? 开始接收
? 清除ADDR标志后,从设备的数据才出现在总线上

? 接收过程中
? RxNE置位后,在下一个数据传输结束之前,读取数据寄存器

? 结束通信
? 主设备在适当的时刻置位NAK和STOP位
注意: (1) 主设备只接收一个数据 时,此处是个NAK 红色箭头标志的事件:如 果软件未完成相应操作, SCL会被拉低延展 绿色箭头标志的事件:如 果软件未在当前数据传输 完成之前,完成相应操作 ,SCL会被拉低延展 蓝色箭头标志的事件:必 须在当前数据传输完成之 前完成对应软件操作

16

主设备接收一个和两个数据的特殊处理流程
? ? ? EV5
? SB置位:软件读取SR1,往I2C_DR写入目标从设备的地址字节

EV6
? ADDR置位:软件对ACK位写零,再通过读取SR1和SR2来清除该标志

EV7

?

RxNE置位:读取数据寄存器,置位STOP位

?

EV5
? SB置位:软件读取SR1,往 I2C_DR写入目标从设备的 地址字节

ADDR置位:软件对ACK位写零,置位POS,再 通过读取SR1和SR2来清除该标志;在ADDR 标志被清除之前,SCL一直被拉低延展 BTF置位(Data1在数据寄存器中,Data2在移 位寄存器中):置位STOP;读取Data1和Data2 。在读取Data1之前,SCL一直被拉低延展

17

主设备接收三个或更多数据
? ? ? EV5
? SB置位:软件读取SR1,往I2C_DR写入目标从设备的地址字节

EV6
? ADDR置位:软件对ACK位写零,再通过读取SR1和SR2来清除该标志

EV7

?

RxNE置位:读取数据寄存器,置位STOP位

Data3

Data4

BTF置位(Data3在数据寄存器中,Data4在移 位寄存器中):软件对ACK位写零,读取Data3 。在读取Data3之前,SCL一直被拉低延展 BTF置位(Data4在数据寄存器中,Data5在移位 寄存器中):置位STOP位,读取Data4和Data5 。在读取Data4之前,SCL一直被拉低延展

18

从设备通信:地址匹配检测
? 从设备接收来自主设备的时钟信号
? 也需配置PCLK1 :FREQ@I2C_CR2
? 标准速度下,最小外设输入时钟 = 2MHz ? 快速模式下,最小外设输入时钟 = 4MHz

? 检测到总线上的起始位后接收地址字节,然后
? 和OAR1寄存器比较 ? 如果使能双地址模式,还要和OAR2寄存器比较
? ENDUAL@I2C_OAR2 = 1

? 如果使能广播模式,检验收到的是否为广播地址
? 广播地址由两个字节组成,第一个字节是0x00 ? ENGC@I2C_CR1 = 1

? 地址字节接收并匹配后,根据通信方向硬件设置TRA

19

7位和10位地址匹配检测
10位地址模式
地址头序列 11110XX0 如果ACK位置位,硬件回复应答脉 冲,并继续等待下一个地址字节 继续等待总线上的下一个起始位 若ACK置位,硬件回复应答脉冲; 硬件置位ADDR并产生中断,如果 ITEVFEN置位; 若双地址模式,软件读取DUALF确 认收到的地址和自身哪个地址匹配 继续等待总线上的下一个起始位 匹配 不匹配

7位地址模式

第二个地址字节 XXXXXXXX

匹配

同左

地址字节 XXXXXXXY

不匹配

同左

蓝色表示地址信息; 红色表示方向位: 10位地址模式下,地址头序列的LSB方向位固定是“主发从收” 7位地址模式下,地址字节LSB方向位根据通信方向确定

20

地址匹配检测中的寄存器
? ADDMODE@I2C_OAR1
? 置位表示10位地址模式;清零表示7位地址模式 ? 只在从模式有效

? ADD[9:0]@I2C_OAR1
? 10位地址模式下从设备的10位地址

? ADD[7:1]@I2C_OAR1
? 7位地址模式下从设备的7位地址

? ADD2[7:1]@I2C_OAR2
? 双地址模式下,从设备的第二个地址

? ENDUAL@I2C_OAR2
? 置位表示使能双地址模式

? ENGC@I2C_CR2
? 置位则使能广播呼叫模式

? DUALF@I2C_SR2
? 只在从模式有效 ? 表示收到的地址和双地址中的哪个匹配 ? 检测到停止位或重复起始位后,或者当PE=0时,由硬件清零

21

从设备通信:发送数据

? 红色箭头标志的事件
? 在软件执行完相应操作之前,时钟信号被拉低延展

? 绿色箭头标志的事件
? 当前数据传输完成之前还未执行完相应软件操作,时钟被拉低延展 ? 即BTF置位就会延展时钟
22

从设备通信:接收数据

? 红色箭头标志的事件
? 在软件执行完相应操作之前,时钟信号被拉低延展

? 绿色箭头标志的事件
? 当前数据传输完成之前还未执行完相应软件操作,时钟被拉低延展 ? 即BTF置位就会延展时钟

? 通信结束:检测到停止位,置位STOPF标志
23

时钟延展
? 主设备:一直具备该特性
? BTF或ADDR置位未清零前,时钟被硬件拉低延展

? 从设备:该特性可被软件关闭
? NOSTRETCH@I2C_CR1= 0
? BTF或ADDR未清零前,时钟被硬件拉低延展 ? 同主设备

? NOSTRETCH@I2C_CR1 = 1
? 由软件管理读写冲突 ? RxNE置位未清零,又收到新数据:Overrun错误 ? 后一个数据会丢失 ? TxE置位,当前数据发送完成之前还未写DR:Underrun错误 ? 重复发送前一个数据

24

PEC包错误检查
? 目的:提供I2C通信可靠性
? 使用CRC8多项式对每个字节的8位进行计算 ? C(x) = X8 + X2 + X + 1 ? 对每个数据字节以及包含读写位的地址字节都计算

? 使能控制
? ENPEC@I2C_CR1

? PEC的使用
? 发送:最后一个数据对应的TxE置位,把最后一个发送数据写入 DR,然后置位PEC
? 在最后一个数据发送完成后,硬件自动发送PEC计算值

? 接收:最后一个数据对应的RxNE置位,读取DR中最后一个接收 数据,然后置位PEC
? 收到的数据和自身计算出的PEC值不相符合,回复NAK信号。 ? 主设备接收时:无论PEC符合与否,都回复NAK信号;软件必须在清 零ACK位之前,置位PEC位 ? 从设备接收时:置位PEC不能晚于PEC字节的应答脉冲出现,否则即 使CRC错误也不会置位PECERR。 DMA模式下PEC的使 ? PECERR标志和相应中断 用在DMA章节讲
25

PEC操作相关寄存器
? ENPEC @ I2C_CR1
? 软件控制PEC计算使能控制位

? PEC @ I2C_CR1
? ? ? ? ? 软件置位表示发送PEC计算值 PEC发送完成后由硬件清零 检测到起始位、停止位后由硬件清零 PE=0时由硬件清零 仲裁失败破坏PEC的计算

? PECERR @ I2C_SR1
? 硬件置位表示收到的PEC出现错误
? 接收方返回NACK信号,无论ACK位是1还是0

? 否则表示没有PEC错误
? 接收方在收到PEC后返回ACK信号,如果ACK位为1

? 软件写0清除该位;也可在PE=0时由硬件清零
26

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

27

DMA特性
? I2C的DMA请求
? ? ? ? ? 发送时数据寄存器为空 接收时数据寄存器为满 收/发共同的DMA使能控制:DMAEN@I2C_CR2 DMA请求必须在当前数据传输完成之前被响应 数据传输完毕,DMA控制器给I2C发送EOT/EOT_1信号;并产生中断,如果 使能了的话

? 使用DMA发送
? 不要置位ITBUFEN@I2C_CR2 ? 主设备:在EOT对应的中断ISR中,等待BTF置位再软件置位STOP位来发出 停止位 ? 如果使能了PEC:发送完最后一个数据后,自动发出PEC

? 使用DMA接收
? 不要置位ITBUFEN@I2C_CR2 ? 主设备:接收完N-1个数据,硬件产生EOT_1信号。如果LAST @ I2C_CR2 已经置位,则在EOT_1信号之后的下一个字节传输完成后,硬件自动发送 NAK信号。在DMA传输完成中断ISR中,再软件置位STOP为来发出停止位 ? 如果使能了PEC:I2C收到EOC信号后自动认为下一个字节是PEC并核查它 的值。PEC接收完毕后会在产生一个DMA请求

28

DMA操作相关寄存器
? DMAEN@I2C_CR2
? DMA使能控制位 ? 置位时表示:当TxE或RxNE置位似,产生DMA请求

? ITBUFEN@I2C_CR2
? 发送/接收缓冲中断使能控制位 ? 置位时表示:当TxE或RxNE置位时,产生事件中断
? 和错误中断不同的中断向量 ? 无论DMA使能与否

? LAST@I2C_CR2
? 用于主接收模式
? 在收到最后一个数据后产生NAK信号

? LAST=1:下一个DMA EOT信号是最后一次传输 ? LAST=0:下一个DMA EOT信号不是最后一次传输
29

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

30

错误标志
主设备 从设备 在地址和数据发送过程中,检测到停止位或起始位:置位BERR并产生中断,如果ITERREN置 位 总线错误 BERR 当前传输的数据不受影响。由软件决定是否 丢弃这次传输 当前正在传输的数据被丢失,硬件释放总线。 检测到起始位:等待后续地址或停止位; 检测到停止位:硬件释放总线

应答失败 AF

发送方检测到非应答(第九个时钟脉冲时数据线为高电平):置位AF并产生中断,如果ITERREN 置位 软件必须产生停止位或重复起始位,来复位 通信过程 硬件释放总线

仲裁失败ARLO Overrun 接收数据时 上溢/ 下溢 错误 OVR* Underrun 发送数据时

检测到仲裁失败:置位ARLO并产生中断,如果ITERREN置位; 释放总线,回到从设备模式(MSL位被清零),但不应答自己的从设备地址;除非在下一个起始位 之后 RxNE已经置位的情况下,下一个数据又接收完毕:置位OVR 新数据丢失; TxE已经置位的情况下,下一个字节对应的时钟到来之前还未更新数据寄存器:置位OVR DR中的数据被重复发送

备注: OVR只有在从设备这一端,并且关闭了时钟延展特性时才会发生。主设备永远不会发生,因为它固有的时钟延 展特性。 从设备在时钟延展关闭的情况下:ADDR清零之后必须在SCL的上升沿来临之前把要发送的第一个数据写进DR (使能时钟延展特性时,在ADDR清零和写DR的软件序列完成之前,SCL会把硬件拉低延展)

31

中断管理
中断事件 中断标志 使能控制位 矢量

主模式:起始位发送完成
通 信 开 始 结 束 主模式:地址发送完成且被应答 从模式:收到的地址字节匹配 主模式:10位地址的头序列发送完毕 从模式:检测到停止位

SB
ADDR ADD10 STOPF ITEVFEN I2Cx_EV

过 通 接收缓冲非空 中程 信 发送缓冲为空 总线错误 主模式:仲裁失败 通 信 错 误 应答失败 上溢/下溢错误 PEC错误 超时/Tlow错误

/

数据传输完成(DR和移位寄存器中都空)

BTF
RxNE TxE BERR ARLO AF OVR PECERR TIMEOUT ITERREN I2Cx_ER ITEVFEN以及 ITBUFEN

SMBus Alert错误

SMBALERT
32

培训内容
? I2C总线协议回顾 ? STM32F2的I2C特性总览 ? 通信流程和相应标志
? 主设备通信 ? 从设备通信

? DMA特性 ? 错误标志和中断管理 ? 兼容SMBus和PMBus

33

SMBus
? SMBus介绍
? 两线接口,基于I2C操作原则 ? 用于为系统和电源管理的相关应用提供控制总线 ? 总线中的三种设备
? Slave:接受命令、响应命令 ? Master:发送命令,产生时钟,结束通信 ? Host:特殊的Master,必须支持主机通报协议

? 和I2C协议的不同
SMBus协议 时钟频率 最快 最慢 100KHz 10KHz 35ms 电平固定值 不同类型(保留地址、动态地址) 9种不同协议(快速命令、进程调用) I2C协议 400KHz 没有下限 无超时限制 取决于VDD 7位、10位、广播地址 没有总线协议

超时限制 逻辑电平 设备地址类型 总线协议

34

SMBUs模式特性简介
? 兼容SMBus2.0版本 ? 时钟同步机制允许不同速度的设备共存于总线
? 时钟拉低延展
? 主设备:最长10ms的累积延展时间 ? 从设备:最长25ms的累积延展时间

? 在每个bit上延展

? 带应答控制的硬件PEC产生和校验 ? 支持地址解析协议(ARP)
? 给每个从设备动态分配唯一地址,以解决地址冲突

? 支持主机通报协议

35


相关文章:
炒股一招鲜系列全集
炒股一招鲜系列全集_金融/投资_经管营销_专业资料。今日推荐 50份文档 2014...STM32F2系列技术培训-全... 354页 2下载券 蒙特梭利教育法系列全集 53页 ...
stm32F 2
STM32F2系列培训资料(完... 354页 免费 STM32F2系列技术培训-全... 232页...81份文档 笑话大全集 笑话大全爆笑版 幽默笑话大全 全球冷笑话精选160份文档 ...
改革课堂教学与学的方式提高课堂实效
喜欢此文档的还喜欢 STM32F2系列技术培训-全... 199页 免费改​革​课​堂​教​学​与​学​的​方​式​提​高​课​堂​实...
基础知识2
基础知识2_职业技术培训_职业教育_教育专区。企业人力资源管理师,基础知识,第章 企业人力资源管理师——基础知识树 第章劳动法 一、单项选择题(请将正确答案...
学习STM32笔记汇总
2STM32 技术概述 2.1 一些概述指令集,即 CPU 能执行的指令的集合(内部逻辑块支持的) ,指令的功能不同当 然影响性能。 arm 中不同系列的 CPU 设计,定位...
SimTrade外贸模拟实训指导书
STM32F2系列技术培训-全... 199页 免费 造价员工作总结 4页 2下载券S...(4)选择集装箱为"20'",填入装船日期"09/10/2004'",再点"确定",订舱完成...
STM32F207中文数据手册
-M3 内核的相关信息,请参考《Cortex-M3 技术参考...Page 15 2.1 系列之间的全兼容性 STM32F205xx ...它们可以使用 DMA 操作并支持 SMBus 总线 2.0 版/...
STM32快速入门教程
《STM32 技术参考手册—RM0008.pdf 或 STM32F103-..._ChineseV2.pdf》 《汉化 STM32F 的固件.rar》-...笑话大全爆笑版 幽默笑话大全 全球冷笑话精选 20份文档...
STM32系列常见问答集锦
STM32系列常见问答集锦_电子/电路_工程科技_专业资料...2STM32F207 的串口问题 问:使用官方提供的串口...鄂教版三年级上册科学复... 10页 1下载券 键盘膜...
基于STM32F2xx库建立uCOS-II工程
STM32F2xx 系列标准外设库, ST 官方提供,版本 V1.0.0 ,下载地址: http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/ stm32f2xx...
更多相关标签:
stm32f系列 | stm32f0系列 | stm32f7系列 | stm32f072同系列芯片 | stm32培训 | stm32系列 | stm32l系列低功耗 | stm32f3系列 |