【简介】
在开发中经常会有同样的软件需要根据芯片的PART ID进行差分关联的处理,这样就需要软件能获取到当前的CPU 属性的配置信息。
S32K3的寄存器中可以获取到芯片的PART ID 及封装最大运行频率,Flash 属性等基本信息。S32K3 的SIUL2->MIDR1寄存器可以获取到芯片的PartNO信息.


S32K3 的SIUL2->MIDR2寄存器可以获取到芯片最大运行频率,支持的最高运行温度芯片的封装及Flash 大小的信息。

根据上述的信息我们编写如下的测试代码打印芯片的属性信息。
void S32K3_PrintCpuInfo(void)
{
uint32_t reg_midr1 = readl(S32K3_SIUL2_BASE + SIUL2_MIDR1_OFF);
uint32_t reg_midr2 = readl(S32K3_SIUL2_BASE + SIUL2_MIDR2_OFF);
PRINTF("CPU PART S32K3%ld\r\n", ((reg_midr1 & S32K3_SIUL2_MIDR1_PART_NO_MASK) >> S32K3_SIUL2_MIDR1_PART_NO_SHIFT) - 0x136 + 10);
PRINTF("CPU TEMPERATURE max %dC\r\n", ((reg_midr2 & S32K3_SIUL2_MIDR2_TEMPERATURE_MASK) >> S32K3_SIUL2_MIDR2_TEMPERATURE_SHIFT) == 2 ? 105 : 125);
PRINTF("CPU FREQUENCY max %dMHz\r\n", ((reg_midr2 & S32K3_SIUL2_MIDR2_FREQUENCY_MASK) >> S32K3_SIUL2_MIDR2_FREQUENCY_SHIFT) == 3 ? 120 :
(((reg_midr2 & S32K3_SIUL2_MIDR2_FREQUENCY_MASK) >> S32K3_SIUL2_MIDR2_FREQUENCY_SHIFT) == 4 ? 160 :
(((reg_midr2 & S32K3_SIUL2_MIDR2_FREQUENCY_MASK) >> S32K3_SIUL2_MIDR2_FREQUENCY_SHIFT) == 5 ? 240 :
(((reg_midr2 & S32K3_SIUL2_MIDR2_FREQUENCY_MASK) >> S32K3_SIUL2_MIDR2_FREQUENCY_SHIFT) == 6 ? 320 : 0))));
PRINTF("CPU PACKAGE %s\r\n", ((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 3 ? "257-MAPBGA" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 4 ? "289-MAPBGA" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 0X22 ? "100-HDQFP" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 0X23 ? "100-HDQFP" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 0X25 ? "172-HDQFP" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 0X26 ? "172-HDQFP" :
(((reg_midr2 & S32K3_SIUL2_MIDR2_PACKAGE_MASK) >> S32K3_SIUL2_MIDR2_PACKAGE_SHIFT) == 0X27 ? "172-HDQFP-EP" :"UNKNOWN")))))));
PRINTF("CPU FLASH_SIZE_DATA %dKB\r\n", ((reg_midr2 & S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_MASK) >> S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_SHIFT) == 0 ? 64 :
(((reg_midr2 & S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_MASK) >> S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_SHIFT) == 1 ? 128 :
(((reg_midr2 & S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_MASK) >> S32K3_SIUL2_MIDR2_FLASH_SIZE_DATA_SHIFT) == 2 ? 256 : 0)));
PRINTF("CPU FLASH_SIZE_CODE %ldKB\r\n", ((reg_midr2 & S32K3_SIUL2_MIDR2_FLASH_SIZE_CODE_MASK) >> S32K3_SIUL2_MIDR2_FLASH_SIZE_CODE_SHIFT)*256);
}将上述程序运行在S32K312/324/344/388上读取属性信息。
以下是在S32K344 的板卡上运行该函数的打印信息。

本地的S32K388的板子上运行打印

本地S32K324 的板子运行打印

以下是S32K312 板子运行打印
我要赚赏金
