美文网首页
03.判断启动flash & 重定位

03.判断启动flash & 重定位

作者: 柏666 | 来源:发表于2019-07-20 22:44 被阅读0次

    注意:重定位时要保证编译后的二进制文件中,操作 flash 和初始化 SDRAM 的程序必须在前4K中。否则会出错。

    一、判断启动flash:

    int isBootFromNorFlash(void) {

        volatile unsigned int *p = (volatile unsigned int *)0;

        unsigned int val = *p;    // 读出0地址存放的值

        *p = 0x66;

        if (*p == 0x66) { // 写成功, 对应nand启动

            *p = val; // 回写

            return 0;

        }

        else {

            return 1;

        }

    }


    二、重定位:

    void copy2sdram(void) {

        extern int __code_start, __bss_start;    // 从链接脚本中获得起始结束地址

        volatile unsigned int *dest = (volatile unsigned int *)&__code_start;

        volatile unsigned int *end = (volatile unsigned int *)&__bss_start;

        volatile unsigned int *src = (volatile unsigned int *)0;

        int len = ((int)&__bss_start) - ((int)&__code_start);

        if (isBootFromNorFlash()) {

            while (dest < end) {

                *dest++ = *src++;

            }

        }

        else {

            nand_init();

            nand_read(src, dest, len);

        }

    }


    三、清除bss段:

    void clean_bss(void) {

        extern int _end, __bss_start;

        volatile unsigned int *start = (volatile unsigned int *)&__bss_start;

        volatile unsigned int *end = (volatile unsigned int *)&_end;

        while (start <= end) {

        *start++ = 0;

        }

    }

    相关文章

      网友评论

          本文标题:03.判断启动flash & 重定位

          本文链接:https://www.haomeiwen.com/subject/wbtblctx.html