會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC18F45K80在BOOTLOADER中使用中斷的問題
新會員
註冊日期:
2017/11/21 21:23
所屬群組:
註冊會員
文章: 4
等級: 1; EXP: 21
HP : 0 / 5
MP : 1 / 42
離線
HI All

目前我在PIC18F45K80中做了一個BOOTLOADER

並在其中使用了中斷

當燒錄完跳到AP後,只要發生中斷就還是會

跳到BOOTLOADER的中斷去執行,當然整體的工作會變得很怪

請問我該如何從BOOTLOADER跳到AP時一併更改AP的中斷向量呢?

整體的配置如下

BOOTLOADER: 0x0000~0x1FFF

AP:0x2000~0x8000

因為在BOOTLOADER中使用了LIN的模組

看起來是需要中斷來做一些事情,輪巡恐會有一些其他的問題存在

以上,還望不吝賜教,謝謝

6月13日 12:46:17
轉換PDF檔 列印


Re: PIC18F45K80在BOOTLOADER中使用中斷的問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15083
等級: 73; EXP: 95
HP : 1094 / 1823
MP : 5027 / 86350
離線
如果是使用 MCC 所產生的 Bootloader 可以在 MCC 裡直接設定 APP 應用程式的起始位址。

Bootloader 的 APP 程式起始位置是可以設定的,如你的 APP 是從 0x2000 開始,那 Bootloader 的中斷向量轉移就必須在 0x0008 及 0x0018 這兩個中斷執行位址利用 goto 轉移到 0x2008 及 0x2018 這兩個位址來讓 APP 執行中斷函式。

至於 APP 就需要在 Linker 設定裡講整個程式在位移到 0x2000 的起始位址,可以用 Code Offset = 0x2000 的設定將 APP 的編譯從 0x2000 開始編譯。並在 0x2008 及 0x2018 利用嵌入式組語方式跳到高優先權及低優先權中斷函式。

底下是一個中斷轉移的範例程式參考看看:

#include <xc.h>

void HighISR();
void LowISR();

    
REMAPPED_HIGH_INTERRUPT_VECTOR = 0x2008
void Remapped_High_ISR
(void)
{
      
#asm goto HighISR #endasm
}

REMAPPED_LOW_INTERRUPT_VECTOR = 0x2018
void Remapped_Low_ISR
(void)
{
    
#asm goto LowISR #endasm
}

void interrupt HighISR(void)             // 高優先權中斷函數
{
    if (
TMR0IE && TMR0IF)
    {
        
WriteTimer0(65536-488);     // 500mS Period, 500mS/4uS/256 = 488
        
LATDbits.LATD0 = !LATDbits.LATD0;
        
TMR0IF=0;
    }
}

void interrupt low_priority LowISR(void)     //  低優先權中斷函數
{
    if (
TMR1IF && TMR1IE)
    {
        
WriteTimer1(65536-7812);    // 250mS Period, 250mS/4uS/8 = 7812
        
LATDbits.LATD7 = !LATDbits.LATD7;
        
TMR1IF = 0;
    }
}

6月15日 10:24:11

Ryang 於 2020年06月15日 10:41:46
Ryang 於 2020年06月15日 11:17:47
轉換PDF檔 列印


Re: PIC18F45K80在BOOTLOADER中使用中斷的問題
新會員
註冊日期:
2017/11/21 21:23
所屬群組:
註冊會員
文章: 4
等級: 1; EXP: 21
HP : 0 / 5
MP : 1 / 42
離線
HI Sir:

你好

先把名詞定義一下

BOOT = BOOTLOADER (0x0000~0x1FFF)

APP = 主程式(0x2000~0x7FFF)

我在BOOT中也有用到中斷副程式

因為沒有額外的設定,所以他應該是直接用了

0x0008和0x0018這兩個中斷向量

但我在跳到APP時,APP的中斷也會跳到BOOT的中斷

我想請教的是我們如何在BOOT跳到APP之後

讓APP執行他自己的中斷副程式

您幫我整理的這兩段CODE,請問這是要放在BOOT中嗎?

感覺是要放在BOOTLOADER中,讓他跳到0x2008和0x2018

但這樣原本BOOT的中斷副程式怎麼辦呢?

抱歉這部分我不是很清楚,還望不吝指導

謝謝

6月15日 11:18:35
轉換PDF檔 列印


Re: PIC18F45K80在BOOTLOADER中使用中斷的問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15083
等級: 73; EXP: 95
HP : 1094 / 1823
MP : 5027 / 86350
離線
1. 在 Bootloader 程式裡,0x0001 及 0x0018 的中斷進入為址必須填入 goto 0x2008 及 goto 0x2018 的指令。如果你是用 MCC 來產生的 Bootloader 則可以在 MCC 下直接設定 APP 中斷的執行位址。如圖一所示:

2. 上面所附的範例程式是用在 APP 端的中斷程式。第一階段是在程式位址 0x2008 的地方強行遷入一個 goto HighISR 的組合語言。
#asm goto HighISR #endasm
而void interrupt HighISR(void) 是宣告一個高優先權中斷函數,函數名稱為 HighISR( ) 以接收在 0x2008 跳過來的執行。

所以你的 Bootloader 與 APP 的關係是:

APP 發生中斷後,程式跳入Bootloader 的 0x0008 處執行高優先權中斷。又因此處放了 goto 0x2008 的指令,所以又會跳轉到 APP 的 0x2008 位址執行在跳到 APP 的中斷函數 HighISR( ) 執行中斷程式。

附加檔案:



jpg  擷取.JPG (59.63 KB)
16_5ee6eac427a6a.jpg 703X598 px

6月15日 11:28:27
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project