完善资料让更多小伙伴认识你,还能领取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使用步骤总结如下:
|
|
|
|
摘要
本文章基于国信长天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使用步骤总结如下:
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1850浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
614浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
510浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
491浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 20:59 , Processed in 0.530146 second(s), Total 47, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号