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 |
|---|---|---|
|
CpuTimer2Regs.TCR.bit.TIE = 1; |
STIMER_enableInterrupt(STIM2, STIM_OVERFLOW); |
|
IER |= M_INT14; |
NVIC_EnableIRQ(STIM2_IRQn); |
|
EINT; |
__enable_irq(); |
|
interrupt void Timer2_ISR(void) __interrupt void Timer2_ISR(void) |
void Timer2_ISR(void); |
|
IER &= ~M_INT14; |
NVIC_disableIRQ(STIM2_IRQn); |
|
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中),如下示例:
在代码中将需要重映射的函数 增加宏定义声明
__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; .... }
编译程序,编译前选择SDK默认的链接脚本
link_flash.sctER_ROM2 0x00000000 0x00008000 { ; place RamFunc to ITCM so speed up execution *(.RamFunc) }
编译成功后查看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擦写操作步骤:
解锁Flash 寄存器
FLASH_unlockRegister关闭Flash写包含
FLASH_disableWriteProtect擦除Flash
FLASH_eraseSectororFLASH_eraseChip写 Flash
FLASH_programming