[应用相关] AT32F402/405 DMA使用指南

[复制链接]
26|0
MCU学习帮 发表于 2026-6-25 13:22 | 显示全部楼层 |阅读模式
前言
AT32F402/405拥有2个DMA控制器(DMA1/DMA2),每个DMA支持7个通道且外设的DMA请求可映射到任意通道上。本文主要就DMA的基本功能进行讲解和案列解析。
支持型号列表:AT32F402系列/AT32F405系列

备注:本文档仅供有小伙伴们参考,如需更多资料可访问雅特力官网https://www.arterytek.com/cn/support/index.jsp?index=1
1                 DMAMUX简介
对于如何将外设的DMA请求映射到任意的数据流通道上,就需要使用到DMAMUX。DMAMUX针对每个外设都设计了独有的ID号,使用者只需要将此ID号写入对应的寄存器中并打开DMAMUX功能即可。DMAMUX的引入,使得DMA相较于传统DMA控制器变得更加灵活,使用者可以随意的分配7个通道的使用情况,不必再纠结与某个IP的DMA请求只能固定使用在某个或某几个通道上。

2                 DMA功能解析2.1           可编程数据宽度
DMA控制器的通道可支持传输不同数据宽度,byte/halfword/word。通过DMA_CxCTRL中的PWIDTH和MWIDTH位可以对源数据和目标数据的数据宽度进行编程,通常情况下需要设置PWIDTH和MWIDTH位相等,当PWIDTH不等于MWIDTH时,会依据PWIDTH/ MWIDTH设定将资料对齐。

2.2            配置DMAMUX
在M2P与P2M模式下,必须配置DMAMUX,否则DMA不会响应外设DMA请求。DMAMUX的作用是为外设的DMA请求复用通道,即任何一个外设的DMA请求可以映射到DMA1/DMA2的任意通道,这大大增加了DMA通道分配的灵活性。配置DMAMUX比较简单,只需调用专门提供的两个接口函数即可:
  1. /* 使能DMAMUX功能 */
  2. void dmamux_enable(dma_type *dma_x, confirm_state new_state);
  3. /* 配置DMAMUX通道 */
  4. void dmamux_init(dmamux_channel_type *dmamux_channelx, dmamux_requst_id_sel_type dmamux_req_sel);
2.3            配置请求生成器模块
在配置了DMAMUX时,可选择配置DMA请求生成器模块,模块一共有4个请求生成器通道。此模块无需任何传统外设(如TIMER、SPI等)提供DMA请求,可通过外部EXINT输入作为DMA请求源输入。配置请求生成器模块较为简单,只需调用专门提供的接口函数即可:

  1. /* 初始化请求生成器结构体参数 */
  2. dmamux_generator_default_para_init(&dmamux_gen_init_struct);
  3. /* 配置请求生成器结构体 */
  4. dmamux_gen_init_struct.gen_polarity = DMAMUX_GEN_POLARITY_RISING;
  5. dmamux_gen_init_struct.gen_request_number = 4;
  6. dmamux_gen_init_struct.gen_signal_sel = DMAMUX_GEN_ID_EXINT0;
  7. dmamux_gen_init_struct.gen_enable = TRUE;
  8. /* 配置请求生成器 */
  9. dmamux_generator_config(DMA2MUX_GENERATOR1, &dmamux_gen_init_struct);
2.4            配置请求同步模块
在配置了DMAMUX时,可选择配置DMA同步模块,模块一共有7个同步通道。使能此功能后,当外设产生DMA请求时,DMA不会马上响应并传输数据,而是要等待同步信号的到来,当接收到同步信号后,DMA才会根据配置传输数据;同步信号可由外部EXINT输入提供配置同步模块较为简单,只需调用专门提供的接口函数即可.



  1. /* 初始化同步模块结构体参数 */
  2. dmamux_sync_default_para_init(&dmamux_sync_init_struct);
  3. /* 配置同步模块结构体参数 */
  4. dmamux_sync_init_struct.sync_request_number = 4;
  5. dmamux_sync_init_struct.sync_signal_sel = DMAMUX_SYNC_ID_EXINT0;
  6. dmamux_sync_init_struct.sync_polarity = DMAMUX_SYNC_POLARITY_RISING;
  7. dmamux_sync_init_struct.sync_event_enable = FALSE;
  8. dmamux_sync_init_struct.sync_enable = TRUE;
  9. /* 配置同步模块 */
  10. dmamux_sync_config(DMA2MUX_CHANNEL4, &dmamux_sync_init_struct);
3           3. DMA配置解析
以下对DMA的配置接口及流程进行说明。



