1回答

0收藏

结合mkd下的启动和初始化文件和官方软件包搭建IAR下开发...

其他 其他 3832 人阅读 | 1 人回复 | 2013-01-14

习惯了在MDK下的开发方式,中断向量表和时钟初始化在进入main函数前就已经完成,但是在IAR下SAM-4s官方提供的软件包没有这两个文件,怎么办?把他们移植过来步就行了,怎么移植?分两步
1. 修改sam4s.s文件,具体做法是在IAR下找到ST的任意一个.s文件,将中断向量表,默认中断服务函数等修改一下名称,将多余的中断服务函数向量表项删除掉就差不多了。我的st的汇编文件在如下目录

这里面任意一个都行
sam4s.s在mdk的startup文件夹下有,可参考下面目录,另外一个c文件是第二步需要修改的文件

修改方法很简单,还可以参考IAR提供的帮助文档

第二步修改system_SAM4S.c文件,将修改好的的.s文件和这个c文件加入建立好的工程模版里,方法可参考
https://www.cirmall.com/bbs/thread-6412-1-1.html
只加入基本驱动库,而且需要将里面的USB驱动文件去掉,编译,会报错,仔细研究报错的选项,是一下宏定义没有,在mdk下通用建一个空白的工程,将报错的宏定义在mdk下查找出来,全部复制到system_SAM4S.c文件的前面,直到不报错为止。
第三步:测试
测试1:利用systic定时器产生定时中断来控制LED2闪烁的频率,比较system_SAM4S.c 和sam4s.s 包含和步包含在工程中时,闪烁频率的变化。无初始化时默认应该是片内振荡器提供时钟频率,应该是12M,
测试2:设置外部按键中断,编写中断服务函数改变LED1的闪烁频率,测向量表是否工作正常。

main.c文件
#include "SAM4S16C.h"
#include "chip.h"

unsigned systicks=0;
unsigned dlyMs=0;                    //延时时间,可通过按键中断服务函数修改
void delayMs(uint32_t n)
{
  unsigned int tmp;
  tmp=120*200*n;
  while(tmp--);
}
void LedInit()
{
  Pin LedInitStruct;
  LedInitStruct.mask=PIO_PC10|PIO_PC17;
  LedInitStruct.pio=PIOC;
  LedInitStruct.id=ID_PIOC;
  LedInitStruct.type=PIO_OUTPUT_0;
  LedInitStruct.attribute=PIO_PULLUP;
  PIO_Configure(&LedInitStruct,1);
}

void KeyInit()
{
  Pin KeyInitStruct;
  KeyInitStruct.mask=PIO_PA5;
  KeyInitStruct.pio=PIOA;
  KeyInitStruct.id=ID_PIOA;
  KeyInitStruct.type=PIO_INPUT;
  KeyInitStruct.attribute=PIO_PULLUP|PIO_IT_AIME|PIO_IT_FALL_EDGE;
  PIO_Configure(&KeyInitStruct,1);
  PIOA->PIO_IER|=1<<5;
  NVIC_EnableIRQ(PIOA_IRQn);
}

void UartInit()
{


}
int main()
{
  LedInit();                   //初始化LED
  KeyInit();                   //初始化按键为中断输入,下降沿触发
  SysTick_Config(12000000);    //初始化系统定时器,定时间隔约为100毫秒
  dlyMs=300;
while(1)
{
   PIOC->PIO_SODR|=PIO_SODR_P10;
   delayMs(dlyMs);
   PIOC->PIO_CODR|=PIO_CODR_P10;
   delayMs(dlyMs);
}
}

void SysTick_Handler()
{   
       systicks++;
     if(systicks%2==1)
      PIOC->PIO_SODR|=PIO_SODR_P17;         //熄灭LED2
     else
      PIOC->PIO_CODR|=PIO_CODR_P17;         //点亮
}
void PIOA_IrqHandler()                      //按键中断服务函数
{
    static unsigned i=0;
    uint32_t status;
     i++;
    /* Read PIO controller status */
    status = PIOA->PIO_ISR;
    status &= PIOA->PIO_IMR;
    if(i%3==1)
     dlyMs=200;
    else if(i%3==2)
     dlyMs=100;
    else
      dlyMs=300;
}

将编译好的工程下载到板上,观察两个灯的闪烁频率,按BP2按键,观察LED1的闪烁频率是否改变
将sam4s.s和system_SAM4S.c从工程中移除,重新编译下载,重新观察上面的现象,可以看到闪烁频率明显变慢


工程在附件里,大小限制,分为两卷了
                  


复件 libchip_sam4s.part02.rar

4.57 MB, 下载次数: 14

复件 libchip_sam4s.part01.rar

5.72 MB, 下载次数: 9

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

fengye5340-272571

发表于 2013-1-14 21:59:23 | 只看该作者

楼主,IAR下有专门的启动文件,我已经找到了,明天传一份上来
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条