先楫

总线型伺服器是指利用总线技术将多个伺服驱动器、传感器、控制器等连接在一起,形成一个整体控制系统,实现了伺服系统的联动控制和数据传输。这种集成化的控制方式不仅提高了系统的可靠性和响应速度,还显著降低了系统的维护成本,实现智能化生产,是现代工业自动化系统中不可或缺的关键组成部分。

国产高性能微控制器产品及解决方案服务商——上海先楫半导体科技有限公司(先楫半导体,HPMicro)研制的HPM6E00伺服驱动器方案是一款采用德国倍福正版授权ESC芯片,支持标准EtherCAT通讯、符合CiA402协议,具备FOE+OTA功能和完整的三环控制功能,完全开源的伺服驱动器方案。该方案成熟及完整度高,以量产为目标,高性价比优势明显,达到国内伺服行业的主流产品标准,能极大降低伺服产品的开发难度,有效缩短产品上市时间。

先楫HPM6E00伺服驱动器支持单相AC~90V- AC~253V 电源供电,配合100W~750W 高响应伺服电机(电机搭配17位绝对值编码器),实现全闭环功能,电机运行安静平稳。该方案支持适配电机、支持EtherCAT总线控制,支持DI输入和DO输出,具备过流、过压、过载等保护。该方案应用于电子制造、锂电、机械手、包装、机床等行业的自动化设备,以其高性能实现快速精确的位置控制、速度控制和转矩控制,提高系统的响应速度和生产效率,降低维护成本,助力企业高效实现生产智能化。

1730776533318296.png

方案特点

  • 采用先楫半导体国产高性能MCU HPM6E80

    - 主频600MHz,双核,性能超过 3390 CoreMark™ 和 1710 DMIPS

    - 支持TSN、千兆工业以太网,支持Beckoff(德国倍福)授权的EtherCAT

    - 硬件电流环,Σ∆ 数字滤波,各种编码器接口,包括旋变解码、多摩川、BISS等

    - 4个2MSPS,16位高精度 ADC

    - 32路100ps高精度PWM信号

  • 支持COE、FOE+OTA等功能

  • 完全开源的软件,包含CiA402、三环控制的源码

  • 配套商用和开源主站:基于HPM6800

  • 支持多种模式:CSP\CSV\CST\PP\PV\HM

  • 完整的位置、速度、力矩三环控制

  • 量产级的参考方案,能帮助客户快速进行产品设计和交付

  • 支持第三方付费定制开发

规格参数:

  • MCU:HPM6E80 (只使用了CPU0)

  • 输入电压范围:AC~90V- AC~253V

  • 额定功率:750W

  • 额定电流:5A

  • 额定转速:3000RPM (根据适配电机)

  • 适配电机:5对极伺服电机

  • 编码器:电机适配17位绝对值编码器(多摩川)

  • 支持通讯方式:EtherCAT (支持CiA402协议)

支持功能:

  • 支持的操作模式:CSP,CSV,CST, PP、PV

  • 丰富的回零HM模式;

  • 位置、速度、力矩三环控制;

  • 上电软起动、掉电电机绕组短路等;

  • 保护功能:过流、过压、欠压、过载、堵转、过热等

2.jpg

HPM6E00 MCU优势

  • 高性能RISC-V双核,主频高达600MHz

  • 高达2MB SRAM

  • 支持TSN网关,3个外部端口+1个内部端口

  • 支持EtherCAT Slave控制器,3个MAC端口

  • 1个千兆以太网MAC控制器

  • 32通道高分辨率PWM控制器,100ps

  • 增量式和绝对值位置传感器接口x4

  • 串行编码器输入/输出:支持多摩川,BISS-C,ENDAT等

  • 8个CAN-FD接口

  • 4个16b SAR ADC

  • 2个4通道ΣΔ滤波器

  • 封装:

    - 289BGA,14x14,0.8pitch

    - 196BGA,12x12,0.8pitch

  • 工作温度TA:-40 ~ 105˚C

3.png

核心硬件功能

EtherCAT高压伺服驱动器是先楫研制的高性能中小功率的直流伺服产品,支持的功率范围为100W~750W,采用以太网通讯接口,支持EtherCAT通讯协议,配合上位机可实现多台伺服驱动器联网运行。

电路设计包含:

  • 电源模块:将AC220V整流成DC310V提供给电机驱动模块。

  • 通讯模块:负责EtherCAT通讯,菜单控制交互,调试交互。

  • 电机控制模块:负责电机驱动, 电机电流采样 ,母线电压采样,编码器读取,故障保护。

