把STM32F407的keil版程序移植到IAR for ARM上

  • 使用開發板:正點原子的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  之後,就沒有警告了,說明這還是正點原子寫這個的時候沒有特別注意這一個,雖然對結果沒影響。

 

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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章