keil5工程移植到IAR工程
一、 軟件版本
MDK-ARM Professional Version: 5.14.0.0
IAR 8.1
移植工程:基於正點原子開發板建立的STM32F407ZGT6工程
二、 開始建立IAR對應工程
1、 keil5例程結構如下:
2、 建立對應的IAR工程:
參考鏈接:https://blog.csdn.net/Q_fighting/article/details/89429962
3、 建立好的對應IAR工程如下:
可以看到,基本按照MDK中的結構建立了對應的IAR工程
三、 修改對應的文件(重點)
1、 修改startup_stm32f40_41xxx.s文件,由於IAR中使用的是自己的啟動文件,所以先要找到對應的文件進行代替。在固件庫的此路徑下:
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar
2、修改sys.c文件
IAR中的匯編引用於MDK中是不一樣的,移植時務必注意,這也就導致了無法同時很好支持兩個編譯器,只能做不同的版本了。修改后的代碼如下:
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學習使用,未經作者許可,不得用於其它任何用途
//ALIENTEK STM32F407開發板
//系統時鍾初始化
//包括時鍾設置/中斷管理/GPIO設置等
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//創建日期:2014/5/2
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2014-2024
//All rights reserved
//********************************************************************************
//修改說明
//無
//////////////////////////////////////////////////////////////////////////////////
//THUMB指令不支持匯編內聯
//采用如下方法實現執行匯編指令WFI
#if defined ( __ICCARM__ ) //IAR下使用
void WFI_SET(void)
{
asm("WFI");
}
//關閉所有中斷(但是不包括fault和NMI中斷)
void INTX_DISABLE(void)
{
asm("CPSID I");
asm("BX LR");
}
//開啟所有中斷
void INTX_ENABLE(void)
{
asm("CPSIE I");
asm("BX LR");
}
//設置棧頂地址
//addr:棧頂地址
void MSR_MSP(u32 addr)
{
asm("MSR MSP, r0"); //set Main Stack value
asm("BX r14");
}
#else
__asm void WFI_SET(void)
{
WFI;
}
//關閉所有中斷(但是不包括fault和NMI中斷)
__asm void INTX_DISABLE(void)
{
CPSID I
BX LR
}
//開啟所有中斷
__asm void INTX_ENABLE(void)
{
CPSIE I
BX LR
}
//設置棧頂地址
//addr:棧頂地址
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
#endif
3、修改usart.c
主要修改部分如下:
////////////////////////////////////////////////////////////////// //加入以下代碼,支持printf函數,而不需要選擇use MicroLIB
#if defined ( __ICCARM__ ) //IAR下使用
//重定義fputc函數
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
USART1->DR = (u8) ch;
return ch;
}
#else //非IAR下使用
#pragma import(__use_no_semihosting)
//標准庫需要的支持函數
struct __FILE { int handle; };
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
USART1->DR = (u8) ch;
return ch;
} #endif
4、 修改相關工程設置