1730776731490896.png

软件方案

软件基础流程,参考如下图:

1730776749137909.png

技术与商务支持

目前,先楫半导体HPM6E00伺服驱动器方案Demo已支持测样,整套代码开源可交付。进一步的方案详情与购买事宜,请联系先楫半导体的客户经理及官方代理商。

工业自动化和机器控制的飞速发展对伺服电机系统提出了更高效、更精准的需求,先楫半导体的伺服驱动器方案,借助国内首款获得正式授权的ESC芯片—HPM6E00 高性能MCU,助力客户攻克电机控制难题,缩短开发周期,实现无缝实时通信与功能安全设计。展望未来,先楫半导体将一如既往地关注市场需求,持续推出行业创新的解决方案,助力客户解决复杂多样的系统难题。

6.png

来源:先楫半导体HPMicro

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

围观 39

Buck-Boost简介

Buck-boost是一种非隔离变换器,可以将电源的电压转换为较高或较低的电压输出。它采用开关控制原理,通过周期性地切换电感和电容的连接方式,改变电感储能和释放能量的时间比例来实现电压升降。

1.png

Buck-boost优点:

 ● 可逆性好,控制简单。

 ● 转换效率高。

 ● 控制精度高,输出稳定性好。

 ● 电路驱动成本低。

Buck-boost应用

 ● 非隔离式的电池充放电,例如储能型微逆、分布式光伏(如下图)。

 ● 低压的高效非隔离升压或降压电路。

 ● 为降低电源纹波,多选用多路交错式结构。

2.png

Buck工作模式

当直流母线侧给电池充电时降压输出,工作在buck模式。

根据流过电感L的电流情况(连续或断续),Buck变换器常规三种工作模式:

 ● CCM(Continuous Coduction Mode)

 ● DCM(Discontinuous Conducton Mode)

 ● BCM(Boundary Conducton Mode)

数字电源中主要以CCM为主,本应用重点讲述CCM控制实现。输出电压:

3.png

这里D为PWM占空比。

4.png

( Buck变换器CCM工作波形 )

5.png

6.png

当电池向直流母线放电时升压输出,工作在boost模式。

数字电源中主要以CCM为主,本应用重点讲述CCM控制实现。输出电压:

7.png

这里D为PWM占空比。

8.png

( Boost变换器CCM工作波形 )

9.png

10.png

交错式Buck-Boost工作特点

交错式buck-boost电路是一种多路并联的升降压转换器,利用多个相同的电路模块,通过交错控制方式实现高效率、低纹波、大功率输出的升降压转换。本应用选用了两相交错模式,相位角为180°。

Buck-Boost应用要求

● buck和boost工作模式的主功率管可以通过软件切换,对应死区控制也根据工作模式切换。

● 为了提高效率,buck-boost电路中续流功率管在续流状态时,需要打开功率管;同时在续流电路减小至零点前需要关闭功率管,防止电流反向。

● 由硬件完成监控续流电流并实现续流功率管快速关闭。

● PWM中有效输出状态有跨越PWM周期的情况,针对该应用,PWM输出应不受计数器重载影响。

● 选用PWM中心对齐模式,优化EMC和电路采样精度。

11.png

PWM输出波形

12.png

Buck-boost配置框图

整个驱动中用到了PWM、TRGM、ACMP、PLB等功能模块。

13.png

外设配置

PWM配置

● 两路PWM选择中心对齐模式,其中通道0的中心点为周期/2,通道1的中心点为周期结束点。

● 通道0的主功率管和续流功率管由两个PWM输出分别控制。

● buck和boost模式不同,通道0中的主功率开关对应PWM直接输出通道根据模式可以在PWM0和PWM1直接切换,PWM工作模式为中心对齐模式。

● 通道0中的续流功率管通过PWM8输出互联管理器,在PLB中与ACMP组合产生最终PWM信号。

● 通道1的PWM输出有跨越周期问题,PWM工作模式为边沿输出,由PWM9-PWM12输出至PLB后,根据信号重构PWM。

14.png

模拟比较器ACMP

● HPM5300包含2个模拟比较器。ACMP可以对两个模拟电压输入 (同相端INP) 和反相端 (INN) 进行比较,并输出比较结果。

● ACMP支持内部8位数字模拟转换器DAC,支持外部模拟信号与内部 DAC 生成的参考信号进行比较。

ACMP配置

● ACMP是用于侦测两通道buck-boost输出电流大小。

● 反馈电流信号输入作为反相端输入,内置DAC作为同相端输入。当反馈电流信号过小时,ACMP输出高电平,关闭续流功率管的PWM信号。

