會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





pic18f Mcc generated bootloader
新會員
註冊日期:
2月03日 17:56:46
所屬群組:
註冊會員
文章: 1
等級: 1; EXP: 0
HP : 0 / 0
MP : 0 / 0
離線
大家好

我們公司最近在整合產品的bootloader 和application時
遇到一個問題。我們使用的mcu是pic18f27k40.
Bootloader 是用mcc產生的bootloader修改而來的。

bootloader和application都有達到我們想要的功能。
我們可以透過自己撰寫的host application更新pic application
的firmware,更新完後也可以跳轉到application的位置。
application的interrupt也正常。

但我們現在希望在update firmware以及update完成之後,都可以保留者某根gpio的狀態。之前有詢問過microchip,他們建議我們在application跳轉到bootloader時可以使用 跳轉道bootloader用來update的funtion 在map 裡的symbol table 可以找到的address,
這裡我們修改完成,也可以成功地update firmware。
我從application跳轉到bootloader的方式是

STKPTR
= 0x00;
    
asm ("pagesel " str (RESET_VECTOR));
    
asm ("goto  "  str (RESET_VECTOR));

在這裡的RESET_VECTOR 我們填上的是map file看到的Run_Bootloader() 位址。



我們遇到的問題是在 update完時,從mcc提供的bootloader 來看
要離開 Run_Bootloader() 的唯一方法只有透過bootloader 的介面
下一個reset command.而reset command 會下
asm("reset") , reset pic 到初始狀態。
這個時候我在host application裡會清掉我們定義的update flag
所以bootloader不會進 Run_Bootloader()
而會直接透過

STKPTR
= 0x00;
    
asm ("pagesel " str(NEW_RESET_VECTOR));
    
asm ("goto  "  str(NEW_RESET_VECTOR));

跳轉到application的位置(NEW_RESET_VECTOR)。


我想請問的是,我們目前碰到一個問題:

透過bootloader 更新完firmware時
如果我讓pic host application送某個command,
bootloader讀到這個command就直接break Run_Bootloader()的while 1 迴圈
然後直接透過

STKPTR
= 0x00;
    
asm ("pagesel " str(NEW_RESET_VECTOR));
    
asm ("goto  "  str(NEW_RESET_VECTOR));

這樣跳轉到application。
但這樣為application無法順利運作?
我有沒有其他可以順利跳轉的方式(除了reset),可以保留某個gpio的狀態呢?


void Run_Bootloader
()
{
    
volatile uint8_t  index;
    
uint8_t  msg_length;

    while (
1)
    {
        while (
TXSTA1bits.TRMT == 0); // wait for last byte to shift out before
                                 // starting autobaud.
        
Check_Device_Reset ();  // Response has been sent.  Check to see if a reset was requested

// *****************************************************************************
// Hardware AutoBaud
// *****************************************************************************
        
BAUDCONbits.ABDEN = 1;    // start auto baud
        
while (BAUDCONbits.ABDEN == 1)
        {
            if (
BAUDCONbits.ABDOVF == 1)
            {
                
BAUDCONbits.ABDEN = 0;    // abort auto baud
                
BAUDCONbits.ABDOVF = 0;    // start auto baud
                
BAUDCONbits.ABDEN = 1;    // restart auto baud
            
}
        }

        
index = RCREG;  // required to clear RCIF

// *****************************************************************************

// *****************************************************************************
// Read and parse the data.
        
index = 0;       // Point to the buffer
        
msg_length = 9;  // message has 9 bytes of overhead (Opcode + Length + Address)
        
uint8_t  ch;

        while (
index < msg_length)
        {
            
ch = EUSART1_Read();          // Get the data
            
frame.buffer [index ++] = ch;
            if (
index == 4)
            {
                if ((
frame.command == WRITE_FLASH)
                 || (
frame.command == WRITE_EE_DATA)
                 || (
frame.command == WRITE_CONFIG))
                {
                    
msg_length += frame.data_length;
                }
            }
        }

        
msg_length = ProcessBootBuffer ();

// *****************************************************************************
// Send the data buffer back.
// *****************************************************************************
        
EUSART1_Write(STX);
        
index = 0;
        while (
index < msg_length)
        {
            
EUSART1_Write (frame.buffer [index++]);
        }
    }
}
// **********************************

2月03日 18:51:35
轉換PDF檔 列印






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

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project