UART:Universal Asynchronous Receiver/Transmitter(通用异步收/发器)

USART:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行收/发器)

从命名即可看出USART就是UART的基础上添加了同步功能。通常把UART/USART称为串口。

串口包含TLL电平和232的串口,485等电气特性的串口。232、485通常应用于工业。

串口配置的一般步骤可以参考正点原子的总结:

1、串口时钟使能,GPIO时钟使能;

2、串口复位;(我不知道这一步的意义,去掉似乎也没影响,求大神指点)

3、GPIO端口模式的配置;

4、串口参数初始化;

5、初始化NVIC并开启中断;

6、使能串口;

7、编写中断服务函数。

配置示例:

void Usart3_Init(unsigned int BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);USART_DeInit(USART3);//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//USART3_RX   GPIOB.11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE);
}

注意:在此示例中GPIO的速率配置为50M,其实没必要那么高,可降低至2M。速率越高,噪声越大,功耗越高。

在配置代码中,开启了接收中断。在日常串口使用中,都会规定通信协议。通信协议的解析,通常在中断服务函数里进行。

通信协议通常由帧头,数据,帧尾三部分组成。

帧头不正确,不继续处理后续接收到的内容。

帧尾不正确,对数据不进行处理。

示例:

帧头由两部分组成,校验信息和数据长度。示例中断校验信息,赋值给unsigned char的变量,相加后为0。这是特殊的帧头。

    unsigned char chr = 0;chr += (0xAA + 0xBB + 0xCC + 0xDD + 0xEE + 0x04);printf("chr=%X\n", chr);

数据长度通常只指数据的长度,不包含帧头校验信息和帧尾的长度。

帧尾可以是CRC等校验方式。可包含长度也可不包含,计算数据的CRC。目的是确保数据的一致性。

串口中断服务函数示例:

void USART3_IRQHandler(void)
{       if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);g_usart3_recv_data = USART_ReceiveData(USART3);switch(g_usart3_recv_state){case USART3_RECV_FIRST_FRAME_HEAD:if(MKLM_FIRST_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_SECOND_FRAME_HEAD;   }else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;             }break;case USART3_RECV_SECOND_FRAME_HEAD:if(MKLM_SECOND_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_FIRST_LENGTH;}else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;             }break;case USART3_RECV_FIRST_LENGTH:g_Usart3_recv_struct.length = g_usart3_recv_data;g_Usart3_recv_struct.length <<= 8;g_usart3_recv_state = USART3_RECV_SECOND_LENGTH; break;case USART3_RECV_SECOND_LENGTH:g_Usart3_recv_struct.length |= g_usart3_recv_data;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_ADDRESS; break;case USART3_RECV_ADDRESS:g_Usart3_recv_struct.address = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ORDER;break;case USART3_RECV_ORDER:g_Usart3_recv_struct.order = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ACTION; break;case USART3_RECV_ACTION:g_Usart3_recv_struct.action = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_FIRST_CRC;break;case USART3_RECV_FIRST_CRC:g_Usart3_recv_struct.crc16 = g_usart3_recv_data;g_Usart3_recv_struct.crc16 <<= 8;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_SECOND_CRC;break;case USART3_RECV_SECOND_CRC:g_Usart3_recv_struct.crc16 |= g_usart3_recv_data;g_usart3_recv_length++;if(g_usart3_recv_length == g_Usart3_recv_struct.length){g_recv_status = RECEIVE_OK;}else {g_recv_status = RECEIVE_LENGTH_ERROR;}g_usart3_recv_flag = USART3_RECV_SECCESS;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;break;default:break;}}
}

STM32使用printf的方法。

在魔术棒里勾选Use MicroLIB(默认是不勾选的)

如果不勾选会出现在BEAB BKPT 0xAB 死循环,如下图

以串口2为例,在串口2相关.c里(可在任何位置,为防混乱放在需要配置给printf的串口文件里)

加入以下代码(别忘了添加包含头文件stdio.h)

#include <stdio.h>int fputc(int ch, FILE* stream)
{while (!(USART2->SR & USART_FLAG_TXE));USART_SendData(USART2, (uint8_t)ch);return ch;
}

就可以调用printf了,调用前别忘了相关串口要初始化。

Uart2_Init(9600); while(1)
{printf("Hello World!\r\n");delay_ms(100);
}

通过串口助手可以看到现象

STM32F1笔记(三)UART/USART相关推荐

  1. 嵌入式学习笔记——STM32的USART通信概述

    文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...

  2. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  3. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  4. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  5. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  6. AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

    AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核, 打算移植新的2.6的内核,从网上下了2.6.17的kernel,下载 ...

  7. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  8. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  9. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

最新文章

  1. 性能测试应用领域分析
  2. Hive的伴奏_Position Music顶级背景音乐合集243CD
  3. Domino(群组工作软件)
  4. 简单实现下载功能--jsp,servlet
  5. 区块链中心化业务必须基于中心化平台吗?
  6. RotateCard(自定义旋转view)
  7. iphone 内部函数使用 (函数可能无法响应的部分解决方案)
  8. 日志平台查询异常,没有打印异常信息
  9. Bypass功能depletion mode
  10. JavaWeb和WebGIS学习笔记(七)——MapGuide Open Source安装、配置以及MapGuide Maestro发布地图——超详细!目前最保姆级的MapGuide上手教程!
  11. matlab—赋值具有的非单一 rhs 维度多于非单一下标数
  12. Arduino的数字信号、模拟信号以及串口整理
  13. sweet-alert的swal()出现瞬间自动消失(type:“success”类型)
  14. 删除打开方式中的选项
  15. 天润融通呼叫中心破教育机构分布式难题
  16. u盘中病毒文件被隐藏怎么恢复?看看这三种方法
  17. 《送给八年以前两年以后的自己》
  18. Python基础篇1:输入直角三角形的两个直角边的长度a、b,求斜边c的长度
  19. 是使用id还是使用pk查找呢?
  20. select a method for export 各选项都是什么意思

热门文章

  1. 魔术命令python_Python前10个魔术命令可以帮助您提高生产率
  2. python彩色螺旋线_解决python彩色螺旋线绘制引发的问题
  3. c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...
  4. 中科软测试面试题2019_2019国考成绩今日是否会发布,笔试120能进面不?
  5. android 包裹内容,Android开发中Bundle用法 包裹数据
  6. java循环输入直到,使用循环接受其他用户输入,直到用户输入结束输入的值
  7. 推荐几十本投资书籍、互联网书籍及热门查看流量的工具
  8. java大佬是如何快速配置IntelliJ IDEA的Tomcat及安装配置Tomcat及java开发环境
  9. 日志长度_Kafka 日志存储详解
  10. 小程序在wxml页面中取整