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对我来说是陌 ...
随机推荐
- 非全自研可视化表达引擎-RuleLinK
说在前面 工作中经常会遇到这样的场景: 帮忙把小贝拉门店 商品金额在5w以内,产康订单最多95折. 帮忙把圣贝拉门店 开业时间在6个月内,折扣低于7折要发起审批 帮忙把宁波太平洋店设置独立合同模板 帮 ...
- BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。
前言 BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的. 网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看. ...
- 《Docker到Kubernetes容器运维实战》简介
#好书推荐##好书奇遇季#<Docker到Kubernetes容器运维实战>已经出版.本书帮助读者系统掌握Docker与K8s运维技能. 本书内容 本书分两部分系统介绍Docker与K ...
- centos7.6 安装Jenkins
一.安装java环境 yum install -y java-11-openjdk* 三.将Jenkins存储库添加到yum repos wget -O /etc/yum.repos.d/jenkin ...
- 编译器优化记录(Mem2Reg+SSA Destruction)
编译器优化记录(2) Mem2Reg+SSA Destruction 写的时候忽然想起来,这部分的内容恰好是在我十八岁生日的前一天完成的.算是自己给自己的一份成长的纪念吧. 0. 哪些东西可以Mem2 ...
- daffodil
import java.util.ArrayList; public class Daffodil { /** * 打印出100-999之间所有的"水仙花数",所谓"水仙 ...
- 13.1 使用DirectX9绘图引擎
DirectX 9 是由微软开发的一组多媒体应用程序接口API,用于创建和运行基于Windows平台的多媒体应用程序,尤其是游戏.它是DirectX系列中的一个版本,于2002年发布,是DirectX ...
- [ABC310D] Peaceful Teams 题解
Peaceful Teams 题目大意 将 \(n\) 个人分成 \(T\) 组,要求每组不能包含敌对的人,问有多少种分法. 思路分析 注意到 \(n,T\) 均很小,考虑爆搜. 注意到直接枚举会枚举 ...
- RLChina理论三:强化学习基础
强化学习基础 马尔可夫决策过程就是在,环境自发做出转变,是个随波逐流的过程,At是智能体的行动,在St环境状态下加入At动作,c才进入下个状态S(t+1),即环境有自己的变化,也加入了智能体的决策. ...
- QT中级(2)QTableView自定义委托(二)实现QProgressBar委托
同系列文章 QT中级(1)QTableView自定义委托(一)实现QSpinBox.QDoubleSpinBox委托 QT中级(2)QTableView自定义委托(二)实现QProgressBar委托 ...