基于旗芯微FC4150系列的DMA模块介绍

目录

1.概述

1.1 旗芯微FC4150系列芯片DMA特征

1.2 总结

2.功能介绍

2.1 DMA初始化

1)通过配置CR寄存器来得到想要的配置

2)配置DCHPRIn寄存器来配置通道的固定优先级

3)配置EEI寄存器可选通道的使能错误中断

4)配置32字节的CFG寄存器来确定通道请求的服务

5)配置ERQ寄存器来选择通道是否由硬件触发

6)开始通道服务通过配置CFG_CSRn[START]或者硬件请求信号生成

2.2 流程框图

2.3 相关操作

2.3.1 单次请求

2.3.2 多次请求

2.4 DMAMUX

2.4.1 DMAMUX通道模式

2.4.2 DMAMUX配置请求源

2.5 通道触发

2.5.1 inner loop channel trig

2.5.2 out loop channel trig

3.MCAL配置介绍

3.1 EB参数配置介绍

3.2 应用层初始化配置介绍

3.2.1 DMA初始化

3.2.2 使能DMA通道中断

3.2.3 配置DMA通道

3.2.4 使能DMA通道


1.概述

DMA的中文名称是直接内存访问,它不需要CPU的参与,实现数据传输的技术(但是也会占用总线带宽,所以有时候使用DMA虽然会降低CPU负载,但提高访问数据速度并不高)。

1.1 旗芯微FC4150系列芯片DMA特征

·所有数据的传输都是从源地址写入到目标地址,源地址和目标地址以及传输大小都是可编程的

·支持不同地址模式并且支持源地址和目标地址不对齐模块

·通过配置传输配置模块(CFG)实现两层嵌套传输操作,通过定义 inner loop count来设置内部数据传输循环的次数,通过定义 outer loop count来设置外部数据传输循环的次数

·32字节的传输配置模块(CFG)存储在DMA外设的内部内存中为DMA的每个通道服务(即每个DMA通道具有32字节的CFG配置)

·支持三种方式激活DMA的通道

 直接通过软件初始化

 通过连续转换中的通道连接机制进行初始化

 每个通道一个外设请求的硬件机制

·支持通道固定优先级和通道轮询仲裁

·支持可编程的中断请求报告通道完成情况

每个通道都可以独立产生中断,可以在主循环计数完成(或者达到一半主循环完成次数)时产生断言

每个通道的可编程错误结果,被逻辑地加在一起形成一个中断控制器的错误中断

·支持前四个通道的周期性触发方式

·支持多达61个外设卡槽和两个常用卡槽路由到16个DMA通道上通过DMAMUX

·支持DMA ECC功能

1.2 总结

直接存储器访问(DMA)控制器模块,作为一个高度可编程的数据传输引擎,有能力执行复杂的数据传输,从主机处理器的干预最小。它可以灵活地传输数据。主要硬件微控制器构包括三个部分:

·一个DMA引擎,进行源地址和目的地址的计算,并进行从源地址到目的地址的数据移动。

·本地存储器包含16个通道中的每个通道的传输配置。在访问本地内存之前必须初始化。内存的取值范围从CFG_SADDRn到CFG_BLC_CHTRGENYESn (N: 0 ~ 15)。

·直接内存访问多路复用器(DMAMUX)将DMA源路由到16个DMA通道中的任何一个。

2.功能介绍

2.1 DMA初始化

1)通过配置CR寄存器来得到想要的配置

                                                                        图1

寄存器解读:

ACTIVE:   DMA激活状态位:

0:DMA处于空闲状态 

1:DMA处于激活状态,有通道在执行任务

CX: 取消传输位:

0:正常操作,不取消   

1:取消正在传输的DMA,内部循环传输被强制终止,该bit位在取消执行完成后自动清除,取消的作用就像通道正常完成内部转换后一样

ECX: 取消传输产生错误状态位:

0:正常操作,不取消   

1:和CX的区别是该位被置起后会产生错误状态更新到错误状态寄存器里面,如果使能了对应的中断会产生错误中断

EILM:使能内部循环映射:

0:失能内部循环映射,这会导致 DMA_CFG_NBYTES_MLNOn被定义为一个32bits的NBYTES表格,如下图2所示                           

 1:使能内部循环映射,这会使得DMA_CFG_NBYTES_MLOFFYESn被重新定义为一个包含独立使能,offset,以及 NBYTES的表格,如图3所示,细心的朋友会发现这两个表格寄存器的地址是重复的,偏移地址都是0x1008h,所以EILM是否使能决定了你应用哪个表格

                                                                    图2

                                                                    图3

CTM: 连续触发模式 :

0:失能连续触发模式,触发信号会进入通道仲裁来选择哪个通道工作

