1. 程式人生 > >使用codelite搭建stm32開發環境

使用codelite搭建stm32開發環境

本教程適用stm32f205  如果是f103 gcc編譯的時候會有幾處內聯彙編程式碼編譯不過 需要修改下原始碼

1.下載 安裝codelite

官網http://codelite.org 如果打不開就去這裡下載 連結: http://pan.baidu.com/s/1mirTPzE 密碼: rtv5
安裝 一直點next就ok了
2. arm GCC編譯器安裝
官網下載:https://launchpad.net/gcc-arm-embedded/ 下載zip版本的 安裝是直接解壓 注意不要解壓到帶中文路徑的目錄下 然後把編譯器的bin目錄的路徑新增到系統環境變數裡 安裝就完成了

比如我的 D:\STM32\gcc-arm-none-eabi-5_3-2016q1-20160330-win32


3. 給codelite 新增arm gcc編譯器



4. 建立工程
codelite 要建立工程 先要建立工作空間 一個工作空間下可以有多個工程




5. 新增stm32標準庫到工程
也可以把標準庫編譯成.a檔案 工程直接連線使用 這裡不講這個
標準庫的新增 基本跟mdk差不多
1. 開啟工程所在目錄 在下面建立 User  StdPeriph_Driver  CMSIS 三個目錄
2. 
STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F2xx\Include 目錄下stm32f2xx.h system_stm32f2xx.h 複製到CMSIS資料夾下
STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Include 目錄下 core_cm3.h  core_cmFunc.h  core_cmInstr.h 複製到CMSIS資料夾下
STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\STM32F2xx_StdPeriph_Driver\inc 目錄下所有檔案複製到StdPeriph_Driver目錄下
STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\STM32F2xx_StdPeriph_Driver\src 目錄下所有檔案複製到StdPeriph_Driver目錄下
STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F2xx\Source\Templates\gcc_ride7 目錄下startup_stm32f2xx.s 複製到User目錄
STM32F2xx_StdPeriph_Lib_V1.1.0\Project\STM32F2xx_StdPeriph_Template 目錄stm32f2xx_conf.h  stm32f2xx_it.c  stm32f2xx_it.h  system_stm32f2xx.c 複製到User目錄
在User目錄下建立main.c 檔案 寫上main函式
最後把這些檔案都新增到工程裡 這裡可以用批量新增功能


6. 配置工程的編譯引數
c/c++ 編譯引數 -g;-O0;-Wall;-mcpu=cortex-m3;-mthumb;-mthumb-interwork;-ffunction-sections;-fdata-sections
彙編編譯引數 -mcpu=cortex-m3;-mthumb;-mthumb-interwork
標頭檔案包含目錄 .;CMSIS;StdPeriph_Driver;User
巨集定義 STM32F2XX;USE_STDPERIPH_DRIVER;HSE_VALUE=8000000   這個HSE_VALUE=8000000 是我的板子是8m的晶振所以要加上 這些巨集定義完全跟mdk一樣 mdk設定了什麼巨集抄過來就行

連結引數-Wl, -T stm32-gnu.ld;-Wl,--gc-sections;-nostartfiles;-mcpu=cortex-m3;-mthumb;-mthumb-interwork
連結庫 g_nano;c_nano  連線的libg_nano.a libc_nano 這兩個是標準c裡面的庫 如果不用標c函式 可以不新增




-ffunction-sections;-fdata-sections 這兩個引數意思是給每一個函式 和資料  都定義一個單獨的段
-Wl,--gc-sections; 表示連結時不連結沒有使用到的段 這樣可以減小編譯體積 注意必須跟-ffunction-sections;-fdata-sections配合使用
-Wl, -T stm32-gnu.ld; 給編譯器指定連線指令碼
-nostartfiles 不使用編譯器的啟動程式碼 因為我們有startup_stm32f2xx.s啟動程式碼


因為codelite編譯好後生成的可執行檔案是elf格式的 我們需要hex格式來下載到板子是
gcc有提供objdump命令來進行轉換
使用格式是:
arm-none-eabi-objcopy -O binary elf檔名 生成的bin檔名  這個是轉換成bin(-O binary)
arm-none-eabi-objcopy -O ihex elf檔名 生成的hex檔名
這兩個命令我們不需要手動敲 可以在codelite工程設定項裡設定編譯後執行的命令裡
arm-none-eabi-objcopy  -O binary $(IntermediateDirectory)/$(ProjectName).elf $(IntermediateDirectory)/$(ProjectName).bin
arm-none-eabi-objcopy  -O ihex $(IntermediateDirectory)/$(ProjectName).elf $(IntermediateDirectory)/$(ProjectName).hex






