天天看點

STM32進階開發(6)-makefile與調試器驅動

上一篇我們介紹了整套開發環境中的最重要的一環 :編譯工具鍊。而在這篇中我們會介紹與其配合使用的makefile與調試器驅動,将這些工具結合,我們所需要的開發環境就簡單的搭建完成了。最激動人心的:在這篇文章的最後我們将去嘗試編譯一個流水燈程式。

#Makefile

Make可以說是在Linux下最出色的一個工具,也許在我們剛剛接觸時覺得它晦澀難懂,用着也不友善。但當你漸漸熟悉了他的用法,你會發現原來它是那麼的強大。

那麼Makefile到底是做什麼的呢?這裡我們就可以順帶着解釋之前我們提出的問題了,難道編譯的指令要一個一個檔案的敲嗎?顯然不是。而Makefile就是幫助我們來敲編譯指令的工具。也許這樣描述有些抽象,而直接看Makefile的教程又有些生硬,讓我們先來看一個樣例工程的Makefile檔案,先來簡單的看看它到底是做什麼的。

#工程的名稱及最後生成檔案的名字
TARGET = LED_project

#設定臨時性環境變量
export CC             = arm-none-eabi-gcc           
export AS             = arm-none-eabi-as
export LD             = arm-none-eabi-ld
export OBJCOPY        = arm-none-eabi-objcopy

#讀取目前工作目錄
TOP=$(shell pwd)

#設定包含檔案目錄
INC_FLAGS= -I $(TOP)/CORE                  \
           -I $(TOP)/HARDWARE    \
           -I $(TOP)/STM32F10x_FWLib/inc             \
           -I $(TOP)/SYSTEM        \
           -I $(TOP)/USER

CFLAGS =  -W -Wall -g -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER $(INC_FLAGS) -O0 -std=gnu11
C_SRC=$(shell find ./ -name '*.c')  
C_OBJ=$(C_SRC:%.c=%.o)          

.PHONY: all clean update      

all:$(C_OBJ)
	$(CC) $(C_OBJ) -T stm32_f103ze_gcc.ld -o $(TARGET).elf   -mthumb -mcpu=cortex-m3 -Wl,--start-group -lc -lm -Wl,--end-group -specs=nano.specs -specs=nosys.specs -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=Project.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 
	$(OBJCOPY) $(TARGET).elf  $(TARGET).bin -Obinary 
	$(OBJCOPY) $(TARGET).elf  $(TARGET).hex -Oihex

$(C_OBJ):%.o:%.c
	$(CC) -c $(CFLAGS) -o [email protected] $<
clean:
	rm -f $(shell find ./ -name '*.o')
	rm -f $(shell find ./ -name '*.d')
	rm -f $(shell find ./ -name '*.map')
	rm -f $(shell find ./ -name '*.elf')
	rm -f $(shell find ./ -name '*.bin')
	rm -f $(shell find ./ -name '*.hex')

update:
	openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg  -f /usr/share/openocd/scripts/target/stm32f1x_stlink.cfg -c init -c halt -c "flash write_image erase $(TOP)/LED_project.hex" -c reset -c shutdown
           

先說說這個檔案怎麼用吧,我們進入工程目錄後使用make指令來執行它(Ubuntu是自帶make工具的,是以不用下載下傳安裝),make工具就會調用目錄下名為Makefile的檔案,并根據其中的設定來執行指令。在這個makefile中就是生成hex和bin檔案。

關于makefile的具體說明和教程,論壇大神陳皓曾經寫過一個系列跟我一起寫 Makefile其中把Makefile的功能和用法寫的已經十分詳盡了,大家可以去他的部落格閱讀學習或是百度下載下傳一個網友總結好的PDF文檔來學習。基本上看完前20%,你就可以了解上面這個makefile的意思和作用了。

STM32進階開發(6)-makefile與調試器驅動

在這篇中我們重點講述軟體的安裝和功能介紹,其具體的用法會在之後的篇章中慢慢講解。是以接下來我們先來看調試器驅動的介紹。

#調試器驅動

雖然我更建議大家且實際經常使用的是OpenOCD作為調試器驅動,但是我仍然會為大家講解一下其他的驅動方式。

##st-link

在Linux上,st-link是有是一個專門的驅動的,在使用者檔案夾下輸入git指令,從GitHub上下載下傳驅動或直接打開網頁下載下傳也行。當然啦在使用git工具前首先要安裝它。

$ sudo apt-get install git
$ git clone https://github.com/texane/stlink.git
           
