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. 干了这么多年C#,后悔没早点用这种“分页”,简单/高效/易维护

    [前言] 干了这么多年C#,后悔没早点用这种"分页",简单/高效/易维护,比其它的分页方式强多了,不信你自己看. [正文] 支持.Net Core(2.0及以上)与.Net Fra ...

  2. 在.NET Framework中使用RocketMQ(阿里云版)实战【第一章】

    章节 第一章:https://www.cnblogs.com/kimiliucn/p/17662052.html 第二章: 作者:西瓜程序猿 主页传送门:https://www.cnblogs.com ...

  3. Python+Flask设置接口开机自启动

    Windows系统适用 创建一个批处理文件(例如 start_flask_api.bat),内容如下: @echo off cd /d C:\path\to\your\flask\app //你要启动 ...

  4. MySQL数据库触发器讲解 [创建/删除/查询/select into]

    刚学习实例完mysql触发器, 前来分享学习经验.    菜鸟装逼,  老鸟勿喷 先来认识一下有关触发器的一些关键词.  在使用触发器时, 这些关键词将被用到, 请记下它们的模样和用途(意思) cre ...

  5. KRPANO资源分析工具下载VR-FACTORY全景图

    示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师官 ...

  6. 多主架构:VLDB技术论文《Taurus MM: bringing multi-master to the cloud》解读

    本文分享自华为云社区<多主创新,让云数据库性能更卓越>,作者: GaussDB 数据库. 华为<Taurus MM: bringing multi-master to the clo ...

  7. Kruskal重构树 学习笔记

    Kruskal 重构树 最大生成树将部分内容倒置即可 回顾:Kruskal 基本信息 求解最小生成树 时间复杂度:\(O(m \log m)\) 更适合稀疏图 算法思想 按照边权从小到大排序 依次枚举 ...

  8. SpringCloud-ZipKin搭建保姆级教程

    服务链路追踪 一.服务追踪说明 微服务架构是通过业务来划分服务的,使⽤REST调⽤.对外暴露的⼀个接⼝,可能需要 很多个服务协同才能完成这个接⼝功能,如果链路上任何⼀个服务出现问题或者⽹络超 时,都会 ...

  9. [HNCTF 2022 WEEK2]e@sy_flower

    花指令分析 如果没接触过花指令,先看这个博客,大致了解一下花指令 https://www.cnblogs.com/Here-is-SG/p/15802040.html 点击此处下载附件 查壳 32位, ...

  10. 记一次 .NET 某拍摄监控软件 卡死分析

    一:背景 1. 讲故事 今天本来想写一篇 非托管泄露 的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软件卡死了,让我帮忙分 ...