STM32 您所在的位置:网站首页 pp拉片机 STM32

STM32

2023-09-14 16:53| 来源: 网络整理| 查看: 265

文章目录 一、USART简介二:组成1、功能引脚2、数据寄存器3、控制器4、波特率生成 三、USART的配置步骤1、使能串口时钟及 GPIO 端口时钟2、GPIO 端口模式设置,设置串口对应的引脚为复用功能3、初始化串口参数,包含波特率、字长、奇偶校验等参数4、使能串口5、设置串口中断类型并使能6、设置串口中断优先级,使能串口中断通道7、编写串口中断服务函数 五、printf重定向

一、USART简介

1、USART:通用同步异步收发器 2、功能: (1)与外部设备进行全双工数据交换 (2)支持同步单向通信和半双工单线通信 (3)还支持 LIN(域互连网络)、 智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作(CTS/RTS) (4)支持多处理器通信和 DMA 功能(实现高速数据通信) (5)通过小数波特率发生器提供了多种波特率 (6)应用最多的是 printf 输出调试信息

二:组成

在这里插入图片描述

1、功能引脚

在这里插入图片描述

(1)TX/RX:发送/接收数据输出引脚。 (2)SW_RX:数据接收引脚属于内部引脚(没有具体外部引脚,只用于单线和智能卡模式) (3)nRTS/nCTS:请求以发送(Request To Send)/清除以发送(Clear To Send),n 表示低电平有效。只适用于硬件流控制,一般不适用 (4)SCLK:发送器时钟输出引脚。仅适用于同步模式。

Tip:SCLK、nCTS 和 nRTS 引脚不存在于只具有异步传输功能的USART引脚上

2、数据寄存器

USART 数据寄存器(USART_DR):只有低 9 位有效 在这里插入图片描述在这里插入图片描述

图:USART_DR寄存器

补充:DR包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。

TDR寄存器提供了内部总线和发送(输出)移位寄存器之间的并行接口。RDR寄存器提供了接收(输入)移位寄存器和内部总线之间的并行接口。

并且第 9 位数据是否有效要取决于 USART 控制寄存器 1(USART_CR1)的 M位(12位)设置 (第九位:校验选择,当校验控制使能后,该位用来选择是采用偶校验还是奇校验。软件对它置’1’或清’0’。当前字节传输完成后,该选择生效。)

在这里插入图片描述

图:USART_CR1寄存器

M:字长 (Word length) 该位定义了数据字的长度,由软件对其设置和清零 0:一个起始位,8个数据位,n个停止位; 1:一个起始位,9个数据位,n个停止位。 注意:在数据传输过程中(发送或者接收时),不能修改这个位。

3、控制器

在这里插入图片描述 USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。 使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能USART。

UE:USART使能 (USART enable) 位13当该位被清零,在当前字节传输完成后USART的分频器和输出停止工作,以减少功耗。该位由 软件设置和清零。 0:USART分频器和输出被禁止; 1:USART模块使能。

发送或者接收数据字长可选 8 位或 9 位(由M控制) ①发送器 发送器可发送 8 位或 9 位的数据(由M控制)。TE置 1 时,发送移位寄存器中的数据在 TX 引脚输出,如果是同步通信模式,相应的时钟脉冲在SCLK引脚输出。

TE:发送使能 (Transmitter enable) 位3 该位使能发送器。该位由软件设置或清除。 0:禁止发送; 1:使能发送。 注意: 1.在数据传输过程中,除了在智能卡模式下,如果TE位上有个0脉冲(即设置为’0’之后再设置为’1’),会在当前数据字传输完成后,发送一个“前导符”(空闲总线)。 2.当TE被设置后,在真正发送开始之前,有一个比特时间的延迟。

②接收器 如果将 USART_CR1 寄存器的 RE 位(接收使能 (Receiver enable) 位2 该位由软件设置或清除)置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR 内,并把USART_SR 寄存器的 RXNE 位置 1,同时如果 USART_CR1 寄存器的 RXNEIE 置 1的话可以产生中断。

(官方手册写USART_CR2,但是RXNEIE在CR2在官方文档中找不到)

