stm32h7 串口idle_【一个小白的STM32H7修炼之道】串口的简单应用

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:15   2041   0

文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。

历程代码:https://gitee.com/cai_xl/MyWayToLearnSTM32H7

想必串口在单片机中的地位不必多说,大家都明白。

STM32H743ZIT6单片机一共有9个串口,分别为4个通用同步异步收发器(USART)、4个通用异步收发器,1个低功耗通用异步收发器(LPUART)。STM43H743ZIT6的一部分外设资源

USART既可以同步收发,又可以异步收发。而UART只能异步收发。所以暂且可以认为USART是UART的升级版,LPUART为了降低功耗,在UART的基础上还要再阉割一部分。

一个USART共有7个信号,最多可以使用5个IO口,即Tx、Rx、CTS(Clear to Send)、RTS(Request to Send)、CLK(同步时钟信号),此外还有一个片选信号NSS(N表示低电平,SS表示Slave Select),这个信号与CTS共用一个GPIO、一个驱动使能引脚DE(Driver Enable),这个信号和RTS共用一个GPIO。

其中Tx、Rx为共享信号,分别为数据的发送、接收引脚,所有模式、配置下均可使用。

CTS、RTS为RS232硬件控制信号。

DE为RS485硬件控制信号。

NSS、CLK为同步模式硬件控制信号(主从机和智能卡模式)。

这部分内容在参考手册47.5.2小节。参考手册USART signal部分

参考手册中并没有给出UART的信号,不过从下图不难猜到,它和USART相比,应该少了用于同步通信的NSS和CLK信号。LPUART虽然与UART有着相同的信号,但由于为了降低功耗,又除去了一些非必要的部分。USART、UART、LPUART功能概览

参考手册中,47.5.1节给出了一个USART的简化结构图。USART结构简图

图中有两个时钟域,分别为usart_pclk与ussart_ker_ck,前者是对应APB总线提供的时钟,用于访问寄存器,后者是由RCC提供的USART内核时钟,不过他们是由RCC对应的寄存器同时开启的。以USART3为例,通过RCC->APB1LENR可以同时开启这两个时钟。USART3EN可以开启的时钟

usart_ker_ck时钟域下,是USART外设的主要部分,有两个移位缓存器(所以它可以进行全双工通讯)、一个波特率发生器和过采样控制器、一个硬件流控制器(不算FIFO),用于完成数据收发功能。

usart_pclk时钟域下,是一堆控制寄存器、DMA接口和中断接口,用于管理usart_ker_ck时钟域下的各个部分以及收发的数据。

串口的寄存器部分是由HAL库进行管理的,所以可以不管它,现在来看一看IRQ Interface,也就是中断接口。中断源列表在参考手册47.6节。表格太长,先截这么多

USART的中断源很多,但最常用的并没有多少:TXE、TC、RXNE。TXE和TC与数据发送有关。TXE是发送数据寄存器空中断,TC是发送完成中断。在USART结构简图中可以看到,如果不使能FIFO,当要发送的数据写入USART_TDR寄存器时,这个数据会被复制到移位缓存器进行发送。当数据从USART_TDR寄存器写入移位缓存器时,USART_TDR寄存器就会为空,并触发TXE中断,此时可以向USART_TDR寄存器写入下一个数据。当移位缓存器的数据全部发送完毕,等待一段时间(一个起始位),若没有向移位缓存器写入新数据,则会触发TC中断,表示发送完成。TXE和TC在数据发送过程中的行为

相较于TXE和TC,RXNE中断简单的多,每发生一次RXNE中断,都表示USART接收到了一帧数据,可以从USART_RDR中读出接收到的数据。

现在来看STM32Cube_FW_H7库提供的UART_Printf历程(位置:Projects\STM32H743I_EVAL\Examples\UART\UART_Printf),在main.c文件中,程序初始化了USARTx的配置信息,在main.h中可以看到,USARTx是USART1,同时main.h也给出了有关串口的其他信息,如时钟、GPIO使用情况等。main.c/.h中初始化串口的部分程序

USART的MSP初始化(时钟配置和GPIO配置)在stm32h7xx_hal_msp.c中完成。USART的MSP初始化

从这些程序中可以大致了解配置USART的基本过程:开启时钟、初始化GPIO、配置USART(因为在HAL_PPP_Init()函数中,MSP函数的调用是先于初始化PPP外设的)。所以现在就可以开始编写BSP了。

不过要注意。在工程中应该在HAL库使能UART组件而不是USART组件,这是因为现在用到的是USART3的异步通讯功能,在这种模式下,USART等同于UART,应该使用HAL库提供的UART功能接口。另外UART组件和DMA组件做了互联,所以也要使能DMA组件。也就是要在stm32h7xx_hal_conf.h中定义HAL_UART_MODULE_ENABLED与HAL_DMA_MODULE_ENABLED

NUCLEO-H743有一个ST-LinkV2-1提供的板载TTL-to-USB串口,所以USART的BSP文件命名为BSP_SOB.c/.h(SOB=Serial on Board)。从原理图上可以知道,与ST-LinkV2-1相连的串口为USART3,使用的引脚为PD8(USART3_Tx)和PD9(USART3_Rx)。NUCLEO-H743原理图的一部分

所以在BSP_Config.h中做出相关的定义:BSP_Config.h中关于SOB的部分

在BSP_SOB.c/.h文件中,编写有关SOB的主要代码:BSP_SOB.c/.h相关代码

这一部分是SOB的初始化和从HAL映射过来的数据发送、接收接口

在stm32h7xx_hal_msp.c中编写msp初始化部分:stm32h7xx_hal_msp.c中的相关代码

这一部分主要是负责初始化和USART3有关的GPIO配置

之后,在BSP.c的BSP_Init()中添加SOB初始化部分:BSP.c的部分代码

最后编写main.c中的用户程序,因为只是简单应用,所以在这里先只使用阻塞发送方式,当按下按键时,单片机向计算机发送一个字符串。main.c中的用户程序

将程序编译并下载后,任意打开一个串口工具,设置对应的串口和波特率,按下按键,就可以看到程序运行的效果:程序运行效果

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP