计算机系统应用教程网站

网站首页 > 技术文章 正文

STM32学习笔记-ustar串口通信 stm32串口usart2

btikc 2024-10-12 11:44:24 技术文章 8 ℃ 0 评论

通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的 外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据 组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。

物理层

1.通讯结构
串口通讯的物理层的主要标准是
RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:


在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。

2.电平标准

根据使用的电平标准不同,串口通讯可分为 RS-232标准 及TTL标准,具体标准如下:

在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。

协议层--RS232协议

        开始位 +数据位 +奇偶检验位 +停止
位数: 1         5~8         0~1          1~2 
电平: 0          0/1          0/1             1 

开始位:产生 1 个下降沿,通知接收设备,准备接收数据。

数据位:7/8 位 -- 存储字节为单位/ascii 码 -- 8 位为主

奇偶校验位:奇偶校验 -- 判断数据在发送过程中是否出现错误 -- 一般不使用(现在使用 CRC 校验) ,判断数据位中 1 的个数+奇偶位中 1 的个数。

奇校验:位数必须为奇数

偶校验:位数必须为偶

停止位:1~2 位,高电


波特率的计算公式:


PCLK2 -- APB2 时钟 -- 72MHz

公式中已知量:fck 和波特率

求得USARTDIV = fck/(波特率*16)

例如:假设波特率为 9600

USARTDIV = 468.75

波特率寄存器:

电脑连接串口需要用到usb转串口模块,带闹闹需要安装CH340的驱动

实现串口通信的基本步骤:

1,配置 GPIO 口模式

2,配置 USART1

2.1 打开 USART1 的时钟

2.2 USART1:全双工、RS232 协议+波特率

2.3 使能串口

3,编写数据收发函数

oid Usart_Config(void)
{
	//配置端口 PA9 PA10
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//2.配置端口
	GPIO_InitTypeDef  GPIO_PortA;//定义结构体变量
	GPIO_PortA.GPIO_Speed = GPIO_Speed_50MHz;//速度
	
	GPIO_PortA.GPIO_Mode = GPIO_Mode_IN_FLOATING;//模式
	GPIO_PortA.GPIO_Pin = GPIO_Pin_10; //引脚
	GPIO_Init(GPIOA,&GPIO_PortA);
	
	GPIO_PortA.GPIO_Mode = GPIO_Mode_AF_PP;//模式
	GPIO_PortA.GPIO_Pin = GPIO_Pin_9;//引脚
	GPIO_Init(GPIOA,&GPIO_PortA);
	
	//USART配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	USART_InitTypeDef USART_InitStructure;//定义结构体
	
	USART_InitStructure.USART_BaudRate = 115200; //定义波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 
	USART_InitStructure.USART_Parity = USART_Parity_No; 
	USART_InitStructure.USART_StopBits = USART_StopBits_1; 
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
	
	USART_Init(USART1, &USART_InitStructure);//初始化
	
	USART_Cmd(USART1, ENABLE);//使能
}

//发送函数
void Usart1_Tx(uint16_t data)
{
	//发送数据时,确保前面的数据发送完成
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==0) {};
	USART_SendData(USART1,data);
}
//接受数据
uint16_t Ustart1_Rx(void)
{
	uint16_t data;
	//接受数据时,确保前面的数据接受完成
	while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==0) {};
	data = USART_ReceiveData(USART1);
	return data;
}
int fputc(int c, FILE * str)
{
	Usart1_Tx(c);
	return c;
}

重写fputc函数可以实现像串口输出数据的功能,同时需要在设置中进行以下配置,然后我们就可以在程序中使用printf函数像串口调试软件输出数据。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表