● 考虑到开关时干扰,ACMP的回差都设置为最高。

15.png

互联管理器TRGM

● 互联管理器TRGM支持电机控制单元内外各个设备的信号间互通互联,可以把片上各个外设整合起来,实现外设间相互同步,相互配合。

● 互联管理器支持多个输入,输入来自于IO,电机控制单元内外的各个外设。

● 互联管理器支持管理电机控制单元内外设的DMA请求、位置输入切换等。

TRGM配置

● PWM8输入信号的为电平信号。

● ACMP0、ACMP1输入信号为电平信号。

● PWM9、PWM10、PWM11、PWM12为重构PWM信号,输入信号是上升沿有效。

● PLB的OUT0输出是与ACMP0组合后的PWM输出信号,同时配置给TRGM_IO0和TRGM_IO1,由具体应用确定pimmux中配置。

16.png

PLB的主要特性:

● 包含两种可编程类型:TYPE_A为4输入、4输出的查找表,TYPE_B包含4输入、逻辑处理单元用于时序控制。

● HPM5300中包含4个TYPE_A和4个TYPE_B。

● 本应用使用了4个TYPE_A。

17.png

18.png

TYPE_A0、TYPE_A1综合PWM和ACMP

● 包含3个输入、2个输出,其中,3个输入为ACMP输出、自锁信号、PWM电平信号,2个输出为自锁信号、续流功率管驱动信号。

● 输出自锁信号为ACMP输出的锁存信号,即一旦ACMP在PWM有效时间内出现有效信号将一直锁定,直至PWM信号无效时解除。

● 续流功率管输出信号由PWM与输出自锁组合实现。

● TYPE_A由查找表实现,需通过真值表完成逻辑配置见下图。

19.png

TYPE_A2、TYPE_A3逻辑说明

● PWM中心对齐的模式下要求:STA<cmp0<cmp1<rld,当pwm有效状态跨越周期时无法满足该要求。plb通过type_a2、type_a3实现了pwm重构,完成跨周期输出。

● TYPE_A2包含4个输入、1个输出,4个输入为PWM前沿输出、PWM后沿输出、PWM互补前沿输出、自锁信号,1个输出为自锁信号。

● 输出自锁信号在PWM前沿输入后自锁,在PWM后沿输入解锁。其中,PWM互补前沿输入的用于一个通道的两个功率管驱动信号之间的互锁。

20.png

TYPE_A特点

● 每个TYPE A通道有四个trig_in, 四个trig_out

● 每个trig_out对应一个查找表LUT

● 可通过sw_inject将输出注入到trig_out

● 注入保持一个时钟周期

TYPE_A配置

● SDK中plb_type_a_inject_by_sw()函数完成软件注入,实现初始化输出。

● LUT查找表逻辑赋值函数为plb_type_a_set_lut(),可以配置不同通道和不同查找表,达到逻辑输出功能。

21.png

占空比更新

● 为了减少CPU的占用,程序将PWM中比较器CMP0-CMP7的数据存储于高速RAM中,PWM_DMA_struct.PWM_cmp_mirror[0]-PWM_DMA_struct.PWM_cmp_mirror[7]。通过DMA更新PWM寄存器,限于篇幅限制,本文不再赘述。

● 由于PWM没有配置成互补输出模式,需要软件实现死区配置,其中前后沿的死区为单独参数,可以配置不同的数值,PWM_DMA_struct.Front_Dead、PWM_DMA_struct.Post_Dead。此外,例程中包含了占空比限幅,如果在前期计算时占空比时已经对占空比限幅,可以忽略相应限幅处理。

● 浮点运算中需在浮点常数后面加f,否则会增加定点转浮点运算。

● 例程选用的是硬交错方案,即两路输出的中心点强制相差180°。但外设配置同样支持软交错方案,需修改占空比函数。

22.png

输出波形

23.png

buck模式下波形输出

24.png

buck模式下ACMP动作后波形输出

25.png

boost模式下波形输出

26.png

boost模式下ACMP动作后波形输出

小结

● 该操作方法实现了硬件快速续流控制功能,集成度高且阈值数字可控,优化成本和面积。

● 结合PLB功能,令buck-boost模式切合更加自由。

● PWM模块与PLB结合,可以轻松克服单时基PWM模块实现跨周期输出问题,该功能同样适用于单PWM模块的移相控制。

● 两相交错输出,减少纹波,增加EMC能力。

● 强大的DMA功能,减少了读取外设寄存器的时间,并通过硬件触发省去了CPU对寄存器赋值时间。

