問題一、上電程序跑飛或者運行幾步程序跑飛,IAR提示堆棧溢出。
1、首先確認程序入口地址。NVIC_Configuration();// 嵌套向量中斷控制器配置 。我這里是STM32f100c8t6b芯片。
在IAR OPTIONS->C/C++ Compiler->Preprocessor 里面定義了VECT_TAB_FLASH 這樣程序入口地址就是0X08000000+0X3000(既0X08003000)。這里為什么是0X08000000呢因為STM32主程序存儲地址是從0X08000000開始,加上0X3000是為了用戶引導程序預留一段空間。不然每次一上電就跑程序沒有引導程序是不太現(xiàn)實的吧。不過測試的時候無所謂應(yīng)該吧。
2、IAROPTIONS里面設(shè)置好程序下載地址。
這次是在Linker->Config 下面打鉤后點Edit 跳出上面對話框,第一個Vector Table 就是向量表起始位置,這里根據(jù)第一步設(shè)置向量表的起始地址。
3、下載編譯
可以看到main 函數(shù)入口地址是0X08000d42開始。為什么不是0X08000000呢?因為main函數(shù)執(zhí)行之前還有一些變量、函數(shù)的定義,所以main不是從0X08000000開始的。
STM32指導手冊中有存儲器組織介紹,我們的程序應(yīng)該寫在上圖主存儲塊位置??梢姷降刂氛檬?X08000000 開始的,共有128個Sectors(扇區(qū)),每個扇區(qū)1K字節(jié),共128K,中等容量的芯片。
結(jié)果:下載后程序沒有再跑飛,之前貌似是程序?qū)懙搅藙e的地址,好像是寫到了RAM區(qū),這個芯片RAM才8K不溢出才怪呢。