HPM6200

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

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

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

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

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

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

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

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

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

DMA准确控制

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

1.png

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

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

2.png

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

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

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

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

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

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

3.png

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);
}

(可滑动查看)

下面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) {
        };
    }

(可滑动查看)

在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

(可滑动查看)

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

4.png

DMA加速传输

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

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


5.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的时间。

与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效率。

来源:先楫半导体HPMicro

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 15

一、HPM6200 系列 PLA 整体结构

HPM6200 系列的 UM 中带有 PLA 的结构简图。为了方便大家把握整体结构,我也绘制了一个稍微更详细的结构图,将 PLA 外设中的大部分元素都展示出来,并给出了单个通道内的具体结构。

1.png

从总体来看,PLA 外设拥有 8 输入、8 反馈、8 输出,其中 8 输入、8 反馈是内部的 8 个通道共享,8 输出则是每个通道使用一个。输入、输出均连接到 TRGM 外设,再通过 TRGM 连接到定时器、编码器、外部引脚等地方。需要注意的是,PLA 的 8 输入、8 输出并非全部都能引出至外部引脚中。每个 PLA 外设都连接到一个指定的 TRGM 外设,而每个 TRGM 外设最多仅可连接 12 个外部引脚,同时 TRGM 还可能有其他信号需要接到外部引脚中,如果想要使用更多外部引脚,则还需要使用 TRGM 间连接等方式。因此,在设计 PLA 程序时需要尽可能提前考虑 I/O 安排的问题。

每个 PLA 外设由一个滤波器 FILTER1 和 8 个通道组成,FILTER1 对输入和反馈信号进行滤波后,宽度为 16bit 的信号将同时输入到 8 个通道之中(这个扇出也挺惊人的)。每个通道的输出宽度均只有 1bit,8 个通道合并组成的 8bit 就是 PLA 外设的输出。下面我们将分别对 PLA 滤波器和单个通道进行介绍。

二、PLA 外设中的滤波器

和我们之前介绍过的 PLA 结构相比,HPM6200 系列的 PLA 最大的特点就是多出了一些滤波器。每个 PLA 外设都有一个 FILTER1 滤波器,8 个通道中每个通道还各有一个 FILTER2 滤波器和 FILTER3 滤波器。目前,文档中并没有向我们介绍这些滤波器的设计目的,不过我们也不难从其功能中窥探一二。无论是 FILTER 1, 2 还是 3,他们的功能基本一致:将输入信号经过同步、边沿检测、软件注入和扩展滤波四个环节后输出。

1. 同步

文档中并没有告诉我们同步功能的具体实现方式,不过在这一段描述里面,我们可以大致猜测出很多信息:

FILTER_SYNC_LEVEL 位选择同步器级数,清 0 时为 2 级同步,置 1 时为 3 级同步。根据该位的设置,同步器会将信号延时 2 个或者 3 个时钟周期。

2级、3 级同步可选,听上去就与跨时钟域处理中的同步器很像。比较了解 FPGA 或 IC 设计的朋友知道,同步器是减少亚稳态对逻辑电路影响的一个常用措施,PLA 外设可以接受外部输入的信号,自然也算是一种“跨时钟域”传递信号的过程。同时,增加同步功能还有利于避免出现组合逻辑电路的竞争-冒险,毕竟 FPGA 和 CPLD 开发时有 EDA (尽管 EDA 也不完全可靠)工具帮忙看着,我们在和 PLA 玩耍的时候就没那么好的条件了。因此我们不妨猜测同步功能实际上就是使用 2/3 级触发器构成的同步器。

2. 边沿检测

这一功能很好理解,将边沿转为脉冲,此处不再赘述。

3. 软件注入

这一功能也很好理解:强制将输出设置为高电平或低电平。实际上各逻辑门前的四选一 MUX 也能实现类似的功能,这一功能更多是为可配置触发器 CFF 或者是降低配置复杂度而生的。

4. 扩展滤波

扩展滤波要比上面三个功能复杂得多,文档也并没有讲得特别清楚,下面我将结合实际例子,分别介绍它的四个滤波类型效果。

