STM32
直播中

郭中

10年用户 987经验值
擅长:存储技术
私信 关注
[问答]

STM32G431串口通信怎么使用?

STM32G431串口通信怎么使用?

回帖(2)

范亚娟

2021-12-8 10:17:20
摘要

  本文章基于国信长天M4开发板,讲述了STM32G431 串口通信的使用步骤,祝各位学生蓝桥杯电子比赛取得好成绩!

  

  

  M4开发板 串口引脚

  
  

  

  由上图可以看出,DAP Link的串口连接在芯片的PA9和PA10引脚。查阅芯片资料,可以得知PA9和PA10分别是芯片USART1的Tx和Px:
  PA9   ---> USART1_Tx PA10  ---> USART1_Rx   


  UART1串口通信 使用步骤

  下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD 介绍ADC的使用步骤:
  ① 添加 stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c
  双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c 并添加。添加后如下图所示:

  

  

  ② 修改 stm32g4xx_hal_conf.h 文件
  在如下位置找到该文件,并打开:

  

  

取消注释 #define HAL_UART_MODULE_ENABLED 这一行,取下注释后如下图所示:

  

  

  ③ main.c 添加#include "stm32g4xx_hal_uart.h"
  在 main.c 适当位置添加#include "stm32g4xx_hal_uart.h",添加后如下图所示:

  

  

  ④ 复制如下 TIM 初始化的代码
  注意:下列代码包含了UART1的初始化,printf重定向,数据发送,接收中断,同学们可参考自行使用!

UART_HandleTypeDef huart1;
uint8_t uart_rx_buf[128]; //串口接收数据缓冲区


// UART1 初始化
static void MX_UART1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
       
        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
        PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
        HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); //配置USART1外设的时钟
       
        __HAL_RCC_USART1_CLK_ENABLE(); //打开USART1的时钟
        __HAL_RCC_GPIOA_CLK_ENABLE();
       
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 9600; //设置波特率
        huart1.Init.WordLength = UART_WORDLENGTH_8B; //设置数据位
        huart1.Init.StopBits = UART_STOPBITS_1; //设置停止位
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_MultiProcessor_Init(&huart1, 0, UART_WAKEUPMETHOD_IDLELINE);
        HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8);
       
        HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8);
        HAL_UARTEx_DisableFifoMode(&huart1);
       
        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //复用开漏输出
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;//复用功能
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化串口引脚PA9 PA10
       
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); //设置串口中断优先级
        HAL_NVIC_EnableIRQ(USART1_IRQn); //打开串口中断
       
        HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); //设置串口中断缓冲区及中断阈值(当前为1)
}


//串口中断
void USART1_IRQHandler(void) //串口中断
{
        HAL_UART_IRQHandler(&huart1);
}


//串口中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(uart_rx_buf[0] == 'a') //接收导数据 a ,回应 Hello
        {
                printf("Hellorn");
        }
       
        HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); //设置串口中断缓冲区及中断阈值(当前为1)
}


//重定向printf函数为串口输出
int fputc(int ch,FILE *p)
{
        char c = ch;
        HAL_UART_Transmit(&huart1,(unsigned char *)&c, 1, 50);
        return ch;
}


//发送单个数据
void UART1_SendByte(char c)
{
        HAL_UART_Transmit(&huart1,(unsigned char *)&c, 1, 50);
}


//发送整个数组
void UART1_SendData(char *p, int len)
{
        HAL_UART_Transmit(&huart1,(unsigned char *)p, len, 50);
}
  ⑤ 在main() 中调用 MX_UART1_Init();
  如下图所示,在main() 函数的适当位置调用 MX_UART1_Init();

  

  

  ⑥ 通过串口发送数据
  printf("Hello World!rn"); //发送Hello World!  UART1_SendByte(0xF3); //发送16进制数据 0xF3  UART1_SendData("123456", 6); //发送数组   
  

  

  ⑦ 串口接收数据
  
  

  

  总结

  UART使用步骤总结如下:
  


  • 添加stm32g4xx_hal_uart.c,stm32g4xx_hal_uart_ex.c
  • 打开 stm32g4xx_hal_conf.h ,取消注释 HAL_UART_MODULE_ENABLED
  • 主函数 添加 #include "stm32g4xx_hal_uart.h"
  • 复制(手打)代码 到 main() 上面;
  • 在主函数中调用 MX_UART1_Init();
  • 调用printf("Hello World!rn"); , UART1_SendByte(); , UART1_SendData(); 发送数据
  • 在HAL_UART_RxCpltCallback()中处理接受到的数据

