在《参考手册》第六章〈初始化配置〉中,八个初始化配置寄存器的复位值是不定的,小华对此的处理方式很巧妙(但是也给移植埋下了一个大坑):

hc32f460_icg.h
/*!< ICG0 register value */
#define ICG0_REGISTER_CONSTANT (((uint32_t)ICG0_WDT_REG_CONFIG << 16) | \
((uint32_t)ICG0_SWDT_REG_CONFIG) | \
((uint32_t)0xE000E000ul))
/*!< ICG1 register value */
#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))
/*!< ICG2~7 register reserved value */
#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) /* GNU Compiler */
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
{
/* ICG 0~ 3 */
ICG0_REGISTER_CONSTANT,
ICG1_REGISTER_CONSTANT,
ICG2_REGISTER_CONSTANT,
ICG3_REGISTER_CONSTANT,
/* ICG 4~ 7 */
ICG4_REGISTER_CONSTANT,
ICG5_REGISTER_CONSTANT,
ICG6_REGISTER_CONSTANT,
ICG7_REGISTER_CONSTANT,
};

通过定义常量的方式,在程序加载阶段,将数据 load 至指定的寄存器。

避坑指北

如果工程由 bootloader 和 app 两部分组成,那么只能在 bootloader 中添加 *_icg.c 文件,在 app 中不能添加该文件,否则会出现异常,原因如下:

在 App 中也添加 *_icg.c 意味着要将 u32ICG 指定到 0x400 这个地址,所以编译出来的 App 会由两部分组成:

ER$$.ARM. AT Ox00000400                 文件大小为一个扇区(HC32F460=8K)
ER IROM1

而 0x400 所在的扇区通常是 bootloader 所在的区域,所以在烧录 App 时就会导致 bootloader 的中断向量表数据被擦除,进而导致程序无法引导,具体表现就是程序运行不起来。

beep...领导要求每天写日报,但是我不太想写,于是就有了本段代码。

# 一键生成日报 V2.0.0
import os
import re
import datetime
from datetime import timedelta
« 閱讀全文 »

2022年09月01日于武汉

flowchart TB
%%{init: { "flowchart": { "curve": "basis" } } }%%
R0[智能融合终端<br>SCU]
R0--->N1[断路器<br>9]
R0--->N2[断路器<br>16]
N1--->N1.1[断路器<br>7]
N1--->N1.2[断路器<br>6]
N1--->N1.3[断路器<br>10]
N1--->N1.4[断路器<br>12]
N2--->N2.1[断路器<br>18]
N2--->N2.2[断路器<br>19]
N2--->N2.3[断路器<br>14]
N1.1--->N1.1.1[断路器<br>3]
N1.1--->N1.1.2[断路器<br>4]
N1.1--->N1.1.3[断路器<br>5]
N1.2--->N1.2.1[断路器<br>8]
N1.2--->N1.2.2[断路器<br>11]
N1.3--->N1.3.1[断路器<br>2]
N2.2--->N2.2.1[断路器<br>13]
N2.2--->N2.2.2[断路器<br>17]
N1.1.1--->N1.1.1.1[断路器<br>0]
N1.2.2--->N1.2.2.1[断路器<br>1]
N2.2.2--->N2.2.2.1[断路器<br>15]
« 閱讀全文 »

        !  @  #  $  %  ^  &  *  (  )  {  }          
        :  <  >  W  Y  K  R  D  L  C  ?  +  |       
        A  O  E  I  U  G  H  T  N  S  _             
        "  Q  X  J  B  F  M  P  V  Z                

« 閱讀全文 »

The dƷvorak keyboard layout has been released !


        1  2  3  4  5  6  7  8  9  0  [  ]          
        ;  ,  .  y  w  r  k  d  l  c  /  =  \       
        a  o  e  i  u  g  h  t  n  s  -             
        '  q  x  j  v  b  f  m  p  z                

« 閱讀全文 »