在《参考手册》第六章〈初始化配置〉中,八个初始化配置寄存器的复位值是不定的,华大对此的处理方式很巧妙(但是也给移植埋下了一个大坑):
hc32f460_icg.h #define ICG0_REGISTER_CONSTANT (((uint32_t)ICG0_WDT_REG_CONFIG << 16) | \ ((uint32_t)ICG0_SWDT_REG_CONFIG) | \ ((uint32_t)0xE000E000ul))
#define ICG1_REGISTER_CONSTANT (((uint32_t)ICG1_NMI_REG_CONFIG << 24) | \ ((uint32_t)ICG1_VDU0_REG_CONFIG << 16) | \ ((uint32_t)ICG1_HRC_REG_CONFIG) | \ ((uint32_t)0x03F8FEFEul))
#define ICG2_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul) #define ICG3_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul) #define ICG4_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul) #define ICG5_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul) #define ICG6_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul) #define ICG7_REGISTER_CONSTANT ((uint32_t)0xFFFFFFFFul)
|
hc32f460_icg.c#if defined ( __GNUC__ ) && !defined (__CC_ARM) const uint32_t u32ICG[] __attribute__((section(".icg_sec"))) = #elif defined (__CC_ARM) const uint32_t u32ICG[] __attribute__((at(0x400))) = #elif defined (__ICCARM__) __root const uint32_t u32ICG[] @ 0x400 = #else #error "unsupported compiler!!" #endif { ICG0_REGISTER_CONSTANT, ICG1_REGISTER_CONSTANT, ICG2_REGISTER_CONSTANT, ICG3_REGISTER_CONSTANT, ICG4_REGISTER_CONSTANT, ICG5_REGISTER_CONSTANT, ICG6_REGISTER_CONSTANT, ICG7_REGISTER_CONSTANT, };
|
通过定义常量的方式,在程序加载阶段,将数据 load 至指定的寄存器。
避坑指北
如果项目由 bootloader 和 app 两部分组成,那么只能在 bootloader 中添加上述源文件,在 app 中不能添加该文件,否则会出现异常。