在开始之前,我们首先要了解 PLA 外设的时钟。PLA 外设挂载在 AHB/APB 总线下,因此也受在 AHB/APB 时钟(默认 200MHz)驱动。在上文提到的同步器同步周期数量中,2/3 级同步就是指的 AHB/APB 时钟的 2/3 个周期。扩展滤波功能最高支持 65535 周期的扩展,对应的 AHB/APB 时钟周期数也为 65535 周期,单个周期的时间为 5ns,这在我们后续的计算中会常常用到。对于 hpm_sdk v1.2 以前的版本,周期数配置部分存在一个小 bug,需在代码中将计算出来的周期数乘二。

(1)输入高电平扩展

这一个模式相对比较好理解:扩展高电平的长度,也就是在输入信号变为低电平以后,输出信号仍会保持高电平,时间为设定的周期数。下图给出了一个例子。输入信号是周期为 80μs,占空比 50% 的 PWM 信号,滤波器设置为输入高电平拓展,周期数为 2000,输出信号较输入信号延迟10μs 变为低电平。

2.png

(2)输入低电平扩展

这一个模式正好与上一个模式相反。下图输入信号仍是周期为 80μs,占空比 50% 的 PWM 信号,滤波器设置为输入低电平拓展,周期数为 2000,输出信号较输入信号延迟 10μs 变为高电平。

5.png

(3)输出状态扩展

这一个模式可以看作是以上两种模式的加和:既延长低电平时间,也延长高电平时间。输入信号发生变化时,输出信号将先在设定的周期数内维持现有状态,结束后跟随输入信号变化。这一模式可以起到两个效果,一是将脉冲宽度小于设定周期数的脉冲全部过滤掉,二是将脉冲宽度大于设定周期数的脉冲延迟设定周期后输出。

下图前半段输入信号是一个脉冲宽度为 40μs 的 PWM 波,输出信号对比输入信号延迟了 10μs;在后半段将输入信号和输出信号对比,则可以发现所有宽度不大于 10μs 的波形都被过滤掉了。

4.png


(4)输入跳变扩展

这一模式下输出信号跟随输入信号变化,但是当输出信号发生过跳变以后,在设定周期数的时间内,输出信号将保持不变,随后输出信号继续跟随输入信号的变化。

下图中前半段滤波器设置的周期数为 2000,对应 10μs 的时间,因此对于半周期 20μs 的 PWM 信号不会产生任何影响;后半段滤波器设置的周期数为 6000,对应 30μs 时间,因此在输入信号从高电平跳变为低电平以后,输出信号还会继续保持高电平直至 30μs 结束。

5.png

三、PLA 外设通道结构

1. 与- 或阵列

每个通道的 16 信号输入会分别接入到 8 个 16 输入与门中,对单个输出信号最高支持 8 个最小项相加(8 个与门),并可生成 7 个输出信号(7 个或门)。每个逻辑门的输入端都有一个四选一 MUX,可选逻辑 1、逻辑 0、原信号和原信号取反四种输入。

2. 可配置触发器

CFF 可被配置为 D 触发器、双边沿 D 触发器、JK 触发器、T 触发器、锁存器、运算器和直接输出信号这几种功能。CFF 的输出即为其所在通道的输出,输出信号宽度 1bit,输入信号宽度则为 7bit,CFF 配置为各类触发器时,触发器的使能、置位、同步/异步复位、时钟等信号均来自于 7bit 宽度的输入信号,具体的分配表可见 UM 文档。除了使用输入信号以外,CFF 还可以使用 AHB/APB 的时钟。

四、如何使用 HPM_SDK 中的PLA驱动

在之前介绍的各种含有 PLA 的芯片基本都会配置对应的 EDA 工具,用户一般可以使用 verilog 编程或者图形化界面编程,由 EDA 工具生成比特流。比如 PSoC 芯片用户可以使用图形化界面编辑状态机的状态转移条件,再由软件完成后端的处理。HPM6200 的 PLA 则没有使用这种开发方式,而是将所有的可配置项均以寄存器的方式暴露给 CPU,CPU 设置好对应的寄存器以后,PLA 即可开始工作。

1. FILTER

