最近遇到一個困擾已久的問題,使用STM32F103VE的單片機 ,按照常規方式測驗,所有功能均正常,然后為了以后程式升級方便,先刷bootloader程式,然后再通過網口下載application程式,結果發現如下的問題(下邊分步介紹):
1:升級下載工具提示下載完成,然后板卡應當會作業在application模式下,但實際上未看到任何功能,再次嘗試依舊
2:用debug除錯,先用JLINK下載bootloader程式,然后更改application工程內不擦出所有sector的方式將應用程式也下載進去并啟動debug,這樣就能將兩者程式都通過JLINK下載進去并能在線除錯
3:程式能成功從bootloader跳轉到application的main入口,單步往下除錯,程式都能正常作業,但使用全速運行(無斷點方式), 程式就跑飛
4:此時點擊停止按鈕,程式停在啟動檔案的中斷服務函式的末尾 B .處,好像是產生中斷后沒找到中斷服務函式
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .
ENDP
ALIGN
5:屏蔽其他中斷初始化,只使能一個定時器中斷,在該中斷內斷點,每次都能進來執行并成功退出,但取消斷點運行仍然不行
6:下邊是application的main處初始化代碼
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
ReadFlashCfg();
DrLed();
DrTimer_Init();
system_stm32f10x.c檔案設定
#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
target option里的IROM1設定
start 0x8008000 size 0x1C000
mish.h檔案設定,即偏移地址為0x8000
#define NVIC_VectTab_RAM ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH ((uint32_t)0x08008000)
#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \
((VECTTAB) == NVIC_VectTab_FLASH))
bootloader程式是公司成熟的產品,其他程式可以正常執行,唯獨此程式有問題。初步推測是中斷重定位后出的問題,中斷后指向非法地址了(但不理解單步除錯可以運行)。哪位大神了解此情況,知道一下問題出在哪,感激不盡!
uj5u.com熱心網友回復:
既然bootloader已經成熟的,那把它整理成一個__root常量陣列 “@” 到一個固定的Flash地址,放到獨立的一個源檔案里面,這樣一個工程既有bootloader又有application,就很方便了,雖然這不一定能解決你的問題。。例如IAR可以這么弄
__root const static unsigned char BOOTLOADER[] @ 0x08000000 =
{
......
};
另外,既然NVIC_VectTab_FLASH加了0x8000的偏移,那么VECT_TAB_OFFSET順便也改成0x8000的偏移如何
uj5u.com熱心網友回復:
IAR 有這么強悍的功能啊,不知道keil有沒有這個功能。我用keil是分2個工程,boot一個,app一個。
uj5u.com熱心網友回復:
按理說,只要偏移地址正確,中斷向量映射偏移正確,一般都沒問題。跳轉前關閉所有中斷。uj5u.com熱心網友回復:
改2個地方1、在"OPTION"的"target"中作如下改動
2、在"system_stm32f1xx.c"中,改變中斷向量表的偏移
//#define VECT_TAB_OFFSET 0x0 //原來的數值
#define VECT_TAB_OFFSET 0x4000 //改動后的數值
// 偏移量在下面指令中被執行
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
在"OPTION"的"target"中作如下改動“IROM1”的起始地址要加上偏移地址。
uj5u.com熱心網友回復:
抱歉,這個回復的比較晚,多謝各位提供的建議和方法。當初我這個問題根源是bootloader和application用的兩個工程,但庫版本號不一致。bootloader是公司一直在使用的成熟產品,application做了升級,把STM32韌體庫升級成最新的了,導致了該問題,若把兩個工程的韌體庫改成同一個版本就不會有問題。uj5u.com熱心網友回復:
這個方法值得推薦
uj5u.com熱心網友回復:
確實不錯,不是老司機想不出來的方法
uj5u.com熱心網友回復:
樓上的方法會使得生成的bin檔案很大 代碼變化后,bin檔案大小看不出來轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/69031.html
標籤:單片機/工控
下一篇:跪求推薦幾個ADC芯片
