目录
1. GPIO - General-purpose input/output
通用型IO, 功能如其名, pin脚可以自用控制使用,充当如clk, generator, chip select 等. 并且一定有寄存器来选择这些功能:
对于输入, 可以通过读取某个寄存器来确定pin脚电位的高低;
对于输出,一定可以通过写入某个寄存器来让这个引脚输出高低点位;
对于其他功能,则会由另外的寄存器来控制
操作
现在能够看到的关于GPIO操作的库函数是V1.8.0,可以在STM官方库支持中下载文档的综述表明其功能是管理GPIO的外设功能,总共是三点:
- 初始化;2.读写;3.复用
整个文件中包括14个函数: 初始化与配置4个; 读写操作9个; 复用1个
| 初始化函数 | |
|---|---|
| GPIO_DeInit() | 取消初始化,恢复为其默认复位值。默认引脚悬空(除JTAG) |
| GPIO_Init() | 根据初始化结构体来自定义初始化引脚 |
| GPIO_StructInit() | 根据默认模式初始化引脚 |
| GPIO_PinLockConfig() | 锁定寄存器GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR,GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH,可使用复位操作来解除锁定 |
| 读写函数 | |
|---|---|
| GPIO_ReadInputDataBit() / GPIO_ReadInputData() | 获得在输入模式下配置的引脚电平 |
| GPIO_ReadOnputDataBit() / GPIO_ReadOnputData() | 获得在输出模式下配置的引脚电平 |
| GPIO_SetBits()/ GPIO_ResetBits() | 设置/复位在输出模式下使用的引脚电平 |
| GPIO_Write() / GPIO_WriteBit() | 将数据写入指定的GPIO数据端口 |
| GPIO_ToggleBits() | 切换指定的GPIO引脚使用的引脚电平,即是1变0,0变1 |
| 复用函数 | |
|---|---|
| GPIO_PinAFConfig() | 为单个引脚提供复用的函数 |
2. IIC - Inter-Integrated Circuit
全称是I2C Bus, aka. 集成电路总线
I2C是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息. SDA: 串行数据线; SCL:
串行时钟线, 都是双向I/O线,
数据传输
1. 数据帧格式
-
发送到SDA 线上的每个字节必须为8 bits,每次传输可以发送的字节数量不受限制; 每个字节后必须跟一个响应位 (即一帧一共9bits)
-
I2C总线上传送的数据信号是广义的,即包括地址信号,又包括真正的数据信号
主机发起通信后,第一个字节是SLAVE地址(7bits + R/T寻址信号), 1表示读取数据Read; 0表示发送数据TransmitMaster → Slave send Data:
- 有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送, A应答
Master ← Slave read Data
Master ↔ Slave Read/Transmit Data -
首先传输的是数据的最高位(MSB)
- lsb(the least significant bit, 最低有效位), 指一个二进制数字中的第0位(即最低位), 具有权值为2^0,可以用它来检测数的奇偶性; 在大端序中,lsb指最右边的位。
- msb(the maximum significant bit), 指一个n位二进制数字中的n-1位,具有最高的权值2^n − 1; 在大端序中,msb即指最左端的位
- 如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续
2. 应答响应
1. 数据位的有效性规定
- I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化
- scl处于高电平的时候,如果sda处于低电平:传输数据0,sda处于高电平:传输数据1
2. 起始和终止信号p
- SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号
- 起始和种植信号由master发起, 在起始信号产生后,总线就处于被占用的状态; 在终止信号产生后,总线就处于空闲状态
起始信号: scl处于高电平, sda由高→ 低电平, 表示发起起始信号S
终止信号: scl处于高电平, sda由低→ 高电平, 表示发起终止信号P
在中间时, 数据正常传输 - 如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续
- 以下情况, Slave通过不应答, 即从机在SDA上的应答信号置于高位, 而由主机产生一个终止信号以结束总线的数据传送
- 由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线上的应答信号置于高电平, 而由主机产生一个终止信号以结束总线的数据传送
- 如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”(从机sda处于高电平)通知主机,主机则应发出终止信号以结束数据的继续传送
- 当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由从机的“非应答”(拉高sda)来实现的。然后,从机释放SDA线,以允许主机产生终止信号
3. I2C发送与接收数据时序图
Master Send Data:
red : Master ctl green: Slave ctl
Master Read Data:
参考
3. SPI - Serial Peripheral Interface
SPI是一种4线总线的协议,因为硬件强,所以SPI软件相对简单, 是一种高速全双工同步串行总线,可支持同时输入输出,使用3条通讯总线和1条片选线:
- SCK: 时钟信号线,用于通讯同步
- MOSI: 主机发送数据
- MISO: 主机接收数据
- NSS/CS: 片选信号线, 用于选择通讯的从设备
起始-停止信号
由NSS确定信号的起始和停止, 如图中1,6;
- 当NSS电平由高到低时产生起始信号;
- 当NSS电平由低到高时产生终止信号;
- Slave检测到自己的NSS电平被置低时,开始与Master通信
数据有效性
MOSI和MISO线在SCK的每个时钟周期传输一位数据,开发者可以自行设置MSB或LSB先行,不过需要保证两个通讯设备都使用同样的协定。从上图看到,在SCK的上升沿和下降沿时进行触发和采样。SPI有四种通讯模式,在SCK上升沿触发,下降沿采样只是其中一种模式。四种模式的主要区别便是总线空闲时SCK的状态及数据采样时刻。这涉及到“时钟极性CPOL”和“时钟相位CPHA”,由CPOL和CPHA的组合而产生了四种的通讯模式
CPOL CPHA
- CPOL: (pole), clock的空闲状态电平,即没有数据传输时间
CPOL = 0, 空闲时的sck时钟为低电平; CPOL = 1, 空闲时的sck时钟为高电平;- CPHA: (phase), clock的数据采样时刻
CPHA= 0, 非空闲时的sck时钟的第1边沿为采样时刻; CPHA= 0, 第2边沿为采样时刻
由此构成4中通讯模式如下如:
4. URAT - Universal Asynchronous Receiver/Transmitter
通用异步收发传输器,是异步通信协议
- 两根线,全双工,异步通信,速度较慢。也就是一根发送数据,一根接收数据,并且电平逻辑是时间的函数。
- 发送和接收一个bit都有固定的宽度,也就是只有等于这个时间宽度时才认为是1bit。
- 为了约定时间宽度,就诞生了比特率的概念:表示1s信号可以传输N bit的数据,单位bps=bit per second。比如,9600bps = 1s发送或接收9600 bit数据,那么1bit数据时间宽度也就是1/9600 s
- 常见比特率——9600bps 19200bps 38400bps 57600bps 115200bps
嵌入式里面说的串口,一般是指UART口, 但是我们经常搞不清楚它和COM口的区别, 以及RS232, TTL等关系,
实际上UART,COM指的物理接口形式(硬件), 而TTL、RS-232是指的电平标准(电信号)
UART有4个pin(VCC, GND, RX, TX), 用的TTL电平, 低电平为0(0V),高电平为1(3.3V或以上)
VCC:供电pin,一般是3.3v,在我们的板子上没有过电保护,这个pin一般不接更安全
GND:接地pin,有的时候rx接受数据有问题,就要接上这个pin,一般也可不接
RX:接收数据pin
TX:发送数据pin
COM口是我们台式机上面常用的口(下图),9个pin, 用的RS232电平, 它是负逻辑电平,它定义+5+12V为低电平,而-12-5V为高电平