7. 建立連結指令碼stm32-gnu.ld
1. 在工程目錄下建立 stm32-gnu.ld檔案 內容如下

/*_estack _sidata _sdata _sbss 這幾個標號比較重要啟動程式碼中要用到的*/

_estack = 0x20020000; /*棧頂地址*/
MEMORY
{
rom (rx): ORIGIN = 0x08000000, LENGTH = 1M /*rom起始地址以及大小*/
ram(rwx): ORIGIN = 0x20000000, LENGTH = 128K /*ram起始地址以及大小*/
}
 
SECTIONS
{
.isr_vector : { /*這個段是中斷向量表段 必須放在最前面*/
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} > rom

.text : { /*程式碼段*/
*(.text*)
*(.rodata*)
} > rom

.ARM.exidx : { /*好像是使用了浮點計算之類的必須有這個*/
*(.ARM.exidx*)
*(.gnu.linkonce.armexidx.*)
} > rom
 
_sidata = .; /*data段在rom中儲存位置*/
.data : AT(_sidata) { /*data段 */
_sdata = .; /*data段在ram中的儲存位置  啟動程式碼要乾的活 其中就有把data段從rom中拷貝到ram裡去*/
*(vtable)
*(.data*)
_edata = .;
} > ram
 
.bss : { /*bss段*/
_sbss = .;
*(.bss*)
*(COMMON)
_ebss = .;
} > ram
}


2. 把stm32-gnu.ld檔案新增到工程虛擬資料夾User下 因為建立模板時 模板只會包含新增在工程裡的檔案 所以我們要先新增進來
新增很簡單右擊工程虛擬資料夾User 選Add an Existing File 然後找到stm32-gnu.ld 新增就可以了


8. 編譯工程
編譯的時候有報錯 stm32f2xx_it.c裡有包含main.h標頭檔案我們沒有這個檔案 所以把對這個檔案的包含去掉
還有一個錯誤 undefined reference to `TimingDelay_Decrement' 還是在stm32f2xx_it.c檔案裡 呼叫了TimingDelay_Decrement函式 我們沒有實現這個函式 所以刪除這個呼叫
如果不想使用stm32f2xx_it.c stm32f2xx_it.h 這兩個檔案 直接把他們從工程中移除出去就不會報錯了


9. 設定一鍵燒寫(使用Jflash +jlink)
Jflash 是jlink驅動自帶的工具 只要裝了jlink驅動就有 在jlink的安裝目錄下
我的是D:\Program Files (x86)\SEGGER\JLinkARM_V472a\JFlashARM.exe
1. 首先把你的jlink連結到電腦上 然後 開啟jflash 建立一個工程
2. 設定jflash工程用於stm32f205下載 不同的晶片設定不一樣我的是stm32f205vg
3. 儲存jflash工程到我們的工程目錄下 名為down.jflash 並把它新增到工程User虛擬資料夾下
4. 使用codelite外掛裡的External Tools 來執行jflash下載命令(jflash支援命令列模式)
D:\Program Files (x86)\SEGGER\JLinkARM_V472a\JFlashARM.exe
命令引數-openprj$(ProjectPath)\down.jflash -open$(ProjectPath)\$(IntermediateDirectory)\$(ProjectName).hex -connect -auto -startapp -exit
-openprj選項指定jflash要開啟的工程檔案後面直接跟檔案絕對路徑 中間沒有空格
-open 指定開啟的hex檔案
-connect 連線裝置
-auto 自動擦除flash 校驗 燒寫
-startapp  下載完畢後啟動程式
-exit 之前的操作執行完畢後自動退出jflash
這裡用到了一些codelite的環境變數$(ProjectPath) 表示工程所在路徑 $(IntermediateDirectory)輸出中間目錄$(ProjectName)工程名 $(ProjectName).hex輸出檔案
如果有問題可以不用變數 直接指定檔案的絕對路徑 配置的時候可以去掉-exit選項 這樣可以看到jflash是不是正常下載成功了 確定命令工作正常後再加上-exit
配置完畢後就可以一鍵下載了 只要點選下剛建立的那個工具項 或者使用快捷鍵  快捷鍵預設的是ctrl+shift+ 0 到9  剛好對應0到9個工具條

JFlash設定:





codelite設定



10. 配置遠端除錯(使用gdb客戶端 和JLinkGDBServer.exe(跟JFlashARM.exe在同一個目錄))
還是在工程設定
使用除錯功能JLinkGDBServer.exe需要一直執行

JLinkGDBServer設定



codelite裡除錯的配置 在工程設定裡



11. 其它