本帖最后由 ArterySW 于 2023-4-27 19:49 编辑
AT32F423 DMA使用指南
前言
AT32F423 拥有2 个DMA 控制器(DMA1/DMA2),每个DMA 支持7 个通道且外设的DMA 请求可
映射到任意通道上。本文主要就DMA 的基本功能进行讲解和案列解析。
支持型号列表:
支持型号 AT32F423xx
1 DMA 简介
DMA 控制器的作用不仅在增强系统性能并减少处理器的中断生成,而且还针对32 位MCU 应用程序
专门优化设计。DMA 控制器为存储器到存储器,存储器到外设和外设到存储器的传输提供了7 个通
道。每个通道都支持外设的DMA 请求映射到任意通道上。
图1. DMA 控制器架构
2 DMAMUX 简介
对于如何将外设的DMA 请求映射到任意的数据流通道上,就需要使用到DMAMUX。DMAMUX 针
对每个外设都设计了独有的ID 号,使用者只需要将此ID 号写入对应的寄存器中并打开DMAMUX 功
能即可。DMAMUX 的引入,使得DMA 相较于传统DMA 控制器变得更加灵活,使用者可以随意的
分配7 个通道的使用情况,不必再纠结与某个IP 的DMA 请求只能固定使用在某个或某几个通道
上。
各IP 对应ID 号如下表:
表1. 各IP 对应ID 号列表
注:表格中“DMAMUX 请求”为ID 号;“来源”为各IP 的DMA 请求。
3 DMA 功能解析
3.1 可编程数据宽度
DMA 控制器的通道可支持传输不同数据宽度,byte/halfword/word。通过DMA_CxCTRL 中的PWIDTH
和MWIDTH 位可以对源数据和目标数据的数据宽度进行编程,通常情况下需要设置PWIDTH 和
MWIDTH 位相等,当PWIDTH 不等于MWIDTH 时,会依据PWIDTH/ MWIDTH 设定将资料对齐。
图2. PWIDTH: byte, MWIDTH: half-word
图3. PWIDTH: half-word, MWIDTH: word
3.2 配置DMAMUX
在M2P 与P2M 模式下,必须配置DMAMUX,否则DMA 不会响应外设DMA 请求。DMAMUX 的作
用是为外设的DMA 请求复用通道,即任何一个外设的DMA 请求可以映射到DMA1/DMA2 的任意通
道,这大大增加了DMA 通道分配的灵活性。
配置DMAMUX 比较简单,只需调用专门提供的两个接口函数即可:
/* 使能DMAMUX 功能 */
void dmamux_enable(dma_type *dma_x, confirm_state new_state);
/* 配置DMAMUX 通道 */
void dmamux_init(dmamux_channel_type *dmamux_channelx, dmamux_requst_id_sel_type dmamux_req_sel);
3.3 配置请求生成器模块
在配置了DMAMUX 时,可选择配置DMA 请求生成器模块,模块一共有4 个请求生成器通道。此模
块无需任何传统外设(如TIMER、SPI 等)提供DMA 请求,可通过外部EXINT 输入作为DMA 请求
源输入。
配置请求生成器模块较为简单,只需调用专门提供的接口函数即可:
/* 初始化请求生成器结构体参数 */
dmamux_generator_default_para_init(&dmamux_gen_init_struct);
/* 配置请求生成器结构体 */
dmamux_gen_init_struct.gen_polarity = DMAMUX_GEN_POLARITY_RISING;
dmamux_gen_init_struct.gen_request_number = 4;
dmamux_gen_init_struct.gen_signal_sel = DMAMUX_GEN_ID_EXINT0;
dmamux_gen_init_struct.gen_enable = TRUE;
/* 配置请求生成器 */
dmamux_generator_config(DMA2MUX_GENERATOR1, &dmamux_gen_init_struct);
3.4 配置请求同步模块
在配置了DMAMUX 时,可选择配置DMA 同步模块,模块一共有7 个同步通道。使能此功能后,当
外设产生DMA 请求时,DMA 不会马上响应并传输数据,而是要等待同步信号的到来,当接收到同步
信号后,DMA 才会根据配置传输数据;同步信号可由外部EXINT 输入提供
配置同步模块较为简单,只需调用专门提供的接口函数即可:
/* 初始化同步模块结构体参数 */
dmamux_sync_default_para_init(&dmamux_sync_init_struct);
/* 配置同步模块结构体参数 */
dmamux_sync_init_struct.sync_request_number = 4;
dmamux_sync_init_struct.sync_signal_sel = DMAMUX_SYNC_ID_EXINT0;
dmamux_sync_init_struct.sync_polarity = DMAMUX_SYNC_POLARITY_RISING;
dmamux_sync_init_struct.sync_event_enable = FALSE;
dmamux_sync_init_struct.sync_enable = TRUE;
/* 配置同步模块 */
dmamux_sync_config(DMA2MUX_CHANNEL4, &dmamux_sync_init_struct);
4 DMA 配置解析
以下对DMA 的配置接口及流程进行说明。
4.1 函数接口
表2. 通道配置函数列表
/* 复位通道 */
void dma_reset(dma_channel_type *dmax_channely);
/* 初始化DMA 结构体参数 */
void dma_default_para_init(dma_init_type *dma_init_struct);
/* 初始化通道 */
void dma_init(dma_channel_type *dmax_channely, dma_init_type *dma_init_struct);
/* 使能通道 */
void dma_channel_enable(dma_channel_type *dmax_channely, confirm_state new_state);
/* 使能DMAMUX */
void dmamux_enable(dma_type *dma_x, confirm_state new_state);
/* 写入DMA 请求ID 号 */
void dmamux_init(dmamux_channel_type *dmamux_channelx, dmamux_requst_id_sel_type dmamux_req_sel);
/* 初始化DMA 请求生成器模块 */
void dmamux_generator_config(dmamux_generator_type *dmamux_gen_x, dmamux_gen_init_type
*dmamux_gen_init_struct);
/* 初始化DMA 请求同步模块 */
void dmamux_sync_config(dmamux_channel_type *dmamux_channelx, dmamux_sync_init_type
*dmamux_sync_init_struct);
4.2 数据流配置
设置外设地址(CxPADDR 寄存器)
数据传输的初始外设地址,在传输过程中不可被改变。
设置存储器地址(CxMADDR 寄存器)
数据传输的初始内存地址,在传输过程中不可被改变。
配置数据传输量(CxDTCNT 寄存器)
可编程的传输数据长度最大为65535。在传输过程中,该传输数据量的值会逐渐递减。
数据流配置(CxCTRL 寄存器)
包含通道优先级,数据传输的方向、宽度、地址增量模式、循环模式和中断方式。
优先级(CHPL)
分为4 个等级,最高优先级、高优先级、中等优先级和低优先级。
若有2 个流优先级设定相同,则较低编号的流有较高的优先权。举例,流1 优先于流2。
数据传输方向(DTD)
分为存储器到外设(M2P),外设到存储器(P2M)或存储器到存储器(M2M)传输。
在存储器到存储器传输模式下不允许使用循环模式、双缓冲模式和直接模式。
数据传输宽度(PWIDTH/ MWIDTH)
根据实际使用情景,可配置宽度为byte、halfword、word。
地址增量模式(PINCM/MINCM)
当通道配置设定为增量模式时,下一笔传输的地址将是前一笔传输地址加上传输宽度
(PWIDTH/MWIDTH)。
循环模式(LM)
当流配置设定为循环模式时,在最后一次传输后CxDTCNT 寄存器的内容会恢复成初始值。
使能DMAMUX(MUXSEL 寄存器的TBL_SEL 位)
在非存储器到存储器(M2M)模式下时,需要使能DMAMUX 功能,才能启动数据流响应外设
的DMA 请求。
写入外设ID 号(MUXCxCTRL 寄存器的REQSEL)
在非存储器到存储器(M2M)模式下时,需要将外设的DMA 请求ID 号写入,才能启动数据流
响应外设的DMA 请求。
打开数据流(CxCTRL 寄存器的CHEN 位)
4.3 配置流程
打开DMA 时钟;
调用通道复位函数复位数据流;
调用结构体初始化函数初始化通道配置结构体;
调用初始化函数初始化通道;
调用DMAMUX 使能函数以及ID 号写入函数配置DMAMUX 相关内容;
调用通道使能函数开启通道。
更多详细内容请参考附件:
AN0160_AT32F423_DMA_Application_Note_ZH_V2.0.0.pdf
(953.81 KB)
|