STM32F103xE的USART异步数据传输示例

USART全称Universal Synchronous/Asynchronous Receiver/Transmitter,是一种可以进行同步/异步通信的串行设备接口。

通过查阅STM32官方手册得之,STM32f10x系列一共有五个USART传输串口。其中USART1、USART2、USART3为同步/异步串行通信接口,USART4、USART5为异步串行通信接口。

STM32外设的初始化步骤基本上是:

  1. 使能外设时钟
  2. 配置外设所需要的I/O端口
  3. 配置外设
  4. 使能外设

根据这个步骤首先我们使能外设时钟

使能外设时钟

查阅手册

通过该图我们看到USART1位于总线APB2上面,而USART2、3和UART4、5位于总线APB1上面。

因此我们开启USART1的时钟

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1时钟

配置外设所需I/O端口

通过查阅STM32官方手册得之,STM32f10x系列一共有五个USART传输串口。其中USART1、USART2、USART3为同步/异步串行通信接口,USART4、USART5为异步串行通信接口。

在这里我们将使用USART1同步/异步串行通信接口为例,进行介绍。既然想通过USART1通信接口发送数据,那肯定GPIO引脚呀,因此继续在官方手册中查找

该表格清楚明了的说明了USART1的各个引脚。其中TX(Transmit data发送数据输出)、RX(Receive data接受数据输入)、CK(Clock发送时钟输出)、CTS(Clear to Send允许发送)、RTS(Request to Send请求发送)分别对应于PA09、PA10、PA08、PA11、PA12。

因此我们配置I/O端口:

GPIO_InitTypeDef  GPIO_InitStrue;
//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//GPIO10使能TX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //10脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_10
//GPIO10使能RX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;//11脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_11

配置外设

在这里外设当然是USART1啦。我们只需要根据自己的需要配置就行啦。主要的配置项有波特率有无硬件控制流发送/接受有无奇偶校验停止位数据位

其中波特率指的是数据传输到速度指每秒钟发送多少bit的数据;硬件控制流指是否通过CTS和RTS控制数据传输;有无奇偶校验则比较简单就是是否对传输的数据进行奇偶校验;因为USART接口传输需要对数据进行封装,即在原有的数据中加上开始位,在原始数据的尾部加上停止位,因此停止位值得就是停止位的长度;数据位指的是每次传输中有效数据的长度。

一个配置的示例:

USART_InitStrue.USART_BaudRate=9600;//波特率9600
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制
USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//使能发送、接收
USART_InitStrue.USART_Parity=USART_Parity_No;//无基偶校验
USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位1位
USART_InitStrue.USART_WordLength=USART_WordLength_8b;//数据8位
USART_Init(USART1,&USART_InitStrue);//根据设定初始化USART1

使能外设

直接使能USART即可

USART_Cmd(USART1,ENABLE);

接下来配置USART1的中断

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开中断USART1
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;//通道
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_InitStrue);

以及中断服务函数

在该函数中我们首先判断中断类型,是否为接受中断;如果是接受中断则接受字符并通过USART1发送出去,最后我们使用了一个while函数来确保数据成功发送。

//中断服务函数
void USART1_IRQHandler(void)
{
u8 USART1_in;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART1_in=USART_ReceiveData(USART1);
USART_SendData(USART1, USART1_in);//向串口3发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
}

废话少说,直接上最终代码

配置IO引脚、USART、中断向量优先级等参数:

//串口初始化
void USART1_init()
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//GPIO10使能TX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //10脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_10
//GPIO10使能RX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;//11脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_11
//USART初始化
USART_InitStrue.USART_BaudRate=9600;//波特率9600
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制
USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//使能发送、接收
USART_InitStrue.USART_Parity=USART_Parity_No;//无基偶校验
USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位1位
USART_InitStrue.USART_WordLength=USART_WordLength_8b;//数据8位
USART_Init(USART1,&USART_InitStrue);//根据设定初始化USART1
//USART1使能
USART_Cmd(USART1,ENABLE);
//开中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开中断USART1
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;//通道
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_InitStrue);
}

中断接受函数

//中断服务函数
void USART1_IRQHandler(void)
{
u8 USART1_in;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART1_in=USART_ReceiveData(USART1);
USART_SendData(USART1, USART1_in);//向串口3发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
}

