STM32F103学习笔记三 串口通信

发布者:大泉人家最新更新时间:2019-06-12 来源: eefocus关键字:STM32F103  串口通信 手机看文章 扫描二维码
随时随地手机看文章

1、串口通信背景知识

1.1、 设备之间的通信方式

并行通信 串行通信

传输原理 数据各个位同时传输 数据按位顺序传输

优点 速度快 占用引脚资源少

缺点 占用引脚资源多 速度相对较慢

1.2、 串行通信分类

1.2.1、按照通信方式,分为:

同步通信:带时钟同步信号传输。比如:SPI,I²C通信接口

异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线


1.2.2、按照数据传送方向,分为:

单工:数据传输只支持数据在一个方向上传输;

半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。

全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。


在这里插入图片描述

1.3、常见的串行通信接口


在这里插入图片描述

2、STM32的串口通信基础

2.1、STM32的串口通信接口有两种,分别是:

UART(通用异步收发器)、

USART(通用同步异步收发器)、

对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。


2.2、UART引脚连接方法

① 单片机连接单片机


RXD:数据输入引脚,数据接受

TXD"数据发送引脚,数据发送


对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信了

在这里插入图片描述

② 单片机连接PC


若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口,因此不能直接交叉连接。RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。而单片机采用的是 TTL电平,所以需要 连接一个RS232转换器 将TTL电平转换成 PC可以识别的RS232电平,再交叉连接。

在这里插入图片描述

经过电平转换后,芯片串口和rs232的电平标准是不一样的:


单片机的电平标准(TTL电平):+5V表示1,0V表示0;

Rs232的电平标准:+15/+13 V表示1,-15/-13表示0。


RS-232通讯协议标准串口的设备间通讯结构图如下:

在这里插入图片描述

所以单片机串口与PC串口通信就应该遵循下面的连接方式:

在单片机串口与上位机给出的rs232口之间,通过电平转换电路(如下面图中的Max232芯片) 实现TTL电平与RS232电平之间的转换。


在这里插入图片描述

2.3、UART异步通信特点

全双工异步通信;

分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s;

可编程的数据字长度(8位或者9位);

可配置的停止位(支持1或者2位停止位);

可配置的使用DMA多缓冲器通信;

单独的发送器和接收器使能位;

检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志;

多个带标志的中断源,触发中断;

其他:校验控制,四个错误检测标志。

2.4、STM32串口异步通信需要定义的参数

STM32异步通信参数:

①起始位

②数据位(8位或者9位)

③奇偶校验位(第9位)

④停止位(1,15,2位)

⑤波特率设置

(奇偶校验位分为奇校验和偶校验两种,是一种简单的数据误码校验方法。奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数;偶校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为偶数。

校验方法除了奇校验(odd)、偶校验(even)之外,还可以有:0 校验(space)、1 校验(mark)以及无校验(noparity)。 0/1校验:不管有效数据中的内容是什么,校验位总为0或者1)

UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图所示


在这里插入图片描述

2.5、 UART(USART)框图

任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。

RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。

TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。

● 总线在发送或接收前应处于空闲状态

● 一个起始位

● 一个数据字(8或9位),最低有效位在前

● 0.5,1.5,2个的停止位,由此表明数据帧的结束

● 使用分数波特率发生器 —— 12位整数和4位小数的表示方法。

● 一个状态寄存器(USART_SR)

数据寄存器(USART_DR)

● 一个波特率寄存器(USART_BRR),12位的整数和4位小数

● 一个智能卡模式下的保护时间寄存器(USART_GTPR)


在这里插入图片描述

2.6、 串口通信过程

① 数据接收过程

外部设备将数据发送到 串行输入移位寄存器,串行输入移位寄存器在将数据传送到输入数据缓冲器,MCU在从输入数据缓冲器中读出数据

在这里插入图片描述

② 数据发送过程

MCU将要发送的数据写入输出数据缓冲器,输出数据缓冲器在将数据写入串行输出移位寄存器,串行移位寄存器在将数据输出到外部设备

在这里插入图片描述


3、 串行通信的编程

3.1、串口通信的相关寄存器

3.1.1、 USART_SR状态寄存器

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


在这里插入图片描述

3.1.2、 USART_DR数据寄存器

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


vaav

3.1.3、 USART_BRR波特率寄存器

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);


在这里插入图片描述

波特率计算方法:


波特率


3.2、 串口操作相关库函数(省略入口函数):

**void USART_Init();** //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能

**void USART_Cmd();**//使能串口

**void USART_ITConfig();**//使能相关中断


**void USART_SendData();**//发送数据到串口,DR

**uint16_t USART_ReceiveData();**//接受数据,从DR读取接受到的数据


**FlagStatus USART_GetFlagStatus();**//获取状态标志位

**void USART_ClearFlag();**//清除状态标志位

**ITStatus USART_GetITStatus();**//获取中断状态标志位

**void USART_ClearITPendingBit();**//清除中断状态标志位


3.3、 串口配置一般步骤:

串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();

串口复位:USART_DeInit(); 这一步不是必须的

GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP

串口参数初始化:USART_Init();

开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) NVIC_Init();

USART_ITConfig();

使能串口:USART_Cmd();

编写中断处理函数:USARTx_IRQHandler();

串口数据收发:

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

串口传输状态获取:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

4、 串口编程

(参照3.2、3.3的章节,其中有关于代码配置的步骤)

usart.c


//串口1中断服务程序

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

u16 USART_RX_STA=0;       //接收状态标记   

  

