0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

经验分享 | DMA助力实时控制

先楫半导体HPMicro 2024-07-18 08:18 次阅读

直接存储器访问(DMA,Direct Memory Access)的优点

· 提高系统效率:通过绕过CPU,DMA显著减少了数据传输对CPU资源的占用,使得CPU能够专注于其他计算任务,提升了系统整体的响应速度和处理能力。

·加快数据传输速度:针对多总线高性能MCU,DMA可以避免不同总线同步问题,提供更高的数据传输速率。

·降低系统延迟:由于减少了CPU参与数据搬运的环节,系统延迟显著降低,这对于实时系统和高性能计算应用至关重要,确保了数据的即时处理和反馈。

·简化软件设计:DMA控制器硬件自动化处理降低了软件层面对数据传输的复杂管理,使得软件设计更为简洁,降低了开发难度和维护成本。

先楫产品中,有大量支持DMA的设备,其中USBEthernetADCDAC等有自己的内部DMA,AHB和AXI总线上还有公共的DMA设备——HDMA、XDMA。

HDMA、XDMA都是多通道DMA,可以通过DMAMUX实现多通道的数据传输。

HDMA、XDMA分别接入AHB和AXI总线,在总线内部传输效率更高,可以支持8-64bit数据宽度的传输。

本文将通过两个应用案例,说明DMA在如何在实时控制中提高系统的稳定性和实时性。

DMA准确控制

下图是典型伺服三环的控制框图,其中编码器是控制的关键反馈,除了准确读取位置之外,还需要通过不同时刻读取位置计算转速。读取位置的时刻在伺服闭环中占非常关键的作用。

357c2184-449b-11ef-817b-92fbcf53809c.png

常见位置读取方式是在定时中断中读取位置,确保读取间隔时刻一致。但由于软件响应时间不确定,读取间隔很难保证一致。

本文通过DMA+链表方式实现HPM6200用串口与多摩川编码器定时通讯的方式。多摩川编码器通讯协议见下图:

35970efe-449b-11ef-817b-92fbcf53809c.png

例程通过PWM定期触发DMA,由DMA启动串口读取动作。DMA动作完成后利用链式传输,可以在处理器不介入的情况下,连续完成多个不同配置的传输任务。

程序中使用了PWM、DMA、UART三个模块

· PWM负责定时输出DMA触发信号;

· DMA接收触发信号后将采样命令写入UART的THR寄存器;

· UART负责收发位置传感器信息,其中接收建议使用硬件idle+FIFO模式。

先楫的UART有硬件收发使能控制,只需要DE设置为有效,485通讯可以自动实现收发方向控制,无须CPU干预。

35aac3a4-449b-11ef-817b-92fbcf53809c.png

HPMICRO

HPM6280集成了9个UART模块:

除了常规配置之外,还支持硬件空闲中断

支持16 字节的 TXFIFO 和 RXFIFO

硬件收发使能自动控制

通过简单配置即可实现2.5Mbps通讯、RS485自动收发使能控制、硬件空闲中断接收数据等功能。

void config_uart(void)
{
hpm_stat_t stat;
uart_config_t config = {0};

/* if TEST_UART is same as BOARD_CONSOLE_BASE, it has been initialized in board_init(); */
uart_default_config(HPM_UART7, &config);
config.baudrate = 2500000UL;
config.fifo_enable = true;
//config.dma_enable = true;
clock_set_source_divider(clock_uart7, clk_src_pll0_clk0, 5);//80Mhz
clock_add_to_group(clock_uart7, 0);
config.src_freq_in_hz = clock_get_frequency(clock_uart7);//clock_get_frequency(clock_uart0);
config.rx_fifo_level = uart_rx_fifo_trg_gt_three_quarters;/* this config should not change *///uart_rx_fifo_trg_not_empty;
config.rxidle_config.detect_enable = true;
config.rxidle_config.detect_irq_enable = true;
config.rxidle_config.idle_cond = uart_rxline_idle_cond_rxline_logic_one;
config.rxidle_config.threshold = 20U; /* 20bit */
stat = uart_init(HPM_UART7, &config);
if (stat != status_success) {
printf("failed to initialize uart\n");
}
//uart_enable_irq(HPM_UART0, uart_intr_rx_data_avail_or_timeout);
intc_m_enable_irq_with_priority(IRQn_UART7, 1);
}

HPMICRO

下面DMA配置启用了链式传输,实现DMA循环触发UART读取位置信息。

构建两个相互链接的 DMA 任务描述符列表。DMA控制器会在完成当前任务描述符的相应任务后,从 ChnLLPointer指向地址取下一个任务描述符。下一个任务描述符又关联当前描述符,如此互锁,无限循环。

