千家信息网

如何用库操作串口UART

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这期内容当中小编将会给大家带来有关如何用库操作串口UART,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.从 GPIO 到 UART前面几节我们讲了MCU如何启动
千家信息网最后更新 2026年11月02日如何用库操作串口UART

这期内容当中小编将会给大家带来有关如何用库操作串口UART,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。


1.从 GPIO 到 UART
前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断。接下来我们介绍的也是最常用的一个模块,串口(UART)。
串口可以说是最古老,而且生命力最强的一种通信接口了。RS485总线更是久经考验。虽然串口早已经从大多数PC的标配中去掉了,但是嵌入式系统跟上位PC机通信用的最多的应该还是通过串口转USB吧。
我们用 Keil 打开下面这个工程:
STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComPollingMDK-ARMProject.uvprojx
这个代码配置串口为 9600,8 N 1,我们把代码编译下载后,可以通过 UART to USB 转换器连接到 PC 的 USB 口,在PC端用串口观察MCU发送的数据。

2.UART 的初始化
我们看一下代码,串口参数的设置是在主程序里完成的,还有一部分是在stm32f0xx_hal_msp.c 里完成的。为什么要这么费事儿,而不把初始化代码全放在一个主程序里完成呢?
我们要慢慢体会这样做带来的好处。我们调用一个驱动时,这个驱动难免会跟底层硬件打交道,比如串口驱动,它最终是利用用户选择的某一个串口模块,和与此模块连接的收发引脚进行数据收发的。
HAL(Hardware Abstract Layer) 把跟具体硬件细节相关的代码单独剥离了出来,并在Cube库中引入了 MSP(MCU Support Package) 的概念, 具体的硬件细节交给用户在这里面配置。

HAL库里面对应每个硬件模块有两个函数 例如:

HAL_UART_Init( ) 功能上的描述:设置收发模式、奇偶校验位、停止位数等等(与芯片无关)。

HAL_UART_MspInit( ) 硬件的描述: IO初始化,不同芯片,不同引脚设置不同。

回到程序,我们要使用串口时要调用驱动层的初始化函数 HAL_UART_Init( ),这个初始化函数回过头来调用了 HAL_UART_MspInit( ) 这个函数来完成 UART 时钟和收发引脚时钟的使能,以及收发引脚的配置。之后初始化函数继续进行 UART 端口的参数配置。
这样做的一个好处就是使驱动层的初始化函数与硬件无关。一般我们做好一块板子后,所用的串口和引脚也就固定下来了,在 HAL_UART_MspInit( ) 里配置一次就好了,之后不需要频繁的改变这些代码。

3.熟悉 Handle
跟 GPIO 的初始化有所不同,在UART这个模块引入了 Handle 这一概念。在看 Handle 之前我们先熟悉一下在驱动里经常用到的结构体及其指针的用法:

typedef struct __MY_TypeDef

{

uint8_t Var1;

uint8_t Var2;

uint16_t Var3;

uint8_t* Var4;

}MY_TypeDef;

MY_TypeDef* MY_VAR;

MY_VAR 是一个 MY_TypeDef 类型的指针,我们看看把它指向不同的地址时会发生什么?
MY_VAR = (MY_TypeDef*) 0x20000018;

需要注意 MY_VAR->Var4 是个字节型指针变量,这个变量本身占用4个字节,它的值是 0x20000018, 而

* MY_VAR->Var4 的值是 0x02。

把 MY_VAR 指向另一个地址:
MY_VAR = (MY_TypeDef*) 0x2000001C;

与此类似,对于串口模块,驱动定义了一个结构体类型 UART_HandleTypeDef,我们可以用这个类型定义多个结构体,并通过把串口模块寄存器区的起始地址付给一个结构体,使该结构体和串口之间建立起联系:

我们运行的当前程序操作串口的方式为查询(polling)方式,结构体中和DMA,中断方式相关的内容可以先忽略,只需要关注结构体中下面这些成员即可:

USART_TypeDef *Instance;

USART_TypeDef 类型的指针,需要指向欲操作的串口寄存器区起始地址。以把此 Handle 和该串口建立起联系。

UART_InitTypeDef Init;

在调用初始化函数前,需要把初始化参数如 波特率,是否奇偶校验等写入此结构体。

UART_AdvFeatureInitTypeDef AdvancedInit;

串口扩展功能初始化参数。当前未用到扩展功能。
使用 Handle 的好处是,我们操作某个模块时,把这个模块对应的 Handle 的首地址传给驱动函数就行了。此函数通过 Handle 就可以找到所有需要的东西。如:

HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000);

&UartHandle 为 UART1 对应的 Handle 的首地址。
Handle 除了保存自己对应模块的参数信息,还保存缓冲数据,以及当前工作状态。它可以保证各模块之间互不干扰,在代码执行过程中被打断,恢复后又可以正确继续执行。这样也便于把驱动集成到操作系统中。在以后的中断方式和 DMA 操作模式中,我们可以更深刻的体会到这种方法的优点。在理解了串口模块的工作方式后,理解其它模块就非常容易了。

需要提到的是,在M0芯片内,有一些共享的或系统级的硬件模块不使用 Handle 的方式来处理:

GPIO

SYSTICK

NVIC

PWR

RCC

FLASH.

上述就是小编为大家分享的如何用库操作串口UART了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

串口 模块 函数 驱动 结构 代码 硬件 地址 方式 不同 参数 配置 指针 类型 内容 功能 好处 指向 数据 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网政务服务 互联网金融 金融科技 碳银互联网科技 银优互联网科技有限公司 新浪科技互联网 新华互联网科技校企合作 玖二柒互联网科技公司待遇 互联网科技扶贫时间 深圳育鹏互联网科技有限公司招聘 特约风豹互联网科技为什么扣费 中科明德北京互联网科技 国大互联网教育科技有限公司薪资 银行科技岗属于互联网吗 厦门江牛科技互联网 昆明中奇联合互联网科技 互联网界的黑科技 互联网金融运营模式中的金融科技 安徽九吞吴互联网科技有限公司 优雇互联网科技有限公司 颐高云石互联网科技 互联网科技公司简介 科技互联网龙头 深圳齐家互联网科技 互联网 视角下的科技创新 互联网 科技服务平台 现代科技和互联网有关系吗 怎样加入科技互联网 新氧科技和美国互联网有关系吗 张家口科技产业互联网平台 山东蛋芒互联网科技有限公司
0