新闻  |   论坛  |   博客  |   在线研讨会
ColdFire 32位微控制器学习系列五--如何产生定时中断(ZT)
moran | 2008-08-02 15:57:46    阅读:6457   发布文章

本文介绍如何使用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");
 
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客