STM32外设:串行通信 USART、I2C、SPI
USART:Universal Synchronous Asynchronous Receiver Transmitter 通用同步异步接收发送器
UART:异步中断
主要功能:接收指定长度的帧
数据通路
CPU←输入数据缓冲器←串行输入移位寄存器←引脚UART_RX
CPU→输出数据缓冲器→串行输出移位寄存器→引脚UART_TX
- 串行通信:一个字符一个字符地传输,每个字符一位一位地传输(移位寄存器)
- 波特率(bps):每秒钟传输的数据位数(双方必须使用相同波特率)
- 串行通信类型:同步、异步
- 异步通信数据格式:起始位(start bit)+若干数据位(data bits)+奇偶校验位(parity bit)+停止位(stop bit)
- 支持轮询(缺省)、中断、DMA
硬件设计
开发板mini USB口是使用的USART2引脚:PA2复用为USART2_TX、PA3复用为USART2_RX
在PC端“串口调试助手”中,使用STLink的虚拟串口COMx进行收发信息
CubeMX的配置
- 引脚分配:
- 自动分配PA2为USART2_TX
- 自动分配PA3为USART2_RX
- 外设配置:
Connectivity→USART2 →模式→ Mode=Asynchronous异步通讯方式、Hardware Flow Control(RS232)=Disable 硬件流控制禁用
Connectivity→USART2 →参数配置(基本参数)→波特率=115200、传输数据长度(包括校验位)=8、无奇偶校验=None、停止位长度=1
System Core-NVIC-NVIC中断表 →参数配置(NVIC)→USART2 global interrupt→ 勾选使能、并设置抢占优先级和子优先级
用户代码
//USER CODE Includes:头文件
//printf重定位为uart
#include "stdio.h"
//USER CODE PD:常量定义define
#define BUF_SIZE 10
//USER CODE PV:变量定义variables
uint8_t RxMsg[BUF_SIZE]={""};//接收缓冲区
uint32_t RxFlag=0;//接收标志位
//USER CODE2:外设启动
printf("准备开始接收:\n");
HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuf,BUF_SIZE);
//USER CODE3:后台程序(无限循环)
if(RxFlag==1){
RxFlag=0;
HAL_UART_Transmit_IT(&huart2,(uint8_t*)RxBuf,BUF_SIZE);
HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuf,BUF_SIZE);
}
//USER CODE4:用户函数定义或前台程序(定义中断回调函数)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART2){
RxFlag=1;
}
}
//printf重定位为uart
int fputc(int ch,FILE *f){
HAL_UART_Transmit(&huart2,(uint8_t *) &ch,1,HAL_MAX_DELAY);
return ch;
}
UART:DMA
主要作用:在数据传输过程中,由DMA控制,从而节省CPU资源
DMA传输的4个要素
- 传输源 :DMA数据传输的来源
- 传输目标:DMA数据传输的目的
- 传输数量:DMA传输数据的数量
- 触发信号:启动一次DMA数据传输的动作
数据流Stream:传输源和传输目标的数据通路
传输源和传输目标称为通道(Channel)
若使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址
数据传输方式
- 普通模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
- 循环模式:可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。
空闲状态
- 在一帧数据传输结束后,通信线路将会维持高电平,这个状态称为空闲状态
- 当CPU检测到通信线路处于空闲状态时,空闲状态标志IDLE将由硬件置1。如果串口控制寄存器CR1中的IDLEIE位为1,将会触发空闲中断( IDLE中断);
- 由于空闲标志是在一帧数据传输完成后才置位,在有效数据传输过程中不会置位,因此借助空闲中断,可以实现不定长数据的收发
硬件设计
同上
CubeMX的配置
- 引脚分配:
- 自动分配PA2为USART2_TX
- 自动分配PA3为USART2_RX
- 外设配置:
Connectivity→USART2 →模式→ Mode=Asynchronous异步通讯方式、Hardware Flow Control(RS232)=Disable 硬件流控制禁用
Connectivity→USART2 →参数配置(基本参数)→波特率=115200、传输数据长度(包括校验位)=8、无奇偶校验=None、停止位长度=1
Connectivity→USART2 →参数配置(DMA设置)→ADD→USART2_RX→传输模式=普通、地址递增=外设不递增、存储器递增、FIFO使用=不是能、数据宽度=Byte
Connectivity→USART2 →参数配置(DMA设置)→ADD→USART2_TX→传输模式=普通、地址递增=外设不递增、存储器递增、FIFO使用=不是能、数据宽度=Byte
System Core-NVIC-NVIC中断表 →参数配置(NVIC)→USART2 global interrupt→ 勾选使能、并设置抢占优先级和子优先级
System Core-NVIC-NVIC中断表 →参数配置(NVIC)→DMA1 stream5 global interrupte→由CubeMX自动勾选使能、并设置抢占优先级和子优先级
System Core-NVIC-NVIC中断表 →参数配置(NVIC)→DMA1 stream6 global interrupte→由CubeMX自动勾选使能、并设置抢占优先级和子优先级
用户代码
stm32f4xx_it.c文件
void USART2_IRQHandler(void){
HAL_UART_IRQHandler(&huart2);
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET){
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除IDLE中断标志
HAL_UART_IdleCpltCallback(&huart2);//调用用户编写IDLE中断回调函数
}
}
main.c文件
//USER CODE PD:常量定义define
#define BUF_SIZE 1024
//CubeMX生成的变量
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
//USER CODE PV:变量定义variables
uint8_t RxBuf[BUF_SIZE]={""};//接收缓冲区
uint8_t RxFlag=0;//中断标志:0-接收未完成 1-接收完成
uint16_t RxLen=0;//接收消息长度
//USER CODE2:外设启动
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);//使能IDLE中断
HAL_UART_Receive_DMA(&huart2,(uint8_t*)RxBuf,BUF_SIZE);//启动DMA接收
//USER CODE3:后台程序(无限循环)
if(RxFlag==1){
RxFlag=0;
RxLen=BUF_SIZE-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);//发生空闲中断时,已接收数据长度=数据总量-DMA中待接收的数据个数
HAL_UART_Transmit_DMA(&huart2,(uint8_t *)RxBuf,RxLen);
RxLen=0;
__HAL_DMA_DISABLE(&hdma_usart2_rx);//设置DMA Disable 触发DMA中断,调用接收中断回调函数来重启下一次DMA接收
}
//USER CODE4:前台程序(定义中断回调函数)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART2){
HAL_UART_Receive_DMA(&huart2,(uint8_t*)RxBuf,BUF_SIZE);
}
}
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart){
RxFlag=1;//设置接收完成标志
}
I2C
I2C总线:SCL时钟线、SDA数据线,只允许一个主设备STM32 MCU、可以有多个从设备
总线根据设备选择上拉电阻1~10k,IO引脚复用开漏模式
每个器件都有一个唯一地址,最多有127个器件地址(7bit地址模式)、新I2C规范增加10bit地址模式 最多器件地址为1023个器件地址
根据通信帧内的地址分辨从设备
SPI
SPI总线:MOSI 主输出从输入、MISO 主输入从输出、SCK时钟(时钟上升沿收发1bit)、CS选片(通讯过程中保持低电平)
在主设备为只有一个NSS连接从设备CS、要使用多个从设备需要使用其他IO引脚连接从设备CS(不需要发送地址数据、但需要占用IO引脚)
SCK时钟的频率由主设备决定
STM32外设:串行通信 USART、I2C、SPI的更多相关文章
- STM32串行通信USART解说笔记
STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...
- 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议
1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...
- STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...
- pixy&STM32使用记录(串口&SPI外设)
先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...
- 使用STM32的USART的同步模式Synchronous调戏SPI【usart模拟spi理论】
[原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064321.html 什么东西?? 我们先来看我们平常看到SPI的时序图(呵呵,要是忘记 ...
- Stm32串口通信(USART)
Stm32串口通信(UART) 串口通信的分类 串口通信三种传递方式 串口通信的通信方式 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束.其每帧的格式如下: 在一帧格 ...
- 【STM32】串行通信原理
(1)通信接口背景知识 并行通信: --传输原理:数据各个位同时传输 --优点:速度快 --缺点:占用引脚资源多 串行通信: ...
- STM32学习笔记——USART串口
转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...
- STM32学习笔记——USART串口(向原子哥和火哥学习)
一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...
- STM32学习笔记——USART
STM32的USART组件支持异步.同步.单线半双工.多处理器.IrDA.LIN.SmartCard等模式,本文介绍的是异步即UART模式. 总线通信有三种模型:轮询.中断和DMA.DMA对我来说是陌 ...
随机推荐
- Linux下后台运行Java程序
1.背景描述 用Java编写了一个程序(可执行的jar),需要在Linux中启动并持续运行 1.1.直接执行程序 直接执行程序后,在程序执行期间,无法在当前会话中再执行其他操作 1.2.直接执行程序后 ...
- 一张图读懂TuGraph Analytics开源技术架构
TuGraph Analytics(内部项目名GeaFlow)是蚂蚁集团开源的分布式实时图计算引擎,即流式图计算.通过SQL+GQL融合分析语言对表模型和图模型进行统一处理,实现了流.批.图一体化计算 ...
- c# .NET 高级编程 高并发必备技巧(二) - 分布式锁
上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题. 然而现实中,一般会高并发的应用,很少会单机部署.当用户量达到一定的程度,分布式.集群部署是必然的选择.在分布式部署的情况下,之前 ...
- Python+Flask设置接口开机自启动
Windows系统适用 创建一个批处理文件(例如 start_flask_api.bat),内容如下: @echo off cd /d C:\path\to\your\flask\app //你要启动 ...
- 图解Spark Graphx基于connectedComponents函数实现连通图底层原理
原创/朱季谦 第一次写这么长的graphx源码解读,还是比较晦涩,有较多不足之处,争取改进. 一.连通图说明 连通图是指图中的任意两个顶点之间都存在路径相连而组成的一个子图. 用一个图来说明,例如,下 ...
- iOS证书的使用
在iOS开发中,证书分两种,一种是对应于应用的证书,一种是通用证书
- Kafka与RabbitMQ
一.什么是kafka,什么是rabbit Kafka是由Scala语言开发的一种分布式流处理框架,主要用于处理活跃的流式数据,以及大数据量的数据处理.它采用发布-订阅模型,支持消息的批量处理,数据 ...
- Kong网关
Kong网关 一.kong网关核心概念 1. Upstream upstream 对象表示虚拟主机名,可用于通过多个服务对传入请求进行负载远的 2. Target 目标ip地址/主机名,其端口表示后端 ...
- 从DevOps实践落地的角度谈谈“流程”和“规范"的反模式
最近在经历的一些事情,让我突发灵感,觉得要写点关于DevOps体系建设过程中的"流程规范",记录下来. 如何解读"流程规范" 谈到DevOps落地,无一例外都会 ...
- SpringBootAdmin_监控
监控的意义 监控服务状态是否宕机 监控服务运行指标(内存.虚拟机.线程.请求等) 监控日志 管理服务(服务下线) 监控的实施方式 大部分监控平台都是主动拉取监控信息,而不是被动地等待应用程序传递信息 ...