3.1           函数接口
  1. /* 复位通道 */
  2. void dma_reset(dma_channel_type *dmax_channely);
  1. /* 初始化DMA结构体参数 */
  2. void dma_default_para_init(dma_init_type *dma_init_struct);
  1. /* 初始化通道 */
  2. void dma_init(dma_channel_type *dmax_channely, dma_init_type *dma_init_struct);
  1. /* 使能通道 */
  2. void dma_channel_enable(dma_channel_type *dmax_channely, confirm_state new_state);
  1. /* 使能DMAMUX */
  2. void dmamux_enable(dma_type *dma_x, confirm_state new_state);
  1. /* 写入DMA请求ID号 */
  2. void dmamux_init(dmamux_channel_type *dmamux_channelx, dmamux_requst_id_sel_type dmamux_req_sel);
  1. /* 初始化DMA请求生成器模块 */
  2. void dmamux_generator_config(dmamux_generator_type *dmamux_gen_x, dmamux_gen_init_type *dmamux_gen_init_struct);
  1. /* 初始化DMA请求同步模块 */
  2. void dmamux_sync_config(dmamux_channel_type *dmamux_channelx, dmamux_sync_init_type *dmamux_sync_init_struct);
[url=]3.2            数据流配置n  设置外设地址(CxPADDR寄存器)
数据传输的初始外设地址,在传输过程中不可被改变。
n  设置存储器地址(CxMADDR寄存器)
数据传输的初始内存地址,在传输过程中不可被改变。
n  配置数据传输量(CxDTCNT寄存器)可编程的传输数据长度最大为65535。在传输过程中,该传输数据量的值会逐渐递减。
n  数据流配置(CxCTRL寄存器)
包含通道优先级,数据传输的方向、宽度、地址增量模式、循环模式和中断方式。
Ø  优先级(CHPL
分为4个等级,最高优先级、高优先级、中等优先级和低优先级。
若有2个流优先级设定相同,则较低编号的流有较高的优先权。举例,流1优先于流2。
Ø  数据传输方向(DTD
分为存储器到外设(M2P),外设到存储器(P2M)或存储器到存储器(M2M)传输。
在存储器到存储器传输模式下不允许使用循环模式、双缓冲模式和直接模式。
Ø  数据传输宽度(PWIDTH/ MWIDTH
根据实际使用情景,可配置宽度为byte、halfword、word。
Ø  地址增量模式(PINCM/MINCM
当通道配置设定为增量模式时,下一笔传输的地址将是前一笔传输地址加上传输宽度(PWIDTH/MWIDTH)。
Ø  循环模式(LM
当流配置设定为循环模式时,在最后一次传输后CxDTCNT寄存器的内容会恢复成初始值。
n  使能DMAMUX(MUXSEL寄存器的TBL_SEL
在非存储器到存储器(M2M)模式下时,需要使能DMAMUX功能,才能启动数据流响应外设的DMA请求。
n  写入外设ID号(MUXCxCTRL寄存器的REQSEL
在非存储器到存储器(M2M)模式下时,需要将外设的DMA请求ID号写入,才能启动数据流响应外设的DMA请求。
n  打开数据流(CxCTRL寄存器的CHEN

3.3            配置流程
n  打开DMA时钟;
n  调用通道复位函数复位数据流;
n  调用结构体初始化函数初始化通道配置结构体;
n  调用初始化函数初始化通道;
n  调用DMAMUX使能函数以及ID号写入函数配置DMAMUX相关内容;
n  调用通道使能函数开启通道。

4                 案例  数据从FLASH传输到SRAM4.1           功能简介
实现了使用DMA将数据从片上FLASH搬运到内部SRAM中。
4.2           资源准备
1)     硬件环境:
对应产品型号的AT-START BOARD
2)     软件环境
project\at_start_f4xx\examples\dma\flash_to_sram
4.3           软件设计
1)     配置流程
n 开启DMA外设时钟
n 配置DMA通道
n 开启传输完成中断
n 开启通道
n 等待数据传输完成
n 比较数据传输是否正确
2)     代码介绍

n  main函数代码描述
  1. int main(void)
  2. {
  3.   /* 初始化系统时钟 */
  4. /* initial system clock */  
  5.   system_clock_config();  
  6. /* 板载初始化 */
  7.   /* at board initial */
  8.   at32_board_init();
  9.   /* 打开DMA1时钟 */
  10.   crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);

  11.   /* dma1 通道初始化 */
  12.   dma_reset(DMA1_CHANNEL1);
  13.   dma_init_struct.buffer_size = BUFFER_SIZE;
  14.   dma_init_struct.direction = DMA_DIR_MEMORY_TO_MEMORY;
  15.   dma_init_struct.memory_base_addr = (uint32_t)dst_buffer;
  16.   dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_WORD;
  17.   dma_init_struct.memory_inc_enable = TRUE;
  18.   dma_init_struct.peripheral_base_addr = (uint32_t)src_const_buffer;
  19.   dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_WORD;
  20.   dma_init_struct.peripheral_inc_enable = TRUE;
  21.   dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  22.   dma_init_struct.loop_mode_enable = FALSE;
  23.   dma_init(DMA1_CHANNEL1, &dma_init_struct);

  24.   /* 打开传输完成中断 */
  25.   dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);

  26.   /* dma1 channel1 interrupt nvic init */
  27.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  28.   nvic_irq_enable(DMA1_Channel1_IRQn, 1, 0);

  29.   dma_channel_enable(DMA1_CHANNEL1, TRUE);

  30.   /* wait the end of transmission */
  31.   while(data_counter_end != 0)
  32.   {
  33.   }
  34.   /* check if the transmitted and received data are equal */
  35.   transfer_status = buffer_compare(src_const_buffer, dst_buffer, BUFFER_SIZE);

  36.   /* 判断数据是否正确,正确则点亮LED灯 */
  37.   if(transfer_status == SUCCESS)
  38.   {
  39.     /* turn led2/led3/led4 on */
  40.     at32_led_on(LED2);
  41.     at32_led_on(LED3);
  42.     at32_led_on(LED4);
  43.   }

  44.   while(1)
  45.   {
  46.   }
4.4            实验效果
n  如若数据传输无误,LED2/3/4会点亮。

5                 案例 TMR产生DMA请求将数据从SRAM传输到GPIO5.1           功能简介
本案例介绍TMR产生DMA请求将数据从SRAM传输到GPIOB,可通过逻辑分析仪等仪器查看波形。
5.2           资源准备
1)     硬件环境:
对应产品型号的AT-START BOARD
2)     软件环境
project\at_start_f4xx\examples\dma\dmamux_data_to_gpio
5.3           软件设计
1)     配置流程
n 开启DMA/TMR2/GPIOB外设时钟
n 配置DMA通道
n 配置TMR2开启溢出DMA请求
n 开启传输完成中断
n 开启DMAMUX功能
n 开启通道
n 开启TMR2,使其溢出中断产生DMA请求
2)     代码介绍

