历史上的今天
今天是:2024年08月25日(星期日)
2021年08月25日 | 飞思卡尔RTI实时中断模块
2021-08-25 来源:eefocus
实时中断就是一个定时模块,定时溢出,产生中断。 第一步,实时中断RTI 在默认情况下是关闭的,怎样才能让 RTI 工作呢? 这就用到实时中断控制寄存器 RTICTL 了。 RTICTL是一个八位寄存器,第七位没定义,只用到低七位[RTR6~RTR0]。当RTR[6:4]=000时,实时中断被禁止,只要当RTR[6:4] 不全为0时,实时中断就开了同时实时中断的溢出周期也是由该寄存器配置的。 RTI 的参考时间是外部晶振的时钟OSCCLK。故,实时中断的溢出时钟周期=(RTR[3:0]+1) x (2的(RTR[6:4] + 9)次方)/OSCCLK 第二步,要想在实时中断溢出时产生一个中断,则用到寄存器 CRGINT 了。
当CRGINT_RTIE=1时,每个周期结束时,就会产生一个中断只要配置好上面说的两个寄存器,再写上相应的中断函数,实时中断就可以用了。顺便提一下,实时中断 RTI 的中断号是 7 CRGFLG_RTIF 是实时中断的标志位,当 RTI 溢出时,CRGFLG_RTIF 就会由硬件置1,向CRGFLG_RTIF 写1,可以清零标志位。这和51单片机不一样,51单片机的标志位清零是向相应的寄存器写0 与 RTI 相关的寄存器还有 CLKSEL_RTIWAI,不过一般都不会用到。当CLKSEL_RTIWAI=1时,只要系统进入等待模式,RTI 就停止工作。当CLKSEL_RTIWAI=0时,在等待模式下,RTI 仍然工作实时中断写到这里接进尾声了,下面附些与实时中断相关的程序:实时中断就是一个定时模块,定时溢出,产生中断。 第一步,实时中断RTI 在默认情况下是关闭的,怎样才能让 RTI 工作呢? 这就用到实时中断控制寄存器 RTICTL 了。 RTICTL是一个八位寄存器,第七位没定义,只用到低七位[RTR6~RTR0]。当RTR[6:4]=000时,实时中断被禁止,只要当RTR[6:4] 不全为0时,实时中断就开了同时实时中断的溢出周期也是由该寄存器配置的。 RTI 的参考时间是外部晶振的时钟OSCCLK。故,实时中断的溢出时钟周期=(RTR[3:0]+1) x (2的(RTR[6:4] + 9)次方)/OSCCLK 第二步,要想在实时中断溢出时产生一个中断,则用到寄存器 CRGINT 了。
当CRGINT_RTIE=1时,每个周期结束时,就会产生一个中断只要配置好上面说的两个寄存器,再写上相应的中断函数,实时中断就可以用了。顺便提一下,实时中断 RTI 的中断号是 7 CRGFLG_RTIF 是实时中断的标志位,当 RTI 溢出时,CRGFLG_RTIF 就会由硬件置1,向CRGFLG_RTIF 写1,可以清零标志位。这和51单片机不一样,51单片机的标志位清零是向相应的寄存器写0 与 RTI 相关的寄存器还有 CLKSEL_RTIWAI,不过一般都不会用到。当CLKSEL_RTIWAI=1时,只要系统进入等待模式,RTI 就停止工作。当CLKSEL_RTIWAI=0时,在等待模式下,RTI 仍然工作实时中断写到这里接进尾声了,下面附些与实时中断相关的程序:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
void RTI_INIT() //实时中断 RTI 初始化函数
{
CRGINT_RTIE=1; // 允许在每个周期结束产生中断
RTICTL=0x59; // 设置RTICTL为 0101 1001 溢出周期为 (9+1)*2^(5+9)/(16M)= 10*2^14/(16M)
} //实际上是10.24ms 16M是外部晶振的频率,实时中断以外部晶振时钟为参考时钟
void main()
{
DisableInterrupts;
RTI_INIT();
EnableInterrupts;
for(;;)
{
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //实时中断RTI 中断函数
void interrupt 7 RTI(void)
{
CRGFLG_RTIF=1; //向CRGFLG_RTIF 写1 清除标志位
上一篇:飞思卡尔中断设置
下一篇:飞思卡尔运动小车前方道路识别
史海拾趣
|
小弟最近在写一个串口驱动,用到一个寄存器,其物理地址为0x18000000,也就是bank3的基地址,据我所知,linux 2.6中要读些该寄存器不可直接使用这个物理地址,它的虚拟地址是多少呢?之前调用了ioremap(08000000,1),但是没有达到预期效果,不知 ...… 查看全部问答> |
|
用libusb库搞了一个通信程序,usb_interrupt_read进行接收,但是这个函数是非阻塞的,写死循环太占CPU。 我试了select,监视/dev/bus/usb下设备打开句柄,也试了监视设备的输入端点管道句柄,都不好用。有谁搞过这方面的东西,提提建议。貌似win版 ...… 查看全部问答> |
|
本人也是刚接触1114,编写了段程序可是进入不了中断,特请教各位同道中人。我是想用定时器捕获功能,如能赐教不胜感激。 调试中发现在捕获脚上输入脉冲信号,程序就进入DefualtVectorHandle();函数中。可是关闭了中断注册函数zyIsrSet(NVIC_TIMER32 ...… 查看全部问答> |
|
我想编一个数码管动态显示的程序,但是下到板子(epm240t100c5)里一直跑不起来,也不知道是什么问题,求高手指导,谢谢。 module dig_show(clk,rst,csm_1,csm_2,db);input clk; ...… 查看全部问答> |
|
用过单片机的人应该都熟悉矩阵键盘扫描程序。矩阵键盘一般是依次扫描输出管脚,需要N(N为输出管脚的数目)次扫描才能完成整个键盘的一次完整扫描。不过,你见过一次就可以扫描一个完整键盘的程序吗?呵呵,这个你应该见过的,这就是键盘扫描中很有 ...… 查看全部问答> |
|
易电源试用报告3.2:LMZ12010初试大电流输出:纹波较大,滤波用电感烧毁(芯片外) 从同学那儿弄来的500W 20Ω瓷盘变阻器派上用场了,但是要让LMZ12010输出吓人的10A电流的话,这个电阻值还是有点大,滑动端转到边缘上达到几欧姆,再小就要碰到另一端了。由于时间匆忙,今晚只粗略观察了一下,并没有正式测量数据。使用的最小电阻是 ...… 查看全部问答> |




