初识usart

1.什么是usart?

(b站up主江协科技给出以下解释)

        串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

        简单双向串口通信有两根通信线(发送端TX和接收端RX) TX与RX要交叉连接 当只需单向的数据传输时,可以只接一根通信线 当电平标准不一致时,需要加电平转换芯片

理论原理:

        USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

        USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

        自带波特率发生器,最高达4.5Mbits/s

        可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2) 可选校验位(无校验/奇校验/偶校验)

        支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN 

 2.提取关键点

        串口基本点:他是全双工,点对点异步单端通信,因此必须供地(单端),约定波特率(异步)(双方时钟必须精确是前提,如果代码没问题收到的还是乱码,可能是硬件晶振有问题)。       

        常采用ttl电平:了解串口的逻辑电平定义。通常,0V表示逻辑低电平(0),而高电平(1)可以是3.3V或5V,具体取决于您的设备。

        关键点:空闲时电平为高电平,起始位为低电平,停止位是高电平

难点:一般会避开难点,使用8位数据位无校验,一位停止位数据位(8位)和 校验位(可选)这两位统称数据帧,数据帧如果可以选择九位,不使用校验位的话,就是9位数据了,这该怎么去使用。

3.为什么要使用串口?

因为它可以根据寄存器的一个字节数据,自动生成数据帧时序,就不用手动反转gpio  8次或9次了。说白了就是为了使用

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

//uint16_t Data 可不是8位,但我之会用八位的,不过跳转内部看会把高八位清除了(串口先发的低位,移位寄存器移八位,高八位清除也没关系)

(CRC检验以后值得多看看)

4.值得注意的细节问题

1.想使用printf()必须勾选microLIB

 2. 时钟必须给正确,通常连接一个8mhz的外部晶振容易忽略。

如果是12mhz怎么改:

Ⅰ.stm32f10x.h里修改默认时钟

Ⅱ.system_stm32f10x.c里修改锁相环(应该也叫倍频器吧)

5.代码

使用8位数据位无校验,一位停止位

serial.h

#ifndef _SERIAL_H_
#define _SERIAL_H_
#include "stm32f10x.h"
//pa9是usart1的tx	pa10是usart1的rx
//#define TX	GPIO_Pin_9
//#define RX	GPIO_Pin_10
#define RxPacket_MAX	1024
typedef struct{
	uint8_t RXFlag;
	uint8_t RxCont;
	uint8_t RxPacket[RxPacket_MAX];
}SERIAL_DATA;
extern SERIAL_DATA serialData;


void serial_init(void);
void Serial_SendByte(uint8_t Byte);	
void Serial_SendArray(uint8_t *Array,uint16_t length);
void Serial_SendString(char* String);
uint8_t Serial_GetRXFlag();

#endif

serial.c

#include "serial.h"
#include "stdio.h"

SERIAL_DATA serialData
={
		.RXFlag=0,
		.RxCont=0,
//		.RxPacket[RxPacket_MAX]={'\0'},
};
//USART1 配置 PA9 -Tx  PA10 -RX
void serial_init(void)
{
	//配置IO口
	GPIO_InitTypeDef GPIO_InitStruct={0};
	USART_InitTypeDef USART_InitStructure={0};
	NVIC_InitTypeDef NVIC_InitStructure={0};
	//1,开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//2,配置IO口模式
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//输出管脚
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速度
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//输入管脚	
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	//配置串口
	//1,开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//2,串口初始化参数
	USART_InitStructure.USART_BaudRate=115200;//波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件数据流控制
	USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//同时开启发送和接收模式
	USART_InitStructure.USART_Parity=USART_Parity_No;//不适用校验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//1次传输8位数据
	USART_Init(USART1, &USART_InitStructure);
	//3,串口使能操作
	USART_Cmd(USART1, ENABLE);
	
	//中断配置
	//开启串口的接收中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}


void USART1_IRQHandler(){
	if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){		
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		uint8_t rxDataTem=USART_ReceiveData(USART1);
		serialData.RxPacket[serialData.RxCont]=rxDataTem;
		serialData.RxCont++;	
		serialData.RxCont %= RxPacket_MAX;//防止数组越界
		}
	//空闲中断
	if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
	{
		serialData.RXFlag=1;
		serialData.RxCont=0;
		//空闲中断的清除
		uint8_t  data = USART1->DR;
		data = USART1->SR;
		
	}
}
uint8_t Serial_GetRXFlag(){
	if(serialData.RXFlag==1){
		serialData.RXFlag=0;
		return 1;
	}
	return 0;
}