● HPM5300系列高性价比MCU,运算速度快,在数字电源控制中更加自如。

来源:先楫半导体HPMicro

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

围观 74

贾 工(先楫资深FAE工程师):12年产品研发经验,具有变频器、伺服等工业产品开发经验,也负责过激光投影显示系统开发、AI应用开发、PYQT、Linux驱动开发等工作。

概 述

高速缓存(Cache)主要是为了解决CPU运算速度与内存(Memory)读写速度不匹配的矛盾而存在, 是CPU与存储设备之间的临时存贮器,容量小,但是交换速度比内存快。内置高速缓存通常对CPU的性能提升具有较大作用。

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

1.png

这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。HPM CPU访问片上的Cache内数据是零等待的,这大大节省了CPU直接读取内存数据的时间,使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后存储设备。

一、Cacheable Memory 相关概念 

在访问HPM片上ILM与DLM(Local Memory)时,芯片物理结构决定了CPU不会使用Cache去缓存Local Memory的数据。访问其它存储设备如flash、sram、sdram等,则Cache可以发挥其缓存机制来加快访问速度。在Cache生效的地址空间内,用户可以设置Memory的物理存储属性来设置是否对指定的地址空间使用Cache。

2.png

PMA(Physical Memory Attributes)是指一段存储地址空间的可读写、可执行、可缓存等属性。读、写、执行等属性容易理解,此处不赘述。下面介绍几个其它属性及相关的概念。(注意:HPM5300系列不支持PMA设置)

首先介绍一些Cache基本概念。

1. Cache Line/dirty/invalidate

Cache Line:一次最少缓存多少字节的数据是有要求的,通常以Cache Line为单位。HPM6000系列MCU Cache Line为64byte,HPM5300系列MCU Cache Line为32byte。在进行PMA设置时,要求起始地址按Cache Line字节数对齐,大小为Cache Line大小的整数倍。声明数组时最好也遵循此规则。

Dirty:表示某Cache Line的数据是否与Memory保持一致,如果只将数据写入Cache而没有写入Memory,会将该Cache Line标记为dirty。

Invalidate:将某地址范围的Cache Line数据失效掉,当Cache Line状态被Invalidate时,不管读取是否命中,CPU都会到Memory拿数据。

对Cache的标准操作包括 write-back,invalidate,flush。

Write-back表示把cache内dirty的数据写入Memory,invalidate表示忽略某地址范围的Cache line,flush操作则先对某Cache Line 进行write-back操作,再进行invalidate操作。HPM SDK的hpm_l1c_drv.h文件提供了这3种操作的接口函数。

2. Bufferable

Bufferable是指MCU在写入一片内存区时,是否可使用Write buffer进行加速。例如向sram内写入64个字节:

1)不使用Bufferable:CPU等待64字节数据写入完成后再去执行其它指令;

2)使用Bufferable:CPU将64字节数据写入Write buffer,不等Write buffer内的数据写入sram,CPU就去执行其它指令;写入动作则自动进行直至完成。

3. Cacheable

Cacheable与 non-Cacheable,决定了CPU是否启用缓存特性。如果启用Cacheable特性,则HPM芯片上的内存区域可以分区指定PMA,可选的属性选项如下(详细信息可参考先楫官方文档HPM6200 UM 2.8章节):

Write-Back

Write-Back(与Write-Through互斥)是指向存储设备内写数据命中时,CPU将数据写入Cache,并不立马向存储设备写入数据,如下图所示:数据先写入到Cache内(①),在Cache内标记该Cache Line为dirty,即表示该Cache Line内容与Memory内容不符;Cache内数据写入Memory(②),则在Cache Line被替换或手动执行write-back操作或flush操作时(把dirty的数据写入Memory)才执行。

未命中时,则写入Memory。是否写入Cache 由xxx-Allocate决定。

3.png

Write-Through

Write-Through(与Write-Back互斥)是指向存储设备内写数据时,无论命中与否,CPU都将数据写入Memory。

命中时,数据同时写入Cache 与Memory;

未命中时,数据写入Memory,是否写入Cache 由xxx-Allocate决定。

xxx-Allocate

xxx-Allocate则用于控制读/写未命中Cache时,是否要在Cache内申请Cache Line用于缓存读/写的数据。例如:

Read-Allocate代表读未命中时,CPU不只从Memory将数据读入,还将数据在Cache放了一份,那么下次再读的时候就不用去Memory读了;

Write-Allocate代表写未命中时,会在Cache内分配Cache Line储存写入的数据,那么下次读的时候就可以从Cache读了;具体是否写入Memory取决于使用的是Write-Back还是Write-Through。

Non-Allocate和 Read-and-Write-Allocate就不再进行解释了。

/* Init noncachable memory */    
extern uint32_t __noncacheable_start__[];    
extern uint32_t __noncacheable_end__[];    
start_addr = (uint32_t) __noncacheable_start__;    
end_addr = (uint32_t) __noncacheable_end__;    
length = end_addr - start_addr;    
if (length > 0) 
{       
    /* Ensure the address and the length are power of 2 aligned */        
    assert((length & (length - 1U)) == 0U);        
    assert((start_addr & (length - 1U)) == 0U);        
    pmp_entry[index].pmp_addr = PMP_NAPOT_ADDR(start_addr, length);        
    pmp_entry[index].pmp_cfg.val = PMP_CFG(READ_EN, WRITE_EN, EXECUTE_EN, ADDR_MATCH_NAPOT, REG_UNLOCK);        
    pmp_entry[index].pma_addr = PMA_NAPOT_ADDR(start_addr, length);        
    pmp_entry[index].pma_cfg.val = PMA_CFG(ADDR_MATCH_NAPOT, MEM_TYPE_MEM_NON_CACHE_BUF, AMO_EN);        
    index++;
}
pmp_config(&pmp_entry[0], index);

以上代码设置了__noncacheable_start__至__noncacheable_end__地址范围内的存储区域PMA属性为noncacheable,bufferable。

通过以上解释,相信开发者可以看懂UM手册内的相关描述了,以HPM6200系列为例,User Manual v2.0 2.8章节的内容对PMA有详细描述。

二、HPM L1-Cache相关函数 

HPM系列芯片L1-Cache分为 iCache与 dCache,指令缓存与数据缓存。开发者们经常遇到的问题是开启dCache导致的CPU拿到的数据与Memory内数据不一致(Cache内的数据与Memory不一致时,读取命中Cache会发生这样的结果)。因此,此处主要介绍 dCache相关函数。

打开hpm_l1c_drv.h文件即可看到先楫提供的Cache相关的函数,部分如下:

*
* @brief D-cache disable
*/
void l1c_dc_disable(void);
/*
* @brief D-cache enable
*/
void l1c_dc_enable(void);
/*
* @brief D-cache invalidate by address
* @param[in] address Start address to be invalidated
* @param[in] size Size of memory to be invalidated
*/
void l1c_dc_invalidate(uint32_t address, uint32_t size);
/*
* @brief D-cache writeback by address
* @param[in] address Start address to be writtenback
* @param[in] size Size of memory to be writtenback
*/
void l1c_dc_writeback(uint32_t address, uint32_t size);
/*
* @brief D-cache invalidate and writeback by address
* @param[in] address Start address to be invalidated and writtenback
* @param[in] size Size of memory to be invalidted and writtenback
*/
void l1c_dc_flush(uint32_t address, uint32_t size);
/*
* @brief D-cache fill and lock by address
* @param[in] address Start address to be filled and locked
* @param[in] size Size of memory to be filled and locked
*/
void l1c_dc_fill_lock(uint32_t address, uint32_t size);
/*
* @brief Invalidate all icache and writeback all dcache
*/
void l1c_fence_i(void);
/*
* @brief Invalidate all d-cache
*/
void l1c_dc_invalidate_all(void);
/*
* @brief Writeback all d-cache
*/
void l1c_dc_writeback_all(void);
/*
* @brief Flush all d-cache
*/
void l1c_dc_flush_all(void);

l1c_dc_disable:关闭dCache。此函数特别有用,在debug时如果怀疑是Cache导致的问题,在main函数开始关闭dCache再次运行即可排查是否是Cache导致的问题。注意,如果是用户程序运行过程中关闭dCache,需要在关闭前将执行l1c_dc_writeback_all,保证Cache数据写入Memory。

l1c_dc_enable:开启dCache。

l1c_dc_invalidate:将某地址范围内的Cache Line失效掉。无论某地址在Cache内是否命中,CPU会从Memory内拿数据。

l1c_dc_writeback:将Cache内数据写入某Memory地址。如果该地址在Cache内,则将该Cache Line写入Memory,并清除dirty标志。

l1c_dc_flush:该函数等于 l1c_dc_writeback + l1c_dc_invalidate,把数据写入到Memory并标记为invalidate,表示下次从Memory拿数据时不走Cache。

l1c_fence_i:将dCache内的数据全部writeback,将iCache内所有Cache Line invalidate。一般关闭Cache前会手动调用此函数。

l1c_dc_invalidate_all、l1c_dc_writeback_all、l1c_dc_flush_all:代表操作整个Cache中的Cache Line,具体含义不再赘述。

三、经验分享 

l1c_dc_writeback:一般非CPU的总线host,如DMA访问某Memory地址前,通过l1c_dc_writeback将Cache内的数据写到Memory,保证DMA拿到的数据与CPU看到的数据是一致的。

例如I2C_DMA例程:

/* setup i2c dma tx */
#if PLACE_BUFF_AT_CACHEABLE  
if (l1c_dc_is_enabled()) 
{      
    /* cache writeback before DMA sent data */      
    l1c_dc_writeback((uint32_t)tx_buff, TEST_TRANSFER_DATA_IN_BYTE);  
}
#endif  
stat = i2c_tx_trigger_dma(TEST_I2C_DMA,                          
                            TEST_I2C_DMA_CH,                          
                            TEST_I2C,                          
                            core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)tx_buff),                          
                            TEST_TRANSFER_DATA_IN_BYTE);  
if (stat != status_success) 
{      
    printf("i2c tx trigger dma failed\n");      
    while (1) {      
    }  
}

在DMA将tx_buff数据搬到I2C的发送寄存器之前,进行了writeback。

l1c_dc_invalidate:一般CPU在读取Memory数据时,如果该数据被其它总线host如DMA操作过(一般是DMA搬了某些数据过去),为了能读到Memory中的数据而不是Cache中的数据,要在读取之前对Cache Line进行invalidate处理(多数开发者遇到的都是这个问题)。

例如I2C_DMA例程:

/* setup i2c dma rx */

  stat = i2c_rx_trigger_dma(TEST_I2C_DMA,

                          TEST_I2C_DMA_CH,

                          TEST_I2C,

                          core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)rx_buff),

                          TEST_TRANSFER_DATA_IN_BYTE);

  i2c_master_start_dma_read(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, TEST_TRANSFER_DATA_IN_BYTE);

  i2c_handle_dma_transfer_complete(TEST_I2C);

#if PLACE_BUFF_AT_CACHEABLE

  if (l1c_dc_is_enabled()) {

      /* cache invalidate after DMA receive data */

      l1c_dc_invalidate((uint32_t)rx_buff, TEST_TRANSFER_DATA_IN_BYTE);

  }

#endif

  check_transfer_data();

在进行check_transfer_data之前,先对数据进行了l1c_dc_invalidate处理。

l1c_fence_i:一般在CPU关闭Cache之前,或程序跳转之前(一般二级boot选择好要执行的固件进行跳转),为了保证所有dirty的Cache Line写入到Memory中,会进行l1c_dc_writeback_all,然后等 l1c_dc_writeback_all执行完毕后再跳转。

例如tinyuf2例程:

void uf2_board_app_jump(void)
{
    fencei();  
    l1c_dc_disable();  
    l1c_ic_disable();
       
    __asm("la a0, %0" ::"i"(BOARD_FLASH_APP_START + 4));  
    __asm("jr a0");
}

uf2_board_app_jump函数在跳转前,执行了fencei,本质上就是l1c_fence_i。

另外,在执行writeback操作期间中断不可用,对实时性要求高的场景应进行合理规划l1c_dc_writeback_all的使用。

四、文末小结 

Cache能大幅提高程序运行性能,但用不好Cache也会给开发者带来各种“奇奇怪怪”的问题现象。在阅读本文后,希望开发者对先楫的 L1-Cache有更深入的理解,使用先楫半导体高性能 MCU系列产品开发项目时,能更加得心应手。

来源:先楫半导体HPMicro

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

围观 382

一、概述

在上一篇杂谈文章《[HPM杂谈]你想要了解的先楫hpm_sdk开发都在这里系列 (一)》,大概分析了先楫通用单片机开发与其他国产单片机的开发差异,以及开发优劣势。刚好在这个月底,先楫官方发布了新的SDK版本,也就是hpm_sdk 1.3.0版本。

与此同时也发布了window端的sdk_env,其可视化构建界面功能更为方便操作,在这个构建工具支持hpm_sdk之外构建自己的application应用。

因此,本文章主要阐述最新发布的window端的sdk_env的构建工具使用以及开发者自身app开发,对于其他的命令操作,以及linux端和mac端等,不在本文阐述范围内。

二、开发步骤

(一) 下载链接

在开始之前,需要知道hpm_sdk和hpm_env的下载的链接:

1、hpm_env仓库,此仓库是windows端的开发环境配置套件,里面包含了编译链以及相关构建工具,以及项目可视化构建工具,本文以该仓库进行阐述使用说明。

