分享n76e003的bootload。 官方的bootload有坑啊!大家要小心

2020-01-12 17:12发布

最近我花了很多时间在 新塘的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 。 你肯定会发现通讯异常的问题!!  通过修正 函数,  问题得到解决
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
52条回答
mangolu
1楼-- · 2020-01-18 03:34
本帖最后由 mangolu 于 2019-5-4 01:16 编辑
rei1984 发表于 2019-4-26 13:35
不会的。 自动运行的。

具体,你可以自己编译一下 bootload。   我的板子一切正常 ...


LZ近段没时间,晚上玩了一下你给编译好的,发现程序不能运行的原因是新唐的ISP工具只直持bin格式的程序文件,就是把文件类型选为所有文件载入hex文件,下载进去也是运行不了的。

还有一个问题,ISP下载完程序后要重启单片机才会运行APROM的程序,有没有改到程序下载完直接运行APROM程序或自动重启运行的阿?
rei1984
2楼-- · 2020-01-18 03:57
mangolu 发表于 2019-5-4 01:15
LZ近段没时间,晚上玩了一下你给编译好的,发现程序不能运行的原因是新唐的ISP工具只直持bin格式的程序文 ...

你的问题, 新塘都帮你想好了。  并且 hex2bin  这个sdk里面也是有的。    建议你仔细看下软件配置(不涉及源代码更改),就能发现你要的东西。

mangolu
3楼-- · 2020-01-18 04:36
rei1984 发表于 2019-5-4 10:59
你的问题, 新塘都帮你想好了。  并且 hex2bin  这个sdk里面也是有的。    建议你仔细看下软件配置(不涉 ...

生成BIN文件这个我已经知道。现在的问题是ISP后要重启单片机才能运行APROM的内容,这个怎么解决?
rei1984
4楼-- · 2020-01-18 06:39
 精彩回答 2  元偷偷看……
mangolu
5楼-- · 2020-01-18 12:36
rei1984 发表于 2019-5-4 14:34

晕倒,我那个版本是2.0的,没有这个功能,请看上面20楼。一下去官网下个新版本看看,谢谢了!
o0pingu0o1
6楼-- · 2020-01-18 15:37
新唐官方的isp基本没法用,上位机只支持115200和19200,真不知道改完哪里能降下来波特率,还有如果远程升级的话地址都不知道怎么加进去,,后来自己写了个iap下位和上位,波特率从2400到115200全支持,也能通过地址485升级。其实就用bsp包里的读写片上flash改改就成iap了。

一周热门 更多>