keil5工程移植到IAR工程


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、 修改相關工程設置

           

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM