STM32F103标准库开发---Uart串口通信实验---初始化配置

发布者:pengbinyyy最新更新时间:2022-09-21 来源: csdn关键字:STM32F103  Uart串口通信  初始化配置 手机看文章 扫描二维码
随时随地手机看文章

一、Uart 串口通信

1. Uart 简介

UART 全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器 ,是一种通用串行数据总线,用于异步通信

该总线双向通信,可以实现全双工数据发送和接收。

常用于单片机和电脑之间以及单片机和单片机之间的板级通信。


2. 接口连接方式

Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口,硬件连接比较简单,仅需要3条线。

image.png

具体连接图如下:

在这里插入图片描述

3. 传输方式

Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口, 一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。

实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。


波特率

波特率:每秒钟传输的数据位数(bit)。

波特率的单位是每秒比特数(bps),串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,57600bps,115200bps等。

以波特率9600bps为例:1秒钟传输9600位(bit)数据,所以传输1位(bit)数据需要1000000us/9600=104us。


字符帧格式

每个字符帧,包含起始位、数据位,校验位和停止位。

字符帧格式如下表:

image.png

具体如下图所示:

在这里插入图片描述

空闲位: 处于逻辑“1”状态,即高电平,每个字符之间都会有一段空闲位,表示当前线路上没有数据传输。

起始位: 处于逻辑”0”状态,即低电平,表示数据传输的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号,即低电平。

数据位: 起始位之后就是要传输需要传输的数据,数据可以是5,6,7,8,9位构成一个字符,一般都是8位。先发送最低位最后发送最高位,使用低电平表示0,高电平表示1,完成数据位的传输。

校验位: 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验方法:奇校验(odd)、偶校验(even)以及无(noparity)。

停止位: 一个字符帧数据的结束标志,可以是1位、1.5位、2位的高电平,表示数据传输的结束。


二、Uart 初始化配置

1. 初始化配置具体步骤

使能USART时钟和GPIO时钟

TX 和 RX 引脚GPIO初始化配置

设置 RX 接收中断为中断源

配置中断优先级NVIC

USART 初始化设置

2. 初始化配置库函数

(1)使能USART时钟和GPIO时钟

APB2 外设时钟启用和禁用函数:


/**

  *@功能:启用和禁用APB2外设时钟

  *@参数1:指定外围设备

  *@参数2:指定外围设备状态

  *@返回值:无

  */

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);


APB2外设如下:


#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)

#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)

#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)

#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)

#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)

#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)

#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)

#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)

#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)

#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)

#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)

#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)

#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)

#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)

#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)

#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)

#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)

#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)

#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)

#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)

#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)


本次配置如下:


//使能USART1,GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);


(2)TX 和 RX 引脚 GPIO 初始化配置

GPIO初始化函数如下:


/**

  *@功能:初始化GPIO外设

  *@参数1:指定GPIO外设(GPIOA~GPIOG)

  *@参数2:指定GPIO外设的配置信息

  *@返回值:无

  */

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);


GPIO初始化配置信息如下:


GPIO_InitTypeDef----GPIO初始化配置信息:


typedef struct

{

  uint16_t GPIO_Pin;             //指定要配置的GPIO引脚

  GPIOSpeed_TypeDef GPIO_Speed;  //指定所选引脚的速度

  GPIOMode_TypeDef GPIO_Mode;    //指定所选引脚的工作模式


}GPIO_InitTypeDef;


GPIO_Pin----指定要配置的GPIO引脚:


#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */

#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */

#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */

#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */

#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */

#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */

#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */

#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */

#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */

#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */

#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */

#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */

#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */

#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */

#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */

#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */

#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */


GPIO_Speed----指定所选引脚的速度:


typedef enum

  GPIO_Speed_10MHz = 1,

  GPIO_Speed_2MHz, 

  GPIO_Speed_50MHz

  

}GPIOSpeed_TypeDef;


GPIO_Mode----指定所选引脚的工作模式:


typedef enum

GPIO_Mode_AIN = 0x0, //模拟输入模式

  GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式

  GPIO_Mode_IPD = 0x28, //下拉输入模式

  GPIO_Mode_IPU = 0x48, //上拉输入模式

  GPIO_Mode_Out_OD = 0x14, //开漏输出模式

  GPIO_Mode_Out_PP = 0x10, //推挽输出模式

  GPIO_Mode_AF_OD = 0x1C, //复用开漏输出模式

  GPIO_Mode_AF_PP = 0x18 //复用推挽输出模式

 

}GPIOMode_TypeDef;


STM32F103系列参考手册可知以下USART引脚GPIO配置信息:

在这里插入图片描述
在这里插入图片描述

本次配置如下:


//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

//USART1_TX   PA9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

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

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

   

//USART1_RX   PA10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

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


(3)设置 RX 接收中断为中断源

USART 中断启用函数如下:


/**

  *@功能:启用或禁用指定的USART中断

  *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)

  *@参数2:指定USART中断源

  *@参数3:指定USART中断源状态(ENABLE 或 DISABLE)

  *@返回值:无

  */

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);


USART中断源定义:

#define USART_IT_PE                          ((uint16_t)0x0028)

#define USART_IT_TXE                         ((uint16_t)0x0727)

#define USART_IT_TC                          ((uint16_t)0x0626)

#define USART_IT_RXNE                        ((uint16_t)0x0525)

#define USART_IT_ORE_RX                      ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */

#define USART_IT_IDLE                        ((uint16_t)0x0424)

#define USART_IT_LBD                         ((uint16_t)0x0846)

#define USART_IT_CTS                         ((uint16_t)0x096A)

#define USART_IT_ERR                         ((uint16_t)0x0060)

#define USART_IT_ORE_ER                      ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */

#define USART_IT_NE                          ((uint16_t)0x0260)

#define USART_IT_FE                          ((uint16_t)0x0160)


本次配置如下:


//USART1 中断配置

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


(4)串口接收 RX 中断优先级配置 NVIC

中断优先级NVIC初始化配置函数:


/**

  *@功能:初始化NVIC外设

  *@参数:指定NVIC外设的配置信息

  *@返回值:无

  */

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);


中断优先级NVIC初始化配置信息如下:


typedef struct

{

  uint8_t NVIC_IRQChannel;                //指定中断IRQ通道

  uint8_t NVIC_IRQChannelPreemptionPriority;  //指定优先级:0~15

  uint8_t NVIC_IRQChannelSubPriority;          //指定子优先级:0~15

  FunctionalState NVIC_IRQChannelCmd;        //指定IRQ通道使能和禁用

  

} NVIC_InitTypeDef;


本次配置如下:


//Usart1 NVIC 配置

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //指定USART1中断通道

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

[1] [2]
关键字:STM32F103  Uart串口通信  初始化配置 引用地址:STM32F103标准库开发---Uart串口通信实验---初始化配置

上一篇:STM32F103标准库开发---Uart串口通信实验---安装串口驱动和串口调试
下一篇:STM32F103标准库开发:LED跑马灯实验

推荐阅读最新更新时间:2024-11-13 18:09

stm32f103串口实现重映射功能
在实际开发中,经常遇到串口的默认输出IO口被其他模块占用了,所以我们要用到串口IO口映射功能,是指将原来实现功能的IO口映射到其他指定IO口,其他不变。具体操作如下: 先贴出默认下的串口初始化设置: void USART1Conf(u32 baudRate) { USART_InitTypeDef USART_InitSturct;//定义串口1的初始化结构体 GPIO_InitTypeDef GPIO_InitStruct;//定义串口对应管脚的结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);
[单片机]
STM32F103x 485通信
一、485通信模块选型 1.1 模块型号 单片机TTL转RS485模块 485转串口UART电平互转 硬件自动控制流向 购买网址: https://item.taobao.com/item.htm?spm=a230r.1.14.95.462418200wPGRW&id=558153026325&ns=1&abbucket=11#detail 1.2 模块简介 1) 美信公司产品,一颗芯片485和自动流向控制,芯片内部集成自动流向控制,非外接流向控制芯片,使用的绝.非相对低廉的MAX485芯片加外置流向控制方案。 2) 具有1/4单位负载的接收器输入阻抗,支持多机通讯,允许接在最多128个设备的总线上。 3) 每个模
[单片机]
<font color='red'>STM32F103</font>x 485通信
基于STM32F103ZET6的UART通讯实现
一、什么是IAP,为什么要IAP IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给用户一个代码文件即可。 而IAP却能很好的解决掉这个难题,一片STM32芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区
[单片机]
基于<font color='red'>STM32F103</font>ZET6的<font color='red'>UART</font>通讯实现
STM32F103学习笔记 (十) TFTLCD 显示
看了TFTLCD和FSMC(灵活的静态存储控制器)的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D : 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: int main(void) { u8 x=0; u8 lcd_id ; //存放
[单片机]
STM32F030和STM32F103的IO结构上的区别
STM32F103GPIO 功能描述 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器
[单片机]
STM32F030和<font color='red'>STM32F103</font>的IO结构上的区别
单片机最小系统介绍及电路设计
一.什么是单片机最小系统 常见的单片机最小系统为单片机能独立运行程序及控制外围电路的最简单电路,主要由单片机、晶振电路、复位电路三部分构成。Stm32f103c8t6也不例外,构成最小的运行电路也需要以上三部分。 Stm32f103最小系统板原理图如下: 二.最小系统电路 Stm32单片机最小系统电路有单片机、晶振电路、复位电路。 1. 单片机 Stm32f103系列单片机主要资源如图: Stm32f103c8t6工作电压为2-3.6V(一般采用3.3V),内置64-128KBytes Flash,20KBytesSRAM,带有37个通用GPIO口(含特殊功能IO)。在最小系统板上主要连接晶振电路、复位电路、工作电源、
[单片机]
单片机最小系统介绍及电路设计
stm8s串口通信uart
最近开始使用stm8s103k3单片机了。据说很好,确实不错。前几天已经试过了GPIO,Timer2,ADC的功能,都比较容易,唯独串口UART使用,破费周折,写出来,供大家借鉴。 我使用的是stm8s103k3,32脚单片机,这个使用手册上说了UART1,UART2,UART3。但是引脚的功能图上只有UART1,并且你打开stm8s103k.h的头文件,里面也只有UART1寄存器的定义说明。所以我认为只有UART1。既然有这个功能,那就用吧,我以为直接可以连接到电脑的串口(COM1),就可以使用了,其实不可以。单片机即使写着提供UART通讯功能,也要连接MAX232转接芯片,我就在这里耽误了许多时间。 1、使用st
[单片机]
stm8s<font color='red'>串口通信</font>(<font color='red'>uart</font>)
基于STM32的智能循迹往返小车设计
智能车辆作为智能交通系统的关键技术之一,是许多高新技术综合集成的载体。它体现了车辆工程、人工智能、自动控制及计算机技术于一体的综合技术,是未来汽车发展的趋势。本文提出了一个基于STM32F103芯片为控制核心,附以红外传感器采集外界信息和检测障碍物的智能小车系统设计方案。充分利用该芯片高速运算、处理能力,来实现小车自动识别路线按迹行走、躲避障碍物,并且通过LCD显示器实时显示小车运动参数,使用芯片自带的PWM输出功能,步进调节占空比来调节电机的转速。通过模糊控制和PWM脉宽调制技术的结合,提高了对车位置控制精度。 1 系统硬件电路设计 根据题目中的设计要求,本系统主要由主控单片机模块、电源模块、电机驱动模块、黑线检测模块、
[单片机]
基于STM32的智能循迹往返小车设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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