举报

姬房有

2021-12-8 10:17:20
摘要

  本文章基于国信长天M4开发板,讲述了STM32G431 串口通信的使用步骤,祝各位学生蓝桥杯电子比赛取得好成绩!

  

  

  M4开发板 串口引脚

  
  

  

  由上图可以看出,DAP Link的串口连接在芯片的PA9和PA10引脚。查阅芯片资料,可以得知PA9和PA10分别是芯片USART1的Tx和Px:
  PA9   ---> USART1_Tx PA10  ---> USART1_Rx   


  UART1串口通信 使用步骤

  下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD 介绍ADC的使用步骤:
  ① 添加 stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c
  双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c 并添加。添加后如下图所示:

  

  

  ② 修改 stm32g4xx_hal_conf.h 文件
  在如下位置找到该文件,并打开:

  

  

取消注释 #define HAL_UART_MODULE_ENABLED 这一行,取下注释后如下图所示:

  

  

  ③ main.c 添加#include "stm32g4xx_hal_uart.h"
  在 main.c 适当位置添加#include "stm32g4xx_hal_uart.h",添加后如下图所示:

  

  

  ④ 复制如下 TIM 初始化的代码
  注意:下列代码包含了UART1的初始化,printf重定向,数据发送,接收中断,同学们可参考自行使用!

UART_HandleTypeDef huart1;
uint8_t uart_rx_buf[128]; //串口接收数据缓冲区


// UART1 初始化
static void MX_UART1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
       
        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
        PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
        HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); //配置USART1外设的时钟
       
        __HAL_RCC_USART1_CLK_ENABLE(); //打开USART1的时钟
        __HAL_RCC_GPIOA_CLK_ENABLE();
       
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 9600; //设置波特率
        huart1.Init.WordLength = UART_WORDLENGTH_8B; //设置数据位
        huart1.Init.StopBits = UART_STOPBITS_1; //设置停止位
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_MultiProcessor_Init(&huart1, 0, UART_WAKEUPMETHOD_IDLELINE);
        HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8);
       
        HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8);
        HAL_UARTEx_DisableFifoMode(&huart1);
       
        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //复用开漏输出
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;//复用功能
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化串口引脚PA9 PA10
       
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); //设置串口中断优先级
        HAL_NVIC_EnableIRQ(USART1_IRQn); //打开串口中断
       
        HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); //设置串口中断缓冲区及中断阈值(当前为1)
}


//串口中断
void USART1_IRQHandler(void) //串口中断
{
        HAL_UART_IRQHandler(&huart1);
}


//串口中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(uart_rx_buf[0] == 'a') //接收导数据 a ,回应 Hello
        {
                printf("Hellorn");
        }
       
        HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1); //设置串口中断缓冲区及中断阈值(当前为1)
}


//重定向printf函数为串口输出
int fputc(int ch,FILE *p)
{
        char c = ch;
        HAL_UART_Transmit(&huart1,(unsigned char *)&c, 1, 50);
        return ch;
}


//发送单个数据
void UART1_SendByte(char c)
{
        HAL_UART_Transmit(&huart1,(unsigned char *)&c, 1, 50);
}


//发送整个数组
void UART1_SendData(char *p, int len)
{
        HAL_UART_Transmit(&huart1,(unsigned char *)p, len, 50);
}
  ⑤ 在main() 中调用 MX_UART1_Init();
  如下图所示,在main() 函数的适当位置调用 MX_UART1_Init();

  

  

  ⑥ 通过串口发送数据
  printf("Hello World!rn"); //发送Hello World!  UART1_SendByte(0xF3); //发送16进制数据 0xF3  UART1_SendData("123456", 6); //发送数组   
  

  

  ⑦ 串口接收数据
  
  

  

  总结

  UART使用步骤总结如下:
  


  • 添加stm32g4xx_hal_uart.c,stm32g4xx_hal_uart_ex.c
  • 打开 stm32g4xx_hal_conf.h ,取消注释 HAL_UART_MODULE_ENABLED
  • 主函数 添加 #include "stm32g4xx_hal_uart.h"
  • 复制(手打)代码 到 main() 上面;
  • 在主函数中调用 MX_UART1_Init();
  • 调用printf("Hello World!rn"); , UART1_SendByte(); , UART1_SendData(); 发送数据
  • 在HAL_UART_RxCpltCallback()中处理接受到的数据

举报

更多回帖

发帖
×
20
完善资料,
赚取积分