前言
不知不觉,学习华清远见物联网课程已经一月。一个月的时间,我收获颇多。老师扎实的专业知识,良好的学习环境,一群认真刻苦的同学,无一不在促进我对此课程的学习和了解!
因大学我所学专业与此相同,对嵌入式的了解还是较为深入的。在一开始学习此课程时,会比其他同学更轻松一些。在嵌入式课程学习开始时,由于老师讲的知识点比较易懂,大部分也接触过。但,当理论知识学习完进入敲代码阶段时,我才正真打开了这门课程的又一扇大门,也正是应了实践是检验真理的唯一标准这句话。在学校学习时只是为了实现功能而写代码,完全没有注意到应该注重的代码规范格式,只是为了实现而实现,没有考虑到后期他人使用的感受。“无从下手”就是我当时的状态,在我认真的反思后,我从头开始,规范自己的代码格式,把在课程中学习到的理论知识带入实践中去。
在嵌入式学习的过程中,从一个小白到现在我已经慢慢走上正轨,对此付出的时间和精力,不言而喻。晚上加班加点的学习已是常态,在我的不断努力和付出之后终于收获了硕果。
文章目录
一、STM32 I2C总线通信专题讲解
(一)I2C总线通信原理
1、I2C总线简介
(1)I2C总线介绍
I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。
(2)I2C总线特征
- 两条总线线路:一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
- I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
- I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
- I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输。
实际运用中,STM32一般为主机,其余外设为从设备,对应的地址一般为7位
(3)I2C总线物理·拓扑结构
I2C 总线在物理连接上分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
2、I2C总线协议
- I2C协议规定: 总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
- 空闲状态: SCL和SDA都保持着高电平。
- 起始信号: 当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件
- 结束信号:当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件
- 数据传输:数据传输以字节为单位 , 主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,数据在时钟的高电平被采样,一个字节按数据位从高位到低位的顺序进行传输主设备在传输有效数据之前 要先指定从设备的地址,一般为7位,然后再发生数据传输的方向位, 0表示主设备向从设备写数据,1表示主设备向从设备读数据
- 应答信号:接收数据的器件在接收到 8bit 数据后,向发送数据的器件发出低电平的应答信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之,由接收数据的器件发出。
3、I2C总线读写操作
- 主设备往从设备写数据
- 主设备读从设备数据
- 主设备读从设备的某个寄存器
4、STM32F4-I2C控制器特性
- 软件模拟I2C时序
由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。
- 硬件控制产生I2C时序
STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单。
- I2C的主要特点
I2C总线规范 rev03 兼容性:
- 从机模式和主机模式
- 多主机功能- 标准模式(高达 100kHz )
- 快速模式(高达 400kHz )
- 超快速模式(高达 1 MHz )
- 7 位和 10 位地址模式
- 软件复位 1 字节缓冲带 DMA 功能
- STM32芯片有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚。
引脚 | I2C编号 | ||
I2C1 | I2C2 | I2C3 | |
SCL | PB6/PB10 | PF1/PB10 | PA8 |
SDA | PB7/PB9 | PF0/PB11 | PC9 |
(二)EEPROM(24CXX)存储芯片介绍
1、EEPROM简介
EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器——一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。
EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I 2 C 协议
2、24CXX简介
- 24CXX芯片容量 XX表示:01、02、04、16、32、64、….. 单位: Kbit
- 24CXX芯片引脚
3、24C65设备地址
24CXX的设备地址:
24CXX的设备地址为7位: 高4位恒定为 1010 低3位取决于A0-A2的电平状态
注:一般主机在读写24CXX都是把设备地址连同读写位组合成一个字节一起发送
4、24C65硬件原理图
- 电气连线
- 设备地址:
读地址: 1010 0001 即 0xA1
写地址: 1010 0000 即 0xA0
5、24C65读写时序
- 写时序
- 读时序
(三)I2C读写EEPROM实例
二、STM32-SPI总线通信
(一)串行FLASH_W25X16简介STM32
1、SPI总线简介
(1)SPI总线介绍
SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。
SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
(2)SPI总线物理·拓扑结构
SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
(1)MOSI:主器件数据输出,从器件数据输
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK :时钟信号,由主器件产生
(4)/SS:从器件使能信号,由主器件控制(片选)
2、SPI总线协议
- 起始信号: NSS信号线由高变低,是SPI通讯的起始信号
- 结束信号:NSS信号由低变高,是SPI通讯的停止信号
- 数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。
- 主从设备间数据交换逻辑示意
主机和从机都包含一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了。从机的写操作和读操作时同步完成的,因此SPI成为一个很有效的协议。
3、SPI的四种通信模式
在SPI操作中,最重要的两项设置就是时钟极性(CPOL)和时钟相位(CPHA)这两项即是主从设备间数据采样的约定方式。
- 时钟极性CPOL : 设置时钟空闲时的电平
当CPOL = 0 ,SCK引脚在空闲状态保持低电平; 当CPOL = 1 ,SCK引脚在空闲状态保持高电平。
- 时钟相位CPHA :设置数据采样时的时钟沿
当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样
当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样
- 通信模式的设置:
由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,因此通常主机要按照从机支持的模式去设置
4、STM32F4-SPI控制器特性
STM32的SPI架构剖析:• 通讯引脚 • 时钟控制逻辑 • 数据控制逻辑 • 整体控制逻辑
(1)通讯引脚
STM32F4芯片有多个SPI外设,它们的SPI通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》为准。
注:其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达42Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为21Mbits/s。其它功能上没有差异。
(2)时钟控制逻辑
SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对f pclk 时钟的分频因子,对f pclk 的分频结果就是SCK引脚的输出时钟频率
注:其中的f pclk 频率是指SPI所在的APB总线频率,APB1为f pclk1 ,APB2为f pckl2
(3)数据控制逻辑
STM32F4的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。
- 通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。
- 通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。 • 其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行。
(4)整体控制逻辑
- 整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。
- 在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。
- 实际应用中,一般不使用STM32 SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。
(二)串行FLASH_W25X16简介
1、串行FLASH_W25X16简介
- FLASH的特性
FLSAH 存储器又称闪存,它与 EEPROM 都是掉电后数据不丢失的存储器,但 FLASH存储器容量普遍大于 EEPROM,现在基本取代了它的地位。我们生活中常用的 U盘、SD卡、SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是FLASH 芯片只能一大片一大片地擦写,而EEPROM可以单个字节擦写。
- SPI_Flash W25X16简介
W25X16有8192个可编程页,每页256字节。用“页编程指令”每次就可以编程256个字节。用扇区擦除指令每次可以擦除16页,用块擦除指令每次可以擦除256页,用整片擦除指令即可以擦除整个芯片。W25X16有512个可擦除扇区或32个可擦除块。
2、W25X16硬件连线
CS: 片选引脚,低电平有效,连接到STM32-PH2管脚
SO: 连接到STM32-PB4管脚(MISO)
SI: 连接到STM32-PB5管脚(MOSI)
CLK: 连接到STM32-PA5管脚(CLK)
WP: 写保护管脚,低电平有效,有效时禁止写入数据。接电源未使用
HOLD: HOLD 引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,未使用
3、W25X16控制指令
(1)W25X16操作方式
我们需要了解如何对 FLASH 芯片进行读写。FLASH 芯片自定义了很多指令,我们通过控制 STM32利用 SPI总线向 FLASH 芯片发送指令,FLASH芯片收到后就会执行相应的操作。 而这些指令,对主机端(STM32)来说,只是它遵守最基本的 SPI通讯协议发送出的数据,但在设备端(FLASH 芯片)把这些数据解释成不同的意义,所以才成为指令。
注:可查看FLASH 芯片的数据手册《W25X16》,可了解各种它定义的各种指令的功能及指令格式
(2)读制造商/设备ID(90)
该指令通常在调试程序的时候用到,判断SPI通信是否正常。该指令通过主器件拉低/CS片选使能器件开始传输,首先通过DI线传输“90H”指令,接着传输000000H的24位地址(A23-A0),之后从器件会通过DO线返回制造商ID(EFH)和设备ID。
注:SPI为数据交换通信,主器件在发送“90H”指令时也会接收到一个字节FFH,但此数据为无效数据
(3)写使能命令(06H)
在向 FLASH 芯片存储矩阵写入数据前,首先要使能写操作,通过“Write Enable”命令即可写使能
(4)扇区擦除(20H)
由于 FLASH 存储器的特性决定了它只能把原来为“1”的数据位改写成“0”,而原来为“0”的数据位不能直接改写为“1”。所以这里涉及到数据“擦除”的概念。
在写入前,必须要对目标存储矩阵进行擦除操作,把矩阵中的数据位擦除为“1”,在数据写入的时候,如果要存储数据“1”,那就不修改存储矩阵 ,在要存储数据“0”时,才更改该位。
(5)读状态寄存器(05H)
FLASH 芯片向内部存储矩阵写入数据需要消耗一定的时间,并不是在总线通讯结束的一瞬间完成的,所以在写操作后需要确认 FLASH 芯片“空闲”。我们只需要读取状态寄存器SRP的S0即可(当这个位为“1”时,表明 FLASH芯片处于忙碌状态,它可能正在对内部的存储矩阵进行“擦除”或“数据写入”的操作)
(6)读数据(03H)
读数据指令可从存储器依次一个或多个数据字节,该指令通过主器件拉低/CS电平使能设备开始传输,然后传输“03H”指令,接着通过DI管脚传输24位地址,从器件接到地址后,寻址存储器中的数据通过DO引脚输出。每传输一个字节地址自动递增,所以只要时钟继续传输,可以不断读取存储器中的数据。
(7)写数据——页编程(02H)
页编程指令可以在已擦除的存储单元中写入256个字节。该指令先拉低/CS引脚电平,接着传输“02H”指令和24位地址。后面接着传输至少一个数据字节,最多256字节。
注: 当数据写到一个新的扇区的时候,需要重新发起一个页编程信号才能继续写入数据。
(三)STM32 SPI_FLASH基本配置和操作
(四)SPI_FLASH擦除及读数据操作
(五)SPI_FLASH写数据操作
三、STM32 单总线类传感器
(一)红外遥控工作原理讲解
1、光的基础知识
- 光的本质:光的本质是电磁波,其传播本质上是一种粒子振动。广义上,光是指所有的电磁波谱。狭义上的光是人类眼睛可以看见的一种电磁波,也称可见光。
- 光的波长:是指波在一个振动周期内传播的距离。光的波长由光的频率以及传播的介质决定,光通过不同介质的时候,频率不变而波长发生改变。
- 光的颜色: 是由它的波长来决定的,各种颜色有各自的波长,人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。
- 可见光:光整个电磁波谱包括了无线电波、红外线、紫外线以及X射线等。它们的波长不同,其中波长在380~760纳米之间就是一般的可见光。依次为红、橙、黄、绿、青、蓝、紫。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。
- 红外线:是波长介于微波与可见光之间的电磁波,波长在1mm到760纳米(nm)之间,比红光长的非可见光。 高于绝对零度(-273.15℃)的物质都可以产生红外线。现代物理学称之为热射线。我们把红光之外的辐射叫做红外线(紫光之外是紫外线),人的肉眼不可见。
2、红外通信
(1)无线远程遥控技术
又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。
(2)红外遥控
是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。
(3)红外通讯
就是通过红外线传输数据。发射器发出红外信号,接收器接收到信号进行解析。
(4)红外遥控器
红外遥控器是利用一个红外发光二极管,以红外光为载体来将按键信息传递给接收端的设备。红外光对于人眼是不可见的,因此使用红外遥控器不会影响人的视觉(可以打开手机摄像头,遥控器对着摄像头按,可以看到遥控器发出的红外光)。
(5)信号调制
日常生活环境中有很多红外光源,太阳、蜡烛火光、白炽灯、甚至是我们的身体。这些红外光源都可能会对我们的接收设备产生干扰,为了屏蔽干扰,只接收有效信息,我们就需要用到调制。
通过调制我们可以把指定的数字信号转换为特定频率的红外光进行发送,调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz
(6)红外接受器
红外线接收器是一种可以接收红外信号并能独立完成从红外线接收到输出与TTL电平信号兼容的器件,体积和普通的塑封三极管差不多,适合于各种红外线遥控和红外线数据传输。
(7)信号解调
解调就是将模拟信号转换成数字信号。红外接收器接收到外部发射器传过来的红外信号后,会按照固定的协议去解析信号,并转换成数字信号输出。
3、NEC协议详解
NEC协议特点
- 8 位地址码, 8 位命令码
- 完整发射两次地址码和命令码,以提高可靠性
- 脉冲时间长短调制方式
- 38KHz 载波频率
- 位时间 1.12ms 或 2.25ms
(二)红外遥控实例讲解
(三)DS18B20温度传感器工作原理
1、DS18B20技术性能特征
- 独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。大大提高了系统的抗干扰性。
- 测温范围 -55℃~+125℃,精度为±0.5℃。
- 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
- 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)。
- 在使用中不需要任何外围元件。
- 测量结果以9~12位数字量方式串行传送。
2、DS18B20硬件连接
3、DS18B20通信类型
单总线是一种半双工通信方式
DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。
所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。
(1)复位脉冲
单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480 us,,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~60 us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240 us,以产生低电平应答脉冲。
(2)写时序
写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。
- 写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。
- 写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。
(3)读时序
单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。
- 典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。
4、温度读取过程
DS18B20的典型温度读取过程为:
- 复位
- 发SKIP ROM命令(0XCC)
- 发开始转换命令(0X44)
- 复位
- 发送SKIP ROM命令(0XCC)
- 发读存储器命令(0XBE)
- 连续读出两个字节数据(即温度)
- 结束。
温度数据的存储:
转化后得到的11位数据,存储在18B20的两个8比特的RAM中, MSB的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反再乘于0.0625即可得到实际 温度。
例如+125℃的数字输出为07D0H,,-25.0625℃的数字输出为FE6FH
(四)DS18B20温度采集实例
四、STM32-FSMC外扩SRAM
(一)常用存储器介绍
1、存储器的种类
存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算机才具有记忆功能
2、RAM存储器
RAM是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。这个词的由来是因为早期计算机曾使用磁鼓作为存储器,磁鼓是顺序读写设备,而RAM可随读取其内部任意地址的数据,时间都是相同的,因此得名。
实际上现在RAM已经专门用于指代作为计算机内存的易失性半导体存储器。
根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。
(1)DRAM的存储器
- DRAM的存储单元结构:动态随机存储器DRAM(Dynamic RAM)
- 动态刷新:动态随机存储器 DRAM的存储单元以电容的电荷来表示数据,有电荷代表 1,无电荷代表 0,,代表 1 的电容会放电,代表 0的电容会吸收电荷,因此它需要定期刷新操作,这就是“动态(Dynamic)”
DRAM以电容的电荷来表示数据
- 同步和异步DRAM:根据 DRAM的通讯方式,又分为同步和异步两种,这两种方式根据通讯时是否需要使用时钟信号来区分。由于使用时钟同步的通讯速度更快,所以同步 DRAM 使用更为广泛,这种 DRAM 被称为 SDRAM(Synchronous DRAM)。 常见的DRAN大多是SDRAM
- DDR SDRAM:为了进一步提高 SDRAM的通讯速度,人们设计了 DDR SDRAM (Double DataRate SDRAM)存储器。DDR SDRAM在时钟的上升沿及下降沿各表示一个数据,也就是说在 1 个时钟周期内可以表示 2数据,在时钟频率同样的情况下,提高了一倍的速度
- DDRII和 DDRIII,它们的通讯方式并没有区别主要是通讯同步时钟的频率提高了。
种类 | 特点 |
普通SDRAM | 在上升沿时同步数据 |
DDRII SDRAM | 在上升沿及下降沿都同步数据,时钟极限频率800MHz |
DDRIII SDRAM | 在上升沿及下降沿都同步数据,时钟极限频率1600MHz |
(2)SRAM的存储器
- SRAM的存储单元结构:静态随机存储器 SRAM的存储单元以锁存器来存储数据,见图 。这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为“静态(Static)”RAM。
- 同样地,SRAM 根据其通讯方式也分为同步SRAM和异步 SRAM,相对来说,异步SRAM用得较多。
(3)DRAM与SRAM的应用场合
DRAM和SRAM的特性对比:
特性 | DRAM | SRAM |
存取速度 | 较慢 | 较快 |
集成度 | 较高 | 较低 |
生产成本 | 较低 | 较高 |
是否需要刷新 | 是 | 否 |
注:所以在实际应用场合中,SRAM 一般只用于 CPU 内部的高速缓存(Cache),而外部扩展的内存一般使用 DRAM。
3、非易失性存储器
非易失性存储器种类非常多,半导体类的有 ROM 和 FLASH,而其它的则包括光盘、软盘及机械硬盘。
(1)ROM存储器
ROM是“Read Only Memory”的缩写,意为只能读的存储器。由于技术的发展,后来设计出了可以方便写入数据的ROM,而这个“Read Only Memory”的名称被沿用下来了,现在一般用于指代非易失性半导体存储器,包括后面介绍的FLASH存储器,有些人也把它归到ROM类里边。
种类 | 特性 |
MASK ROM | 出厂时固化,不可修改 |
OTPROM | 用户可写入一次,之后不可修改 |
EPROM | 可重复擦写,需要使用专用紫外线照射设备擦除 |
EEPROM | 可重复擦写,电擦除,使用方便 |
(2)FLASH存储器
FLASH存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把FLASH存储器称为FLASH ROM,但它的容量一般比EEPROM大得多,且在擦除时,一般以多个字节为单位
根据存储单元电路的不同,FLASH存储器又分为NOR FLASH和NAND FLASH
特性 | NOR FLASH | NAND FLASH |
同容量存储器成本 | 较贵 | 较便宜 |
集成度 | 较低 | 较高 |
介质类型 | 随机存储 | 连续存储 |
地址线和数据线 | 独立分开 | 共用 |
擦除单元 | 以“扇区/块”擦除 | 以“扇区/块”擦除 |
读写单元 | 可以基于字节读写 | 必须以“块”为单位读写 |
读取速度 | 较高 | 较低 |
写入速度 | 较低 | 较高 |
坏块 | 较少 | 较多 |
是否支持XIP | 支持 | 不支持 |
(二)SRAM控制原理
1、SRAM简介
STM32与SRAM
STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F407系列芯片可以扩展外部SRAM用作内存。
给STM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,而且内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32扩展时,直接与SRAM芯片连接。
IS61LV25616SRAM外观:
IS61LV25616的特点:高速访问时间:8,10,12,15ns 容量:256K * 16bit
2、SRAM内部框图分析
- 地址数据接口
- 存储矩阵
- 控制电路
(1)SRAM信号线
信号线 | 类型 | 说明 |
A0-A17 | I | 地址输入 |
I/O0-I/O7 | I/O | 数据输入输出信号,低字节 |
I/O8-I/O15 | I/O | 数据输入输出信号,高字节 |
CE# | I | 片选信号,CE#低电平有效 |
OE# | I | 输出使能信号,低电平有效 |
WE# | I | 写入使能,低电平有效 |
UB# | I | 数据掩码信号Upper Byte,高位字节允许访问,低电平有效, |
LB# | I | 数据掩码信号Lower Byte,低位字节允许访问,低电平有效 |
SRAM的控制比较简单,只要控制信号线使能了访问,从地址线输入要访问的地址,即可从I/O数据线写入或读出数据。
(2)SRAM的控制电路
控制电路主要包含了片选、读写使能以及上面提到的宽度控制信号UB#和LB#。利用CE#片选信号,可以把多个SRAM芯片组成一个大容量的内存条。OE#和WE#可以控制读写使能,防止误操作。
3、SRAM的读写时序
(1)SRAM的读时序
重点时序:读周期时间(tRC) 地址建立时间(tAA) OE建立时间(tDOE)
(2)SRAM的写时序
重点时序:写周期时间(tWC) 地址建立时间(tSA) WE脉宽(tPWE)
(3)SRAM的读写流程
读写时序的流程很类似,过程如下:
- 主机使用地址信号线发出要访问的存储器目标地址;
- 控制片选信号CE#使能存储器芯片;
- 若是要进行读操作,则控制读使能信号OE#表示要读数据,若进行写操作则控制写使能信号WE#表示要写数据;
- 使用掩码信号LB#与UB#指示要访问目标地址的高、低字节部分;
- 若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。
(三)STM32-FSMC控制器介绍
1、FMSC控制器简介
STM32F4系列芯片使用FSMC外设来管理扩展的存储器,FSMC是Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。它可以用于驱动包括SRAM、NOR FLASH以及NAND FLSAH类型的存储器,不能驱动如SDRAM这种动态的存储器。而在STM32F429系列的控制器中,它具有FMC外设,支持控制SDRAM存储器。
2、FSMC控制器框图分析
(1)通讯引脚 (2)存储器控制器 (3)时钟控制逻辑
(1)通讯引脚
由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的
FSMC引脚名称 | 对应SRAM引脚名 | 说明 |
FSMC_NBL[1:0] | LB#、UB# | 数据掩码信号 |
FSMC_A[17:0] | A[17:0] | 行地址线 |
FSMC_D[15:0] | I/O[15:0] | 数据线 |
FSMC_NWE | WE# | 写入使能 |
FSMC_NOE | OE# | 输出使能(读使能) |
FSMC_NE[1:4] | CE# | 片选信号 |
注:其中比较特殊的FSMC_NE是用于控制SRAM芯片的控制信号线,STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。
(2)存储器控制器
上面不同类型的引脚是连接到FSMC内部对应的存储控制器中的NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。
相关控制寄存器:控制SRAM的有FSMC_ BCR 、FSMC_ BTR以及FSMC_BWTR寄存器。每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下:
- FSMC_BCR控制寄存器:可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。
- FMC_BTR时序寄存器:用于配置SRAM访问时的各种时间延迟,如数据保持时间、地址保持时间等。
- FMC_BWTR写时序寄存器:与FMC_BTR寄存器控制的参数类似,它专门用于控制写时序的时间参数。
(3)时钟控制逻辑
FSMC外设挂载在AHB总线上,时钟信号来自于HCLK(默认168MHz),控制器的同步时钟输出就是由它分频得到。
例如,NOR控制器的FSMC_CLK引脚输出的时钟,它可用于与同步类型的SRAM芯片进行同步通讯,它的时钟频率可通过FSMC_BTR寄存器的CLKDIV位配置,可以配置为HCLK的1/2或1/3,也就是说,若它与同步类型的SRAM通讯时,同步时钟最高频率为84MHz。
后面示例中的SRAM为异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。
3、FSMC地址映射
FSMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据。
FSMC访问存储器的方式与I2C EEPROM、SPI FLASH的不一样,后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令。
而使用FSMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。
FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址被映射到了External RAM地址空间内,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样
FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址。
FSMC地址映射:在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。
4、FSMC时序控制
- FSMC读时序:FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解
注:内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器
ADDSET对于SRAM未作要求
FSMC的主频为168M,一个周期约等于6ns
- FSMC写时序:
注:内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器
(四)FSMC外扩SRAM实例
五、TFT-LCD专题讲解
(一)常见显示器介绍
1、显示器分类
显示器属于计算机的 I/O 设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。
常见显示器有三类: CRT显示器 LCD液晶显示器 LED点阵显示器 OLED显示器
(1)CRT显示器
CRT显示器是靠电子束激发屏幕内表面的荧光粉来显示图像的,由于荧光粉被点亮后很快会熄灭,所以电子枪必须循环地不断激发这些点。
(2)LCD显示器:
液晶显示器,简称 LCD(Liquid Crystal Display),相对于上一代 CRT显示器,LCD 显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。
液晶显示器的显示结构: 液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分子排列却和固体晶体一样非常规则,因此取名液晶。如果给液晶施加电场,会改变它的分子排列,从而改变光线的传播方向,配合偏振光片,它就具有控制光线透过率的作用,再配合彩色滤光片,改变加给液晶电压大小,就能改变某一颜色透光量的多少 利用这种原理,做出可控红、绿、蓝光输出强度的显示结构,把三种显示结构组成一个显示单位,通过控制红绿蓝的强度,可以使该单位混合输出不同的色彩,这样的一个显示单位被称为像素。
注意: 液晶本身是不发光的,所以需要有一个背光灯提供光源
(3)LED显示器:
LED点阵彩色显示器的单个像素点内包含红绿蓝三色LED灯,通过控制红绿蓝颜色的强度进行混色,实现全彩颜色输出,多个像素点构成一个屏幕。由于每个像素点都是LED灯自发光的,所以在户外白天也显示得非常清晰,但由于LED灯体积较大,导致屏幕的像素密度低,所以它一般只适合用于广场上的巨型显示器。相对来说,单色的LED点阵显示器应用得更广泛,如公交车上的信息展示牌、店广告牌等。
(4)OLED显示器:
新一代的OLED显示器与LED点阵彩色显示器的原理类似,但由于它采用的像素单元是“有机发光二极管”(Organic Light Emitting Diode),所以像素密度比普通LED点阵显示器高得多 OLED显示器不需要背光源、对比度高、轻薄、视角广及响应速度快等优点。待到生产工艺更加成熟时,必将取代现在液晶显示器的地位。
2、显示器的基本参数
- 像素:像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点,即前面讲解液晶原理中提到的一个显示单元。
- 分辨率: 一些嵌入式设备的显示器常常以“行像素值x列像素值”表示屏幕的分辨率。如分辨率800x480表示该显示器的每一行有800个像素点,每一列有480个像素点,也可理解为有800列,480行。
- 色彩深度:色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位”(bit)来表示。如单色屏的每个像素点能表示亮或灭两种状态(即实际上能显示2种颜色),用1个数据位就可以表示像素点的所有状态,所以它的色彩深度为1bit,其它常见的显示屏色深为16bit、24bit。
- 显示器尺寸:显示器的大小一般以英寸表示,如5英寸、21英寸、24英寸等,这个长度是指屏幕对角线的长度, 通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸
- 显存:液晶屏中的每个像素点都是数据,在实际应用中需要把每个像素点的数据缓存起来,再传输给液晶屏,一般会使用 SRAM 或 SDRAM 性质的存储器,而这些专门用于存储显示数据的存储器,则被称为显存。显存一般至少要能存储液晶屏的一帧显示数据。
如分辨率为 800x480 的 液 晶 屏 使 用 RGB888 格 式 显 示 , 它 的 一 帧 显 示 数 据 大 小 为 :3x800x480=1152000 字 节 ;若 使 用 RGB565 格 式 显 示 , 一 帧 显 示 数 据 大 小 为 :2x800x480=768000 字节。
一般来说,外置的液晶控制器会自带显存,而像 STM32F429等集成液晶控制器的芯片可使用内部 SRAM或外扩 SDRAM用于显存空间
3、TFT-LCD控制框图
STM32F429 系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到 STM32F429 芯片内部了,可以理解为电脑的 CPU集成显卡。而 STM32F407 系列的芯片由于没有集成液晶控制器到芯片内部,所以它只能驱动自带控制器的屏幕,可以理解为电脑的外置显卡。
(二)TFT-LCD控制原理
1、TFT-LCD屏结构
完整的显示屏由液晶显示面板、电容触摸面板以及 PCB底板构成
- 液晶显示面板:用于显示图像,文字的彩色显示设备
- 触摸面板:触摸面板带有触摸控制芯片,该芯片处理触摸信号并通过引出的信号线与外部器件通讯,触摸面板中间是透明的,它贴在液晶面板上面,一起构成屏幕的主体
- PCB底板:PCB 底板上可能会带有“液晶控制器芯片”因为控制液晶面板需要比较多的资源,所以大部分低级微控制器都不能直接控制液晶面板,需要额外配套一个专用液晶控制器来处理显示过程,外部微控制器只要把它希望显示的数据直接交给液晶控制器即可。而不带液晶控制器的 PCB底板 ,只有小部分的电源管理电路,液晶面板的信号线与外部微控制器相连,直接控制。
- 两种常见的TFT-LCD屏
2、TFT-LCD控制原理
STM32F429 系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到 STM32F429 芯片内部了,可以理解为电脑的 CPU集成显卡。而 STM32F407 系列的芯片由于没有集成液晶控制器到芯片内部,所以它只能驱动自带控制器的屏幕,可以理解为电脑的外置显卡。
- 液晶面板的控制信号线(不带液晶控制器):
信号名称 | 说明 |
R[7:0] | 红色数据 |
G[7:0] | 绿色数据 |
B[7:0] | 蓝色数据 |
CLK | 像素同步时钟信号 |
HSYNC | 水平同步信号 |
VSYNC | 垂直同步信号 |
DE | 数据使能信号 |
- RGB信号线:RGB信号线各有8根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。使用红绿蓝颜色分量来表示颜色是一种通用的做法,打开Windows系统自带的画板调色工具,可看到颜色的红绿蓝分量值,常见的颜色表示会在“RGB”后面附带各个颜色分量值的数据位数。.
如RGB565表示红绿蓝的数据线数分别为5、6、5根,一共为16个数据位,可表示216种颜色;
如果液晶屏的种颜色分量的数据线有8根,那它表示RGB888格式,一共24位数据线,可表示的颜色为224种。
- 同步时钟信号CLK:液晶屏与外部使用同步通讯方式,以CLK信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据。
- 水平同步信号HSYNC:水平同步信号HSYNC(Horizontal Sync)用于表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,HSYNC会发生电平跳变,如分辨率为800x480的显示屏(800列,480行),传输一帧的图像HSYNC的电平会跳变480次。
- 垂直同步信号VSYNC:垂直同步信号VSYNC(Vertical Sync)用于表示液晶屏一帧像素数据的传输结束,每传输完成一帧像素数据时,VSYNC会发生电平跳变。其中“帧”是图像的单位,一幅图像称为一帧,在液晶屏中,一帧指一个完整屏液晶像素点。人们常常用“帧/秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像,如液晶屏以60帧/秒的速率运行时,VSYNC每秒钟电平会跳变60次。
- 数据使能信号DE:数据使能信号DE(Data Enable)用于表示数据的有效性,当DE信号线为高电平时,RGB信号线表示的数据有效。
3、RGB-LCD控制时序分析
- LCD数据传输时序
注:液晶屏显示的图像可看作一个矩形,液晶屏有一个显示指针,它指向将要显示的像素。显示指针的扫描方向方向从左到右、从上到下,一个像素点一个像素点地描绘图形。这些像素点的数据通过RGB数据线传输至液晶屏,它们在同步时钟CLK的驱动下一个一个地传输到液晶屏中,交给显示指针,传输完成一行时,水平同步信号HSYNC电平跳变一次,而传输完一帧时VSYNC电平跳变一次。
- LCD数据传输时序参数:液晶显示指针在行与行之间,帧与帧之间切换时需要延时,而且HSYNC及VSYNC信号本身也有宽度,这些时间参数说明见下表:
时间参数 | 参数说明 |
VBP (vertical back porch) | 表示在一帧图像开始时,垂直同步信号以后的无效的行数 |
VFP (vertical front porch) | 表示在一帧图像结束后,垂直同步信号以前的无效的行数 |
HBP (horizontal back porch) | 表示从水平同步信号开始到一行的有效数据开始之间的CLK的个数 |
HFP (horizontal front porth) | 表示一行的有效数据结束到下一个水平同步信号开始之间的CLK的个数 |
VSW (vertical sync width) | 表示垂直同步信号的宽度,单位为行 |
HSW (horizontal sync width) | 表示水平同步信号的宽度,单位为同步时钟CLK的个数 |
(三)SSD1963液晶控制器
1、液晶控制器SSD1963
液晶驱动芯片或LCD驱动器,其内部有着较大的缓存空间可以存储文字、图像等数据,并能够将这些信息送入液晶模块进行显示,由于专用的芯片,因此速度往往比较快。
LCD驱动芯片的主要功能就是对主机发送过来的数据/命令,进行变换,变成每个像素的RGB数据,使之在屏幕上显示出来。常见的液晶驱动芯片有ILI932、ILI9328、SSD1963、HX8347、ILI9341、NT5510等
SSD1963特性:
- 内部包含1215KB frame buffer
- 支持分辨率为864*480的显示屏
- 支持像素位深为24bpp的显示模式(RGB888)
2、SSD1963内部框图分析
注:液晶屏内部包含SSD1963控制器,该控制器使用 8080 接口与单片机通讯
3、8080写时序分析
void LCD_WR_Byte(uint8_t dat, uint8_t cmd)
{
LCD_Data_Out(dat); //放入数据
if(cmd)
LCD_DC_Set(); //传命令
else
LCD_DC_Clr(); //传数据
LCD_CS_Clr(); //拉低片选
LCD_WR_Clr(); //写使能
LCD_WR_Set(); //WR产生上升沿,数据锁存
LCD_CS_Set(); //取消片选
LCD_DC_Set(); //复位DC信号线
}
注:STM32通过8080接口与SSD1963 芯片进行通讯,实现对液晶屏的控制。通讯的内容主要包括命令和显存数据,显存数据即各个像素点的 RGB565 内容;命令是指对 SSD1963的控制指令,MCU 可通过8080接口发送命令编码控制 SSD1963的工作方式,例如复位指令、设置光标指令、睡眠。
4、FMSC模拟8080时序
FSMC-NOR信号线 | 功能 | 8080信号线 | 功能 |
NEx | 片选信号 | CS# | 片选信号 |
NWR | 写使能 | WR# | 写使能 |
NOE | 读使能 | RD# | 读使能 |
D[15:0] | 数据信号 | D[15:0] | 数据信号 |
A[25:0] | 地址信号 | D/C# | 数据/命令选择 |
对于FSMC和8080接口,前四种信号线都是完全一样的,仅仅是FSMC的地址信号线A[25:0]与8080的数据/命令选择线D/C#有区别。
为了模拟出8080时序,我们可以把FSMC的A0地址线与SSD1963芯片8080接口的D/C#信号线连接,那么当A0为高电平时(即D/C#为高电平),数据线D[15:0]的信号会被SSD1963理解为数值,若A0为低电平时(即D/C#为低电平),传输的信号则会被理解为命令。
- 如何控制A0(即控制DC线)
地址 | 地址的二进制值(仅列出低四位) | A0(D/C#)的电平 | 控制SSD1963时的意义 |
0x6Cxx xxx1 | 0001 | 1 高电平 | D数值 |
0x6Cxx xxx3 | 0011 | 1高电平 | D数值 |
0x6Cxx xxx5 | 0101 | 1高电平 | D数值 |
0x6Cxx xxx0 | 0000 | 0低电平 | C命令 |
0x6Cxx xxx2 | 0010 | 0低电平 | C命令 |
0x6Cxx xxx4 | 0100 | 0低电平 | C命令 |
注:LCD控制器的片选连入到FSMC的NE4管脚。所以当发出0x6C00 0000-0x6FFF FFFF之间的地址时NE4输出低电平,选中LCD控制器
在实际控制时,以上地址计算方式还不完整,根据《STM32 参考手册》对 FSMC 访问NOR FLASH 的说明STM32 内部访问地址时使用的是内部 HADDR 总线, HADDR[25:0] 包含外部存储器地址。由于 HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下表所示。
注:实际控制A0时:把前面的地址<<1就可以了
0x6C000000 低电平表示命令 0x6C000002 高电平表示数据
(四)LCD测试程序讲解
(五)LCD显示图片和中文字符
六、触摸屏专题讲解
(一)触摸屏简介
触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏和电容式触摸屏。
- 电阻触摸屏:电阻屏造价便宜,能适应较恶劣的环境,但它只支持单点触控(一次只能检测面板上的一个触摸位置),触摸时需要一定的压力,使用久了容易造成表面磨损,影响寿命;
- 电容触摸屏:具有支持多点触控、检测精度高的特点,电容屏通过与导电物体产生的电容效应来检测触摸动作,只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。
目前电容式触摸屏被大部分应用在智能手机、平板电脑等电子设备中,而在汽车导航、工控机等设备中电阻式触摸屏仍占主流。
触摸屏实际上是在液晶屏上面贴了一层大小相等的薄膜,这个薄膜能够感知触碰,根据薄膜反馈的触摸位置,我们就能知道用户触碰在屏幕的什么位地方了。
1、电阻触摸屏
电阻式的触摸屏结构如图,它主要由表面硬涂层、两个ITO层、间隔点以及玻璃底层构成,这些结构层都是透明的,整个触摸屏覆盖在液晶面板上,透过触摸屏可看到液晶面板。表面涂层起到保护作用,玻璃底层起承载的作用,而两个ITO层是触摸屏的关键结构,它们是涂有铟锡金属氧化物的导电层。两个ITO层之间使用间隔点使两层分开,当触摸屏表面受到压力时,表面弯曲使得上层ITO与下层ITO接触,在触点处连通电路。
两个ITO涂层的两端分别引出X-、X+、Y-、Y+四个电极,这是电阻屏最常见的四线结构,通过这些电极,外部电路向这两个涂层可以施加匀强电场或检测电压。
- 触摸屏的校准: 确定位置和对应的电压值之间的比例关系
2、电容触摸屏检测原理
与电阻式触摸屏不同,电容式触摸屏不需要通过压力使触点变形。它的基本原理是利用充电时间检测电容大小,若手指触摸屏幕,会影响触摸点附近两个电极之间的耦合,从而改变两个电极之间的电容量,若检测到某电容的电容量发生了改变,即可获知该电容处有触摸动作从而通过检测出电容值的变化来获知触摸信号。
(二)触摸屏操作实例讲解
触摸控制芯片XPT2406
注:当触摸屏有触点按下时,PENIRQ 引脚会输出低电平,直到没有触摸的时候,它才会输出高电平
XPT2046命令字(控制字节):
uint8_t CMD_RDX=0XD0; //读取X轴坐标命令。
Uint8_t CMD_RDY=0X90; //读取Y轴坐标命令
0xD0:1 1 0 1 0 0 0 0 0x90:1 0 0 1 0 0 0 0
七、STM32 电源管理专题讲解
(一)STM32电源管理简介
1、电源管理简介
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。
在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。
STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
2、STM32电源管理系统
STM32的电源管理系统主要分为:备份域、调压器供电电路、ADC电源电路
(1)备份域电路
STM32的备份域包括LSE振荡器、RTC、备份寄存器及备份SRAM这些器件,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。
在图中备份域电路的左侧有一个电源开关结构,它的功能类似图中的双二极管,在它的上方连接了VBAT电源,下方连接了VDD主电源(一般为3.3V),右侧引出到备份域电路中。当VDD主电源存在时,由于VDD电压较高,备份域电路通过VDD供电,当VDD掉电时,备份域电路由钮扣电池通过VBAT供电,保证电路能持续运行,从而可利用它保留关键数据
(2)调压器供电电路
在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。
调压器可控制调节供电电路使系统运行在“运行模式”、“停止模式”以及“待机模式”下:
- 运行模式:调压器为 1.2 V 域(内核、存储器和数字外设)提供全功率。
- 停止模式:1.2V域运行在低功耗状态,1.2V区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM的内容;
- 在待机模式:整个1.2V域都断电,该区域的内核寄存器及SRAM内容都会丢失(备份区域的寄存器及SRAM不受影响)。
(3)ADC电源控制电路
为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。
3、STM32低功耗模式
很多单片机都有低功耗模式,STM32F4 也不例外 ,运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。
STM32F4 按功耗由高到低排列具有运行、睡眠、停止和待机四种工作模式。
上电复位后STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。
- 睡眠模式:在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM4核心的外设全都还照常运行。 有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是WFI(wait for interrupt)和WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。睡眠模式的各种特性见下表
特性 | 说明 |
立即睡眠 | 在执行 WFI 或 WFE 指令时立即进入睡眠模式。 |
退出时睡眠 | 在退出优先级最低的中断服务程序后才进入睡眠模式。 |
进入方式 | 内核寄存器的SLEEPDEEP = 0 ,然后调用WFI或WFE指令即可进入睡眠模式; 另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式,SLEEPONEXIT=1时,进入“退出时睡眠”模式。 |
唤醒方式 | 如果是使用WFI指令睡眠的,则可使用任意中断唤醒; 如果是使用WFE指令睡眠的,则由事件唤醒。 |
睡眠时 | 关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。 |
唤醒延迟 | 无延迟。 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。 |
- 停止模式 :在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其1.2V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息。所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式,可选择内部FLASH工作在正常模式或掉电模式
特性 | 说明 |
调压器低功耗模式 | 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗 |
FLASH掉电模式 | 在停止模式下FLASH可工作在正常模式或掉电模式,可进一步降低功耗 |
进入方式 | 内核寄存器的SLEEPDEEP =1,PWR_CR寄存器中的PDDS=0,然后调用WFI或WFE指令即可进入停止模式; PWR_CR 寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式; PWR_CR 寄存器的FPDS=0时,FLASH工作在正常模式,FPDS=1时进入掉电模式。 |
唤醒方式 | 如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒;如果是使用WFE指令睡眠的,可使用任意配置为事件模式的EXTI线事件唤醒。 |
停止时 | 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。 |
唤醒延迟 | 基础延迟为HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若FLASH工作在掉电模式,还需要加上FLASH从掉电模式唤醒的时间。 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。唤醒后,STM32会使用HIS作为系统时钟。 |
- 待机模式:待机模式,它除了关闭所有的时钟,还把1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。它有四种唤醒方式,分别是WKUP(PA0)引脚的上升沿,RTC闹钟事件,NRST引脚的复位和IWDG(独立看门狗)复位。
特性 | 说明 |
进入方式 | 内核寄存器的SLEEPDEEP =1,PWR_CR寄存器中的PDDS=1,PWR_CR寄存器中的唤醒状态位WUF=0,然后调用WFI或WFE指令即可进入待机模式; |
唤醒方式 | 通过WKUP引脚的上升沿,RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位及IWDG复位唤醒。 |
待机时 | 内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、RTC_AF1引脚及WKUP引脚,其它I/O口均工作在高阻态。 |
唤醒延迟 | 芯片复位的时间 |
唤醒后 | 相当于芯片复位,在程序表现为从头开始执行代码。 |
(二)STM32实现睡眠模式
(三)STM32实现停止模式
(四)STM32实现待机模式
八、STM32 SD卡操作专题讲解
(一)STM32 SDIO接口简介
1、SD卡简介
SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。
SD卡按容量分类,可以分为3类:SD卡、SDHC卡、SDXC卡,如下表所示:
容量 | 命名 | 简称 |
0~2G | Standard Capacity SD Memory Card | SDSC或SD |
2G~32G | High Capacity SD Memory Card | SDHC |
32G~2T | Extended Capacity SD Memory Card | SDXC |
- SD卡外形和接口图如下图所示:
SD卡由9个引脚与外部通信,支持SPI和SDIO两种模式,不同模式下,SD卡引脚功能描述如下表所示:
2、SD卡的物理结构
一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分
- 存储单元:是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
- 电源检测单元:保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
- 卡及接口控制单元:控制SD卡的运行状态,它包括有8个寄存器;
- 接口驱动器:控制SD卡引脚的输入输出。
3、SD卡内部的寄存器
SD卡总共有8个寄存器,用于设定或表示SD卡信息。这些寄存器只能通过对应的命令访问,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
名称 | bit宽度 | 描述 |
CID | 128 | 卡识别号(Card identification number):用来识别的卡的个体号码(唯一的) |
RCA | 16 | 相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准。 |
DSR | 16 | 驱动级寄存器(Driver Stage Register):配置卡的输出驱动 |
CSD | 128 | 卡的特定数据(Card Specific Data):卡的操作条件信息 |
SCR | 64 | SD配置寄存器(SD Configuration Register):SD 卡特殊特性信息 |
OCR | 32 | 操作条件寄存器(Operation conditions register) |
SSR | 512 | SD状态(SD Status):SD卡专有特征的信息 |
CSR | 32 | 卡状态(Card Status):卡状态信息 |
4、STM32-SDIO接口简介
SD卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F407系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SD I/O卡以及CE-ATA设备进行数据传输。
参考资料:
- 多媒体卡协会网站www.mmca.org中提供了有MMCA技术委员会发布的多媒体卡系统规范。
- SD卡协会网站www.sdcard.org中提供了SD存储卡和SDIO卡系统规范。
- CE-ATA工作组网站www.ce-ata.org中提供了CE_ATA系统规范。
5、SDIO设备分类
注:目前SDIO协议提供的SD卡规范版本最新是4.01版本,但STM32F42x系列控制器只支持SD卡规范版本2.0,即只支持标准容量SD和高容量SDHC标准卡,不支持超大容量SDXC标准卡,所以可以支持的最高卡容量是32GB
6、STM32-SDIO接口特性
SDIO 具有以下特性:
- 完全兼容 多媒体卡系统规范版本 4.2。卡支持三种不同数据总线模式:1 位(默认)、4 位和 8 位
- 完全兼容先前版本的多媒体卡(向前兼容性)
- 完全兼容 SD 存储卡规范版本 2.0
- 完全兼容 SD I/O 卡规范版本 2.0 : 卡支持两种不同数据总线模式:1 位(默认)和 4 位
- 完全支持 CE-ATA 功能(完全符合 CE-ATA 数字协议版本 1.1)
- 对于 8 位模式,数据传输高达 48 MHz
- 数据和命令输出使能信号,控制外部双向驱动程序。
- SDIO 不具备兼容 SPI 的通信模式。
7、STM32-SDIO功能框图
SDIO 由两部分组成:
- SDIO 适配器块提供特定于 MMC/SD/SD I/O 卡的所有功能,如时钟生成单元、命令和数据传输。
- APB2 接口访问 SDIO 适配器寄存器,并且生成中断和 DMA 请求信号。
注:
- 默认情况下,SDIO_D0 用于数据传输。初始化后,主机可以更改数据总线宽度。
- SD 卡连接到总线,主机可以将数据传输配置为SDIO_D[3:0]
- SDIO 使用两个时钟信号:SDIO 适配器时钟 (SDIOCLK = 48 MHz)和APB2 总线时钟 (PCLK2)
8、STM32-SDIO时钟
- 卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输1位命令或数据。对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
- SDIO适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,可用于产生SDIO_CK时钟。对F4来说,SDIOCLK来自PLL48CK(48Mhz)。
- F4:APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线 接口,其频率为PCLK2=84Mhz。
SDIO_CK计算公式:
注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)。
9、STM32-SDIO适配器
该适配器由五个子单元组成:
- 适配器寄存器块 :适配器寄存器模块包含所有系统寄存器。
- 控制单元 : 控制单元包含电源管理功能和存储卡时钟的时钟分频器。
- 命令路径 :命令路径单元向卡发送命令并从卡接收响应。
- 数据路径 :数据路径子单元负责与卡相互传输数据。
- 数据 FIFO :数据 FIFO(先进先出)子单元是一个数据缓冲器,带发送和接收单元。FIFO 包含一个宽度为 32 位且深度为 32 字的数据缓冲器和发送/接收逻辑。
(二)SD卡操作命令及模式详解
1、SDIO内部结构
名称 | bit宽度 | 描述 |
CID | 128 | 卡识别号(Card identification number):用来识别的卡的个体号码(唯一的) |
RCA | 16 | 相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准。 |
DSR | 16 | 驱动级寄存器(Driver Stage Register):配置卡的输出驱动 |
CSD | 128 | 卡的特定数据(Card Specific Data):卡的操作条件信息 |
SCR | 64 | SD配置寄存器(SD Configuration Register):SD 卡特殊特性信息 |
OCR | 32 | 操作条件寄存器(Operation conditions register) |
SSR | 512 | SD状态(SD Status):SD卡专有特征的信息 |
CSR | 32 | 卡状态(Card Status):卡状态信息 |
2、SDIO命令
SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
SD命令格式固定为48bit,都是通过CMD线连续传输的,数据线不参与。
SD命令的组成如下:
- 起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。
- 传输标志:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD 卡,该位为 0时表示响应,方向为 SD卡传输到主机。
- 命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。
- 命令号:它固定占用 6bit,所以总共有 64个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于 SD 卡操作,只是专门用于 MMC卡或者SD I/O卡。
- 地址/参数:每个命令有 32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit用于指定参数,而寻址命令这 32bit用于指定目标 SD卡的地址。
- CRC7 校验:长度为 7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。
SD命令有4种类型:
- 无响应广播命令(bc),发送到所有卡,不返回任务响应;
- 带响应广播命令(bcr),发送到所有卡,同时接收来自所有卡响应;
- 寻址命令(ac),发送到选定卡,DAT线无数据传输;
- 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输。
在标准中定义了两种类型的通用命令:特定应用命令(ACMD)和常规命令(GEN_CMD)
要使用SD卡制造商特定的ACMD命令如ACMD6,需要在发送该命令之前无发送CMD55命令,告知SD卡接下来的命令为特定应用命令。CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
基本命令(Class 0) | |||||
CMD0 | bc | [31:0]填充位 | - | GO_IDLE_STATE | 复位所有的卡到idle状态。 |
CMD2 | bcr | [31:0]填充位 | R2 | ALL_SEND_CID | 通知所有卡通过CMD线返回CID值。 |
CMD3 | bcr | [31:0]填充位 | R6 | SEND_RELATIVE_ADDR | 通知所有卡发布新RCA。 |
CMD4 | bc | [31:16]DSR[15:0]填充位 | - | SET_DSR | 编程所有卡的DSR。 |
CMD7 | ac | [31:16]RCA[15:0]填充位 | R1b | SELECT/DESELECT_CARD | 选择/取消选择RCA地址卡。 |
CMD8 | bcr | [31:12]保留位[11:8]VHS[7:0]检查模式 | R7 | SEND_IF_COND | 发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。 |
CMD9 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CSD | 选定卡通过CMD线发送CSD内容 |
CMD10 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CID | 选定卡通过CMD线发送CID内容 |
CMD12 | ac | [31:0]填充位 | R1b | STOP_TRANSMISSION | 强制卡停止传输 |
CMD13 | ac | [31:16]RCA[15:0]填充位 | R1 | SEND_STATUS | 选定卡通过CMD线发送它状态寄存器 |
CMD15 | ac | [31:16]RCA[15:0]填充位 | - | GO_INACTIVE_STATE | 使选定卡进入“inactive”状态 |
面向块的读操作(Class 2) | |||||
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCK_LEN | 对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。 |
CMD17 | adtc | [31:0]数据地址 | R1 | READ_SINGLE_BLOCK | 对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。 |
CMD18 | adtc | [31:0]数据地址 | R1 | READ_MULTIPLE_BLOCK | 连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。 |
面向块的写操作(Class 4) | |||||
CMD24 | adtc | [31:0]数据地址 | R1 | WRITE_BLOCK | 对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。 |
CMD25 | adtc | [31:0]数据地址 | R1 | WRITE_MILTIPLE_BLOCK | 连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。 |
CMD27 | adtc | [31:0]填充位 | R1 | PROGRAM_CSD | 对CSD的可编程位进行编程 |
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 |
基本命令(Class 0) | |||||
CMD0 | bc | [31:0]填充位 | - | GO_IDLE_STATE | 复位所有的卡到idle状态。 |
CMD2 | bcr | [31:0]填充位 | R2 | ALL_SEND_CID | 通知所有卡通过CMD线返回CID值。 |
CMD3 | bcr | [31:0]填充位 | R6 | SEND_RELATIVE_ADDR | 通知所有卡发布新RCA。 |
CMD4 | bc | [31:16]DSR[15:0]填充位 | - | SET_DSR | 编程所有卡的DSR。 |
CMD7 | ac | [31:16]RCA[15:0]填充位 | R1b | SELECT/DESELECT_CARD | 选择/取消选择RCA地址卡。 |
CMD8 | bcr | [31:12]保留位[11:8]VHS[7:0]检查模式 | R7 | SEND_IF_COND | 发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。 |
CMD9 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CSD | 选定卡通过CMD线发送CSD内容 |
CMD10 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CID | 选定卡通过CMD线发送CID内容 |
CMD12 | ac | [31:0]填充位 | R1b | STOP_TRANSMISSION | 强制卡停止传输 |
CMD13 | ac | [31:16]RCA[15:0]填充位 | R1 | SEND_STATUS | 选定卡通过CMD线发送它状态寄存器 |
CMD15 | ac | [31:16]RCA[15:0]填充位 | - | GO_INACTIVE_STATE | 使选定卡进入“inactive”状态 |
面向块的读操作(Class 2) | |||||
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCK_LEN | 对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。 |
CMD17 | adtc | [31:0]数据地址 | R1 | READ_SINGLE_BLOCK | 对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。 |
CMD18 | adtc | [31:0]数据地址 | R1 | READ_MULTIPLE_BLOCK | 连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。 |
面向块的写操作(Class 4) | |||||
CMD24 | adtc | [31:0]数据地址 | R1 | WRITE_BLOCK | 对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。 |
CMD25 | adtc | [31:0]数据地址 | R1 | WRITE_MILTIPLE_BLOCK | 连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。 |
CMD27 | adtc | [31:0]填充位 | R1 | PROGRAM_CSD | 对CSD的可编程位进行编程 |
SD命令的响应:
响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。基本特性如下:
- SDIO总共有7个响应类型(代号:R1~R7),其中SD卡没有R4、R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。
- 与命令一样,SD卡的响应也是通过CMD线连续传输的。
- 根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度为136bit。
R1(正常响应命令) | ||||||||
描述 | 起始位 | 传输位 | 命令号 | 卡状态 | CRC7 | 终止位 | ||
Bit | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 | ||
位宽 | 1 | 1 | 6 | 32 | 7 | 1 | ||
值 | "0" | "0" | x | x | x | "1" | ||
备注 | 如果有传输到卡的数据,那么在数据线可能有busy信号 | |||||||
R2(CID,CSD寄存器) | ||||||||
描述 | 起始位 | 传输位 | 保留 | [127:1] | 终止位 | |||
Bit | 135 | 134 | [133:128] | 127 | 0 | |||
位宽 | 1 | 1 | 6 | x | 1 | |||
值 | "0" | "0" | "111111" | CID或者CSD寄存器[127:1]位的值 | "1" | |||
备注 | CID寄存器内容作为CMD2和CMD10响应,CSD寄存器内容作为CMD9响应。 | |||||||
R3(OCR寄存器) | ||||||||
描述 | 起始位 | 传输位 | 保留 | OCR寄存器 | 保留 | 终止位 | ||
Bit | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 | ||
位宽 | 1 | 1 | 6 | 32 | 7 | 1 | ||
值 | "0" | "0" | "111111" | x | "1111111" | "1" | ||
备注 | OCR寄存器的值作为ACMD41的响应 | |||||||
R6(发布的RCA寄存器响应) | ||||||||
描述 | 起始位 | 传输位 | CMD3 | RCA寄存器 | 卡状态位 | CRC7 | 终止位 | |
Bit | 47 | 46 | [45:40] | [39:8] | [7:1] | 0 | ||
位宽 | 1 | 1 | 6 | 16 | 16 | 7 | 1 | |
值 | "0" | "0" | "000011" | x | x | x | "1" | |
备注 | 专用于命令CMD3的响应 | |||||||
R7(发布的RCA寄存器响应) | ||||||||
描述 | 起始位 | 传输位 | CMD8 | 保留 | 接收电压 | 检测模式 | CRC7 | 终止位 |
Bit | 47 | 46 | [45:40] | [39:20] | [19:16] | [15:8] | [7:1] | 0 |
位宽 | 1 | 1 | 6 | 20 | 4 | 8 | 7 | 1 |
值 | "0" | "0" | "001000" | "00000h" | x | x | x | "1" |
备注 | 专用于命令CMD8的响应,返回卡支持电压范围和检测模式 |
SDIO读数据:
SDIO写数据:
SD卡的操作模式及切换:
SD卡有多个版本,STM32控制器目前最高支持《Physical Layer Simplified Specification V2.0》定义的SD卡,STM32控制器对SD卡进行数据读写之前需要识别卡的种类:V1.0标准卡、V2.0标准卡、V2.0高容量卡或者不被识别卡。
SD卡系统定义了两种操作模式:卡识别模式和数据传输模式。
在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。
每个操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换:
操作模式 | SD卡状态 |
无效模式(Inactive) | 无效状态(Inactive State) |
卡识别模式(Card identification mode) | 空闲状态(Idle State) |
准备状态(Ready State) | |
识别状态(Identification State) | |
数据传输模式(Data transfer mode) | 待机状态(Stand-by State) |
传输状态(Transfer State) | |
发送数据状态(Sending-data State) | |
接收数据状态(Receive-data State) | |
编程状态(Programming State) | |
断开连接状态(Disconnect State) |
卡识别模式
- 上电后,主机发送CMD0让所有卡软复位从而进入空闲状态。
- 主机发送CMD8确定卡的电压范围,并识别是否为2.0的卡
- 主机发送ACMD41识别或拒绝不匹配它的电压范围的卡
- 主机发送CMD2来控制所有卡返回它们的卡识别号CID(128位)
- 主机发送CMD3命令,让卡推荐一个RCA(16)地址作为以后通信的标识
注:在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下。
数据传输模式
只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。
CMD7用来选定和取消指定的卡
(三)SD卡普通模式读写操作实例
(四)SD卡DMA模式读写操作实例
总结
总结了华清远见物联网课程Leve4的主要知识点,希望对大家有所帮助。
本文在语雀同时发布:
https://www.yuque.com/docs/share/9e0b58e0-6aaf-4475-9e20-dd4a7790e62b?#
《物联网ARM开发高级》密码:bgxn
希望大家多多关注。