原创
freescale coldfire V1中断处理的几点说明
最近用FSL的MCF51CN128做个东西,此款芯片是飞思卡尔coldfire v1 core系列的一种。集成了以太网控制器,16个KBI中断+1个外部IRQ中断,多通道的ADC,3个SCI(即UART)。因为coldfire v1主要是为了提供低成本的32位微控制器,它实际上更像HCS08系列,而不像coldfire v2~v4那些系列。就V1的中断处理几个注意点说明下:这还是经飞思卡尔工程师确认的。
1. coldfire v1的中断控制器也是实现了7个interrupt level每个level里又支持9个priority,这点和coldfire v2是一样的,而hcs08则只有一个level,中断的优先级是固定的。不过coldfire v1虽然实现了7个level,但它与v2不同的是:每个中断源的优先级(interrupt level+priority)都是定死的,即不像coldfire v2是可以软件任意设置优先级的。
2. 在编程的时候,写中断服务程序isr的时候,只需要和hcs08完全一样的写法即可,无需在exceptions.c文件中把isr的名称加到对应位置上(而coldfire v2系列就需要这么做)
例如:MTIM中断服务程序
//mtim1 interrupt routine
interrupt VectorNumber_Vmtim1 void mtim1_isr(void) {
Timer++;
MTIM1SC_TOF=0;
}
3.coldfire v1的中断处理可以设置成类似于HCS08的那种只有一个level的方式,方法是在进入每个中断服务程序的一开始就禁止所有可屏蔽中断。执行下面的指令:
MOVE.w #0x2700,SR
4.虽然如前面所说,coldfire v1的中断源的interrupt level和priority是固定死的,不像coldfire v2那样可以任意编程设置优先级。但coldfire v1仍然提供了有限的中断优先级调整手段,称为remap。coldfire v1的中断控制器有这么两个寄存器:INTC_PL6P6,INTC_PL6P7;这两个寄存器可以用来设置两个可屏蔽的最高优先级的中断源,即level6的priority 6和7.举个例子:串口sci1的发送和接收中断在MCF51CN128中对应的中断源号是16和17,本来它们的优先级分别是level4 priority 5和level 4,priority 6,我们可以用下面的语句把这两个中断的优先级提升到最高
INTC_PL6P7=16;
INTC_PL6P6=17;
则sci1的发送中断的优先级现在编程level 6,priority7(这是所有可屏蔽中断中的最高优先级了,level7是不可屏蔽中断);接收中断则是level6,priority6,是第2高的中断了。
文章评论(0条评论)
登录后参与讨论