**背景
在进行日常技术支持时,发现很多研发工程师在产品开发时,也并没有太留意MCU内核级别的一些资源和差异。
在此对M0/M0+、M3内核比较常见、有意思的资源做个简单介绍。
Arm架构区别
通用MCU,如APM32F103系列MCU属于M3内核,APM32F407属于M4内核,而APM32F030/051/072都属于M0+内核。但从Arm架构来做划分,M3/M4都是属于Armv7架构,M0/M0+属于Armv6架构。
架构相同的内核,往往资源上也有很多共同点,而在Armv6架构上的资源,在Armv7架构上往往也能找到。
具体可以参考Arm官方的文档资料,**末尾附件已整理好。
CPUID寄存器
可以通过CPUID寄存器(地址是0x410CC200),读取内核版本相关的的VARIANT(大的版本号)、ARCHITETURE(内核架构版本)、内核型号(M0还是M0+)、RIVISION(小版本号)信息。
比如使用不同厂家的通用F103、F030等MCU,想要在软件上做MCU厂家型号的区别,就可以尝试下用CPUID。有可能不同厂家用的内核版本号是不一样的。
M0/M0+和M3内核的资源差异
抢占优先级
如下图所示,M0/M0+内核的AIRCR寄存器不支持配置中断优先级分组(缺少PRIGROUP配置位),即没法区分抢占优先级和子优先级。
这是Arm内核架构级别(Armv6和Armv7)所决定的。
软复位差异
M0/M0+内核的MCU,只支持整个系统级别的MCU软复位(SYSRESETREQ内核相关的寄存器复位+芯片内部外设寄存器 / 外围电路资源(如内部SRAM)的复位)。但M3/M4内核的MCU,可以额外支持VECTRESET复位,即只复位Arm内核的寄存器(如中断使能配置、优先级配置等)。
VTOR寄存器的支持
以往市面M0级别的MCU,在进行IAP Bootloader升级时,需要经过比较繁琐的中断向量表“重映射”操作:
方案一:先把APP的中断向量表保存到SRAM起始地址,再从SRAM区域做启动偏移(此操作还要把MCU的启动模式,从Flash启动修改成从SRAM启动)。
方案二:在从Bootloader跳转到APP之前,提前把Bootloader部分的中断服务函数地址,手动偏移到APP部分(即根据APP基于Flash基地址的偏移量,同样做中断服务函数地址的偏移)。但要维护好这么一个偏离表,相对累赘。
但在APM32F030系列MCU上,只要灵活使用M0+内核的VTOR寄存器,就可以实现中断向量偏移的操作。Bootloader的设计和操作,也可以参考M3级别的MCU做参考设计了。
|