摘要
本文章基于国信长天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()中处理接受到的数据
摘要
本文章基于国信长天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()中处理接受到的数据
举报