https://blog.csdn.net/u012750409/article/details/52516653 本教程適用stm32f205 如果是f103 gcc編譯的時(shí)候會(huì)有幾處內(nèi)聯(lián)匯編代碼編譯不過(guò) 需要修改下源代碼
1.下載 安裝codelite
官網(wǎng)http:// 如果打不開(kāi)就去這里下載 鏈接: http://pan.baidu.com/s/1mirTPzE 密碼: rtv5
安裝 一直點(diǎn)next就ok了
2. arm GCC編譯器安裝
官網(wǎng)下載:https:///gcc-arm-embedded/ 下載zip版本的 安裝是直接解壓 注意不要解壓到帶中文路徑的目錄下 然后把編譯器的bin目錄的路徑添加到系統(tǒng)環(huán)境變量里 安裝就完成了
比如我的 D:\STM32\gcc-arm-none-eabi-5_3-2016q1-20160330-win32
3. 給codelite 添加arm gcc編譯器
4. 創(chuàng)建工程 codelite 要?jiǎng)?chuàng)建工程 先要?jiǎng)?chuàng)建工作空間 一個(gè)工作空間下可以有多個(gè)工程
5. 添加stm32標(biāo)準(zhǔn)庫(kù)到工程 也可以把標(biāo)準(zhǔn)庫(kù)編譯成.a文件 工程直接連接使用 這里不講這個(gè) 標(biāo)準(zhǔn)庫(kù)的添加 基本跟mdk差不多 1. 打開(kāi)工程所在目錄 在下面創(chuàng)建 User StdPeriph_Driver CMSIS 三個(gè)目錄 2. STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F2xx\Include 目錄下stm32f2xx.h system_stm32f2xx.h 復(fù)制到CMSIS文件夾下 STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Include 目錄下 core_cm3.h core_cmFunc.h core_cmInstr.h 復(fù)制到CMSIS文件夾下 STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\STM32F2xx_StdPeriph_Driver\inc 目錄下所有文件復(fù)制到StdPeriph_Driver目錄下 STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\STM32F2xx_StdPeriph_Driver\src 目錄下所有文件復(fù)制到StdPeriph_Driver目錄下 STM32F2xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F2xx\Source\Templates\gcc_ride7 目錄下startup_stm32f2xx.s 復(fù)制到User目錄 STM32F2xx_StdPeriph_Lib_V1.1.0\Project\STM32F2xx_StdPeriph_Template 目錄stm32f2xx_conf.h stm32f2xx_it.c stm32f2xx_it.h system_stm32f2xx.c 復(fù)制到User目錄 在User目錄下創(chuàng)建main.c 文件 寫(xiě)上main函數(shù) 最后把這些文件都添加到工程里 這里可以用批量添加功能
6. 配置工程的編譯參數(shù) c/c++ 編譯參數(shù) -g;-O0;-Wall;-mcpu=cortex-m3;-mthumb;-mthumb-interwork;-ffunction-sections;-fdata-sections 匯編編譯參數(shù) -mcpu=cortex-m3;-mthumb;-mthumb-interwork 頭文件包含目錄 .;CMSIS;StdPeriph_Driver;User 宏定義 STM32F2XX;USE_STDPERIPH_DRIVER;HSE_VALUE=8000000 這個(gè)HSE_VALUE=8000000 是我的板子是8m的晶振所以要加上 這些宏定義完全跟mdk一樣 mdk設(shè)置了什么宏抄過(guò)來(lái)就行 鏈接參數(shù)-Wl, -T stm32-gnu.ld;-Wl,--gc-sections;-nostartfiles;-mcpu=cortex-m3;-mthumb;-mthumb-interwork 鏈接庫(kù) g_nano;c_nano 連接的libg_nano.a libc_nano 這兩個(gè)是標(biāo)準(zhǔn)c里面的庫(kù) 如果不用標(biāo)c函數(shù) 可以不添加 -ffunction-sections;-fdata-sections 這兩個(gè)參數(shù)意思是給每一個(gè)函數(shù) 和數(shù)據(jù) 都定義一個(gè)單獨(dú)的段 -Wl,--gc-sections; 表示鏈接時(shí)不鏈接沒(méi)有使用到的段 這樣可以減小編譯體積 注意必須跟-ffunction-sections;-fdata-sections配合使用 -Wl, -T stm32-gnu.ld; 給編譯器指定連接腳本 -nostartfiles 不使用編譯器的啟動(dòng)代碼 因?yàn)槲覀冇衧tartup_stm32f2xx.s啟動(dòng)代碼 因?yàn)閏odelite編譯好后生成的可執(zhí)行文件是elf格式的 我們需要hex格式來(lái)下載到板子是 gcc有提供objdump命令來(lái)進(jìn)行轉(zhuǎn)換 使用格式是: arm-none-eabi-objcopy -O binary elf文件名 生成的bin文件名 這個(gè)是轉(zhuǎn)換成bin(-O binary) arm-none-eabi-objcopy -O ihex elf文件名 生成的hex文件名 這兩個(gè)命令我們不需要手動(dòng)敲 可以在codelite工程設(shè)置項(xiàng)里設(shè)置編譯后執(zhí)行的命令里 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. 創(chuàng)建鏈接腳本stm32-gnu.ld 1. 在工程目錄下建立 stm32-gnu.ld文件 內(nèi)容如下 /*_estack _sidata _sdata _sbss 這幾個(gè)標(biāo)號(hào)比較重要啟動(dòng)代碼中要用到的*/ _estack = 0x20020000; /*棧頂?shù)刂?/ MEMORY {undefined rom (rx): ORIGIN = 0x08000000, LENGTH = 1M /*rom起始地址以及大小*/ ram(rwx): ORIGIN = 0x20000000, LENGTH = 128K /*ram起始地址以及大小*/ } SECTIONS {undefined .isr_vector : { /*這個(gè)段是中斷向量表段 必須放在最前面*/ . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > rom .text : { /*代碼段*/ *(.text*) *(.rodata*) } > rom .ARM.exidx : { /*好像是使用了浮點(diǎn)計(jì)算之類的必須有這個(gè)*/ *(.ARM.exidx*) *(.gnu.linkonce.armexidx.*) } > rom _sidata = .; /*data段在rom中存儲(chǔ)位置*/ .data : AT(_sidata) { /*data段 */ _sdata = .; /*data段在ram中的存儲(chǔ)位置 啟動(dòng)代碼要干的活 其中就有把data段從rom中拷貝到ram里去*/ *(vtable) *(.data*) _edata = .; } > ram .bss : { /*bss段*/ _sbss = .; *(.bss*) *(COMMON) _ebss = .; } > ram }
2. 把stm32-gnu.ld文件添加到工程虛擬文件夾User下 因?yàn)閯?chuàng)建模板時(shí) 模板只會(huì)包含添加在工程里的文件 所以我們要先添加進(jìn)來(lái) 添加很簡(jiǎn)單右擊工程虛擬文件夾User 選Add an Existing File 然后找到stm32-gnu.ld 添加就可以了
8. 編譯工程 編譯的時(shí)候有報(bào)錯(cuò) stm32f2xx_it.c里有包含main.h頭文件我們沒(méi)有這個(gè)文件 所以把對(duì)這個(gè)文件的包含去掉 還有一個(gè)錯(cuò)誤 undefined reference to `TimingDelay_Decrement' 還是在stm32f2xx_it.c文件里 調(diào)用了TimingDelay_Decrement函數(shù) 我們沒(méi)有實(shí)現(xiàn)這個(gè)函數(shù) 所以刪除這個(gè)調(diào)用 如果不想使用stm32f2xx_it.c stm32f2xx_it.h 這兩個(gè)文件 直接把他們從工程中移除出去就不會(huì)報(bào)錯(cuò)了
9. 設(shè)置一鍵燒寫(xiě)(使用Jflash +jlink) Jflash 是jlink驅(qū)動(dòng)自帶的工具 只要裝了jlink驅(qū)動(dòng)就有 在jlink的安裝目錄下 我的是D:\Program Files (x86)\SEGGER\JLinkARM_V472a\JFlashARM.exe 1. 首先把你的jlink鏈接到電腦上 然后 打開(kāi)jflash 創(chuàng)建一個(gè)工程 2. 設(shè)置jflash工程用于stm32f205下載 不同的芯片設(shè)置不一樣我的是stm32f205vg 3. 保存jflash工程到我們的工程目錄下 名為down.jflash 并把它添加到工程User虛擬文件夾下 4. 使用codelite插件里的External Tools 來(lái)執(zhí)行jflash下載命令(jflash支持命令行模式) D:\Program Files (x86)\SEGGER\JLinkARM_V472a\JFlashARM.exe 命令參數(shù)-openprj$(ProjectPath)\down.jflash -open$(ProjectPath)\$(IntermediateDirectory)\$(ProjectName).hex -connect -auto -startapp -exit -openprj選項(xiàng)指定jflash要打開(kāi)的工程文件后面直接跟文件絕對(duì)路徑 中間沒(méi)有空格 -open 指定打開(kāi)的hex文件 -connect 連接設(shè)備 -auto 自動(dòng)擦除flash 校驗(yàn) 燒寫(xiě) -startapp 下載完畢后啟動(dòng)程序 -exit 之前的操作執(zhí)行完畢后自動(dòng)退出jflash 這里用到了一些codelite的環(huán)境變量$(ProjectPath) 表示工程所在路徑 $(IntermediateDirectory)輸出中間目錄$(ProjectName)工程名 $(ProjectName).hex輸出文件 如果有問(wèn)題可以不用變量 直接指定文件的絕對(duì)路徑 配置的時(shí)候可以去掉-exit選項(xiàng) 這樣可以看到j(luò)flash是不是正常下載成功了 確定命令工作正常后再加上-exit 配置完畢后就可以一鍵下載了 只要點(diǎn)擊下剛建立的那個(gè)工具項(xiàng) 或者使用快捷鍵 快捷鍵默認(rèn)的是ctrl+shift+ 0 到9 剛好對(duì)應(yīng)0到9個(gè)工具條
JFlash設(shè)置:
codelite設(shè)置
10. 配置遠(yuǎn)程調(diào)試(使用gdb客戶端 和JLinkGDBServer.exe(跟JFlashARM.exe在同一個(gè)目錄)) 還是在工程設(shè)置 使用調(diào)試功能JLinkGDBServer.exe需要一直運(yùn)行
JLinkGDBServer設(shè)置
codelite里調(diào)試的配置 在工程設(shè)置里
11. 其它
https://blog.csdn.net/u012750409/article/details/52516653
|