TA的每日心情 | 无聊 2014-12-25 15:47 |
---|
签到天数: 6 天 连续签到: 1 天 [LV.2]偶尔看看I
|
习惯了在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从工程中移除,重新编译下载,重新观察上面的现象,可以看到闪烁频率明显变慢
工程在附件里,大小限制,分为两卷了
|
|