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对我来说是陌 ...
随机推荐
- lattice crosslink开发板mipi核心板csi测试dsi屏lif md6000 fpga
1. 概述 CrossLink开发板,是用Lattice的芯片CrossLink 家族系列的,LIF-MD6000-6JM80I.该芯片用于桥接视频接口功能,自带2路MIPI硬核的功能,4 LANE ...
- Redis沙盒逃逸(CVE-2022-0543)漏洞复现
0x01 概述 Redis 是著名的开源 Key-Value 数据库,其具备在沙箱中执行 Lua 脚本的能力.Debian 以及 Ubuntu 发行版的源在打包 Redis 时,在 Lua 沙箱中遗留 ...
- 月工资不到10元的内容审核专员? - ChatGPT 在内容自动审查中的应用
内容过滤筛查是指对网络上发布或传播的文本.图片.视频等内容进行审核和监管,以防止出现违法违规.暴力色情.虚假广告.电信诈骗等现象,维护网络安全和社会秩序. 内容过滤筛查是一个亟待解决的问题,因为网络内 ...
- 探秘移动端BI:发展历程与应用前景解析
什么是移动端BI 维基百科 上对于 移动端商业智能的定义是这样的 > Mobile BI is a system that presents historical and real-time i ...
- 「loj - 3489」「joisc 2021 day 1」Food Court
link. 感觉好久没写过题解了, 这就是永远在骚动的得不到吧. 星尘 infinity 真的非常行, 就算是 ja voicebase 都不知道吊打那群日 v 多少圈. 我推荐你们都去听一听. ch ...
- 文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题
三.用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn). 文心一言: 快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn).在最坏情况 ...
- 推荐免费的svn空间(SVN代码托管)
推荐免费的svn空间(SVN代码托管) 最近研究了国内和国外的免费svn空间,SVN代码托管,SVN在线,代码托管中心,有所心得. 1.http://www.svn999.com/ [推荐]国内的,免 ...
- PowerShell 多平台一键生成 Blu-ray Live 分轨
前言 本人 n 年前的需求,需要自动化的将 Blu-ray Live 转换成 FLAC 格式的文件(自听&发种). ️ 注意:本脚本仅支持输出 flac ! 前提 计算机安装有 PowerSh ...
- [CISCN 2019华东南]Web11
看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...
- 2020/4/29 一场令人头疼的cf。。。
今天是被安排的cf...我真的是太菜了啊...又双叒叕被机房的一群dalao吊打了... 这就是我与6年级的dalao的区别吗...我裂开了 T1:A - Exercising Walk 简单题. 就 ...