RXNE:读数据寄存器非空 (Read data register not empty) 位5 当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。 如果USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清零。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 0:数据没有收到; 1:收到数据,可以读出

RXNEIE:接收缓冲区非空中断使能 (RXNE interrupt enable) 位5 该位由软件设置或清除。 0:禁止产生中断; 1:当USART_SR中的ORE或者RXNE为’1’时,产生USART中断

③中断控制 USART 有多个中断请求事件,如下: 在这里插入图片描述

仅当使用DMA接收数据时,才使用这个标志位。

USART的各种中断事件被连接到同一个中断向量(见下图),有以下各种中断事件: ● 发送期间:发送完成、清除发送、发送数据寄存器空。 ● 接收期间:空闲总线检测、溢出错误、接收数据寄存器非空、校验错误、LIN断开符号检测、噪音标志(仅在多缓冲器通信)和帧错误(仅在多缓冲器通信)。 如果设置了对应的使能控制位,这些事件就可以产生各自的中断。 在这里插入图片描述

4、波特率生成

串口通信中都把波特率当作比特率。波特率越大,传输速度就越快。

码元:在数字通信中常常用时间间隔相同的符号来表示数字。这样的时间间隔内的信号称为码元,这个间隔称为码元长度波特率:是码元传输速率单位,他说明单位时间传输了多少个码元。比特率:是信息量传送速率单位,即每秒传输二进制代码位数。bit/s

接收器Rx和发送器Tx的波特率设置相同。波特率计算公式 为:在这里插入图片描述

其中,fCK 为 USART 时钟频率,USARTDIV 是一个存放在波特率寄存器 (USART_BRR)的一个无符号定点数。 其中 DIV_Mantissa[11:0]位定义 USARTDIV的整数部分,DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。 串口通信中常用的波特率为 4800、9600、115200 等。

三、USART的配置步骤 1、使能串口时钟及 GPIO 端口时钟

在这里插入图片描述 在这里插入图片描述 USART对应本芯片的PA9和PA10引脚,在USART1挂接在APB2上

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能 USART1 时钟 2、GPIO 端口模式设置,设置串口对应的引脚为复用功能 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX 串口输出 PA9 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); // 初始化串口输入 IO GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX 串口输入 PA10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 GPIO

因为使用引脚的串口功能,所以在配置 GPIO 时要将设置为复用功能, 串口的 Tx 引脚配置为复用推挽输出, Rx 引脚为浮空输入,数据完全由外部输入决定。

3、初始化串口参数,包含波特率、字长、奇偶校验等参数 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate =115200;//波特率设置 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

结构体成员与组成部分知识重合,不做解释

4、使能串口 USART_Cmd(USART1, ENABLE); //使能串口 1 5、设置串口中断类型并使能

在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断

发送完数据时,要产生中断,可以配置如下:

USART_ITConfig(USART1,USART_IT_TC, ENABLE); 6、设置串口中断优先级,使能串口中断通道 7、编写串口中断服务函数 void USART1_IRQHandler(void) //串口 1 中断服务程序 { u8 r; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断 USARTx 的中断类型 USART_IT 是否产生中 { r =USART_ReceiveData(USART1);//串口接收读取到的数据//(USART1->DR); USART_SendData(USART1,r); //串口发送函数 while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET); } USART_ClearFlag(USART1,USART_FLAG_TC); //最后通常会调用一个清除中断标志位的函数, }

设置完了就可以正常使用串口了

五、printf重定向

串口正常使用后,就可以对printf进行重定向了,何谓重定向呢? 在 C 语言中 printf 函数默认输出设备是显示器,但是我们要实现在串口上显示,就需要重定义标准库函数里调用的与输出设备相关的函数。使用 printf 输出到串口,需要将 fputc 里面的输出指向串口,这一过程就叫重定向。 进行重定向,只需要将 fputc 里面的输 出指向 STM32 串口即可,fputc 函数有固定的格式,我们只需要在函数内操作 STM32 串口即可,代码如下:

int fputc(int ch,FILE *p) //函数默认的,在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; }

如果要让其他的串口也使用 printf 函数,只需要修改下串口号即可

引用资料:《STM32F1xx中文参考手册》 《普中STM32F1xx开发攻略_V3.0--标准库版》


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有