//串口发送  USART->DR = data 
void Serial_SendByte(uint8_t Byte)
{
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
	USART_SendData(USART1, Byte);//发送一个字节
	
}
void Serial_SendArray(uint8_t *Array,uint16_t length){
	uint8_t i;
	for(i=0;i<length;i++){
		Serial_SendByte(Array[i]);
	}
}
void Serial_SendString(char* String){
	uint8_t i;
	for(i=0;String[i]!=0;i++){
		Serial_SendByte(String[i]);
	}
}


int fputc(int ch ,FILE *f){
	Serial_SendByte(ch);
	return ch;
}

6.理解函数

        1.空闲中断什么时候会进?

        空闲中断又叫帧中断,有一个字符(一个字节)的时间间隔就会进空闲中断,理论上(9600波特率)应该是1/9600 *8s没有数据就会进空闲中断。有博主说是超过两个字节的时间没有数据才会进空闲中断。https://blog.csdn.net/komtao520/article/details/112678287

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F405 USART是一款由意法半导体开发的串口通信模块。它是STM32F405系列微控制器上的一个重要功能模块,可用于与外部设备进行数据传输和通信。 STM32F405 USART具有多种功能和特性。首先,它支持全双工通信,可以同时发送和接收数据。其次,它支持异步和同步通信模式,可以根据需要选择合适的模式进行数据传输。除此之外,它还提供了多种数据传输格式,例如8位、9位或字节传输格式。 此外,STM32F405 USART还具备高性能和低功耗的特点。它能够以很快的速度进行数据传输,同时在待机模式下能够有效降低功耗,提高系统的能效。 另外,STM32F405 USART还具备多个功能寄存器,用于配置串口通信参数和状态判断。它还支持硬件流控制和中断控制,方便用户对数据传输过程进行灵活的控制和管理。 总的来说,STM32F405 USART是一款功能强大、易于使用的串口通信模块,在工业控制、通信设备和嵌入式系统等领域有广泛的应用前景。它的出现为数据传输和设备通信提供了可靠的解决方案,帮助用户更好地实现数据交换和系统集成。 ### 回答2: STM32F405 USARTSTM32F4系列微控制器上的一种通信接口,用于实现串行数据传输。该微控制器具有多个USART模块,可用于与其他设备进行异步的串行通信。 STM32F405 USART具有许多功能,例如全双工通信、异步或同步传输模式、帧错误检测等。它还支持多种传输速率和数据位数,使得它成为连接各种外部设备的理想选择。 USART模块通过发送和接收引脚与其他设备进行通信。发送数据时,我们可以通过设置USART的发送寄存器来发送字节。接收数据时,我们可以通过读取USART接收寄存器获取接收到的字节。这使得我们可以轻松地在微控制器和其他设备之间进行双向数据通信。 除了基本的数据传输功能外,STM32F405 USART还支持中断和DMA传输,以提高数据传输的效率。通过使用中断和DMA,我们可以在接收或发送完成时立即触发相应的中断或DMA传输。 总的来说,STM32F405 USART是一种功能强大的串行通信接口,适用于各种应用场景。无论是与传感器、无线模块、显示器还是其他设备进行通信,都可以通过该接口轻松实现数据传输。 ### 回答3: STM32F405 是意法半导体(STMicroelectronics)生产的一款32位微控制器,采用ARM Cortex-M4内核。它的主要特性包括高性能、低功耗、丰富的外设和多种接口选项,使其在各种应用领域中得以广泛应用。 USARTSTM32F405微控制器上的一种通信接口,代表"通用同步/异步串行收发传输器"(Universal Synchronous/Asynchronous Receiver Transmitter)的缩写。它可以用于实现串行数据的发送和接收,并且支持同步和异步的数据传输方式。USART接口提供了多种功能和配置选项,使其能够适应不同的通信需求。 STM32F405的USART接口具有以下特点: 1. 可配置性:USART接口支持多种工作模式,包括同步模式、异步模式、单向模式和全双工模式,可根据具体需求进行配置。 2. 高速传输:USART接口支持高速串行通信,最高传输速率可达到25Mbps,可以满足对数据传输速度要求较高的应用。 3. 异常检测和处理:USART接口具有错误检测和处理功能,可以检测和纠正传输过程中出现的错误,提高数据传输的可靠性。 4. DMA支持:USART接口支持DMA(直接存储器访问)功能,可以通过设置DMA通道实现大量数据的高速传输,减轻CPU的负担。 5. 多种接口模式:USART接口可通过配置选择不同的工作模式,包括主机模式、从机模式和多主机模式,以适应不同的通信需求。 总之,STM32F405的USART接口是一种灵活、高性能的通信接口,可以用于实现各种串行数据传输应用。无论是工业控制、通信设备还是消费电子产品,都可以通过该接口实现可靠的数据通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值