n  main函数代码描述
  1. #define BUFFER_SIZE     16
  2. uint16_t src_buffer[BUFFER_SIZE] = {0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
  3.                                   0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010};
  4. Int main(void)
  5. {
  6.   /* 系统时钟初始化 */
  7.   system_clock_config();  
  8.   /* 板载初始化 */
  9.   at32_board_init();
  10.   /* 开启 dma2/gpioc/tmr2 时钟 */
  11.   crm_periph_clock_enable(CRM_DMA2_PERIPH_CLOCK, TRUE);
  12.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  13.   crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
  14.   
  15.   /* config gpiob pin for output mode */
  16.   gpio_init_struct.gpio_pins = GPIO_PINS_ALL;
  17.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  18.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  19.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  20.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  21.   gpio_init(GPIOB, &gpio_init_struct);
  22.   /* 初始化TMR2 */
  23.   tmr_base_init(TMR2, 0xFF, 0);
  24.   tmr_cnt_dir_set(TMR2, TMR_COUNT_UP);
  25.   
  26.   /* 开启 TMR2溢出DMA请求 */
  27.   tmr_dma_request_enable(TMR2, TMR_OVERFLOW_DMA_REQUEST, TRUE);
  28.   
  29.   /* dma2 通道1初始化 */
  30.   dma_reset(DMA2_CHANNEL1);
  31.   dma_init_struct.buffer_size = BUFFER_SIZE;
  32.   dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  33.   dma_init_struct.memory_base_addr = (uint32_t)src_buffer;
  34.   dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
  35.   dma_init_struct.memory_inc_enable = TRUE;
  36.   dma_init_struct.peripheral_base_addr = (uint32_t)&GPIOB->odt;
  37.   dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
  38.   dma_init_struct.peripheral_inc_enable = FALSE;
  39.   dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  40.   dma_init_struct.loop_mode_enable = FALSE;
  41.   dma_init(DMA2_CHANNEL1, &dma_init_struct);
  42.   /* 开启传输完成中断 */
  43.   dma_interrupt_enable(DMA2_CHANNEL1, DMA_FDT_INT, TRUE);
  44.   
  45.   /* dma2 channel1 interrupt nvic init */
  46.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  47.   nvic_irq_enable(DMA2_Channel1_IRQn, 1, 0);
  48.   
  49.   /*开启TMR2的DMAMUX功能 */
  50.   dmamux_enable(DMA2, TRUE);
  51.   dmamux_init(DMA2MUX_CHANNEL1, DMAMUX_DMAREQ_ID_TMR2_OVERFLOW);
  52.   
  53.   /* enable dma channel */
  54.   dma_channel_enable(DMA2_CHANNEL1, TRUE);
  55.   
  56.   /* enable tmr2 */
  57.   tmr_counter_enable(TMR2, TRUE);
  58.   
  59.   while(1)
  60.   {
  61.   }
  62. }
