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的配置

  1. 引脚分配:
  • 自动分配PA2为USART2_TX
  • 自动分配PA3为USART2_RX
  1. 外设配置:

    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的配置

  1. 引脚分配:
  • 自动分配PA2为USART2_TX
  • 自动分配PA3为USART2_RX
  1. 外设配置:

    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的更多相关文章

  1. STM32串行通信USART解说笔记

    STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...

  2. 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议

    1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...

  3. STM32入门系列-STM32外设地址映射

    片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...

  4. pixy&STM32使用记录(串口&SPI外设)

    先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...

  5. 使用STM32的USART的同步模式Synchronous调戏SPI【usart模拟spi理论】

    [原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064321.html 什么东西?? 我们先来看我们平常看到SPI的时序图(呵呵,要是忘记 ...

  6. Stm32串口通信(USART)

    Stm32串口通信(UART) 串口通信的分类 串口通信三种传递方式 串口通信的通信方式 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束.其每帧的格式如下: 在一帧格 ...

  7. 【STM32】串行通信原理

    (1)通信接口背景知识    并行通信:         --传输原理:数据各个位同时传输         --优点:速度快         --缺点:占用引脚资源多     串行通信:       ...

  8. STM32学习笔记——USART串口

    转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...

  9. STM32学习笔记——USART串口(向原子哥和火哥学习)

    一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...

  10. STM32学习笔记——USART

    STM32的USART组件支持异步.同步.单线半双工.多处理器.IrDA.LIN.SmartCard等模式,本文介绍的是异步即UART模式. 总线通信有三种模型:轮询.中断和DMA.DMA对我来说是陌 ...

随机推荐

  1. 非全自研可视化表达引擎-RuleLinK

    说在前面 工作中经常会遇到这样的场景: 帮忙把小贝拉门店 商品金额在5w以内,产康订单最多95折. 帮忙把圣贝拉门店 开业时间在6个月内,折扣低于7折要发起审批 帮忙把宁波太平洋店设置独立合同模板 帮 ...

  2. BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。

    前言 BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的. 网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看. ...

  3. 《Docker到Kubernetes容器运维实战》简介

    #好书推荐##好书奇遇季#<Docker到Kubernetes容器运维实战>已经出版.本书帮助读者系统掌握Docker与K8s运维技能.   本书内容 本书分两部分系统介绍Docker与K ...

  4. centos7.6 安装Jenkins

    一.安装java环境 yum install -y java-11-openjdk* 三.将Jenkins存储库添加到yum repos wget -O /etc/yum.repos.d/jenkin ...

  5. 编译器优化记录(Mem2Reg+SSA Destruction)

    编译器优化记录(2) Mem2Reg+SSA Destruction 写的时候忽然想起来,这部分的内容恰好是在我十八岁生日的前一天完成的.算是自己给自己的一份成长的纪念吧. 0. 哪些东西可以Mem2 ...

  6. daffodil

    import java.util.ArrayList; public class Daffodil { /** * 打印出100-999之间所有的"水仙花数",所谓"水仙 ...

  7. 13.1 使用DirectX9绘图引擎

    DirectX 9 是由微软开发的一组多媒体应用程序接口API,用于创建和运行基于Windows平台的多媒体应用程序,尤其是游戏.它是DirectX系列中的一个版本,于2002年发布,是DirectX ...

  8. [ABC310D] Peaceful Teams 题解

    Peaceful Teams 题目大意 将 \(n\) 个人分成 \(T\) 组,要求每组不能包含敌对的人,问有多少种分法. 思路分析 注意到 \(n,T\) 均很小,考虑爆搜. 注意到直接枚举会枚举 ...

  9. RLChina理论三:强化学习基础

    强化学习基础 马尔可夫决策过程就是在,环境自发做出转变,是个随波逐流的过程,At是智能体的行动,在St环境状态下加入At动作,c才进入下个状态S(t+1),即环境有自己的变化,也加入了智能体的决策. ...

  10. QT中级(2)QTableView自定义委托(二)实现QProgressBar委托

    同系列文章 QT中级(1)QTableView自定义委托(一)实现QSpinBox.QDoubleSpinBox委托 QT中级(2)QTableView自定义委托(二)实现QProgressBar委托 ...