把STM32F407的keil版程序移植到IAR for ARM上
使用開發(fā)板:正點原子的STM32F407ZGTb——探索者
使用IAR版本,IAR Embedded Workbench for ARM 7.80.4.12495,如下圖所示

使用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文件,雙擊添加

我們發(fā)現CORE文件夾里面就只有唯一一個需要添加的文件——startup_stm32f40_41xxx.s?,結果我們還不用它了,所以建立的CORE分組好像就沒什么用了,也可以把它移除,【吐血】

之后就是把工程文件夾中的每一個文件夾中的.c源文件添加到對應分組中,跟上面添加startup_stm32f40x.s文件相同,理解的 同孩 可以跳過自己操作了
如下圖,以添加delay.c文件到SYSTEM分組中為例演示,

在SYSTEM分組上 右鍵 →Add →Add Files...

選擇相應文件夾下的delay.c文件就OK了,如果該目錄下需要添加的文件多的話,是可以批量添加的,支持鼠標區(qū)域選擇、Ctrl + A全選? 、Ctrl + 鼠標多選? 、Shift + 鼠標區(qū)域選擇?等window差用的功能與快捷鍵,移除時亦可以~,keil好像移除的只能一個文件一個文件的移除

然后我還在IAR文件夾里新建了一個? 說明 文件夾并在里面新建了一個說明.txt的文件,用來解釋說明這個工程文件的功能,用途等等,并把工程文件下的README文件夾中的說明文件?README.txt添加了進來,
至此,所有源文件都添加進來了,如下圖,是與keil的對比,主要區(qū)別是兩個的啟動文件的不同,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?

我們遇到什么錯誤,都不要害怕,消除錯誤的最好辦法就是把錯誤的部分去掉,只要去掉就不會出錯? [狗頭]?[狗頭]?[狗頭]?[狗頭]
我們跳轉定義,發(fā)現在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? 之后,就沒有警告了,說明這還是正點原子寫這個的時候沒有特別注意這一個,雖然對結果沒影響。

好了,本次修訂結束,如果有新的小伙伴發(fā)現還有哪里有問題的話,歡迎提出,大家相互學習和探討
