<wbr id="9qp22"><legend id="9qp22"><rt id="9qp22"></rt></legend></wbr>
<th id="9qp22"><noframes id="9qp22"><form id="9qp22"></form></noframes></th>

      <dd id="9qp22"><big id="9qp22"><video id="9qp22"></video></big></dd>
      <th id="9qp22"></th>
        <rp id="9qp22"><acronym id="9qp22"></acronym></rp>
        <dd id="9qp22"><pre id="9qp22"></pre></dd>

        1. <dd id="9qp22"><pre id="9qp22"></pre></dd>
          1. 打印

            [技術問答] 自己寫BOOTLOADER的實現方法

            [復制鏈接]
            126|1
            跳轉到指定樓層
            樓主
            大家好,我這個項目是需要自己寫個BootLoader,因為我要在我自己的BootLoader邏輯里做很多事情,包括在BootLoader里實現APP區域的update。我現在有幾個問題不是很確定,第一,我的APP開始地址怎么確定,在哪定義?我沒找到flash的分配管理文件,是直接在keil里編輯ROM1的地址值嗎?

            第二,我在BOOTLOADER要跳轉到APP里的時候,我該怎么跳過去呢?是否可以直接參考你們的ISP源碼?你們是怎么實現跳轉到0X08000000地址執行的。
            第三,其實也是第一點,APP地址定義好后,中斷向量表要重新定義么?

            使用特權

            評論回復
            沙發
            | 2019-9-29 13:52 | 只看該作者
            第一,我的APP開始地址怎么確定,在哪定義?我沒找到flash的分配管理文件,是直接在keil里編輯ROM1的地址值嗎?如果在配置中勾選了use memory layout from target dialog是通過IROM1進行配置,沒勾選則在sct文件中配置。
            bootloader的配置如下:

            APP的配置如下:

            第二,我在BOOTLOADER要跳轉到APP里的時候,我該怎么跳過去呢?是否可以直接參考你們的ISP源碼?你們是怎么實現跳轉到0X08000000地址執行的。
            可以參考我們的IAP代碼。
            bootloader跳轉代碼:
            1. /**
            2. * JumpTOApp
            3. *
            4. * @param[in] none
            5. * [url=home.php?mod=space&uid=266161]@return[/url]    none
            6. *
            7. * [url=home.php?mod=space&uid=247401]@brief[/url]  Jump to APP Code
            8. */
            9. void JumpTOApp(void)
            10. {
            11.     uint32_t JumpAddress;
            12.     __ASM("CPSID I");
            13.     if(((*(__IO uint32_t *)APP_ADDRESS) & 0x2FFE0000) == 0x20000000)
            14.     {
            15.         JumpAddress = *(__IO uint32_t *)(APP_ADDRESS + 4); // Jump to user application
            16.         s_jumpToApplication = (pFunction)JumpAddress;   // Initialize user application's Stack Pointer
            17.         __set_MSP(*(__IO uint32_t*)APP_ADDRESS);
            18.         s_jumpToApplication();  /* jump to app */
            19.     }
            20.     else
            21.     {
            22.         printf("top of stack pointer is unvalid! please reboot!\r\n");
            23.         while (1);  /* because of APP address have no code data */
            24.     }
            25. }
            復制代碼

            第三,其實也是第一點,APP地址定義好后,中斷向量表要重新定義么?


            APP中,進入MAIN函數后,重定向中斷向量表:
            1. __ASM(" CPSIE I");
            2. SCB->VTOR = APP_ADDRESS;
            復制代碼



            使用特權

            評論回復
            掃描二維碼,隨時隨地手機跟帖
            您需要登錄后才可以回帖 登錄 | 注冊

            本版積分規則

            我要發帖 投訴建議 創建版塊 申請版主

            快速回復

            您需要登錄后才可以回帖
            登錄 | 注冊
            高級模式

            論壇熱帖

            在線客服 快速回復 返回頂部 返回列表
            成人短片线上看