滤波器的可配置项非常多,包括是否同步、是否启用边沿检测、是否软件注入等一系列内容,不过最关键的其实是准确把握配置的数量。PLA 中有 1 个 FILTER1、8 个 FILTER2 和 8 个 FILTER3,FILTER1/2/3 中分别有 16/8/7 个信号,每一个信号都可以独立设置上述介绍过的所有滤波功能,也就是共有 136 个信号,很容易错配、漏配。因此,除了所有通道共用的 FILTER1 单独配置以外,FILTER2/3 建议和它们所在的通道一同配置,避免混淆的同时,如果部分通道没有使用,也就不需要对它们的 FILTER2/3 进行配置了。

6.jpg

滤波器的配置结构体是一个位域结构体,使用四个字节保存一个信号的滤波选项,其每个成员的功能结合手册也非常容易理解,注意,配置结构体里面并没有任何关于该配置位于哪个通道、哪个滤波器等位置的信息。结构体填充完成以后,则需要使用以下几个函数完成设置:

7.jpg

这里面实际上有不少容易踩坑的地方。例如 FILTER2/3 都只有一个函数,而 FILTER1 有 in/out 两个函数。实际上 in/out 两个函数分别负责 FILTER1 16 个信号里面前 8 个和后 8 个信号的配置,原因大概是前 8 个是 PLA 的输入信号,后 8 个则是 PLA 的输出信号反馈回来的。

刚刚提到的滤波器配置结构体里面并没有关于位置的信息,因此这些信息要以参数的形式提供给设置函数。以在通道 3 的 FILTER2 为例,使用 pla_set_filter2() 时不仅要写明通道 3,还要指出是 FILTER2 8 个信号中的具体哪一个信号。而 SDK 中通道参数和信号参数分别叫 chn 和 filter2_chn,使用时一定要注意区分两者之间的差别。

2. 与门

16 输入与门本身只有一个可配置的内容:各输入信号的 MUX 选项。不过同样需要注意数量和位置的问题。8 个通道里面,每个通道有 8 个与门,每个与门又有 16 个 MUX。当然,除了没有使用的通道无需配置以外,部分没有使用的与门也可以不进行设置,默认状态下与门将输出低电平。

8.jpg

与门的配置结构体是 pla_aoi_16to8_chn_cfg,可以对一个与门进行配置,记得不要被它名字里面那个 chn 给欺骗了。结构体里面有 pla channel 和 aoi_16to8 channel 两个“通道”成员,一个指的是 PLA 的通道,另一个则是指 8 个与门的编号。个人认为这样设计其实容易混淆,可以在命名方面更加有区分度一些。

一个与门中有 16 个 MUX,因此 pla_aoi_16to8_chn_cfg 里面有长度为 16 的 MUX 配置结构体 pla_aoi_16to8_cfg_unit_t 数组。MUX 配置结构体的 signal 成员是信号的编号;op 成员的四个选项对应 MUX 的四个选项,对应关系在上面的代码注释中给出。

最后我们需要使用以下函数对一个与门进行配置。

9.jpg

3. 或门

或门的代码和注意事项和与门大同小异,数量上一个通道有 7 个或门,每个或门有 8 个 MUX,比与门会少不少,其余部分基本一致,参照使用即可。

10.jpg

4. 可配置触发器

CFF 可配置的内容并不多,主要就是功能选择和时钟源,具体情况可参考源代码。需要注意的是触发器的同步复位、同步置位、异步复位、异步置位等信号有的是高电平有效,有的则是低电平有效,且有优先级顺序,使用时需要对照手册仔细调整。

11.jpg

5. 使能 PLA

在完成上述全部配置完成以后,还需要对每一个通道进行使能。

在没有使能的情况下,PLA 的寄存器可以作为 1KB 的 APB SRAM 使用。

12.jpg

五、一个简单的例子:同步八进制计数器

1. 概述

在前面章节的基础上,我们将实战使用 PLA 构建一个经典的同步时序逻辑电路:同步八进制计数器。为了简化问题让大家更容易理解,我们要构建的计数器只会计数,没有复位、没有使能、没有置数,长得更像是个分频器,它的电路结构如下所示:

13.png

有了电路图,下一步就是将电路结构转换为 PLA 的配置代码。不过,由于 PLA 是与或结构,我们不妨进一步直接将使用到的与门、或门和各种信号都绘制出来,在编码时将会更加方便。

