zoukankan      html  css  js  c++  java
  • 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.0LibrariesCMSISDeviceSTSTM32F4xxSourceTemplatesiar

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

               

     

  • 相关阅读:
    Maven打jar包(有依赖)
    java使用ffmpeg进行多个视频合并
    ffmpeg视频精准剪切
    windows下java调用海康sdk,Unable to load library 'HCNetSDK'
    java使用JNA框架调用dll动态库
    排序和反转
    118. 杨辉三角
    1394. 找出数组中的幸运数
    1491. 去掉最低工资和最高工资后的工资平均值
    1332. 删除回文子序列
  • 原文地址:https://www.cnblogs.com/lh03061238/p/10917654.html
Copyright © 2011-2022 走看看