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

主要是fputc函数的重写,修改后的代码如下:

#include "sys.h"

#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////    

//Èç¹ûʹÓÃucos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É.

#if SYSTEM_SUPPORT_OS

#include "includes.h"                               //ucos ʹÓà  

#endif

//////////////////////////////////////////////////////////////////////////////////  

//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;

//ALIENTEK STM32F4̽Ë÷Õß¿ª·¢°å

//´®¿Ú1³õʼ»¯             

//ÕýµãÔ­×Ó@ALIENTEK

//¼¼ÊõÂÛ̳:www.openedv.com

//ÐÞ¸ÄÈÕÆÚ:2014/6/10

//°æ±¾£ºV1.5

//°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£

//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019

//All rights reserved

//********************************************************************************

//V1.3ÐÞ¸Ä˵Ã÷

//Ö§³ÖÊÊÓ¦²»Í¬ÆµÂÊϵĴ®¿Ú²¨ÌØÂÊÉèÖÃ.

//¼ÓÈëÁ˶ÔprintfµÄÖ§³Ö

//Ôö¼ÓÁË´®¿Ú½ÓÊÕÃüÁÄÜ.

//ÐÞÕýÁËprintfµÚÒ»¸ö×Ö·û¶ªÊ§µÄbug

//V1.4ÐÞ¸Ä˵Ã÷

//1,Ð޸Ĵ®¿Ú³õʼ»¯IOµÄbug

//2,ÐÞ¸ÄÁËUSART_RX_STA,ʹµÃ´®¿Ú×î´ó½ÓÊÕ×Ö½ÚÊýΪ2µÄ14´Î·½

//3,Ôö¼ÓÁËUSART_REC_LEN,ÓÃÓÚ¶¨Òå´®¿Ú×î´óÔÊÐí½ÓÊÕµÄ×Ö½ÚÊý(²»´óÓÚ2µÄ14´Î·½)

//4,ÐÞ¸ÄÁËEN_USART1_RXµÄʹÄÜ·½Ê½

//V1.5ÐÞ¸Ä˵Ã÷

//1,Ôö¼ÓÁ˶ÔUCOSIIµÄÖ§³Ö

//////////////////////////////////////////////////////////////////////////////////     

//////////////////////////////////////////////////////////////////

//¼ÓÈëÒÔÏ´úÂë,Ö§³Öprintfº¯Êý,¶ø²»ÐèҪѡÔñuse MicroLIB      

#if 1

//#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;

}

void UsSend(unsigned char comm_flag,unsigned char *Data,unsigned short int len)

{

       uint16_t i = 0,dummy;

       for(i=0;i<len;i++)

       {     

   if(comm_flag==1)

    {

               dummy=USART1->SR & USART_FLAG_TC; //±ÜÃâÁ˵ÚÒ»´Î·¢ËÍc0·¢²»³öÈ¥µÄÇé¿ö

          USART1->DR = *(Data+i) & (uint16_t)0x01FF;

     while((USART1->SR & USART_FLAG_TC)==RESET);

         }

   else if(comm_flag==2)

    {

               dummy=USART2->SR & USART_FLAG_TC; //±ÜÃâÁ˵ÚÒ»´Î·¢ËÍc0·¢²»³öÈ¥µÄÇé¿ö

          USART2->DR = *(Data+i) & (uint16_t)0x01FF;

     while((USART2->SR & USART_FLAG_TC)==RESET);

         }

   else if(comm_flag==3)

    {

               dummy=USART3->SR & USART_FLAG_TC; //±ÜÃâÁ˵ÚÒ»´Î·¢ËÍc0·¢²»³öÈ¥µÄÇé¿ö

          USART3->DR = *(Data+i) & (uint16_t)0x01FF;

     while((USART3->SR & USART_FLAG_TC)==RESET);

        }

       }

    i=dummy;//ΪÁËÏû³ý¾¯¸æÌí¼Ó´ËÌõÓï¾ä£¬Ã»ÓÐʵ¼Ê×÷Ó㬿Éɾ³ý¡£

}

#endif

#if EN_USART1_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ

//´®¿Ú1ÖжϷþÎñ³ÌÐò

//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó     

u8 USART_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.

//½ÓÊÕ״̬

//bit15£¬      ½ÓÊÕÍê³É±êÖ¾

//bit14£¬      ½ÓÊÕµ½0x0d

//bit13~0£¬  ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿

u16 USART_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç 

//³õʼ»¯IO ´®¿Ú1

//bound:²¨ÌØÂÊ

void uart_init(u32 bound){

   //GPIO¶Ë¿ÚÉèÖÃ

  GPIO_InitTypeDef GPIO_InitStructure;

       USART_InitTypeDef USART_InitStructure;

       NVIC_InitTypeDef NVIC_InitStructure;

      

       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ʹÄÜUSART1ʱÖÓ

       //´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä

       GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1

       GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1

      

       //USART1¶Ë¿ÚÅäÖÃ

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz

       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö

       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­

       GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA9£¬PA10

   //USART1 ³õʼ»¯ÉèÖÃ

       USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖÃ

       USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ

       USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ

       USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ

       USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ

       USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //ÊÕ·¢Ä£Ê½

  USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1

      

  USART_Cmd(USART1, ENABLE);  //ʹÄÜ´®¿Ú1

      

       //USART_ClearFlag(USART1, USART_FLAG_TC);

      

#if EN_USART1_RX     

       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ

       //Usart1 NVIC ÅäÖÃ

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ

       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3

       NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;             //×ÓÓÅÏȼ¶3

       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                  //IRQͨµÀʹÄÜ

       NVIC_Init(&NVIC_InitStructure);  //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢

#endif

      

}

void USART1_IRQHandler(void)                  //´®¿Ú1ÖжϷþÎñ³ÌÐò

{

       u8 Res;

#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS.

       OSIntEnter();   

#endif

       if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)

       {

              Res =USART_ReceiveData(USART1);//(USART1->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý

             

              if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É

              {

                     if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d

                     {

                            if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼

                            else USART_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË

                     }

                     else //»¹Ã»ÊÕµ½0X0D

                     {     

                            if(Res==0x0d)USART_RX_STA|=0x4000;

                            else

                            {

                                   USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

                                   USART_RX_STA++;

                                   if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ       

                            }            

                     }

              }            

  }

#if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS.

       OSIntExit();                                                                          

#endif

}

#endif   

4、 修改相关工程设置

           

猜你喜欢

转载自www.cnblogs.com/lh03061238/p/10917654.html