STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单

发布者:SereneMelody最新更新时间:2023-11-19 来源: zhihu关键字:STM32F0  单片机  快速入门  库操作 手机看文章 扫描二维码
随时随地手机看文章

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.


参考资料

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

STM32F030 Datasheet

STM32F030 Reference Manual


关键字:STM32F0  单片机  快速入门  库操作 引用地址:STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单

上一篇:STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
下一篇:STM32F0单片机快速入门五: GPIO中断

推荐阅读最新更新时间:2024-11-12 21:33

51单片机汇编学习和系统除错步骤
如果单片机系统出现问题,检修流程如下: 一、对硬件电路的检查 1、检查电源(40脚) 2、检查振荡(18、19脚) 3、检查地(20脚) 3、检查复位电路(9脚) 4、检查中断允许(31脚) 5、然后再检查是否有信号 6、信号是否正确 二、软件编写规则 1、只被调用一次的不要写成子程序 2、不比自己定义太多的ORG地址入口,只需定义两个,一个0000H,还有一个主程序入口, 3、中断程序需定义自己的程序入口地址, 中断源有INT0,定时器T0,INT1,定时器T1,串行口中断,共5种中断, 入口地址分别为,INT0 = 0003H, 定时器T0 = 000BH, INT1
[单片机]
STM32单片机程序编译及下载配置
前言 当拿到STM32单片机开发板的时候,程序的编译和下载将是我们踏入STM32单片机开发的第一步。本章详细介绍程序的编译和下载。包括:Keil5工程编译、Keil5程序下载、DAPLINK U盘拖拽下载以及串口程序下载。本文以RY-STM32开发板为例,布局图如下所示,开发板自带下载器DAPLink,与计算机通过USB线连接即可。其他类型的开发板编译与下载类似,举一反三即可。 2.1 DAPLink下载器识别 将开发板通过USB线与计算机连接,并打开开发板供电开关,计算机将自动识别下载器。如下图所示,分别识别出:USB串行设备(COM3),USB大容量存储设备,WebUSB:CMSIS-DAP以及一个名称为DAPLINK的
[单片机]
STM32<font color='red'>单片机</font>程序编译及下载配置
单片机8X8LED点阵显示“中国生日快乐”
硬件图如下图: 元件清单如下图(有些多余了): 程序如下(C语言): #include reg51.h unsigned char led1 ={0XEF,0XEF,0X83,0XAB,0XAB,0X83,0XEF,0XEF}; //中 unsigned char led2 ={0x01,0X7D,0X45,0X45,0X65,0X45,0X7D,0X01}; //国 unsigned char led3 ={0xF7,0XD7,0X80,0X77,0XC1,0XF7,0XF7,0X00}; //生 unsigned char led4 ={0x83,0XBB,0XBB,0X83,0XBB,0XBB,0X83,0XF
[单片机]
<font color='red'>单片机</font>8X8LED点阵显示“中国生日快乐”
AVR单片机(学习ing)—(十)、ATMEGA16的同步串行接口SPI—02
1)那就是在之前的介绍中说过,在说一遍~~ 主机和从机的两个移位寄存器可以被认为是一个公开的16位环形移位寄存器,当数据从主机移向从机时,同时从机饿数据也向相反的放向移向主机。这就意味着在一个以为周期内,主机和从机的数据进行了交换。(不过这个例子里没有用到这个,下个会用到~~呵呵~~),早知道对谁都好~~ 2)配置为SPI主机时,SPI接口不自动控制SS引脚,必须由用户软件来处理。还有配置为从机时,只要SS引脚为高,SPI接口将一直保持睡眠状态,并保持MISO为三态。(这个章节的第一篇文章有详细的介绍~~自己可以看看~~) 3)SPI系统的发送方向只有一个缓冲器,而接收方向有两个缓冲器。也就是说,在发送时一定要等到移位过程全部结束
[单片机]
AVR<font color='red'>单片机</font>(学习ing)—(十)、ATMEGA16的同步串行接口SPI—02
基于单片机的多机无线短信通信系统设计
  现代通信技术的迅速发展使得许多应用领域都采用无线的通信方式进行数据传输。编解码芯片PT2262、PT2272组成的电路,由于具有体积小、功耗低、功能强、成本低等特点,广泛应用于各类的无线遥控器、无线报警器以及玩具等其他小型电器装置。但是,这种电路极少用在多个字节数据的通信方面,具有一定的局限性。 本文主要介绍利用433 MHz高频发射模块和接收模块来制作多机无线ASCII码格式的短信通信。该通信方式是在433MHz高频发射模块和接收模块的基础上自己定义无线传输协议,实现任意两机之间的多个字节数据通信。   1 硬件系统设计   本系统主要由PICl6F877A单片机构成控制系统,周围4个模块分别是:按键输入模块、
