STM32之串口通信

news/2024/9/28 5:20:34/

什么是串口

串行通信接口:指按位发送和接收的接口,如RS232/422/485

RS232电平和COMS/TTL电平对比

RS232电平:逻辑1:-15V ~ -3V 逻辑0:+3V ~ +15V
CMOS电平: 逻辑1:3.3V 逻辑0:0V (STM32使用)
TTL电平:逻辑1:5V 逻辑0:0V (51单片机使用)

备注:因为电压不同,所以CMOS/TTL是不能是直接与RS232交换信息,需要电平转换芯片进行电压转换。 如3.3V可以使用MAX323/SP3232转换芯片, 如果是5V可以使用MAX232转换芯片

USART/UART异步通信配置步骤

一、配置串口工作参数、开启串口异步接收中断

使用HAL库接口HAL_UART_Init(); HAL_UART_Receive_IT();

#define RXBUFFERSIZE 1
UART_HandleTypeDef g_uart1_handle;    /* UART句柄 */
uint8_t g_rx_buffer[RXBUFFERSIZE] = {0};         //接收缓冲区
void usart_init(uint32_t baudrate)
{g_uart1_handle.Instance = USART1;g_uart1_handle.Init.BaudRate = baudrate;      								//波特率g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;                        //字长为8位数据格式g_uart1_handle.Init.StopBits = UART_STOPBITS_1;                             //一个停止位g_uart1_handle.Init.Parity = UART_PARITY_NONE;                              //无奇偶校验位g_uart1_handle.Init.Mode = UART_MODE_TX_RX;                                 //收发模式g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                        //无硬件流控HAL_UART_Init(&g_uart1_handle);                                             //HAL_UART_Init()会使能UART1/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}

二、串口底层初始化

使用HAL库接口:HAL_UART_MspInit() 配置GPIO/NVIC/CLOCK等

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if (huart->Instance == USART1){__HAL_RCC_USART1_CLK_ENABLE();                                  //使能USART1的时钟__HAL_RCC_GPIOA_CLK_ENABLE();                                   //使能GPIOA的时钟gpio_init_struct.Pin  = GPIO_PIN_9;                           //PA9  Txgpio_init_struct.Mode = GPIO_MODE_AF_PP;                     //推挽复用输出gpio_init_struct.Pull = GPIO_PULLUP;                          //下拉,因为时钟空闲是低电平gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;                 //低速gpio_init_struct.Alternate = USART_TX_GPIO_AF;                //复用为USART1的TXHAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin  = GPIO_PIN_10;                           //PA10  Rxgpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;                 //低速gpio_init_struct.Alternate = USART_RX_GPIO_AF;                //复用为USART1的RXHAL_GPIO_Init(GPIOA, &gpio_init_struct);    }
}

三、设置优先级、使能中断

使用HAL接口:HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();

 HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);                     //设置优先级HAL_NVIC_EnableIRQ(USART1_IRQn);                              //使能中断

四、编写中断服务函数

使用接口:USARTx_IRQHandler(); UARTx_IRQHandler();

void USART1_IRQHandler(void)
{HAL_UART_IRQHandler(&g_uart1_handle);HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}

五、编写回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{g_rx_flag = 1;}

五、串口数据发送(在main函数中)

USART DR(数据发送寄存器) 、HAL_UART_Transmit();

int main()
{HAL_Init();                                 //初始化HAL库sys_stm32_clock_init(360, 25, 2, 8);       //设置时钟,180Hzdelay_init(180);                           //延时初始化usart_init(115200);printf("开始发送数据\r\n");while(1){       if (g_rx_flag == 1){HAL_UART_Transmit(&g_uart1_handle, (uint8_t *)g_rx_buffer, 1, 30);while(__HAL_USART_GET_FLAG(&g_uart1_handle, UART_FLAG_TC) != 1);printf("\r\n");g_rx_flag = 0;}else{delay_ms(30);}       } }

http://www.ppmy.cn/news/1531453.html

相关文章

C语言VS实用调试技巧

文章目录 一、什么是bug?二、什么是调试?三、Debug和Release四、VS调试快捷键4.1环境准备4.2调试快捷键 五、监视和内存观察5.1监视5.2内存 六、调试举例七、编程常见错误归类7.1编译型错误7.2链接型错误7.3运行时错误 一、什么是bug? 🍎bug本意是 “…

【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码

目录 1.下载python解释器 2.第一个python程序 3.配置解释器环境变量 4.下载开发工具 PyCharm 4.通过PyCharm编写第一个python程序 1.下载python解释器 官网下载,但是下载太慢了,所以直接百度搜了下载了个 Welcome to Python.org 1.官网下载 2.直…

StarRocks Elasticsearch Catalog原理简析

前言 Elasticsearch不仅是强大的全文搜索引擎,在很多场景下(特别是TiDB、ShardingSphere等框架成熟之前)也被当做分布式HTAP数据库使用,在存储、更新海量数据的同时,提供高效的点查和部分聚合查询能力。StarRocks从3.1版本开始支持Elasticsea…

​​合​​合​​信​息​​​龙​​湖​​数​​科​​一​​面​​​

1. 请尽可能详细地说明,Git中merge和rebase的区别和应用场景?Git中pull和fetch的区别和应用场景?Git中revert和reset的区别和应用场景?你的回答中不要写出示例代码。 Git中merge和rebase的区别和应用场景 merge 区别&#xff1…

前端工程记录:Vue2 typescript项目升级Vue3

由于typescript飞速发展,某些vue2项目也在vue3出现之前集成了typescript开发,例如我的个人网站,当时花费了不少时间。而vue3我使用一段时间后,在2022年左右开始投入生产,但是这个个站就没怎么维护了。若是想继续&#…

【LLM】 TinyAgent 构建指南

文章目录 TinyAgent 构建指南项目概述实现步骤步骤一:模型构建步骤二:工具构建步骤三:Agent 构建步骤四:运行 Agent 结论参考文献学习心得 TinyAgent 构建指南 项目地址:https://github.com/datawhalechina/tiny-univ…

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络(RNN)主要用于自然语言处理的。 循环神经网络(RNN)、卷积神经网络(CNN)和全连接神经网络(FCN)是三种常见的神经网络类型,各自擅长处理不同类型的数据。下面…

【Go语言】深入解读Go语言中的指针,助你拨开迷雾见月明

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…