14.png

对照上图,我们可以提炼出以下信息:

· 此电路使用了 3 个 PLA 通道,每个通道的 CFF 均配置为 T 触发器(图上是 JK,实际功能是 T)

· 触发器时钟使用外部时钟PLA OUT0\OUT1\OUT2 分别作为计数器 D2\D1\D3 的输出

· OUT1\OUT2 将作为反馈信号进入通道 1 和 通道 2

2. 工程准备

本部分包括新建工程、使用 GPTMR 产生 1M PWM 作为时钟的代码,本文不打算讨论这一部分内容,读者可以参考 HPM_SDK 中的其他例程了解。为了区分三个通道的设置代码,在 main 函数前声明了三个通道的配置函数。

15.jpg


16.jpg

17.jpg

3. TRGM 与 I/O

PLA 并没有专属于自己的输入输出引脚,和其他增强运动控制系统外设一样,所有输入输出信号都要通过 TRGM 处理。因此,这里的代码将 GPTMR0 CH2 的 PWM 输出引入到了 PLA0 IN0 中,将 PLA0 OUT0/1/2 输出到三个外部引脚中。为了方便对比时钟波形和计数器输出,还将 GPTMR CH2 的 PWM 也输出到外部引脚中。





18.jpg

19.jpg

20.jpg

21.jpg

22.jpg

4. FILTER1

FILTER1 并没有特别的功能需求,因此我们只需要开启同步功能即可。

23.jpg

5. 通道 0

来到通道 0 的配置函数,首先声明与门阵列、或门阵列和两个滤波器的配置结构体变量。

24.jpg

通道 0 使用了两个与门。第一个与门根据两个反馈信号相与生成 T 触发器的 T 信号,先将它的全部 MUX 设为输出逻辑 1,再将反馈通道对应的 9、10 号 MUX 修改为输出原信号。第二个与门只需要输出 PWM 时钟信号,因此只设置一个 MUX 输出原信号,其余全部设置输出逻辑 1。



25.jpg

26.jpg

27.jpg

FILTER2 同样只需要设置同步。

28.jpg

通道 0 使用了两个或门。第一个或门需要输出与第一个与门完全相同的信号,因此 0 号 MUX 设置输出原信号,其余 MUX 输出逻辑 0(注意,没有使用的信号 MUX,一般与门设置输出逻辑 1,或门设置输出逻辑 0),第二个与门也基本一致。



29.jpg

30.jpg

31.jpg

FILTER3 同样设置信号同步,不过不要忘了 FILTER3 同时也输出触发器的同步异步复位置位,我们这个电路没有相关功能,因此全部根据手册设置为固定值即可。如果要使用这些功能,则需要另外构建他们的控制逻辑函数。


32.jpg

33.jpg

最后是 CFF 并使能通道。

34.jpg

其余两个通道配置过程大同小异,就不再复制粘贴那么多次了,完整的代码可在先楫社区中获取。最终的效果如下图所示。

35.png

六、结 语

通过介绍,相信大家对 PLA 已经有了一个较为全面的了解。在 6200 系列刚推出时,许多开发者非常关注的一点就是 PLA 外设能不能当作 FPGA 使用,对此,我个人的看法是“能,但不完全能”。PLA 拥有完备的逻辑结构,但是其资源数量注定只适合小型逻辑使用,尤其是触发器资源的缺乏,使得 PLA 很难单独构建稍复杂的时序逻辑电路。因此我们在开发 PLA 程序之前,对资源数量要把控地比较准确,以免做无用功。

  • 除了底层资源的限制,个人认为,使用方式上 PLA 也有其遗憾之处:

  • 重复的配置代码相当多,开发效率不高,写代码时容易发生错误

  • 无法对内部信号进行调试,对复杂逻辑调试困难

“牵一发而动全身”,难以通过模块化设计等方式复用现有资料

基于以上原因,我认为图形化配置,程序自动生成配置代码将会是 PLA 极好的开发方式:PLA 配置项繁多但并不复杂,代码由机器生成非常合适;图形化配置的方式降低了开发者编写大量重复代码时出错的可能性,还可以通过抽象出电路图的方式协助开发者调试;甚至还可以以此为基础造出 PLA 的模拟器。

