STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单_第1页
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单_第2页
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单_第3页
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页STM32F0单片机快速入门六用库操作串口(UART)原来如此简单1.从GPIO到UART前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断。接下来我们介绍的也是最常用的一个模块,串口(UART)。串口可以说是最古老,而且生命力最强的一种通信接口了。RS485总线更是久经考验。虽然串口早已经从大多数PC的标配中去掉了,但是嵌入式系统跟上位PC机通信用的最多的应该还是通过串口转USB吧。我们用Keil打开下面这个工程:STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComPollingMDK-ARMProject.uvprojx这个代码配置串口为9600,8N1,我们把代码编译下载后,可以通过UARTtoUSB转换器连接到PC的USB口,在PC端用串口观察MCU发送的数据。2.UART的初始化我们看一下代码,串口参数的设置是在主程序里完成的,还有一部分是在stm32f0xx_hal_msp.c里完成的。为什么要这么费事儿,而不把初始化代码全放在一个主程序里完成呢?我们要慢慢体会这样做带来的好处。我们调用一个驱动时,这个驱动难免会跟底层硬件打交道,比如串口驱动,它最终是利用用户选择的某一个串口模块,和与此模块连接的收发引脚进行数据收发的。HAL(HardwareAbstractLayer)把跟具体硬件细节相关的代码单独剥离了出来,并在Cube库中引入了MSP(MCUSupportPackage)的概念,具体的硬件细节交给用户在这里面配置。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之前我们先熟悉一下在驱动里经常用到的结构体及其指针的用法:

typedefstruct__MY_TypeDef{uint8_tVar1;uint8_tVar2;uint16_tVar3;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_InitTypeDefInit;在调用初始化函数前,需要把初始化参数如波特率,是否奇偶校验等写入此结构体。UART_AdvFeatureInitTypeDefAdvancedInit;串口扩展功能初始化参数。当前未用到扩展功能。使用Handle的好处是,我们操作某个模块时,把这个模块对应的Handle的首地址传给驱动函数就行了。此函数通过Handle就可以找到所有需要的东西。如:HAL_UART_Transmit(&UartHandle为UART1对应的Handle的首地址。Handle除了保存自己对应模块的参数信息,还保存缓冲数据,以及当前工作状态。它可以保证各模块之间互不干扰,在代码执行过程中被打断,恢复后又可以正确继续执行。这样也便于把驱动集成到操作系统中。在以后的中断方式和DMA操作模式中,我们可以更深刻的体会到这种方法的优点。在理解了串口模块的工作方式后,理解其它模块就非常容易了。需要提到的是,在M0芯片内,有一些共享的或系统级的硬件模块不使用Handle的方式来处理:GPIOSYSTICKNVICPWRRCCFLASH.

参考资料:PM0215STM32F0xxxCortex-M0programm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论