字符发送的过程描述:在UART的发送过程中先将数据输入到发送数据寄存器中(TDR)此时(TXE)被硬件置1,之后TDR寄存器将数据串行移入到发送移位寄存器中,将数据在TX端口发送,此时(TC)被硬件置1。 发送与接收是逆过程。
UART发送配置步骤:
1.通过USART_CR1寄存器上置位UE来激活USART。
2.编程USART_CR1的M位来定义字长。
3.在USART_CR2中编程停止位的位数。
4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。
5.利用USART_BRR寄存器选择要求的波特率。
6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。
在配置USART的接收时,除上面的步骤外,还要使能接收中断并且配置中断向量控制器NVIC。
波特率的计算方法:
STM32--UART异步通信学习
USART的编程:
1.定义USART_InitTypeDef类型的结构体 UART_init
2.使能GPIO的时钟和USART的时钟。(UART1 PA9为TX,PA9为RX)
3.配置UART_init结构体的各参数。 配置波特率、数据位、停止位、奇偶效验位、硬件流、收发模式
4.初始化UART_init结构体的各参数使用函数。
5.使能USART
6.定义GPIO_InitTypeDef类型的结构体 GPIO_UART
7.讲相应GPIO引脚(PA10 RX PA9 TX)。
8.初始化GPIO引脚。
在配置接收模式时,还要使能接收中断,并且配置中断向量控制器NVIC。
在发送完数据时,要判断标志TC是否置位,在接收数据时,要判断是否有接收中断请求。
关键字:STM32 UART 异步通信
引用地址:
STM32--UART异步通信学习
推荐阅读最新更新时间:2024-11-04 21:01
STM32 ADC 规则多通道转换
看了这个代码之后终于明白了规则多通道转是怎么回事,以及整体如何实现了。附代码: /******************************************************************************* * Function Name : main * Description : Main program * Input : None * Output : None * Return : None *******************************************************************************/ in
[单片机]
STM32 实战 按键点亮LED(中断)
来看看最简单的点亮一个灯的实验你把,实验要求使用KEY4*4按键,按键按下灯亮,按键拿起灯灭,如此一直循环: 程序的思路如下: 1、首先需要设置的是时钟:你将灯的管脚连在哪个端口的某个引脚上面,你就开启哪个端口的时钟,比如灯连在A端口的某个引脚,就要开启A端口的时钟。 2、其次,设置管脚(我们要设置LED和矩阵键盘中的一个键的管脚): 我们需要对GPIO进行初始化设置,我们只需调用 GPIO_InitTypeDef的结构体,对每个成员进行设置,要设置的有PIN管脚的位置GPIO_Pin,还有管脚的速率GPIO_Speed,还有管脚的工作状态GPIO_Mode,最后在调用一下初始化的函数GPIO_Init, 3、然后就开始写我们的
[单片机]
STM32学习之串口
第一步:把串口用的引脚设置。接收的为 GPIO_Mode_IN_FLOATING; //浮空输入 发送的为GPIO_Mode_AF_PP; // 复用推挽输出 第二部设置 void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel ; // 全局中断、、 NVIC_InitStructure.NVIC_IRQChannelPreemptio
[单片机]
stm32专题三十二:stm32功耗模式
stm32功耗模式 按功耗由高到低排列,STM32 具有运行、睡眠、停止和待机四种工作模式。上电复位后 STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。三种低功耗的模式说明见下表。 睡眠模式下,任何中断都可以唤醒内核,外部 / 内部高速时钟保持打开,调压器保持打开,因此,内核只要被唤醒,就能马上正常的执行程序(优点:响应速度快;缺点:功耗比较大); 停止模式下,HSE和HSI被关闭,调压器可选开启或低功耗模式(若选为低功耗模式,则还需要加上调压器从低功耗切换至正常模
[单片机]
STM32入门学习笔记之EEPROM存储实验1
16.1 EEPROM概述 EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEPROM可以在电脑上或专用设备上擦除已有信息,重新编程,一般用在即插即用设备中。 这种存储芯片可以通过高于普通电压的作用来擦除或重写,EEPROM芯片一般用在需要频繁存储数据,但是数据量不大的场合,本实验以Atmel公司设计的AT24C02为例,来详细描述EEPROM的基本操作。 AT24C02是一片存储容量在2Kbit的的存储芯片,即存储容量512Byte,通过IIC总线协议进行数据通信,STM32F1内置的I
[单片机]
STM32之SPI通信
之前一直对SPI通信一知半解,所以想抽空把它搞得明白一些。考虑到之前是结合Flash芯片来学的,十分不直观,而且主要把时间和精力都花在Flash芯片的datasheet和驱动上了,SPI通信也没学好。所以这次就考虑用4位数码管显示模块,模块是直接买的现成的,如下图所示,这样可以简化操作,把精力聚焦到学习的核心–SPI通信本身上来。 该模块是用2片74HC595串联驱动的,一片用来控制数码管的位选(U1),一片用来控制数码管的段选(U2)。接口比较简单,总共5个引脚,2个引脚分别接VCC和GND,DIO用来接收串行数据的输入,SCLK用来接收同步时钟,每个SCLK上升沿74HC595内部的移位寄存器会移一位,RCLK用
[单片机]
STM32_USB之完全双缓存(包括发送和接收) -- 更新中断处理
STM32的USB双缓存接收代码其实已经可以在ST提供的USB示例代码中找到,只要稍加修改,就可以得到将近1MB的数据接收性能。虽然Datasheet中说明USB发送也同样可以使用双缓存,但并没有示例代码,由于为了测试性能,自己做了一个,测试中没有发现问题,虽然对性能的提升不如在USB接收上实现双缓存那么多。 注意: FreeUserBuffer的作用是切换当前的USB缓存。 1.接收双缓冲: EPX_OUT_Callback中,此代码只是在ST的示例程序的基础上稍加修改,并且不是偶写的,而是一个网友测试的: if(GetENDPOINT(ENDP3) & EP_DTOG_TX) { FreeUserBuffer(EN
[单片机]
关于stm32的USB和SPI疑似存在干扰的问题
情况是这样的,最近做一个项目,使用的是stm32f103RE单片机,使用到了单片机的usb口和SPI1。USB虚拟成串口向上位机发送数据,已经通过修改官网的例程调试通过,SPI1也能正常工作。但是当把两个功能做在同一个工程中时,发现出现了一些问题:USB想上位机发送一段时间后会停止发送(我的程序是在while中一直发送);USB发送会出现乱码。当我把SPI1的读写函数注释掉之后上述问题有消失了。这个问题纠结了我好几天了,不知道各位高手能不能帮我解答解答。 调试发现程序停在了while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);中,但是之前没有添加USB功能模块
[单片机]