微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > OK6410 裸机中断最简单代码

OK6410 裸机中断最简单代码

时间:11-10 来源:互联网 点击:

然后,基本中断向量允许位,这也是中断条件(2)需要的,这样定时器中断配置就配置好了,然后, 需要初始人中断源的配置信息,这是条件(1)所要求的,我们需要定时器完成定时任务,就需要定时器计数到零的时候,自动装载计算值,重新计数,以重新产生中断。这里为什么要这么设置了,设置的顺序在文档中有说明的,比如这里对rTCON的配置就是要求的一个顺序。定时器分频在S3C6410文档的PWM节有描述,这里将时间频率设为1MHz,这样我们就好计算定时的时间了。

关于定时器初值的计算,我说一下我的理解。

MHz是兆赫兹,表示一秒内振荡的资料,这表示1MHz = 每秒震荡1000 000次,反过来,如果你需要一秒的定时,你需要计数1000,000次,也就是要求频率为1MHz,那如何配置频率为1MHz呢?参考手册上有这个参数:

Timer input clock Frequency = PCLK / ( {prescaler value + 1} ) / {divider value}

这样如果需要一秒的时间一次中断,在没有配置PPL(可以配置CPU的倍频的东西)的情况下,CPU的频率为FOSC的频率,即66MHz,在分频为66,预分频为0,那么需要设置计数值为1000,000,这样就可以产生每秒一次的中断了。

中断初始化完成之后,主程序可以进入死循环,等待中断的来临……

在等待之前,我们需要正确设置中断向量,进入C语言代码的中断程序,再正确返回到程序的原为位置。中进入中断向量之前,CPU进入中断状态,使用中断状态下的特殊寄存器,通过寄存器仍然使用中断之前模式的,为了防止破坏中断之前的代码,需要备份这些寄存器,之后,将中断函数的返回地址设置好后,就可以进入实际中断处理函数了。中断处理函数返回后,需要恢复寄存器现场,并通过将PC设置为中断前的地址,以使主程序断续。

[cpp]view plaincopy

  1. IRQHandler
  2. STMFDSP!,{r0-r3,r12,lr};保存现场
  3. ldrlr,=int_return;设置中断异常处理程序返回地址到下面的位置
  4. BIRQ_Exception;直接进入到中断函数处理
  5. int_return
  6. LDMFDSP!,{r0-r3,r12,lr};恢复现场
  7. SUBSPC,LR,#4;返回进入中断前的代码

通过上面的简陋代码,可以让中断进入到我们的C程序IRQ_Exception程序中。

下面给出简单的中断跑马灯代码:

[cpp]view plaincopy

  1. inti=0;
  2. //IRQ异常中断
  3. voidIRQ_Exception()
  4. {
  5. i%=4;
  6. //打开一个灯,并闭另外一个灯
  7. rGPMDAT=~(1
  8. //清除定时器中断状态位
  9. while((rTINT_CSTAT&0x20))rTINT_CSTAT|=(1<5);
  10. }

中断程序很简单,切换灯,并清除中断。清除中断是我最后的一个难点,这一行代码,我查了很多资料,还不是很明白。首先,中断状态一定要清除的,不然程序进入中断后,将不会再出来了,因为中断状态不清,中断将会不断的产生。还有中断状态清除是通过置位寄存器指定位来清零的,如果不加入while等待,那么清除指令操作很可能没有正确执行,导致中断会马上再次进入,而且表现在灯效果上,就是四个灯只有两个隔着亮,这里的原因是第二次清中断,一条指令就可以成功,第一次不会成功。如果在中断加入延时代码,也会每次都成功。后来分析,并参考资料,说是在电平中断时,只有在中断无效状态时,该位置位才有效。这也是这里为什么一定会使用while等待的原因了。

好了,中断程序就这样介绍完了,这里还有如何设置启动代码,寄存器如果定义等相关内容,可以参考由上面给出的飞凌论坛的《裸机教学视频第一季》。如果出了第二季,我就不会这么走的如此艰辛了。
程序下载地址:http://download.csdn.net/source/3567988


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top