https://github.com/texane/stlink

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-fxKoejUu-1572081861901)(https://img-blog.csdn.net/20170130230840843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmd5YW5nbGl1MTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

在使用git下載下傳指令後或下載下傳好壓縮包解壓後我們就會得到一個檔案夾,使用終端進入檔案夾後,首先執行一下指令安裝libusb和cmake程式,這2個程式是st-link驅動編譯時需要的,是以需要先安裝它。

$ sudo apt-get install libusb-1.0.0-dev
$ sudo apt-get install cmake
           

在安裝完後,使用終端進入st-link驅動的檔案夾執行指令:

$ cd ./stlink
$ make 
$ cd ./build/Release
$ sudo make install
           
STM32進階開發(6)-makefile與調試器驅動
STM32進階開發(6)-makefile與調試器驅動

到這裡st-link的驅動就安裝完成了,下載下傳的檔案此時就可以删除了。這時連接配接st-link調試器,用lsusb指令就可以檢視到相關的裝置已經連接配接上,如下圖。

STM32進階開發(6)-makefile與調試器驅動

注意在裝置插上計算機後,要在虛拟機右下腳将st-link連接配接到虛拟機上

STM32進階開發(6)-makefile與調試器驅動

驅動程式可以通過終端指令來使用,如下載下傳bin程式

$ st-flash write $hello.bin 0x8000000
           

在比如開啟調試器将它接在計算機網絡端口:4242上

$ sudo st-util 
           

##j-link

Ubuntu下jlink的驅動安裝可以參考這個文章,我之前安裝過但好久沒用了,是以不确定這篇文章的正确性,隻是看着應該沒有問題:(轉載)JLink - JLink for Ubuntu

##OpenOCD

接下來就到了我們的重頭戲了,OpenOCD,這絕對是是一個神一樣的存在,忘了是在那裡看到的簡介了,如果沒記錯的話,這是一個國外研究所學生在上學時構思與完成的軟體,它在Linux上運作并且支援幾乎所有你見過的arm調試器,它在國内的介紹網頁是這個:開源的JTAG上位機程式 OpenOCD

安裝好它也就是說,不管什麼st-link,j-link,open j-link之流的調試器,隻要有OpenOCD就能驅動,就能使用,哈~這軟體夠強大吧。

下面我們就來介紹它的安裝方式:

  1. 下載下傳openocd

    網址: http://sourceforge.net/projects/openocd/

  2. 解壓
  3. 進入解壓之後的目錄 cd /openocd-0.10.0
  4. 進行配置
$ ./configure
           

如果這個時候出現錯誤提示 找不到usb.h,原因是沒有安裝libusb的庫

下面安裝Libusb庫即可解決。

  1. 安裝libusb庫
$ sudo apt-get install libusb++-dev
$ ./configure
           
STM32進階開發(6)-makefile與調試器驅動

在最後我們可以看到這個配置支援的調試器類型,有些偏門的調試器在預設設定下是沒有打開的,我們可以通過類似于 ./configure --enable-jlink 的配置指令打開。

$ make
           
$ sudo make install 
           

至此OpenOCD的安裝便完成了,可以删除下載下傳的檔案了。完成安裝後,我們可以在**/usr/local/share的路徑下看到一個openocd**檔案夾,在其下scripts檔案夾下儲存着我們以後使用OpenOCD連接配接調試器的配置檔案。

如,在連接配接 stlink-V2+stm32f1xx 的硬體系統時我們使用指令來加載配置檔案,進而下載下傳程式:

後加:有些同學的安裝目錄可能在其他位置,為了避免安裝目錄不同的影響,我們在運作openocd時可以簡寫路徑,openocd會自動在其script路徑下搜尋腳本:

#編譯第一個程式

不論大家是否學會了使用前面那些工具,我們先放放讓我們來編譯一個小的流水燈工程來體會一下我們之前安裝好的軟體的功能吧。同時也體會一下在實際開發中,編譯與下載下傳程式的方式。

  1. 首先在使用者目錄下建立一個新的檔案夾:workspace ,作為我們以後的程式設計工作目錄
$ mkdir ~/workspace 
           
  1. 進入workspace 檔案夾,使用git指令下載下傳我在GitHub上托管的一個簡單的例程
$ cd ~/workspace 
$ git clone  https://github.com/zhengyangliu/simple-gcc-stm32-project.git
           
  1. 進入樣例工程的檔案夾
$ cd ./simple-gcc-stm32-project

           
  1. 使用檔案浏覽器打開工程目錄,此工程目錄結構與原子開發闆教程配置的工程結構相同,我們打開user目錄下的main.c檔案,将其中的流水燈的GPIO口配置根據自己的 stm32f103 開發闆修改。如果你是用的是原子的stm32f1戰艦開發闆V1版本,那麼恭喜你,你不需要做任何的修改就可以使用了。
  2. 修改後我們使用終端在工程目錄下執行make指令,生成hex和bin檔案
  1. 此時我們就可以将生成的LED_project.hex檔案拷貝到主控端上,通過ISP軟體下載下傳入單片機了。或者我們通過stlink,将st-link插上,在VMware右下角設定中接到虛拟機上,然後通過指令調OpenOCD連接配接st-link調試器下載下傳。
make update
           

在下載下傳完成後我們便能看到開發闆上的LED閃爍了。

#總結

教程至此,我們已經将最基本開發環境的軟體安裝配置完成,而且也學到了很多新的指令如git、mkdir、make 等,也嘗試了一個簡單的流水燈工程的編譯。但是我想大家距離了解這個開發環境的程度還很遠,首先就是我們不了解makefile檔案的文法和用法。這點就要求大家必須要去看至少20%的那篇跟我一起寫 Makefile的文章,隻有粗略的看得懂makefile我們才有繼續下去的資本。

在你能多少了解makefile文法的基礎上,我們接下來的幾篇會為大家講述編譯器的指令和編譯器的輸入參數,同時我們會結合這篇中最後提供的樣例工程中的makefile來分析在這個工程中makefile的意思和用法。

參考文章:

http://blog.163.com/brave_smile_heart/blog/static/187238171201261884412718/

http://blog.csdn.net/xiaofeng1234/article/details/38083211

http://blog.csdn.net/haoel/article/details/2886

繼續閱讀