最近我花了很多时间在 新塘的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 。 你肯定会发现通讯异常的问题!! 通过修正 函数, 问题得到解决
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已经上传验证过的 bootload 。 直接可以连 官方的 isp 。。
注意这个booload 用的是 uart1 (不是官方的uart0) . 目的是 icp 口和 isp 口可以重叠在一起。。
注意看76e003的ds 。 icp是用 clk and data。 然后相同的 pin 的第二功能是 uart1 . 这样做就完美了。 想isp 就isp 想icp 就icp 。 不再占多余的pin
一周热门 更多>