將 STM32的官方工程模板 修改為我們這套教材的:STM32 C++工程模板
我使用的 STM32 庫的版本 : V3.5.0
注意:
想學習本套 STM32 C++編程 的專欄是有點門檻的。你需要有一點點 STM32 基礎 和 一點點 C++ 語言基礎。
完整的STM32 C++工程模板 的下載地址可以在本篇博客的最下面找到。
下面是:將 STM32的官方工程模板 修改為我們這套教材的 STM32 C++工程模板 的修改步驟:
1. 在啟動文件中,增大了 堆 和 棧 的空間
原啟動文件里堆棧的大小:
增大后:
- 棧:
編譯器自動分配釋放。比如說:函數語句的調用(存放函數的參數值,局部變量的值等等)、指針。
- 堆:
一般由程序員分配釋放。由關鍵字new
分配的內存,即對象,存放在堆 中。
Q: 為什么要增大啟動文件中 堆 和 棧 的空間?
A: 解釋:
對於C++語言,相比C語言,它有對象的說法。如果你定義的一個對象需要分配的動態內存空間超出了STM32 啟動文件里面設定的堆棧的大小,程序編譯的時候是沒有錯誤的,並且也可以燒到板子里面。但是在執行的時候沒就出現錯誤,如果你在線調試程序,你會發現:程序死在了 stm32f10x_it.cpp 文件里的HardFault_Handler()
中斷函數里面出不來。
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
出現這種問題一般都是:數組越界,堆棧溢出所導致的,就是內存空間分配的問題。根據你的實際情況,解決辦法就是:
- 增大數組的容量;增大啟動文件中堆棧的大小。
- 對於我們使用C++變成,如果你不將STM32的啟動文件中堆棧的大小調大一點,當程序使用了比較都的對象時,就會很容易死在
HardFault_Handler()
函數里面。
2. 將一些.c
文件擴展名改為:.cpp
將原模板工程里面的main.c
和 stm32f10x_it.c
的后綴名改為:.cpp。
修改后為:main.cpp
和 stm32f10x_it.cpp
。
3. 在stm32f10x_it.cpp 文件中添加一些兼容C/C++的代碼:
添加下面的聲明:
#define ARMAPI extern "C"
這個聲明是:在.cpp
文件中,使用這個聲明(ARMAPI
)聲明的函數,會被用 C語言 對待。
在用戶可以使用的中斷函數前面添加關鍵字:ARMAPI
。比如:
ARMAPI void USART1_IRQHandler(void)
{
}
4. 我已經將一個Gpio類添加到了這個STM32 C++模板程序 里面。
Gpio類 下節再講。
搞定
你可以到這里下載我已經做好的 STM32 C++工程模板:
百度雲 鏈接:http://pan.baidu.com/s/1bpbZ2MV 密碼:esam
也可以在CSDN里面下載:http://download.csdn.net/detail/github_35160620/9621141
小結:
下一講,我們來使用C++語言,創建一個STM32的Gpio類。