[单片机]
基于<font color='red'>单片机</font>的多机无线短信通信系统设计
STM8的最大的特点(与其它8位MCU相比)
STM8是ST意法半导体针对工业应用和消费电子开发而推出的8位单片机。 每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,STM8 8-bit MCU最大的特点是: 内核: 最高fcpu频率,可达24MHz,当fcpu≤16MHz时0等待的存储器访问 高级STM8内核,基于哈佛结构并带有3级流水线 扩展指令集 最高20 MIPS @ 24 MHz 时钟、复位和电源管理: 2.95V到5.5V工作电压 灵活的时钟控制,4个主时钟源 带有时钟监控的时钟安全保障系统 电源管理: 低功耗模式(等待、活跃停机、停机) 外设的时钟可单独关闭 永远打开的低功耗上电和掉电复位 通信接口:
[单片机]
PIC单片机入门之闪灯程序
今天首先发一个关于PIC单片机的入门的一些感悟。PIC单片机有很丰富的寄存器,我所学习的PIC16f886单片机有28个引脚,却又很多I/O口,由于microchip的PIC芯片是相当比较稳定安全的芯片,所以他对端口输入输出方式的控制可谓是很细心,刚开始学习单片机得时候对于端口的配置走了很多弯路,下面做以下总结: 首先要配置输入还是输出方式(TRISA、TRISB等等),其次要配置模拟模式还是数字模式(ANSEL、ANSELH等),如果配置不正确,是读不到想要的值的,我想对于入门主要就是配置上的问题吧! 对于初学PIC,往往先做一个闪灯实验来验证器件已经开始工作,下面是我做的闪灯程序,用汇编编写,不是很规范,毕竟编写的时候也是初学
[单片机]
ST推业界领先新款微控制器 扩展STM32F4系列阵容
意法半导体扩大STM32F4系列,推出业界领先的新款微控制器。STM32F401是意法半导体基于ARM Cortex-M4 32位/DSP内核的STM32F4系列高性能微控制器的入门级产品。其运行频率低于其它STM32F4微控制器,但在性能、功耗和集成度之间取得完美均衡,以105DMIPS(84MHz)、137μA/MHz工作电流、11μA典型停止电流、丰富的集成功能领先于同级产品。 低功耗,3x3mm微型封装,105°C环境温度,STM32F401适用于管理医疗和移动应用或现场总线驱动的工业传感器模块。 意法半导体扩大STM32F4系列,推出业界领先的新款微控制器 STM32F401运用意法半导体独有的自适应实时
[单片机]

推荐帖子

MSP430f149驱动12864液晶
各位高手好,帮忙解决一个msp430f149控制12864的问题吗,如何根据12864的时序实现用430来控制,程序该怎么写?有哪位大侠有这方面的程序,详细解答一下,不胜感激!MSP430f149驱动12864液晶typedefunsignedcharuint8;typedefunsignedintuint16;typedefunsignedlonguint32;#defineBIT(x)(1(x))/***********************
莫回头 嵌入式系统
MSP430 外部flash使用经验
对于开发来说,我们经常需要保存一些参数,当数据多时我们往往采用串行flash存储我们所需的数据,往往这些串行flash有一个缺点,就是必须以4K擦除,这样对于小ram的单片机来说就不好处理了,如果直接擦除就会丢到之前保存的数据,所以为了解决这个问题,我们可以按照这样的方法来解决数据处理:首先我们选择串行flash的第一个4K扇区为缓存扇区,后面的扇区作为我们实际数据存储区,比如我们需要在一个地址写数据,先判断地址数据是否可以写,如果可以就直接写,如果不行,就先擦除第一个缓存扇区,把需要写的地
qwerghf 微控制器 MCU
单片机四种输入模式
MCU输入模式有浮空、上拉、下拉、模拟输入这四种模式,如果采用上拉或者下拉模式输入,岂不是把真实的信号强行变成电源VCC或者GND了?这四种模式分别在什么场合下使用?这个对于嵌入式软件工程师来说很重要单片机四种输入模式具体哪种方式,与信号有很大关系。悬空输入在未连接输入信号或输入阻抗过高时,容易受环境影响产生干扰信号。上拉或下拉时,有偏置电压,就不会容易有干扰。另外单片机内部的上拉下拉并不是电阻,通常等效阻值在几十K,配置电流较大,对低功耗应用来说
QWE4562009 单片机
【转帖】整流二极管想知道的都在这儿
整流二极管的特性整流二极管是利用PN结的单向导电特性,把交流电变成脉动直流电。整流二极管流电流较大,多数采用面接触性料封装的二极管。整流二极管的参数除前面介绍的几个外,还有最大整流电流,是指整流二极管长时间的工作所允许通过的最大电流值。它是整流二极管的主要参数,是选项用整流二极管的主要依据。整流二极管的特性参数①额定整流电流IF:在规定的使用条件下,在电阻性负载的正弦半波整流电路中,允许连续通过半导体二极管的最大工作电流。一些大电流整流二极管要求使用散热片,它的,F
皇华Ameya360 电源技术
储能用到的电池原理和充电技术?
一般储能使用电池都是小电池通过串并联组合形成的,一定的电池组成电池簇再组成电池包,分析单个电池,当其放电到一定电压时,就不再会在放出能量,这是电池的什么原理?再就是有关电池充电时的三种方法,恒压充电、恒流充电、恒功率充电;恒压充电是指电源给到电池的电压恒定,但是随着电池电压的升高充电电流会减小;恒流充电是指充电电流恒定,但是电池电压还是会升高,因此充电电压会逐渐升高以维持恒定电流充电,请问这个恒功率充电是什么过程?这三种方法各有什么优缺点,还有其他充电方法吗?储能用到的电池原理和充电技
乱世煮酒论天下 电源技术
变频调速节能装置的节能原理
1、变频节能由流体力学可知,P(功率)=Q(流量)╳H(压力),流量Q与转速N的一次方成正比,压力H与转速N的平方成正比,功率P与转速N的立方成正比,如果水泵的效率一定,当要求调节流量下降时,转速N可成比例的下降,而此时轴输出功率P成立方关系下降。即水泵电机的耗电功率与转速近似成立方比的关系。例如:一台水泵电机功率为55KW,当转速下降到原转速的4/5时,其耗电量为28.16KW,省电48.8%,当转速下降到原转速的1/2时,其耗电量为6.875KW,省电87.5%.2、功率
beh 工控电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved