1. 核架构差异

1.1 概述

ET6000基于ARM Cortex-M7内核,C28x系列基于TI自研RISC指令集内核。由于集成开发环境和SDK的封装极大的屏蔽了CPU操作的差异,所以对用户来说,差异微小。

1.2 指令集差异

虽然ARMv7-M指令集与C28x指令集存在较大的差异,但是由于编译器的隔离,对于应用开发人员,特别是基于C语言开发时,指令间的差异被屏蔽。这里不再一一列出每条指令的区别,而是将一些在C语言环境下开发时,存在指令兼容问题的指令进行特别说明。

功能

C2000

ET6000

说明

空操作

NOP

__NOP()

空闲操作

IDLE

WFI

使能全局中断

EINT

__enable_irq()

禁止全局中断

DINT

__disable_irq()

使能调试事件

ERTM

N/A

Cortex-M7 不支持

禁止调试事件

DRTM

N/A

Cortex-M7 不支持

使能访问受保护的寄存器

EALLOW

N/A

Cortex-M7 不支持

禁止访问受保护的寄存器

EDIS

N/A

Cortex-M7 不支持

设置软件断点

ESTOP0

__BKPT(value)

设置软件断点

ESTOP1

__BKPT(value)

指令同步屏障

N/A

__ISB()

它刷新处理器的管道,以便在 ISB 指令完成后再次从高速缓存或内存 中获取 ISB 之后的所有指令。

数据同步屏障

N/A

__DSB()

在 DSB 指令完成之前,DSB 之后的指令(按程序顺序)不会执行。 当 DSB 指令在完成之前完成所有显式内存访问.

数据内存屏障

N/A

__DMB()

确保在 DMB 指令之前按程序顺序出现的所有显式内存访问在 DMB 指令之后 按程序顺序出现的任何显式内存访问之前完成

1.3 中断

C2000的中断包含C28x 核的中断和外设中断PIE两部分,CPU中断共32个,PIE中断可选择配置映射到CPU的其中12个中断上。Cortex-M7 的中断控制器称为NVIC,最大可支持240个中断的输入。

C2000 中断架构如下:

ARM中断架构如下:

1.3.1 中断向量表差异

C2000和ET6000的中断向量表起始都为reset handle, C2000最多只支持32个硬件中断,ET6000除去系统预留中断,最多可支持240个硬件中断,且绝大部分中断的优先级均可配置。

C2000:

Vector

Priority

Description

RESET

1(highest)

reset

INT1~INT14

5~18

可屏蔽中断, 可映射到PIE

DLOGINT

19(lowest)

Maskable data log interrupt

RTOSINT

4

Maskable real-time operating system interrupt

NMI

3

不可屏蔽中断

ILLEGAL

Illegal-instruction trap

USER1~USER12

用户自定义的软件中断

ET6000:

Vector

Priority

Description

RESET

-3(highest)

reset

NMI

-2

不可屏蔽中断

Hard Fault

-1

硬件错误中断

MemManage Fault

Programmable

系统中断

Bus Fault

Programmable

总线错误中断

Usage Fault

Programmable

用户错误中断

SVC

Programmable

SuperVisor Call,可用于操作系统访问系统服务

Debug Monitor

Programmable

debug monitor

PendSV

Programmable

Pendable service call,可用于操作系统上下文切换

SYSTICK

Programmable

System Tick Timer , 可用于操作系统滴答

USER1~239

Programmable

留给外设的中断,共240个。

1.3.2 使用差异

步骤

C2000

ET6000

  1. 使能外设内部中断

CpuTimer2Regs.TCR.bit.TIE = 1;

STIMER_enableInterrupt(STIM2, STIM_OVERFLOW);

  1. 使能外设中断

IER |= M_INT14;

NVIC_EnableIRQ(STIM2_IRQn);

  1. 使能全局中断

EINT;

__enable_irq();

  1. 中断服务函数

interrupt void Timer2_ISR(void) __interrupt void Timer2_ISR(void)

void Timer2_ISR(void);

  1. 关闭外设中断

IER &= ~M_INT14;

NVIC_disableIRQ(STIM2_IRQn);

  1. 关闭全局中断

DINT;

__disable_irq();

1.4 时钟和复位

1.4.1 时钟

C2000和ET6000均支持多种时钟输入源选择:

  • Internal Oscillator

  • External Oscillator

  • Auxiliary Clock Input

部分ET6000型号支持CAN时钟源支持 AUXCLKIN和XO时钟输入

ET6000的PLL配置由SDK完成,不建议用户自行修改。

另外ET6000系列外设同样支持模块时钟门控,使用时应先打开外设门控。

1.4.2 复位

C2000和ET6000均支持的复位源有:

  • Power-On Reset

  • Brown-Out-Reset

  • External Reset

  • Watchdog Reset

  • Software Reset

ET6000 不支持 Hardware BIST Reset, NMI watchdog Reset和DCSM Safe Code Copy Reset。

另外ET6000系列外设同样支持模块复位。

1.5 CPU Timer

C2000系列MCU一般都有3个CPU Timer。 而ET6000 CPU核本身自带一个SYSTICK Timer及 2~4个STIMER模块。

C2000

ET6000

Timer0

STIMER0

Timer1

STIMER1

Timer2

SYSTICK

ET6000系列每个Timer都有独立的中断源,且STIMER支持多个门限比较值设置,位宽支持32位或64位。

1.6 内存

1.6.1 存储类型

  • TCM

    • TCM 在物理上是非常靠近CPU核的, 与CPU直接连接

    • TCM包含ITCM和DTCM

    • DTCM 通常用于存储关键变量和经常更新的变量

    • ITCM 通常用于访问关键函数、异常向量表和中断服务程序

    • ITCM和DTCM之间可以相互借用

    • TCM的访问速度远高于SRAM

  • Cache

    • 作为CPU和SRAM/eFlash之间的桥梁,缓存应用程序的部分指令和部分数据

    • 对于应用程序程序员来说,Cache内容是不可见的

    • Cache包含ICache和DCache

    • 开启Cache可以显著提升指令在eFlash中执行的速度

    • 多核或DMA访问场景,需要注意cache一致性

  • SRAM

    • 物理上与CPU核距离较远,通过总线与CPU连接

    • 存储应用程序指令

    • 存储和更新应用程序数据

    • 访问速度高于Flash, 低于 TCM

    • 使用时,建议开启cache

  • eFlash

    • 存储应用程序指令

    • 访问速度最慢

    • 使用时,建议开启cache

TCM

SRAM

eFlash

容量大小

●●

●●●

●●●●●

访问速度

●●●●●●

●●●●

●●●

应用场景

中断服务函数 或实时任务,栈, 算法

存储应用程序指令 存储和 更新应用程序数据

存储和 执行应用程序指令 掉电可以保存

1.6.2 差异说明

C2000

ET6000

相同点

差异点

M0/M1 RAM

TCM

与CPU紧耦合 ,带ECC

C2000: 只有CPU可以访问 ET6001: 单核 :CPU和DMA都可以访问 双核:每个核 只能访问自己的TCM, DMA可访问2个核的TCM

LSx RAM

SRAM

带ECC

C2000: 默认只有C PU可以访问,配置后可 以与CLA共享或CLA独享 ET6001: CPU和DMA都可以访问

GSx RAM

SRAM

带ECC

C2000: CPU,DMA,HIC共享 ET6001: CPU和DMA都可以访问

1.6.3 使用建议

针对一些对执行时间有严格要求的代码段,应用开发者在优化性能时,可优先考虑将此部分代码段重定位到TCM区域中。

ET6000 SDK提供了标准的宏,用户声明函数将重映射到ITCM中(默认在eFlash中),如下示例:

  1. 在代码中将需要重映射的函数 增加宏定义声明__RAM_FUNC

    /* SDK 头文件已定义 */
    #define __RAM_FUNC    __attribute__((section(".RamFunc")))
    
    __RAM_FUNC void Pfc_Isr(void)  /* 只需要增加 __RAM_FUNC 即可 */
    {
      register float dCorrOut;
      register float dLineVoltageV;
      register float dAdPfcVolt;
      register float dRmsOrderA;
      static float dLineVoltageVReg = 0;
      ....
    }
    
  2. 编译程序,编译前选择SDK默认的链接脚本link_flash.sct

    ER_ROM2 0x00000000 0x00008000 {
       ; place RamFunc to ITCM so speed up execution
       *(.RamFunc)
    }
    
  3. 编译成功后查看map文件,已重映射成功

1.7 Flash

  • 芯片上电初始化后,ET6000系列芯片不需要调用Flash_initModule 接口对Flash初始化。

  • ET6000系列芯片上电默认启动地址为Flash bank0的起始地址0x08000000

  • ET6000系列部分芯片的Flash分为PFLASH和DFLASH, PFLASH用于存储程序,DFLASH用于存储数据

  • ET6000系列芯片均支持ECC校验,支持检1bit纠1bit,支持检2bit错误

  • ET6000系列部分芯片支持双bank的芯片,支持OTA BankSwap升级

ET6000系列Flash擦写操作步骤:

  1. 解锁Flash 寄存器 FLASH_unlockRegister

  2. 关闭Flash写包含 FLASH_disableWriteProtect

  3. 擦除Flash FLASH_eraseSector or FLASH_eraseChip

  4. 写 Flash FLASH_programming