-
使用開發板:正點原子的STM32F407ZGTb——探索者
-
使用IAR版本,IAR Embedded Workbench for ARM 7.80.4.12495,如下圖所示
IAR版本信息
-
使用ST-Link進行在線下載程序和調試
-
使用正點原子提供的源代碼移植到IAR上,有人說,爲啥要移植到IAR上呢,也沒啥,總有需要嘛。如下圖所示爲所有的庫函數源代碼
正點原子庫函數源代碼
-
整個移植過程與思路,使用上面提到的 正點原子 提供的工程文件,直接在工程裏面新建IAR工程,然後讓整個工程實現支持IAR和Keil。
-
IAR軟件安裝——————略,請去官方下載,自行安裝。
正文開始,以源代碼:實驗0 Template工程模板爲基礎來實現移植
新建IAR工程,打開IAR→project→Create New Project...
我們選擇建立一個空工程
在工程文件夾下新建一個IAR文件夾
把工程保存到這個文件夾下
接下來就是整個工程的搭建,在新建的工程上右鍵 →Add →Add Group...,熟悉IAR的都知道怎麼做了,可以跳過
我們建立下圖所示的分組,裏面是用來添加源程序文件的,分組以方便後期管理,熟悉IAR的都知道怎麼做了,可以跳過
保存所有,保存工作空間,這樣新的空工程就建好了
我還建立了一個說明的組,用來放說明文件
接下來就是把各個分組的文件導入
首先是有一個要處理的是STM32啓動文件,如果沒有這個文件,程序也可以編譯通過,也可以運行,但是中斷函數是進不去的,而keil使用的是在工程目錄下的CORE文件夾下的:startup_stm32f40_41xxx.s 文件,如下圖所示,但是這個文件我暫時還無法讓它適用於IAR,所以我們要去找適合IAR的啓動文件
打開安裝IAR for ARM的路徑,
...\IAR Systems\Embedded Workbench 7.5\arm\RTOS\SEGGER\ST\STM32F407\embOS_STM32F4_Discovery\DeviceSupport
選擇startup_stm32f40x.s,這是使適用於IAR的STM32啓動文件
複製一份到在工程文件夾下建立的IAR文件夾中
然後,把它添加進IAR分組中,詳細操作如下圖,跟添加分組有點類似,熟悉IAR的也都知道怎麼做了,可以跳過
在IAR分組上 右鍵 →Add →Add Files...
選擇剛纔複製的startup_stm32f40x.s文件,雙擊添加
我們發現CORE文件夾裏面就只有唯一一個需要添加的文件——startup_stm32f40_41xxx.s ,結果我們還不用它了,所以建立的CORE分組好像就沒什麼用了,也可以把它移除,【吐血】
之後就是把工程文件夾中的每一個文件夾中的.c源文件添加到對應分組中,跟上面添加startup_stm32f40x.s文件相同,理解的 同孩 可以跳過自己操作了
如下圖,以添加delay.c文件到SYSTEM分組中爲例演示,
在SYSTEM分組上 右鍵 →Add →Add Files...
選擇相應文件夾下的delay.c文件就OK了,如果該目錄下需要添加的文件多的話,是可以批量添加的,支持鼠標區域選擇、Ctrl + A全選 、Ctrl + 鼠標多選 、Shift + 鼠標區域選擇 等window差用的功能與快捷鍵,移除時亦可以~,keil好像移除的只能一個文件一個文件的移除
然後我還在IAR文件夾裏新建了一個 說明 文件夾並在裏面新建了一個說明.txt的文件,用來解釋說明這個工程文件的功能,用途等等,並把工程文件下的README文件夾中的說明文件 README.txt添加了進來,
至此,所有源文件都添加進來了,如下圖,是與keil的對比,主要區別是兩個的啓動文件的不同,FWLIB中是外設的庫,一般是使用哪個外設添加相應的外設庫,也可以全部添加,我只添加了幾個作爲示例
接下來是一些設置,添加完之後如果直接編譯,肯定是一大堆一大堆的錯誤,
在工程上右鍵 →Options...打開工程設置
選擇General Options →Target →Device →ST ...直到選擇自己使用的單片機型號,例如我的ST STM32F407ZG ,選擇好了之後不要急着點 OK,
一般我們都要支持printf串口輸出,再次選擇Library Configuration →Library 選擇Full就可以爲後面支持printf串口輸出做好準備了,之後也不要急着點 OK,
選擇C/C++Compiler 點擊右邊的小箭頭 →找到 Preprocessor
→在Defined symbols:(one per line)裏面輸入兩個宏定義:
USE_STDPERIPH_DRIVER
STM32F40_41xxx
在Additional include directories:(one per line)裏面輸入地址
$PROJ_DIR$
$PROJ_DIR$\.
$PROJ_DIR$\..\CORE
$PROJ_DIR$\..\FWLIB\inc
$PROJ_DIR$\..\FWLIB\src
$PROJ_DIR$\..\SYSTEM\delay
$PROJ_DIR$\..\SYSTEM\sys
$PROJ_DIR$\..\SYSTEM\usart
$PROJ_DIR$\..\USER
這是所有工程文件包含的文件夾,裏面有頭文件需要IAR去這裏面找
也可以手動一個文件夾一個文件夾添加,點擊右邊的 ... ,可以看到已經添加的地址(相對地址)
點擊 Click to add添加新的地址 ,
例如,我把README文件夾添加進來,雙擊該文件夾,演示作用,其實沒什麼用,
進入之後,點擊Select
可以看到,剛選擇之後默認問絕對地址,這樣與對於移植程序或移動不友好,改爲相對地址
點擊右側的向下的三角▽,選擇$PROJ_DIR$\..\README ,就OK了
因爲是演示,沒用,所以我們在把它去掉,【我太南了】,點擊要去掉的地址,點擊前面的紅色×就可以了
這樣設置就好了,但是,也不要急着點 OK,【吐血】,我們順便把ST-Link也一併設置好,
選擇Debugger →Setup →Driver →選擇ST-LINK
選擇ST-LINK,可以設置連接方式、速度等
OK,終於完成了,可以點OK了
你以爲完成了嗎,如果你添加了usart.c的話,你編譯還是會出錯,【再次吐血】
相信我,只差億點點,只剩 億 步,就能完成了
打開usart.c,編譯的 warnings:1 errors: 1
可以看到他寫的是....
警告無法識別
錯誤,已經定義聲明,那就是重複定義
既然有錯,那就把錯誤的去掉好了,【嘿嘿嘿】
於是, warnings:0 errors: 0
我們遇到什麼錯誤,都不要害怕,消除錯誤的最好辦法就是把錯誤的部分去掉,只要去掉就不會出錯 [狗頭] [狗頭] [狗頭] [狗頭]
我們跳轉定義,發現在stdio.h中已經有定義,那keil爲什麼..,好了這個問題留給有時間和精力童孩探索了,【我纔不會說我去試了一下就沒深入瞭解了】
在線調試,使用printf,串口可以輸出
總算移植成功了。
多難興邦
天佑中華
願逝者安息
頌英雄不朽
前輩們
這盛世如您所願
將來
就放心的交給我們吧
2020年4月4日14:22:43
PS:2020年4月7日補充說明:
當時有億點點遺漏,真的只是億點點T^T,如下,
這個函數:void _sys_exit(int x) 原來不是長這樣的,本來是長這樣的:_sys_exit(int x)當時編譯的時候出錯了,我下意識的以爲是自己不小心把 函數前面的 void 給刪掉了,結果是人家本來就沒帶,所以有的小夥伴如果沒注意,在編譯的時候可能還是會出錯的。
這裏還要說一下,在keil裏面沒加這個 void 雖然在Build Output裏面:warnings:0 errors: 0
但是也有警告在這個函數前面還是有提醒警告,如下圖所示
而加上 void 之後,就沒有警告了,說明這還是正點原子寫這個的時候沒有特別注意這一個,雖然對結果沒影響。
好了,本次修訂結束,如果有新的小夥伴發現還有哪裏有問題的話,歡迎提出,大家相互學習和探討