STM32 --UART串口通信

发布者:太白山人最新更新时间:2018-12-28 来源: eefocus关键字:STM32  UART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

UART串口时序

这里写图片描述


UART串口协议参考下面文章: 
http://blog.csdn.net/gogomusic/article/details/54767502


UART串口配置


1)串口时钟使能。串口作为 STM32 的一个外设,其时钟由外设时钟使能寄存器控制,这里我们使用的串口1是APB2ENR寄存器的第14位。(除了串口 1 的时钟使能在 APB2ENR 寄存器,其他串口的时钟使能位都在 APB1ENR 寄存器,而 APB2(72M)的频率一般是 APB1(36M)的一倍。)


2)串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。 

串口 1 的复位是通过配置 APB2RSTR 寄存器的第 14 位来实现的。串口1的复位设置位在APB2RSTR的第14位。通过向该位写1复位串口1,写 0 结束复位。 

APB2RSTR 寄存器的各位描述如图 8.1.1 所示


这里写图片描述


3)串口波特率设置。每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。 

这里写图片描述


串口波特率计算公式:见《STM32中文数据参考手册》。 

4)STM32 的每个串口都有 3 个控制寄存USART_CR1~3,串口的很多配置都是通过这 3 个寄存器来设置的。这里我们只要用到 USART_CR1 就可以实现我们的功能了。 

这里写图片描述

关于寄存器的具体描述请看《STM32中文数据参考手册》。 

该寄存器的高 18 位没有用到,低 14 位用于串口的功能设置。 

UE 为串口使能位,通过该位置 1,以使能串口。 

M 为字长选择位,当该位为 0 的时候设置串口为 8 个字长外加 n 个停止位,停止位的个数(n)是根据USART_CR2 的[13:12]位设置来决定的,默认为 0。 

PCE 为校验使能位,设置为 0,则禁止校验,否则使能校验。 

PS 为校验位选择,设置为 0 则为偶校验,否则为奇校验。 

TXIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_SR 中的 TXE 位为1 时,将产生串口中断。 

TCIE 为发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC位为 1 时,将产生串口中断。RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_SR中的 ORE 或者 RXNE 位为 1 时,将产生串口中断。 

TE 为发送使能位,设置为 1,将开启串口的发送功能。 

RE 为接收使能位,用法同 TE。


5)数据发送与接收。STM32 的发送与接收是通过数据寄存器USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。


这里写图片描述


DR[8:0]为串口数据,包含了发送或接收的数据。 

当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。当使能校验位进行接收时,读到的 MSB 位是接收到的校验位


6)串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。USART_SR 的各位描述: 

这里写图片描述

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 

TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写USART_DR。2)直接向该位写 0。


关键字:STM32  UART  串口通信 引用地址:STM32 --UART串口通信

上一篇:STM32双机SPI中断通信机制
下一篇:stm32中一些常用基本库函数以及串口配置步骤

推荐阅读最新更新时间:2024-03-16 16:21

STM32利用SPI读写SD卡的程序详解
关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明。 SD卡的读写驱动程序是运用FATFS的基础,学了FATFS就可以在SD卡上创建文件夹及文件了。 我们先从main文件了解一下程序的执行流程 int main(void) { u16 i; USART1_Config(); for(i=0;i 1536;i++) send_data ='D'; switch(SD_Init()) { case 0: USART1_Puts( \r\nSD Card Init
[单片机]
对于stm32中dma的理解
一.dma常识. 1.作用:实现片内数据之间的高速传输。即是能够不占用cpu实现数据传输。 2.模式:外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。 3.stm32中的dma支持外设通道选择,并且可以用仲裁器配置adc对数据流的处理顺序。 4.dma带有一个被称为fifo的东西,主要配置fifo来实现对传输双方要求字长不匹配的调整。即所谓 FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来 4 个 8 位字节的数据拼凑成一个 32 位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需要输出数据 5
[单片机]
基于STM32的MIT-BIH心电数据的D/A回放
0 引言 心电信号是人类最早开展研究并应用于临床医学的生物电信号之一,通过对心电信号的分析处理能有效地预测心脏疾病。如何利用心电数据开发研究相关的医疗设备是对科研人员至关重要。心电数据的回放就是将原有的存储的MIT-BIH心电数据,根据其存储的格式,利用设计的系统通过D/A转换最终从终端回放出模拟信号。本文介绍基于ARM Cortex-M3内核的STM32微控制器作为主控嵌入式芯片的心电信号数据回放的设计方法。 1 工作原理和硬件设计 上位机应用程序读取心电数据库中一文件,利用设备驱动程序与D/A回放模块设备进行通信。通过USB总线不断向硬件设备发送数据,设备接收到的原始数据,利用DMA传输方式,连续、不丢失地传送到DAC模
[单片机]
基于<font color='red'>STM32</font>的MIT-BIH心电数据的D/A回放
STM32的ADC输入通道配置
STM32中最多有3个ADC模块,每个模块对应的通道不完全重叠。 下图是STM32F103CDE数据手册中的总框图的左下角,图中可以看出有8个外部ADC管脚分别接到了3个ADC模块,有8个外部ADC管脚只分别接到了2个ADC模块,还有5个外部ADC管脚只接到了ADC3模块,这样总共是21个通道。 下表是这些ADC管脚与每个ADC模块的对应关系,表中可以看出ADC1还有2个内部通道,分别接到内部的温度传感器和内部的参照电压:
[单片机]
<font color='red'>STM32</font>的ADC输入通道配置
mac下搭建stm32开发环境
一、STM32CubeMX 1. java环境 直接使用brew安装openjdk 8: brew install openjdk@8 配置jdk环境: sudo ln -sfn /usr/local/opt/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk /usr/libexec/java_home 配置完成后检查java环境: java -version 2. 安装stm32cubemx 官方下载:https://www.st.com/en/development-tools/stm32cubemx.html
[单片机]
mac下搭建<font color='red'>stm32</font>开发环境
STM32-(19):I2C通信(理论基础)
I2C BUS是Philips公司推出的一种基于两线的芯片间串行传输总线。I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展方法。 I2C总线在标准模式下,数据传输率可达100kbps,高速模式下可达400kbps。目前 I2C 总线被广泛应用于消费了电子产品、通信产品、仪器仪表及工业测控系统中。 在I2C总线上只需要串行数据SDA线和串行时钟线SCL线两条线。 每个器件都有一个唯一的地址以供识别,并工作在主模式或者从模式下,而且各器件都可以作为一个发送器或接收器。 微控制器包含的I2C 发送/接收器都可以选择作为主模式( Master )或从模式( Slave
[单片机]
STM32-(19):I2C通信(理论基础)
STM32开发笔记70: 传递参数对套接字地址进行强制类型转换
单片机型号:STM32F407VGT6 在进行IPV6的UDP设计时,偶然发现一个问题,就是大部分套接字函数都需对地址进行强制转换,先看一下程序: 这是bind函数: bind(sockIPV6, (struct sockaddr*)&sockAddr, sizeof(sockAddr)) 这是recvfrom函数: recvfrom(sockIPV6, UdpBuffer, 100, 0, (struct sockaddr*)&sockAddr, &slen) 这是sendto函数: sendto(sockIPV6, UdpBuffer, len, 0, (const struct sockaddr*)&so
[单片机]
RC522读写程序代码分享
#include stm32f10x.h #include stm32f10x_spi.h #include stm32f10x_gpio.h #include stm32f10x_rcc.h #include delay.h #include mfrc522.h #include stdio.h #define SPI_CE_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4) #define SPI_CE_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4) void SPI1_Init(void) { RCC_AP
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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