这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 分享自己验证过的n76e003的bootload。 官方的bootload有坑!

共6条 1/1 1 跳转至

分享自己验证过的n76e003的bootload。 官方的bootload有坑!

工程师
2019-06-30 21:29:03     打赏
最近我花了很多时间在 新塘的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 语句。 增加了 程序的分析复杂度。。     有没有哪位小伙伴能改一个好用的程序开源出来。。

最后我放上来 ,自己通过修改、验证后的程序。

Source.rar

直接覆盖 官方 bsp 相同路径即可。  






关键词: n76e003     bootload    

工程师
2019-06-30 21:35:57     打赏
2楼
收下了,多谢楼主!



工程师
2019-06-30 21:39:52     打赏
3楼
台湾大多数MCU的ds都有坑,sample code更是垃圾的不敢直视
不过ds和sample code不代表芯片本身



工程师
2019-06-30 21:43:50     打赏
4楼

新唐官方的boot程序能把人看晕, 估计是写程序的人偷懒


工程师
2019-06-30 21:49:11     打赏
5楼

已经上传验证过的 bootload 。 直接可以连 官方的 isp 。。

点击下载: 76e003_ISP_UART1_OK.zip
注意这个booload 用的是 uart1 (不是官方的uart0)  .  目的是  icp 口和  isp 口可以重叠在一起。。


注意看76e003的ds 。  icp是用 clk and  data。  然后相同的 pin 的第二功能是 uart1 .  这样做就完美了。  想isp 就isp  想icp 就icp 。 不再占多余的pin


菜鸟
2019-07-01 13:36:54     打赏
6楼

多谢楼主


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]