将使用USART1同步/异步串行通信接口为例,进行介绍。既然想通过USART1通信接口发送数据,那肯定GPIO引脚呀,因此继续在官方手册中查找

废话少说,直接上代码

配置IO引脚、USART、中断向量优先级等参数:

//串口初始化
void USART1_init()
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART1,ENABLE);
//GPIO10使能TX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //10脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_10
//GPIO10使能RX
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;//11脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //根据设定参数初始化GPIOB_11
//USART初始化
USART_InitStrue.USART_BaudRate=9600;//波特率9600
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制
USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//使能发送、接收
USART_InitStrue.USART_Parity=USART_Parity_No;//无基偶校验
USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位1位
USART_InitStrue.USART_WordLength=USART_WordLength_8b;//数据8位
USART_Init(USART1,&USART_InitStrue);//根据设定初始化USART1
//USART1使能
USART_Cmd(USART1,ENABLE);
//开中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开中断USART1
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;//通道
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_InitStrue);
}

中断接受函数

//中断服务函数
void USART1_IRQHandler(void)
{
u8 USART1_in;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART1_in=USART_ReceiveData(USART1);
USART_SendData(USART1, USART1_in);//向串口3发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
}

stm32 usart 异步传输示例的更多相关文章

  1. [stm32] USART USART1收发功能工程

    >_<!功能:PC端发送一个特定的字符:0x0d 0x0a,单片机则返回一句话,如图: >_<!知识: 1.复用功能I/O和调试配置(AFIO)  为了优化外设数目,可以把一些 ...

  2. 单片机stm32 USART串口实际应用解析

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  3. stm32 USART rs485 rs232

    转载自:http://www.cnblogs.com/chineseboy/archive/2013/03/06/2947173.html 前题: 前段时间,在公司调试了一个项目,很简单,但对于初学的 ...

  4. STM32 USART 波特率计算

    The baud rate for the receiver and transmitter (Rx and Tx) are both set to the same value as program ...

  5. stm32 usart的几种通信模式

    一 USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换. USART支持同步单向通信和半双工单线通信,也支持LIN(局 ...

  6. STM32 ~ USART接收不定长数据

    IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据. ...

  7. stm32 USART使用标志

    在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束. ...

  8. stm32 usart 串口

    比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps).如每秒钟传送240个字符, 而每个字符格式包含10位(1个起始位.1个停止位.8个数据位),这时的比特率为: 10位 × 240个/秒 = ...

  9. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

随机推荐

  1. Module Zero之角色管理

    返回<Module Zero学习目录> 角色实体 角色管理者 多租户 角色实体 角色实体代表了该应用的一个角色.它应该派生自AbpRole类,如下所示: public class Role ...

  2. sun.misc.BASE64Encoder找不到jar包的解决方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  3. Powershell 切换IE代理

    买了一个穿越防火墙的代理,在 Windows 下每次手动设置代理都好麻烦,最后不断尝试 Powershell 来设置,最后也终于成功了.   其实利用 Powershell 来设置 IE 的代理,就是 ...

  4. Sql Server系列:字符串函数

    字符串函数用于对字符和二进制字符串进行各种操作,大多数字符串函数只能作用于char.nchar.varchar和nvarchar数据类型.字符串函数可以用在SELECT或者WHERE语句中. 1. A ...

  5. jQuery 2.0.3 源码分析core - 整体架构

    拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery ...

  6. 解密jQuery内核 DOM操作的核心buildFragment

    文档碎片是什么 http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-B63ED1A3 DocumentFragment is a & ...

  7. x86汇编程序基础(AT&T语法)

    一.简单的汇编程序 以下面这段简单的汇编代码为例 .section .data .section .text .globl _start _start: movl $, %eax movl $, %e ...

  8. 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...

  9. Java设计模式之单例模式(Singleton)

    前言: 在总结okHttp的时候,为了管理网络请求使用到了单例模式,晚上实在没啥状态了,静下心来学习总结一下使用频率最高的设计模式单例模式. 单例模式: 单例模式确保某个类只有一个实例,而且自行实例化 ...

  10. 基于android studio编译工具下的android开发之IBeacon 例子

    想直接看主要内容的请调到红字下面. 之所以会接触到android下的IBeacon,是因为我自己导师给的任务.一个网址http://estimote.com/和一句话:看看这个网站,然后试下在安卓手机 ...