void uart_init(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

 

//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置


USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

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(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1 


}


void USART1_IRQHandler(void)                //串口1中断服务程序

{

u8 Res;

    #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();    

    #endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART1); //读取接收到的数据

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

else USART_RX_STA|=0x8000; //接收完成了 

}

else //还没收到0X0D

{

if(Res==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   

}  

}

}     

     } 


main.c


int main(void)

 {

  u16 t;  

u16 len;

u16 times=0;

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

  LED_Init();      //LED端口初始化

KEY_Init();          //初始化与按键连接的硬件接口

  while(1)

{

if(USART_RX_STA&0x8000)

{    

len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

printf("rn您发送的消息为:rnrn");

for(t=0;t {

USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

}

printf("rnrn");//插入换行

USART_RX_STA=0;

}else

{

times++;

if(times%5000==0)

{

printf("rn精英STM32开发板 串口实验rn");

printf("正点原子@ALIENTEKrnrn");

}

if(times%200==0)printf("请输入数据,以回车键结束n");  

if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.

delay_ms(10);   

}

}  

 }



关键字:STM32F103  串口通信 引用地址:STM32F103学习笔记三 串口通信

上一篇:STM32F103C8T6使用MDK 4.12中Custom_HID的修改方法
下一篇:STM32f103系列 USART2 串口2通信

推荐阅读最新更新时间:2024-11-24 23:33

51单片机串口通信--SCON方式1
计算机的通信分为:串行通信和并行通信 串行通信分为:异步通信和同步通信 异步通信:发送设备与接受设备有各自的时钟,通信时双方的时钟尽量保持一致, 以字符为单位进行传输, 字符与字符间的时间间隔是任意的, 每个字符中的各位是以固定时间传送的, 异步通信的数据格式:起始位,7位数据,校验位,停止位(这10位数据就是所说的字符,叫1帧数据) 同步通信: 建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。 传输数据的位之间的距离均为“位间隔的整数倍”, 传输的字符间不留间隙,保持位同步和字符同步, 两种方式实现同步:外同步,自同步 外同步:计算机甲控制计算机乙的时钟, 自同步:??? 串行通信的传输方向: 单工:仅
[单片机]
51单片机<font color='red'>串口</font><font color='red'>通信</font>--SCON方式1
16.串口通信
计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。 并行通信:将数据字节的各位用多条数据线同时进行传送。(采用了8根数据线) 控制简单,传输速度快,但由于传输线较长,长距离传送成本高且接收方的各位同时接受存在困难。 串行通信:将数据字节分成一位一位的形式在一条传输线上逐个的传送。(只需要一根线) 传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据传送控制较复杂(需要移位)。 串行通信: 异步通信: 通信的发送与接收设备使用各自的时钟控制,为使收发一致,
[单片机]
16.<font color='red'>串口</font><font color='red'>通信</font>
IAP在stm32f103c8t6上的实现
手上的单片机是STM32F103C8T6,ROM容量是64KB,起始地址为 0x0800 0000;RAM容量是16KB,起始地址为0x0200 0000。开发环境是Keil5,用到的工具还有串口助手。我将待下载的程序生成为bin文件,再通过串口助手发送给单片机接收。 在设计IAP程序时,要考虑ROM和RAM的大小。一方面,APP程序下载到单片机时是存放在ROM中的,如果你想下载多个APP程序,肯定需要ROM大些;另一方面,在串口接收数据时,APP代码首先存在一个数组变量中,这需要占用很大的RAM。我的APP程序是一个简单的灯闪烁程序,仅为验证IAP可行。 首先要完成bin文件的生成: 第一步:
[单片机]
延时函数delay_ms,delay_us会出现进入延时函数出不来的情况
首说明先原子哥的延时函数没有问题。原子哥的延时函数有的是用在STM32F103中的,要看自己的开发板是那个类型。这里给出STM32F103和STM32F030的延时函数。 (1)用在STM32F030中: #include stm32f0xx.h #include delay.h // //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //Mini STM32开发板 //使用SysTick的普通计数模式对延迟进行管理 //包括delay_us,delay_ms //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/5/27 //版本:V1.2 //版权所有
[单片机]
延时函数delay_ms,delay_us会出现进入延时函数出不来的情况
移植ucosII到STM32F103ZE(一)
一、开发环境: 1. 开发环境: keil uvision4 MDK4.12(windows XP) MDK即RealView MDK(Microcontroller Development kit),是 ARM 公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealView MDK 集成了业内最领先的技术,包括 uVision4 集成开发环境与 RealView 编译器。支持 ARM7、ARM9 和最新的 Cortex-M3/M1/M0 核处理器,自动配置启动代码,集成 Flash 烧写模块,强大的 Simulation 设备模拟,性能分析等功能,与 ARM 之前的工具包 ADS 等相比,RealV
[单片机]
AVR串口通信程序RS232头文件
下面是ATMEGA128的头文件 /************************这是串口0******************************/ /*串口0的初始化*/ void Uart0_init(void) { UCSR0B = 0x00; //禁止发送和接收 UCSR0A = 0x02; //倍速异步模式USX0=1 UBRR0L=(Crystal/8/Baud0-1)%256; //根据数据手册的计算法 UBRR0H=(Crystal/8/Baud0-1)/256; //如果不是倍速则(Crystal/16/Baud0-1) UCSR0B=(1 RXEN0)|(1 TXEN0)|(1 RX
[单片机]
μC/OS—II的嵌入式串口通信模块设计
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8"32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。 1 μC/OS-II的
[嵌入式]
rs232串口通信协议
RS232 串口通信协议 串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过改进而形成的。所以,以RS-232C为主来讨论。RS-323C 标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969 年公布的通信协议。它适合于数据传输速率在0~20000b/s 范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。 在讨论RS-232C 接口标准的内容之前,先说明两点: 首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Da
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved