STM32之HAL开发——串口配置(源码)

本文详细解释了USART串口的工作原理,特别关注了HAL库中的USART_InitTypeDef结构体,以及如何配置波特率、数据长度、停止位、校验位等参数。还介绍了如何在STM32中使用DEBUG_USART进行数据发送和接收的实例,包括GPIO配置和中断处理函数的使用。
摘要由CSDN通过智能技术生成

串口收发原理框图(F1系列)

注意:数据寄存器有俩个一个是收一个是发,但是在标准库或者HAL库中没有特别区分开来是俩个寄存器!

USART 初始化结构体详解

HAL 库函数对每个外设都建立了一个初始化结构体,比如 USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 USART_Init() 调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
 

typedef struct {
uint32_t BaudRate; //波特率
uint32_t WordLength; //字长
uint32_t StopBits; //停止位
uint32_t Parity; //校验位
uint32_t Mode; //UART 模式
uint32_t HwFlowCtl; //硬件流控制
uint32_t OverSampling; // 过采样模式
uint32_t CLKLastBit; // 最尾位时钟脉冲
} USART_InitTypeDef;
  • BaudRate:波特率设置。一般设置为 2400、 9600、 19200、 115200。 HAL 库函数会根据设定值计算得到 UARTDIV 值,见公式 20‑1,并设置 UART_BRR 寄存器值
  • WordLength:数据帧字长,可选 8 位或 9 位。它设定 UART_CR1 寄存器的 M 位的值。如果没有使能奇偶校验控制,一般使用 8 数据位;如果使能了奇偶校验则一般设置为 9 数据位。
  • StopBits:停止位设置,可选 0.5 个、 1 个、 1.5 个和 2 个停止位,它设定 USART_CR2 寄存器的STOP[1:0] 位的值,一般我们选择 1 个停止位。
  • Parity:奇偶校验控制选择,可选 USART_PARITY_NONE (无校验)、 USART_PARITY_EVEN (偶校验) 以及 USART_PARITY_ODD (奇校验),它设定 UART_CR1 寄存器的 PCE 位和 PS位的值。
  • UART 模式选择,有 USART_MODE_RX 和 USART_MODE_TX,允许使用逻辑或运算选择两个,它设定 USART_CR1 寄存器的 RE 位和 TE 位。
     

USART1实现数据发送/接收

void DEBUG_USART_Config(void)
{ 
  
  UartHandle.Instance          = DEBUG_USART;
  
  UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;
  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits     = UART_STOPBITS_1;
  UartHandle.Init.Parity       = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode         = UART_MODE_TX_RX;
  
  HAL_UART_Init(&UartHandle);
//    
// /*使能串口接收断 */
//  __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);  
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
  GPIO_InitTypeDef  GPIO_InitStruct;
   
  __HAL_RCC_USART1_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  
/**USART1 GPIO Configuration    
  PA9     ------> USART1_TX
  PA10    ------> USART1_RX 
  */
  /* 配置Tx引脚为复用功能  */
  GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =  GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);
  
  /* 配置Rx引脚为复用功能 */
  GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;
  GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT;	//模式要设置为复用输入模式!	
  HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); 
 
//  HAL_NVIC_SetPriority(DEBUG_USART_IRQ ,0,1);	//抢占优先级0,子优先级1
//  HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ );		    //使能USART1中断通道  
}

//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}
//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}

//如果是在中断里想要完成数据的收发可以用以下函数
        (+) HAL_UART_Transmit_IT()
        (+) HAL_UART_Receive_IT()

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值