keil5工程移植到IAR工程

时间:2022-11-09 21:28:48

keil5工程移植到IAR工程

一、 软件版本

MDK-ARM Professional  Version: 5.14.0.0

IAR 8.1

移植工程:基于正点原子开发板建立的STM32F407ZGT6工程

二、 开始建立IAR对应工程

1、 keil5例程结构如下:

keil5工程移植到IAR工程

2、 建立对应的IAR工程:

参考链接:https://blog.csdn.net/Q_fighting/article/details/89429962

3、 建立好的对应IAR工程如下:

keil5工程移植到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、 修改相关工程设置

keil5工程移植到IAR工程

keil5工程移植到IAR工程