第九章第九章 STM32 外设接口模块外设接口模块9.1 USART 模块模块USART是UniversalSynchronous/AsynchronousReceiver/Transmitter的简称,翻译成中文即为:通用同步/异步串行接收/发送器;它具有全双工通用同步/异步串行收发能力;该接口是一个高度灵活的串行通信设备;STM32的USART模块分USART、UART两种:大容量STM32F103,有多达5个串口,前三个为USART,后两个则为UART,即:USART1,USART2,USART3,以及UART4、UART52021/6/429.1 USART 模块模块USART 收发模块一般分为三大部分:收发模块一般分为三大部分:时钟发生器、数据发送器和接收器时钟发生器、数据发送器和接收器控制寄存器为所有的模块共享寄存器为所有的模块共享时钟发生器时钟发生器由同步逻辑电路和波特率发生器组成发送时钟引脚由同步逻辑电路和波特率发生器组成发送时钟引脚 XCK 仅用于同仅用于同步发送模式下步发送模式下发送器部分发送器部分由一个单独的写入缓冲器、一个串行移位寄存器、校验位发生器和用由一个单独的写入缓冲器、一个串行移位寄存器、校验位发生器和用于处理不同帧结构的控制逻辑电路构成。
于处理不同帧结构的控制逻辑电路构成接收器接收器是是 USART 模块最复杂的部分,最主要的是时钟和数据接收单元,此外还模块最复杂的部分,最主要的是时钟和数据接收单元,此外还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器接收器支持与发送器相同的帧结构,同时支持帧错误、数据溢出和校验错误的检接收器支持与发送器相同的帧结构,同时支持帧错误、数据溢出和校验错误的检测,并实现了连续发送多帧数据无延时的通信测,并实现了连续发送多帧数据无延时的通信数据接收单元用作异步数据的接收数据接收单元用作异步数据的接收2021/6/439.1.1 USART 功能概述功能概述通用同步异步收发器(通用同步异步收发器( USART)提供了一种灵活的方法来与使用工业标准)提供了一种灵活的方法来与使用工业标准NRZ异步串行数据格式的异步串行数据格式的外部设备之间进行全双工数据交换外部设备之间进行全双工数据交换它支持同步一路通信和半双工的单线通信,它支持同步一路通信和半双工的单线通信,LIN,智能卡协议,,智能卡协议,IrDA和调制解调和调制解调器操作(器操作( CTS/RTS);允许多处理器通信,可以进行高速的数据通信。
允许多处理器通信,可以进行高速的数据通信任何任何USART双向通信都至少需要两个引脚:接收数据输入(双向通信都至少需要两个引脚:接收数据输入( RX)和发送数据输)和发送数据输出(出( TX)RX:串行数据输入串行数据输入TX:发送数据输出当发送器使能的时候并且没有数据要发送,:发送数据输出当发送器使能的时候并且没有数据要发送,TX引脚是高电引脚是高电平2021/6/44STM32 外设接口模块外设接口模块在同步模式中需要下列引脚: SCLK: 发送器时钟输出在IrDA模式中需要下列引脚: IrDA_RDI:IrDA模式下的数据输入 IrDA_TDO: IrDA模式下的数据输出在调制解调器模式中需要下列引脚: nCTS: 清除发送 nRTS: 发送请求2021/6/45TX:发送数据输出引脚发送数据输出引脚RX:接收数据输入引脚接收数据输入引脚SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚引脚,没有具体外部引脚nRTS:请求以发送:请求以发送(Request To Send),,n 表示低电平有效。
表示低电平有效nCTS:清除以发送:清除以发送(Clear To Send),,n 表示低电平有效表示低电平有效SCLK:发送器时钟输出引脚这个引脚仅适用于同步模式发送器时钟输出引脚这个引脚仅适用于同步模式USART 数据寄存器数据寄存器(USART_DR)只有低只有低 9 位有效;位有效;USART_DR 包含了已发送的数据或者接收到的数据包含了已发送的数据或者接收到的数据USART_DR 实际是包含了两个寄存器,一个专门用于发送的可实际是包含了两个寄存器,一个专门用于发送的可写写 TDR,一个专门用于接收的可读,一个专门用于接收的可读 RDRUSART 有专门控制发送的发送器、控制接收的接收器,还有唤有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等醒单元、中断控制等等发送或接受遵循一定的格式和协议发送或接受遵循一定的格式和协议波特率指数据信号对载波的调制速率,它用单位时间内载波调波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特制状态改变次数来表示,单位为波特比特率指单位时间内传输的比特数,单位比特率指单位时间内传输的比特数,单位 bit/s(bps)。
对于对于 USART 波特率与比特率相等,以后不区分这两个概念波特率与比特率相等,以后不区分这两个概念波特率越大,传输速率越快波特率越大,传输速率越快USART 的发送器和接收器使用相同的波特率的发送器和接收器使用相同的波特率2021/6/469.1.1 USART 功能概述功能概述通过这些引脚,在正常通过这些引脚,在正常USART模式下,串行数据作为帧发送和接收包括:模式下,串行数据作为帧发送和接收包括: ● 总线在发送或接收前应处于空闲状态总线在发送或接收前应处于空闲状态 ● 一个起始位一个起始位 ● 一个数据字(一个数据字( 8位或者位或者9位),最低有效位在前位),最低有效位在前 ● 0.5、、1/1.5、、2个停止位,由此表明数据帧的结束个停止位,由此表明数据帧的结束● 使用分数波特率产生器使用分数波特率产生器–带带12位整数和位整数和4位小数位小数● 一个状态寄存器一个状态寄存器(USART_SR)● 数据寄存器数据寄存器(USART_DATA)● 波特率寄存器波特率寄存器(USART_BRR) 带带12位尾数和位尾数和4位小数位小数● 智能卡模式下的保护时间寄存器(智能卡模式下的保护时间寄存器( USART_GTPR))2021/6/479.1.2 USART寄存器简介寄存器简介串口最基本的设置,就是波特率的设置。
串口最基本的设置,就是波特率的设置STM32STM32的串口使用起来的串口使用起来非常简单的,只要开启了串口时钟,并设置相应非常简单的,只要开启了串口时钟,并设置相应IOIO口的模式,然口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了波特率计算:波特率计算:假设:假设:fCK=72MHzfCK=72MHz,欲设置,欲设置96009600的波特率,则有:的波特率,则有: USARTDIV=720000/(9600*16)=468.75 USARTDIV=720000/(9600*16)=468.75 则:整数部分则:整数部分DIV_Mantissa=468=0x1D4; (12DIV_Mantissa=468=0x1D4; (12位二进制数位二进制数) ) 小数部分小数部分DIV_Fraction=16DIV_Fraction=16* *0.75=12=0xC; (40.75=12=0xC; (4位二进制数位二进制数) ) DIV=0x1D4CDIV=0x1D4C;;2021/6/48STM32 外设接口模块外设接口模块串口设置一般可以总结为如下几个步骤:串口设置一般可以总结为如下几个步骤:1、串口时钟使能(、串口时钟使能(USART 1用用APB2时钟),时钟), GPIO 时钟使能时钟使能((APB2))2、串口复位、串口复位 USART_DeInit(USART1) 3 3、、GPIOGPIO端口模式设置端口模式设置 ((PA9、、PA10))4 4、串口参数初始化、串口参数初始化 ((波特率、数据位、停止位、校验位等波特率、数据位、停止位、校验位等))5 5、开启中断并且初始化、开启中断并且初始化 NVICNVIC(如果需要开启中断才需要这个步(如果需要开启中断才需要这个步骤)骤) 6 6、使能串口、使能串口 USRRT_Cmd(USART1, ENABLE)7 7、编写中断处理函数、编写中断处理函数2021/6/492021/6/4102021/6/4112021/6/4122021/6/4132021/6/4142021/6/4152021/6/4162021/6/4172021/6/418STM32 外设接口模块外设接口模块实验用电路板串口电路原理图1.硬件连接 电路硬件连接如下图 所示。
2021/6/419STM32 外设接口模块外设接口模块2.软件编程步骤(查询法)步骤一:添加库函数,编写用户函数步骤二:系统时钟配置 main.c文件中SystemInit()函数配置系统时钟为72M步骤三:串口初始化步骤四:串口数据输出步骤五:打开串口调试助手2021/6/420void USART1_Init(void){ GPIO_InitTypeDef GPIO_Initstructure; USART_InitTypeDef USART_Initstructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE); GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9; GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstructure);// PA9复用推挽输出复用推挽输出 TXD引脚引脚 GPIO_Initstructure.GPIO_Pin = GPIO_Pin_10; GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_Initstructure); // PA10复用浮空输入复用浮空输入 RXD引脚引脚 USART_Initstructure.USART_BaudRate = 115200;// 波特率设置波特率设置 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(USART1,&USART_Initstructure); //初始化初始化USART1 USART_Cmd(USART1,ENABLE);//打开串口打开串口}2021/6/421#include "stm32f10x.h“#include "usart.h“u8 ch;int i=0;int main(void){ SystemInit(); USART1_Init(); while(1) { while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET); ch = USART_ReceiveData(USART1); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); USART_SendData(USART1,ch); }}2021/6/422中断配置(采用中断方式是时需设置)中断配置(采用中断方式是时需设置)void Usart1_ITConfig(void){ NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//第二功第二功能时钟开启能时钟开启 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}2021/6/423中断方式下的串口中断方式下的串口1中断程序中断程序void USART1_IRQHandler(void){ static u8 ch; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { ch = USART_ReceiveData(USART1); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); USART_SendData(USART1,ch); USART_ClearITPendingBit(USART1,USART_IT_RXNE); }}2021/6/424小结小结通过本章的学习初步掌握了通过本章的学习初步掌握了STM32单片机的串口结构及单片机的串口结构及使用方法。
使用方法1.能掌握实例程序编制的原则和基本步骤;能掌握实例程序编制的原则和基本步骤;2.实例基础上能够进行基本功能的修改及完善实例基础上能够进行基本功能的修改及完善2021/6/425Thanks!!2021/6/426部分资料从网络收集整理而来,供大家参考,感谢您的关注!。