STM32笔记——USART串口通信

一、USART简介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
  • USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
  • 自带波特率发生器,最高达4.5Mbits/s
  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
  • 可选校验位(无校验/奇校验/偶校验)
  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3

二、USART框图

  • 发送数据:STM32把要发送的数据写入发送数据寄存器(TDR),等待硬件电路把发送数据寄存器中的数据转移到发送移位寄存器中,然后从TX把数据发送出去。
  • 接收数据:接收的数据从RX进入接收移位寄存器,有硬件电路把数据转移到接收数据寄存器,RXNE(读数据寄存器非空)位会被硬件置一。此时,可以通过RXNE触发中断,把数据读取出来。

三、USART数据帧

3.1 字长设置

通常的数据帧模式:

  •  9位字长(11位数据):一位起始位、一位停止位,八位数据位、一位校验位。
  •  8位字长(10位数据):一位起始位、一位停止位,八位数据位、无校验位。

3.2 配置停止位

  •  可选择1个停止位、1.5个停止位、2个停止位或者0.5个停止位。

四、USART基本结构

  1. 开启外设时钟
  2. 初始化GPIO口
  3. 初始化USART
  4. USART中断控制输出(选择触发信号)
  5. NVIC中断优先级分组
  6. 初始化NVIC
  7. 使能USART

程序如下:

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//PA9复用推挽输出
	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_IPU;//PA10上拉输入
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	USART_InitTypeDef USART_InitStruct;
	USART_InitStruct.USART_BaudRate=9600;//波特率
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
	USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//串口模式
	USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶校验
	USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位一位
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据位数
	USART_Init(USART1,&USART_InitStruct);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断输出控制
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	
	USART_Cmd(USART1,ENABLE);
}

猜你喜欢

转载自blog.csdn.net/ssssshhbh/article/details/129571821