1:使能连续触发模式,当一个inner loop完成的时候,这时候不会再使用通道仲裁来选择通道,会直接触发通道本身

HALT:                         

0: 正常工作模式                 

1:停止一切新的通道开启,会让上一个通道数据传输完成,手动清0会再次恢复正常工作

HOE:

0:正常工作模式     

1:使能这个位的时候任何产生的错误都会让HALT置位

ERCA:

0: 使用固定通道优先级来仲裁通道   

1:使用轮询仲裁来选择通道

DBGS:

0:在debug模式的时候DMA保持工作 

1:在debug模式的时候会停止新的通道服务,之前的通道会继续执行完成,离开调试模式或者手动清除该bit位会恢复 

2)配置DCHPRIn寄存器来配置通道的固定优先级

                                                                         图4

如图4所示,每个通道(16个通道)都有对应的寄存器设置固定优先级,优先级最大可以设置到16,数值越大,优先级越高

3)配置EEI寄存器可选通道的使能错误中断

                                                                               图5

4)配置32字节的CFG寄存器来确定通道请求的服务

                                                                 图6

5)配置ERQ寄存器来选择通道是否由硬件触发

                                                                           图7

6)开始通道服务通过配置CFG_CSRn[START]或者硬件请求信号生成

2.2 流程框图

通道根据配置的CR[ERCA]bit位确定通道仲裁是固定通道优先级还是轮询仲裁来选择通道。DMA引擎读取整个CFG到所选通道的内部地址路径模块中。在内部总线上作为CFG初始化第一次传输,除非检测到通道配置错误。从源(由CFG_SADDRn定义)到目标(由CFG_DADDRn定义)的传输一直持续到传输CFG_NBYTESn定义的字节数为止。
传输完成后,DMA引擎的本地CFG_SADDRn、CFG_DADDRn和CFG_CLCn被写回主CFG内存并且内部循环通道触发中断(如果启用)。如果外部循环完成,则执行进一步的后处理,如外部循环通道触发中断(如果启用)。
下图解释了DMA请求在没有CPU干预的情况下启用一个内部循环传输的过程。DMA仲裁在每个内部循环之后发生,并且可以抢占内部循环。开始循环计数(BLC)设置外部循环中内部循环的数量。

                                                                 

### 关于 FC4150 片 SPI 接口配置 对于 FC4150 片而言,SPI(串行外设接口)是一种同步串行通信协议,允许高速数据传输。为了正确配置该片上的 SPI 功能,建议参考官方提供的技术文档和技术支持资源。 #### 官方技术支持与文档获取途径 官方网站提供了详尽的技术文档和支持服务,访问者可以通过以下方式获得所需资料: - **官网下载中心**:进入官方网站,在导航栏找到“产品”选项下的具体型号页面,通常会提供对应产品的数据手册、应用笔记以及开发指南等文件。 - **技术支持邮箱**:如果遇到特定问题或无法在线找到所需的文档,可以联系的技术支持团队寻求帮助。通过发送邮件至指定的支持邮箱,附上详细的查询请求和联系方式,技术人员会在工作时间内给予回复并指导如何进一步操作。 #### 示例代码片段展示基本设置过程 下面是一个简单的初始化函数示例,用于说明如何在 C 语言环境中对 FC4150 的 SPI 进行基础配置[^2]: ```c void spi_init(void){ // 假定已经完成了必要的硬件连接 /* 设置 GPIO 引脚模式 */ GPIO_SetMode(SPI_SCK_PORT, SPI_SCK_PIN, GPIO_MODE_OUTPUT); GPIO_SetMode(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_MODE_OUTPUT); GPIO_SetMode(SPI_MISO_PORT, SPI_MISO_PIN, GPIO_MODE_INPUT); /* 初始化 SPI 控制寄存器 */ SPI_InitTypeDef SPI_InitStruct; SPI_InitStruct.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 波特率分频系数设定为8 SPI_InitStruct.CLKPolarity = SPI_POLARITY_LOW; // SCLK 空闲状态低电平 SPI_InitStruct.CLKPhase = SPI_PHASE_1EDGE; // 数据捕获发生在第一个边沿 SPI_InitStruct.DataSize = SPI_DATASIZE_8BIT; // 数据宽度为8位 SPI_InitStruct.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先传送 SPI_InitStruct.TIMode = DISABLE; // 不启用 TI 模式 SPI_InitStruct.NSS = SPI_NSS_SOFT; // 使用软件管理NSS信号 SPI_InitStruct.Mode = SPI_MODE_MASTER; // 主设备模式 HAL_SPI_Init(&hspi1,&SPI_InitStruct); // 应用上述参数完成初始化 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值