2、串口传输功能
在本例中,通过串口来配置当前系统时间,因此,需要熟悉串口编程过程。CH32V307评估板提供了串口DMA传输样例程序Usart_DMA。下面结合该例程来说明串口应用的重点。
USART串口操作的库函数可以从ch32v30x_usart.h进行检索。相关寄存器配置信息包含《CH32FV2x_V3x 应用手册》的第18章。具体的初始化过程如下所示:
(1)开启串口所在系统总线时钟。具体的哪个外设挂在哪个系统总线下,可以参考《CH32FV2x_V3x 应用手册》的“第1章 存储器和总线架构”。里面USART23,UART48都是挂在系统APB1总线上,USART1挂在APB2总线上。引脚复用关系可以参考《CH32V20x_30x 数据手册》“3.2 引脚描述”来查找。例子中使用了USART2与USART3,一般仅使用TX与RX引脚,查后为USART2_TX、USART2_RX为PA2、PA3引脚(或PD5、PD6引脚,要看封装),USART3_TX、USART3_RX为PB10(GPIO_PIN10)、PB11(GPIO_PIN11)引脚(或PD8、PD9引脚)。
(2)配置GPIO引脚功能。GPIO配置功能需要参考《CH32FV2x_V3x 应用手册》的“第10章 GPIO及其复用功能(GPIO/AFIO)”,其中GPIOx_CFGLR与GPIOx_CFGHR寄存器用于配置复用功能。在本例中引脚被配置为复用功能开漏输出模式(TX)与输入浮动模式(RX)。
(3)开启DMA功能。直接存储器访问控制器(DMA)提供在外设和存储器之间或存储器和存储器之间的高速数据传输方式,无须 CPU 干预,数据可以通过 DMA 快速地移动,以节省 CPU 的资源来做其他操作。DMA 控制器每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各通道之间的优先级。有两个点可以留意:一是支持循环的缓冲器管理;二是可编程的数据传输数目:最大为65535。系统内置了 2 组通用 DMA 控制器,总共管理 18 个通道。在完成DMA初始化配置后,通过DMA_Cmd来启用相应通道的DMA。由于DMA也属于一关键外设,下面专列一节来说明DMA的应用。

图6 USART串口初始化过程1
3、DMA功能

图7 DMA初始化配置示例
CH32V307的DMA功能简介在上一段中进行了介绍,这里主要讨论DMA初始化的问题。DMA寄存器配置可以参考《CH32FV2x_V3x 应用手册》的第11章。
从图7中可以看出,DMA的初始化包括以下几个步骤:
(1)开启DMA外设时钟。由于DMA1(7个通道)、DMA2(11个通道)均挂载到AHB总线上,所以需要利用RCC_AHBPeriphClockCmd开启DMA功能总开关;
(2)设置DMA外设基地址与方向。由于DMA每个通道包括 3 种 DMA 数据转移方式(外设到存储器、存储器到外设、存储器到存储器),因此确定好DMA应用的对象后,就明确了外设基地址与数据转移方式。在Usart_DMA样例程序中,实现的是USART2与USART3之间的通讯。其DMA应用框架如图8所示:

图8 USART_DMA样例程序中的DMA配置
根据《CH32FV2x_V3x 应用手册》表11-2,可以知道USART2的TX与RX分别占用通道6与通道7,USART3的TX与RX分别占用通道2与通道3(从这里知道均源于DMA1)。这也是程序中相应通道配置的由来。
通过解析DMA_DIR_PeripheralDST宏定义及DMA_Init函数可知,DMA_DIR_PeripheralDST是在DMA_CFGR寄存器的第5位置1,因此DMA_DIR_PeripheralDST表示从存储器读;相应的DMA_DIR_PeripheralSRC表示从外设读。这正好与发送接收缓存的应用相应一致。
(3)设置DMA外设缓存区及读数宽度
此处主要注意缓存区的读数宽度,如果是8位的话,由于CFGR寄存器复位时相应功能默认8位Byte型,所以如果是8位位宽,可以设置也可以不设置。
(未完待续)
|