gitee: https://gitee.com/hpmicro/sdk_env.git

github: https://github.com/hpmicro/sdk_env.git

该env使用可以参考下其readme文档:https://gitee.com/hpmicro/sdk_env/blob/main/README_zh.md

2、hpm_sdk仓库,此仓库master分支就是最新的版本,需要以往的版本可以切到tags。不包含编译链和相关构建所需要的工具,工具链和环境变量需要自行配置。

gitee: https://gitee.com/hpmicro/hpm_sdk.git  

github: https://github.com/hpmicro/hpm_sdk.git

(二)安装驱动

目前先楫的官方评估板都是自带的ft2232进行jtag调试,如果以往没安装过此驱动,需要自行在tools/FTDI_InstallDriver.exe 双击安装。


1.png

(三)start_gui.exe操作使用

1、start_gui.exe是适配hpm_sdk的项目构建可视化工具,开发者无需自行在终端输入命令行进行构建,在界面上操作即可简单构建你所需要的应用程序。

2.png


2、需要先介绍下该工具的整体界面,该介绍部分搬于先楫官方的hpm_env 的readme说明。


3.png

① SDK ENV 设置:此处可手动配置 SDK ENV 路径,点击右上角 Advanced 按钮后,可以对 hpm_sdk 以及 CMake、Ninja 等工具路径进行更详细的配置,比如默认的如下:


4.png

② Board 设置:默认情况下,工具会列出 hpm_sdk/boards 文件夹下所有的开发板。同时,工具也支持加载用户自定义的开发板配置。用户需要首先勾选 Enable User Board Path 复选框启用 User Board 搜索功能,然后选择想要搜索的开发板文件夹,软件会搜索当前文件夹以及第一级子文件夹,当查找到文件夹下存在CMakeLists.txt 以及 与文件夹同名的 yaml 配置文件时,会识别当前文件夹为开发板配置,加入到列表项中。当当前文件夹被识别为开发板配置时,不会再搜索子文件夹。

注意:如果使用自定义 board,CMake 构建过程会尝试在自定义目录下搜索与 board 目录同名的 .cfg 文件作为板级 openocd 的配置文件,若无此文件,openocd 将不会添加任何板级配置文件



5.png

6.png③ Sample 设置:选择了开发板后,工具会根据开发板的yaml配置文件自动筛选符合条件的 sample。默认情况下,会展示hpm_sdk/samples 文件夹下经过筛选的sample。同时,工具也支持加载用户自定义的 sample 文件夹。用户需要首先勾选 Enable User Application Path 复选框启用 User Applications 搜索功能,然后选择想要搜索的 sample 文件夹,软件会搜索当前文件夹以及所有子文件夹,当查找到文件夹下存在 CMakeLists.txt时,会查找当前CMakeLists.txt是否调用了 hpm-sdk,符合条件的会识别为 sample 文件夹并加入到列表项中。当选择了 sample 之后,会自动识别当前 sample 支持的 build type 类型并加入到列表项中。

7.png

 ④ Output 设置:用户可以在 Output 区域定义工程的构建生成路径。默认情况下,项目会生成在 ${sample}/${board}_${build_type} 文件夹。同时,工具支持选择一个父文件夹,将多个项目生成在当前父文件夹下。该功能需要用户勾选 Use Same Parent Directory 复选框,然后选择一个父文件夹,即 Parent Directory,之后构建生成的项目均会保存在当前文件夹下,Build Folder 为项目文件夹名称,工具会采用${sample}_${board}_${build_type}规则自动生成文件夹名称,用户也可以手动修改文件夹名称。


8.png

⑤ 构建选项:当配置完毕后,用户可点击 Generate Project 按钮开始构建项目,当项目正确构建后,Open Project with IDE按钮会高亮,点击后会用IDE拉起当前项目。同时,工具支持控制台编译,点击 Open Build Console 按钮后,会拉起控制台,该控制台默认加载了 SDK_ENV 的环境变量,可以直接编译程序。


9.png

⑥ 日志窗口:日志窗口会显示当前的日志信息,日志信息支持清空和导出。


10.png

三、开发实战

在实际项目的开发中,肯定更多希望自己的项目独立于hpm_sdk之外,在hpm_env1.3.0之前,start_gui不支持在sdk之外构建,但在这月底发布的1.3.0已经支持,本文就以start_gui来构建的应用程序。如何开发也很简单。

(一)建立好自己的application

这部分由开发者自身应用决定,楼主仅仅抛砖引玉。在本文,楼主新建以下文件夹和相关文件。自己的app可以放在任意文件夹。


11.png

(二)使用sdk env的start_gui指定app工程

打开start_gui.exe,分别开启Enable User Board Path和Enable User Application Path。对应的Path路径指定到(一)的app工程路径。

需要注意:

1、Enable User Board Path:该路径可以是custom board的根目录也可以是custom board目录内的子目录。比如上述的文件夹board根目录,包含了custom board的rc_hpm_evk文件夹。


12.png

那么该栏就可以如下指定:


13.png

注意:custom board内文件必须包含yaml文件,yaml解析不在本文阐述,可以在sdk内的Board拷贝对应的soc的board yaml文件。该文参考的是hpm6750evk2。另外,openocd的board cfg文件也支持自定义,board的cfg也可以参考sdk对应的soc的board,只要对应的custom board有自己的board cfg文件,那么start_gui自动加载,否则保持默认。建议两个文件都进行复制拷贝更名。


14.png

2、Enable User Application Path:该路径可以是app根目录也可以是app的父目录。但建议路径选择自身的app根目录,这样直接start_gui能直接识别application。


15.png

(三)使用sdk env的start_gui生成app工程

完成(二)之后,点击generate project,即可生成对应的先楫支持的IDE平台,比如ses。


16.png

点击Open Project with IDE即可打开对应的IDE。


17.png

注意:生成的IDE平台,比如ses,建议只用来烧录调试所用,option配置这些用cmakelists进行配置,否则下次生成会被覆盖。比如添加drivers里面的6.c文件,直接在cmakelists加入命令


18.png

来源:先楫半导体HPMicro

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

围观 83

一、概述

在操作相关flash器件的时候,需要先发指令再读数据,或者先发指令再发地址再发dummy再读相关数据。而先楫的SPI控制器中,SPI传输包括了命令、地址和数据字段,提供了专用的寄存器来存储这些字段,不需要开发者自行去填充。本文使用hpm6200evk开发板,flash器件是华邦的W25Q64JV。使用hpm_sdk进行开发。

SPI四线模式,统称也就QSPI。

本文是作者在使用先楫的SPI调试flash器件的心得,仅仅作为参考。

二、开发流程

(一)外设引脚初始化

需要初始化下SPI时钟,由于SDK使用的是单线常规模式的SPI,所以引脚上我们还需要初始化IO2和IO3两个引脚。

1.png

2.png

(二)SPI模式初始化

华邦的W25Q64JV使用的SPI模式是mode0或者mode3。这里使用mode0。可以使用sdk的api接口spi_format_init进行初始化

3.png

4.png

(三)SPI频率

先楫的SPI SCLK可以达到80M,这里由于是杜邦线接的flash模块,波形会存在失真,使用该flash可以达到50M的QSPI速度。

使用SDK的spi_master_timing_init api接口进行SPI频率调整。

(四)指令操作(单线模式SPI操作)

1. 华邦相关flash都会有手册,这里使用了SDK的spi_transfer api接口封装了一个指令操作的API。下面根据这个api配合flash器件的手册命令进行说明。

比如使用90命令读取制造商设备ID的时候,使用单线模式,需要先发指令,再发两个dummy,之后就是读取。

5.png

那么使用spi_transfer赋值以下结构体

6.png

cmd_enable:使能命令段传输

addr_enable:使能地址段传输

addr_pahase_fmt:选择是单线模式还是四线模式传输地址

trans_mode:选择的传输模式,比如同时读写,仅写,仅读,写读,读写,写填充读,读填充写等

dmmy_cnt:填充的数量

依靠上述说明,可以使用单线模式,传输模式为填充再读。填充数量为2

7.png

通过波形查看,是没什么问题的。    8.png

从以下可知,单线模式收发指令是没什么问题的。

9.png

(五)读写操作(四线模式QSPI操作)

这里举例读操作,读操作有好几条指令。这里举例使用Fast Read Quad I/O指令,也就是EBh指令。这里需要先发指令,再发地址(地址使用四线模式),再发三个填充dummy,之后再读。

10.png

11.png

擦除指令,可写入指令跟以上类似,这里测试sector0的0页地址。

12.png

对0页的256字节进行1到256赋值,然后再读取,这时候会是0~255 0变化。查看波形可以知道,读写正常。

13.png

三、总结

先楫的spi外设支持常规单线single spi,双线dual spi,四线quad spi。有着专用的操作flash的寄存器。极大方便开发相关flash器件。

以上内容来自先楫开发者的原创分享。

来源:先楫半导体HPMicro

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

围观 142
订阅 RSS - 先楫