"); //-->
本文介绍如何使用COLDFIRE系列处理器--MCF52235来实现定时中断。定时中断是一个很重要的功能,它可以产生一个周期性的中断,并且周期可以通过硬件设置,具有非常高的精度。在9S12单片机中,我们可以使用实时中断RTI功能来得到周期性中断,而在COLDFIRE里,我个人并没有发现有RTI功能,但是它却给予我们一个更加方便和先进的方法,使用PIT(Programmable Interrupt Timer)模块。
PIT模块可以工作在诸多模式下,如等待、停止和调试等等。
主要寄存器有:
1、控制和状态寄存器--PCSRn
可以选择分频因子,假睡眠模式的工作,调试模式位,是否可覆盖,中断允许位,中断标志位,重新加载位和系统使能位。
2、模块寄存器--PMRn
内部存储加载到计数器的数值。
3、计数寄存器--PCNTRn
模块的计数寄存器。
下面给出一个在1秒内产生10次中断,并使用LED显示的例子。也许注释不够详细(我实在没时间写注释了),但是代码一定好使,工作在CW6.4下是没有问题的。
#include "support_common.h"
#include
void GPIOInit()
{
MCF_GPIO_DDRTC=0xff;
MCF_GPIO_PORTTC=0x00;
printf("GPIO init complete.\n");
}
void init_PIT()
{
MCF_INTC0_ICR55 = MCF_INTC_ICR_IL(0x3) |
MCF_INTC_ICR_IP(0x3);
//Configure the interrupt level and priority
MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_INT_MASK55;
//Open the local mask
MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASKALL;
// Open the maskall
MCF_PIT0_PCSR |= MCF_PIT_PCSR_PIF;
//Clear the flag
MCF_PIT0_PCSR = 0|MCF_PIT_PCSR_PRE(15)|MCF_PIT_PCSR_RLD|MCF_PIT_PCSR_PIE|MCF_PIT_PCSR_OVW;
MCF_PIT0_PMR = MCF_PIT_PMR_PM(92);
//genarate 10 interrupt per second
MCF_PIT0_PCSR |= MCF_PIT_PCSR_EN;
}
void LED1Reverse()
{
char t;
MCF_GPIO_DDRTC=0xff;
t=MCF_GPIO_PORTTC && 0x02;
if(t)
MCF_GPIO_PORTTC=MCF_GPIO_PORTTC & 0xfd;
else
MCF_GPIO_PORTTC=MCF_GPIO_PORTTC | 0x02;
}
void delay()
{
unsigned long i;
for(i=0;i<400000;i++)
{
asm
{
nop
};
}
}
int main(void)
{
printf("Hello World in C\n\r");
fflush(stdout);
GPIOInit();
init_PIT();
asm{ move.w #0x2000,SR };
while(1)
{
//LED1Reverse();
delay();
}
}
__declspec(interrupt:0) void PIT0_isr(void)
{
MCF_PIT0_PCSR |= MCF_PIT_PCSR_PIF;
//Clear the flag
//MCF_PIT0_PMR = MCF_PIT_PMR_PM(1000);
LED1Reverse();
printf("pit0");
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。