描述符中DMA配置目标数据为握手模式,UART设备返回接收数据完毕信号。

为确保uart数据可以准确传输,DMA的高优先级标志位要设置为1。

{
hpm_stat_t stat;
dma_channel_config_t rx_ch_config = { 0 };
dmamux_config(HPM_DMAMUX, ch_num, HPM_DMA_SRC_MOT0_0, true);
/* 1.1 config chain descriptors */
dma_default_channel_config(HPM_HDMA, &rx_ch_config);
rx_ch_config.src_addr = src;
rx_ch_config.src_width = DMA_TRANSFER_WIDTH_BYTE; /* In DMA handshake case, source width and destination width must be BYTE. */
rx_ch_config.src_addr_ctrl = DMA_ADDRESS_CONTROL_INCREMENT;
rx_ch_config.src_mode = DMA_HANDSHAKE_MODE_NORMAL;
rx_ch_config.dst_addr = (uint32_t)&uart_ptr->THR;
rx_ch_config.dst_width = DMA_TRANSFER_WIDTH_BYTE; /* In DMA handshake case, source width and destination width must be BYTE. */
rx_ch_config.dst_addr_ctrl = DMA_ADDRESS_CONTROL_FIXED;
rx_ch_config.dst_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
rx_ch_config.size_in_byte = 1;
rx_ch_config.priority = 1;
rx_ch_config.src_burst_size = DMA_NUM_TRANSFER_PER_BURST_1T; /* In DMA handshake case, source burst size must be 1 transfer, that is 0. */
rx_ch_config.linked_ptr = core_local_mem_to_sys_address(HPM_CORE0, (uint32_t)&descriptors[1]);//link to next dma action
stat = dma_config_linked_descriptor(HPM_HDMA, &descriptors[0], ch_num, &rx_ch_config);
if (stat != status_success) {
while (1) {
};
}

rx_ch_config.linked_ptr = core_local_mem_to_sys_address(HPM_CORE0, (uint32_t)&descriptors[0]);
stat = dma_config_linked_descriptor(HPM_HDMA, &descriptors[1], ch_num, &rx_ch_config);
if (stat != status_success) {
while (1) {
};
}

HPMICRO


在PWM中配置DMA定期触发,配置比较器匹配触发,配置DMA输出使能。


互联管理器TRGM是HPM MCU中非常有特色的外设,可以通过配置实现多个外设的输入输出相互连接,使得多个外设可以相互配合使用。


HPM6200中TRGM支持4个DMA 请求输出,用户可以配置TRGM,从多个DMA请求输入中,选择4个连接到 DMAMUX。本文选择了PWM0的CMP14。

pwm_set_reload(HPM_PWM0, 0, reload);
pwm_set_start_count(HPM_PWM0, 0, 0);
pwm_set_load_counter_shadow_register_trigger(HPM_PWM0,pwm_shadow_register_update_on_modify,0);
/*
* config cmp1 and cmp2
*/
cmp_config[0].mode = pwm_cmp_mode_output_compare;
cmp_config[0].cmp = reload + 1;
cmp_config[0].update_trigger = pwm_shadow_register_update_on_hw_event;

cmp_config[1].mode = pwm_cmp_mode_output_compare;
cmp_config[1].cmp = reload + 1;
cmp_config[1].update_trigger = pwm_shadow_register_update_on_hw_event;

cmp_config[2].mode = pwm_cmp_mode_output_compare;//channel to update compare shadow
cmp_config[2].cmp = reload;
cmp_config[2].update_trigger = pwm_shadow_register_update_on_modify;

cmp_config[3].mode = pwm_cmp_mode_output_compare;//dma trigger channel
cmp_config[3].cmp = reload-100;
cmp_config[3].update_trigger = pwm_shadow_register_update_on_modify;

pwm_get_default_pwm_pair_config(HPM_PWM0, &pwm_pair_config);
pwm_pair_config.pwm[0].enable_output = true;
pwm_pair_config.pwm[0].dead_zone_in_half_cycle = 8000;
pwm_pair_config.pwm[0].invert_output = false;

pwm_pair_config.pwm[1].enable_output = true;
pwm_pair_config.pwm[1].dead_zone_in_half_cycle = 16000;
pwm_pair_config.pwm[1].invert_output = false;

/*
* config pwm
*/
if (status_success != pwm_setup_waveform_in_pair(HPM_PWM0, 0, &pwm_pair_config, cmp_index, cmp_config, 2)) {
printf("failed to setup waveform\n");
while(1);
}
//====================set dma trriger from cmp[14]============================
pwm_config_cmp(HPM_PWM0, 14, &cmp_config[3]);//dma trigger
pwm_enable_dma_request(HPM_PWM0,1<<14);//enable pwm signal output to dma
trgm_dma_request_config(HPM_TRGM0,0,14);//connect cmp14 to HPM_DMA_SRC_MOT0_0

HPMICRO

下图是DMA以20kHz触发UART定期输出的波形,定期输出0X1A,读取多摩川传感器中全部信息。

35b468dc-449b-11ef-817b-92fbcf53809c.png

DMA加速传输

HPM5300、HPM6800、HPM6E00引入了DMAv2,增加了无限循环、DMA传输一半中断,并修改了burst传输长度定义。

下文将列举一个buck-boost电源应用通过DMAv2更新PWM的例子,演示DMA加速传输的方法和效果。

35c37836-449b-11ef-817b-92fbcf53809c.png

例程选用了两路交错buck-boost电路。


高效电源对功率密度有更高的要求,更高的开关频率可以降低主回路中电感和电容体积,实际应用中,中小功率的电源开关频率可达100khz以上,频繁的调节对CPU的运算能力和读写外设的速度有更高的要求。


HPM5300单次写PWM寄存器至少需要5个AHB时钟(HPM6700、HPM6300时间更长),例程使用了8个PWM比较寄存器,CPU时钟为480Mhz、AHB总线为160Mhz,连续写入时至少0.25us,相当于120条CPU clock。


修改PWM刷新方式后,将PWM比较器寄存器的值放入DLM内存中,更新PWM只是占用了CPU 8个访问高速RAM的时间。

HPMICRO

与HPM6200不同,DMAv2直接支持无限循环模式,CHCTRL[CTRL].INFINITELOOP设置为1即可,不需要链表实现无限循环。

将CHCTRL[CTRL].burst_opt配置为1,burst传输个数不再是2的指数次方,可以根据实际需要配置。

PWM配置需要清零SHLK[SHLK],影子寄存器锁定功能。

其它设置与前文配置相同。

void dma_transfer_config(uint8_t DMA_chn, uint8_t PWM_num, uint32_t* CMP0)
{
//---------------configure dma channel-----------------
dma_channel_config_t ch_config = {0};
DMA_chn &= 0x1F;
dma_disable_channel(HPM_HDMA, DMA_chn);//stop channel
dmamux_config(HPM_DMAMUX, DMA_chn, HPM_DMA_SRC_MOT_0, true);//trigger source is from trgms dmacfg0
//dma_reset(APP_GPTMR_DMA);
//---------------configure dma chn0-----------------
dma_default_channel_config(HPM_HDMA, &ch_config);
ch_config.src_addr = core_local_mem_to_sys_address(HPM_CORE0, (uint32_t)&PWM_DMA_struct);//source address
//ch_config.dst_addr = (uint32_t)&HPM_PWM0->CMP[0];//destination address
ch_config.dst_addr = (uint32_t)CMP0;//destination address
ch_config.src_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;//hand shake mode waiting trigger signal
ch_config.src_width = DMA_TRANSFER_WIDTH_WORD;// 32bit
ch_config.src_addr_ctrl = DMA_ADDRESS_CONTROL_INCREMENT;
ch_config.burst_opt = DMA_SRC_BURST_OPT_CUSTOM_SIZE;//burst size is actural number rather than 2^num
ch_config.src_burst_size = PWM_num;
ch_config.dst_width = DMA_TRANSFER_WIDTH_WORD;//32bit
ch_config.dst_addr_ctrl = DMA_ADDRESS_CONTROL_INCREMENT;
ch_config.dst_mode = DMA_HANDSHAKE_MODE_NORMAL;//normal
ch_config.en_infiniteloop = true;//dma will react if transize has been completed
ch_config.size_in_byte = PWM_num*4;
ch_config.linked_ptr = 0;//no link
if (status_success != dma_setup_channel(HPM_HDMA, DMA_chn, &ch_config, true)) {
printf(" dma setup channel failed\n");
return;
}
}

HPM系列MCU包含了强大互联管理器和DMA模块,可以轻松实现外设无限循环的触发DMA,不需要占用CPU时间每次配置DMA触发外设。


DMA直接触发外设动作,将极大提高系统动作的一致性。伺服客户对比之前中断触发读取位置与DMA触发读取位置效果:在2000rpm时,中断触发读取位置得到的计算最大瞬时转速波动为20rpm,改为DMA触发后波动降为2rpm。


微逆应用中,同时变频、变占空比时,通过DMA定时修改PWM比较器和周期寄存器数值消除了同时修改后造成的波形偶发异常问题。


电源应用中,开关频率往往超过100kHz,对CPU的利用率要求更高,且对PWM、ACMP读写频率和内容更多,DMA读写可以有限减轻CPU负担,提高CPU效率。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16608

    浏览量

    347189
  • 存储器
    +关注

    关注

    38

    文章

    7351

    浏览量

    162967
  • dma
    dma
    +关注

    关注

    3

    文章

    552

    浏览量

    99858
  • 实时控制
    +关注

    关注

    0

    文章

    25

    浏览量

    9502
收藏 人收藏

    评论

    相关推荐

    ZYNQ开发案例之DMA控制器系统设计

    断给中断控制器; 5. 拥有8个DMA触发事件并且可以编码控制; 6. 128个(64bit)的MFIFO,在传输的时候读写端可写入到此FIFO; 7. 支持任意内存到内存的传输; 整个系统中的
    的头像 发表于 12-05 10:17 3910次阅读

    28335的McBSP的DMA控制如何实现?

    limited to 16-bit),MCBSP采用DMA控制限制为16位,那么就不能用DMA控制了。外部的AD要实时和DSP通信,那么还
    发表于 06-16 07:21

    DMADMA控制

    DMA(Direct Memory Access)的概念DMA方式不用处理器干预完成M与I/O间数据传送。DMA期间系统总线由其它主模块控
    发表于 12-09 11:03 50次下载
    <b class='flag-5'>DMA</b>与<b class='flag-5'>DMA</b><b class='flag-5'>控制</b>器

    DMA实时图像处理中的应用

    以TMS320C6701 为例,说明在实时图像处理系统中使用DMA 的必要性,同时给出DMA实时图像处理中几种典型的应用例子。
    发表于 04-16 13:59 17次下载

    采用DSP的DMA控制技术分析

    摘要:通过分析TMS320C2XX使用保持(HOLD)操作的直接存储器访问(DMA)和DMA控制器8237-5的工作原理,解决了DSP与8237-5的软硬件接口问题,实现了DMA在数字
    发表于 02-25 12:37 27次下载
    采用DSP的<b class='flag-5'>DMA</b><b class='flag-5'>控制</b>技术分析

    基于DMA控制器的UART串行通信设计

    针对大数据量的串口间通信,在常规的UART串行数据通信的基础上,结合Cortex-M3微控制器中DMA控制器的作用,实现DMA控制的UART
    发表于 04-20 10:54 46次下载
    基于<b class='flag-5'>DMA</b><b class='flag-5'>控制</b>器的UART串行通信设计

    基于DMA的常规弹导航信息实时处理技术_王天宇

    基于DMA的常规弹导航信息实时处理技术_王天宇
    发表于 03-19 19:07 0次下载

    实时图像处理系统的DMA控制器设计

    在分析传统DMA控制器结构的基础上,针对实时图象处理系统的数据传输要求,提出了多端口模块设计、增加RoundRobin通道优先级仲裁算法和优化数据传输通道等优化方法,以提高数据传输速度,并改进了地址产生模式来满足图像算法的要求。
    发表于 12-06 10:43 2288次阅读
    <b class='flag-5'>实时</b>图像处理系统的<b class='flag-5'>DMA</b><b class='flag-5'>控制</b>器设计

    dma控制器芯片8257资料介绍

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 10:23 1.7w次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制</b>器芯片8257资料介绍

    dma控制器由什么组成

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 16:08 5376次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制</b>器由什么组成

    Linux DMA Engine框架的介绍

    此会话描述如何从设备驱动程序在Linux中使用DMA。 这包括内存分配,缓存控制DMA设备控制。 详细介绍了Linux DMA Eng
    的头像 发表于 11-23 06:29 6098次阅读

    dma控制器的组成

    一个DMA控制器,实际上是采用DMA方式的外围设备与系统总线之间的接口电路,这个接口电路是在中断接口的基础上再加DMA机构组成。习惯上将DMA
    的头像 发表于 04-01 16:08 1.1w次阅读

    使用串口绘制实时曲线的使用经验程序说明

    本文档的主要内容详细介绍的是使用串口绘制实时曲线的使用经验程序说明。
    发表于 08-15 17:32 8次下载
    使用串口绘制<b class='flag-5'>实时</b>曲线的使用<b class='flag-5'>经验</b>程序说明

    dma控制器是什么_dma控制器工作方式

    DMA(Direct Memory Access)控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的控制
    发表于 11-15 10:25 1.3w次阅读

    AN3109_用STM32F10x微控制器的DMADMA超时仿真通信外设FIFO

    AN3109_用STM32F10x微控制器的DMADMA超时仿真通信外设FIFO
    发表于 11-21 08:11 0次下载
    AN3109_用STM32F10x微<b class='flag-5'>控制</b>器的<b class='flag-5'>DMA</b>和<b class='flag-5'>DMA</b>超时仿真通信外设FIFO