当然,即使没有这些,PLA 也仍不失为构建简单逻辑的好工具,也期待有更多开发者给出他们使用 PLA 的姿势与心得,共同学习共同进步。

36.png

来源:先楫半导体HPMicro

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 28

2023年2月17日,高性能嵌入式解决方案领导厂商上海先楫半导体(HPMicro Semiconductor Co., LTD.) 发布全新的通用微控制器HPM6200系列。该系列产品进一步完善先楫产品在工业和汽车应用领域的布局,以超强CPU性能、创新的实时控制外设及工业和车规级品质,为新能源、储能、电动汽车和工业自动化等应用提供了世界级解决方案。用高规格产品推动中国新能源自主可控,先楫再次打开“芯”篇章!

0.jpg

先楫半导体CEO曾劲涛先生表示:“HPM6200系列基于先楫团队多年的产品和应用经验积累,从IP设计,架构到软件均经过优化,是一款拥有完全自主产权的高性能MCU产品。国外大厂在新能源、储能等领域筑起了很高的壁垒,国产MCU要拿下这个市场必须深度理解应用,从芯片性能到整体方案,全面替代国外产品,才有可能真正解决卡脖子的问题。我们期待早日与各领域客户和合作伙伴一起开发迭代出更适合中国应用的方案。”

全新的HPM6200系列共有12产品型号,包括单核和双核产品,提供144 LQFP 及 116 BGA两种封装 (与先楫已量产的HPM6300 系列管脚兼容),有内置闪存(4MB)和无内置闪存选项。HPM6200 全线产品通过AEC-Q100 认证,工作温度范围在-40°C~125°C。更多的产品信息如下:

  • RISC-V 双核支持双精度浮点运算及强大的 DSP 扩展,主频达到600 MHz,性能达到6780 CoreMark和3420 DMIPS,可在1us内完成基于矢量控制的电流控制环路运算。

  • 32KB 高速缓存 (I/D Cache) 和双核共高达 512KB的零等待指令和数据本地存储器 (ILM / DLM),加上256KB 通用 SRAM,极大避免了低速外部存储器引发的性能损失。

  • 4 组8通道增强型 PWM 控制器,其中 2 组高分辨率PWM调制精度高达100ps,提升了系统控制精度,并可实现单芯片控制多轴电机或者单芯片实现复杂拓扑的数字电源。

  • 2 个可编程逻辑阵列 PLA,灵活实现组合逻辑和时序逻辑器件互联,在芯片内实现用户独有的功能电路设计。

  • 3 个 2MSPS 16 位高精度 ADC,配置为 12 位精度时转换率可达 4MSPS,多达 24 个模拟输入通道;4 个模拟比较器和 2 个 1MSPS 12 位 DAC。 

  • Σ-∆数字滤波 SDM,包含 SINC 数字滤波器,可外接4路Σ∆调制器,实现带隔离的高精度电流和电压信号采集。

  • 多种通讯接口: 1 个内置 PHY 的高速 USB,多达 4路 CAN-FD, 4 路 LIN 及丰富的 UART、 SPI、I2C 等。

1.png

HPM6200 沿用并扩展了先楫半导体已有的生态系统,包括全免费的商用集成开发环境Segger Embedded Studio,以及基于BSD许可证的SDK,其中包含了底层驱动、中间件和RTOS, 例如流行的开源项目lwIP, TinyUSB,CherryUSB, FreeRTOS,tensorflow lite for MCU以及完全自主研发的高性能电机控制库等。以上所有官方软件产品都将开源。硬件方面,HPM6200 提供一款性价比极高的EVK。EVK带板载调试接口,客户可直接调试,并支持ART-PI接口及先楫电机通用接口,以方便客户扩展应用和移植方案。零售价 298 人民币。

2.png

(HPM6200EVK开发板)

HPM6200系列产品现已开放接受订单,样片和开发板即刻开始供货。如需订购,可直接通过官网下单,或与您的客户经理和代理商联系,也可邮件至 info@hpmicro.com 或拨打021-5899-3108,更多信息敬请关注公众号“先楫半导体”或访问官网www.hpmicro.com

来源:先楫半导体HPMicro

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 23
订阅 RSS - HPM6200