最近我花了很多时间在 新塘的bootload上面。。可谓是跳了无数的坑。下面我会分享一下,我的调试过程,让开发人员尽量少走弯路。。。人生苦短,希望大家开发的顺利一点。。。。 首先,新塘的数据手册,很多是遮遮掩掩的。 尤其是 96bit的 uid数据段。 这个数据段 其实 包含了很多官方自己定义的信息。 但是数据手册什么都没说,但是 仔细分析新塘的BSP包, 就能发现里面大有乾坤!! 新塘的BSP - boot strip program --》 我和你说 bootload ,大家都明白是意思。 打开最新下载的bootload ,里面用了115200波特率。所以需要把 RC参数从16M 调到 16.6M 。 官方的源码是这样写的: void MODIFY_HIRC_16588(void) { //if ((PCON|CLR_BIT4)==0xFF) if(1) { set_IAPEN; IAPAL = 0x30; IAPAH = 0x00; IAPCN = READ_UID; set_IAPGO; hircmap0 = IAPFD; IAPAL = 0x31; IAPAH = 0x00; set_IAPGO; hircmap1 = IAPFD; clr_IAPEN; hircmap1 = hircmap1&0x01; trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01)); trimvalue16bit = trimvalue16bit - 15; hircmap1 = trimvalue16bit&0x01; hircmap0 = trimvalue16bit>>1; set_SFRPAGE; TA=0XAA; TA=0X55; RCTRIM0 = hircmap0; TA=0XAA; TA=0X55; RCTRIM1 = hircmap1; PCON&=CLR_BIT4; // cold boot flag , need clear to 0 by SW } } 这段代码,实际上可谓半对半错。。。 因为数据手册没有交代 30 31 这个地址是什么。 通过源代码猜测是 rc 矫正参数。 但是rc 矫正参数 估计在 76e003 的早期版本(或者是新塘其他1T 51 里面是存在这个位置),但是 仔细分析76003的ds , 在 sfr 里面已经有了 rc 的矫正参数。。所以正确的代码 如下: void MODIFY_HIRC_166(void) // Modify HIRC to 16.6MHz, more detail please see datasheet V1.02 { UINT8 hircmap0,hircmap1; UINT16 trimvalue16bit; /* Check if power on reset, modify HIRC */ //if ((PCON&SET_BIT4)==SET_BIT4) if(1) { hircmap0 = RCTRIM0; hircmap1 = RCTRIM1; //rct0 = hircmap0; //rct1 = hircmap1; trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01)); //all = trimvalue16bit; trimvalue16bit = trimvalue16bit - 15; hircmap1 = trimvalue16bit&0x01; hircmap0 = trimvalue16bit>>1; TA=0XAA; TA=0X55; RCTRIM0 = hircmap0; TA=0XAA; TA=0X55; RCTRIM1 = hircmap1; /* Clear power on flag */ PCON &= CLR_BIT4; } } // 以上是 第一个坑。 如果你直接就用 官方的bsp 包来做booload 。 你肯定会发现通讯异常的问题!! 通过修正 函数, 问题得到解决 |
第二个 坑是 : g_timer0Over=0; g_timer0Counter=500; //3s update time! g_progarmflag=0; g_timer0Counter // 这个参数控制这 bootload 的 time overflow的时间。 官方默认是30sec 。 晕菜。 一般应用3s 足够了!! 这个大家还是要沉下心来分析一下 源代码!! |
第三个坑是 : bootload 到处是 goto 语句。 增加了 程序的分析复杂度。。 有没有哪位小伙伴能改一个好用的程序开源出来。。 最后我放上来 ,自己通过修改、验证后的程序。 直接覆盖 官方 bsp 相同路径即可。 |