5.4            实验效果
n  通过抓取GPIOB的波形,可查看数据,下面抓取GPIO0-GPIO3的数据。
如下为使用逻辑分析仪抓取的GPIO0-GPIO3的输出波形,依次为程序实现定义buffer内的数据

6                 案例  DMA请求生成器产生DMA请求6.1           功能简介
实现了通过板载按键,使DMAMUX产生DMA请求将数据从源地址传输到目的地址。
6.2           资源准备
1)     硬件环境:
对应产品型号的AT-START BOARD
2)     软件环境
project\at_start_f4xx\examples\dma\dmamux_genertor_exint
6.3           软件设计
1)     配置流程
n 开启DMA外设时钟
n 配置DMA通道,配置DMAMUX请求生成器模块
n 开启传输完成中断
n 开启通道
n 等待数据传输完成
2)     代码介绍

n  main函数代码描述
  1. int main(void)
  2. {
  3.   /* initial system clock */
  4.   system_clock_config();

  5.   /* at board initial */
  6.   at32_board_init();

  7.   /* enable dma2/gpioa clock */
  8.   crm_periph_clock_enable(CRM_DMA2_PERIPH_CLOCK, TRUE);
  9.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  10.   /* config pa1 for input mode */
  11.   gpio_init_struct.gpio_pins = GPIO_PINS_0;
  12.   gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  13.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  14.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  15.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  16.   gpio_init(GPIOA, &gpio_init_struct);

  17.   scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

  18.   exint_default_para_init(&exint_init_struct);
  19.   exint_init_struct.line_enable = TRUE;
  20.   exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  21.   exint_init_struct.line_select = EXINT_LINE_0;
  22.   exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  23.   exint_init(&exint_init_struct);

  24.   /* exint line1 interrupt nvic init */
  25.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  26.   nvic_irq_enable(EXINT0_IRQn, 1, 0);

  27.   /* dma2 channel4 configuration */
  28.   dma_reset(DMA2_CHANNEL4);
  29.   dma_init_struct.buffer_size = BUFFER_SIZE;
  30.   dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  31.   dma_init_struct.memory_base_addr = (uint32_t)dst_buffer;
  32.   dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
  33.   dma_init_struct.memory_inc_enable = TRUE;
  34.   dma_init_struct.peripheral_base_addr = (uint32_t)src_buffer;
  35.   dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
  36.   dma_init_struct.peripheral_inc_enable = TRUE;
  37.   dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  38.   dma_init_struct.loop_mode_enable = FALSE;
  39.   dma_init(DMA2_CHANNEL4, &dma_init_struct);

  40.   /* genertor1 configuration */
  41.   dmamux_generator_default_para_init(&dmamux_gen_init_struct);
  42.   dmamux_gen_init_struct.gen_polarity = DMAMUX_GEN_POLARITY_RISING;
  43.   dmamux_gen_init_struct.gen_request_number = 4;
  44.   dmamux_gen_init_struct.gen_signal_sel = DMAMUX_GEN_ID_EXINT0;
  45.   dmamux_gen_init_struct.gen_enable = TRUE;
  46.   dmamux_generator_config(DMA2MUX_GENERATOR1, &dmamux_gen_init_struct);

  47.   /* enable transfer full data interrupt */
  48.   dma_interrupt_enable(DMA2_CHANNEL4, DMA_FDT_INT, TRUE);

  49.   /* dma2 channel4 interrupt nvic init */
  50.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  51.   nvic_irq_enable(DMA2_Channel4_IRQn, 1, 0);

  52.   /* dmamux function enable */
  53.   dmamux_enable(DMA2, TRUE);
  54.   dmamux_init(DMA2MUX_CHANNEL4, DMAMUX_DMAREQ_ID_REQ_G1);

  55.   /* enable dma channe4 */
  56.   dma_channel_enable(DMA2_CHANNEL4, TRUE);

  57.   while(1)
  58.   {
  59.   }
  60. }
6.4            实验效果
通过板载user按键,每按一次,DMA会传输4个数据到dst_buffer数组,当数据传输16笔时会产生DMA完成中断。

7                  案例  DMA传输数据需等待DMA请求同步信号7.1           功能简介
实现了当TMR产生DMA请求后,需等待通过板载按键输入的同步信号,数据才会从源地址传输到目的地址。
7.2           资源准备
1)     硬件环境:
对应产品型号的AT-START BOARD
2)     软件环境
project\at_start_f4xx\examples\dma\ dmamux_synchronization_exint
7.3           软件设计
1)     配置流程
n 开启DMA外设时钟
n 配置DMA通道,配置DMAMUX同步模块
n 配置TMR
n 开启传输完成中断
n 开启通道
n 等待数据传输完成
2)     代码介绍

n  main函数代码描述
  1. int main(void)
  2. {
  3.   /* initial system clock */
  4.   system_clock_config();

  5.   /* at board initial */
  6.   at32_board_init();

  7.   /* enable dma2/gpioa clock */
  8.   crm_periph_clock_enable(CRM_DMA2_PERIPH_CLOCK, TRUE);
  9.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  10.   crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);

  11.   /* config pa1 for input mode */
  12.   gpio_init_struct.gpio_pins = GPIO_PINS_0;
  13.   gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  14.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  15.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  16.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  17.   gpio_init(GPIOA, &gpio_init_struct);

  18.   scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

  19.   exint_default_para_init(&exint_init_struct);
  20.   exint_init_struct.line_enable = TRUE;
  21.   exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  22.   exint_init_struct.line_select = EXINT_LINE_0;
  23.   exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  24.   exint_init(&exint_init_struct);

  25.   /* exint line1 interrupt nvic init */
  26.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  27.   nvic_irq_enable(EXINT0_IRQn, 1, 0);

  28.   /* dma2 channel4 configuration */
  29.   dma_reset(DMA2_CHANNEL4);
  30.   dma_init_struct.buffer_size = BUFFER_SIZE;
  31.   dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  32.   dma_init_struct.memory_base_addr = (uint32_t)dst_buffer;
  33.   dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
  34.   dma_init_struct.memory_inc_enable = TRUE;
  35.   dma_init_struct.peripheral_base_addr = (uint32_t)src_buffer;
  36.   dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
  37.   dma_init_struct.peripheral_inc_enable = TRUE;
  38.   dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  39.   dma_init_struct.loop_mode_enable = FALSE;
  40.   dma_init(DMA2_CHANNEL4, &dma_init_struct);

  41.   dmamux_sync_default_para_init(&dmamux_sync_init_struct);
  42.   dmamux_sync_init_struct.sync_request_number = 4;
  43.   dmamux_sync_init_struct.sync_signal_sel = DMAMUX_SYNC_ID_EXINT0;
  44.   dmamux_sync_init_struct.sync_polarity = DMAMUX_SYNC_POLARITY_RISING;
  45.   dmamux_sync_init_struct.sync_event_enable = FALSE;
  46.   dmamux_sync_init_struct.sync_enable = TRUE;
  47.   dmamux_sync_config(DMA2MUX_CHANNEL4, &dmamux_sync_init_struct);

  48.   /* enable transfer full data interrupt */
  49.   dma_interrupt_enable(DMA2_CHANNEL4, DMA_FDT_INT, TRUE);

  50.   /* dma2 channel4 interrupt nvic init */
  51.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  52.   nvic_irq_enable(DMA2_Channel4_IRQn, 1, 0);

  53.   /* dmamux function enable */
  54.   dmamux_enable(DMA2, TRUE);
  55.   dmamux_init(DMA2MUX_CHANNEL4, DMAMUX_DMAREQ_ID_TMR1_OVERFLOW);

  56.   /* enable dma channe4 */
  57.   dma_channel_enable(DMA2_CHANNEL4, TRUE);

  58.   /* tmr1 configuration */
  59.   tmr_base_init(TMR1, 5000, 5000);
  60.   tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);

  61.   /* enable tmr1 overflow edam request */
  62.   tmr_dma_request_enable(TMR1, TMR_OVERFLOW_DMA_REQUEST, TRUE);

  63.   /* enable tmr1 */
  64.   tmr_counter_enable(TMR1, TRUE);
  65.   while(1)
  66.   {
  67.   }
  68. }
7.4            实验效果
当TMR产生overflow事件并产生DMA请求,但此时DMA请求不会被响应,只有通过板载user按键,每按一次,会同步4个TMR的DMA请求并将数据传输到dst_buffer数组,当数据传输16笔时会产生DMA完成中断。





[/url]






您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0