tag 标签: 松江大学城

相关博文
  • 热度 23
    2012-4-4 12:37
    3128 次阅读|
    2 个评论
    接上文: 《以LPC2136为例说定时器控制原理》 4.1查询方式 相关代码: /**************************************************************************** * 文件名:main.c * 功   能:使用定时器实现秒定时,控制led灯闪烁。(查询方式)* ****************************************************************************/ #include  "config.h" #define      LED1  10                            // P0.0引脚控制LED1 /**************************************************************************** * 名   称:Time0Init() * 功   能:初始化定时器,定时时间为S。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void  Time0Init(void) {   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz        Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz     */     T0PR = 99;                                    // 设置定时器分频为分频,得Hz     T0MCR = 0x03;                                   // 匹配通道匹配中断并复位T0TC     T0MR0 = 110592;                                // 比较值(1S定时值)     T0TCR = 0x03;                                   // 启动并复位T0TC     T0TCR = 0x01; } /**************************************************************************** * 名   称:main() * 功   能:初始化I/O及定时器,然后不断的查询定时器中断标志。当定时时间到达时,取反P0.22 *           控制口。 ****************************************************************************/ int  main(void) {      PINSEL0 = 0x00000000;                        // 设置管脚连接GPIO       IO0DIR = LED1;                             // 设置I/O为输出     Time0Init();                                // 初始化定时器                   while(1)        {          while( (T0IR0x01) == 0 );                // 等待定时时间到         T0IR = 0x01;                            // 清除中断标志         if( (IO0PIN LED1) == 0 )         {             IO0SET = LED1;            }         else          {             IO0CLR = LED1;            }                   }    return(0); } 4.2 中断方式 上面的代码是通过查询方式来等待定时器中断的发生,本例是定时器实验性代码,实际产品开发或工作中不会采用这种方式。 下面讲通过中断方式来等待定时器的发生。 /**************************************************************************** * 文件名:main.c * 功   能:使用定时器实现秒定时,控制led灯闪烁。(查询方式) ****************************************************************************/ #include  "config.h" #define      LED1  10        // P0.0引脚控制LED1 /**************************************************************************** * 名   称:IRQ_Time0() * 功   能:定时器中断服务程序,取反LED1控制口。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void __irq  IRQ_Time0(void) {      if( (IO0PIN LED1 ) == 0 )     {         IO0SET = LED1;        }     else      {         IO0CLR = LED1;        }                                    T0IR = 0x01;                 // 清除中断标志     VICVectAddr = 0x00;            // 通知VIC中断处理结束 } /**************************************************************************** * 名   称:Time0Init() * 功   能:初始化定时器,定时时间为S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void  Time0Init(void) {   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz        Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz     */     T0PR = 99;                                // 设置定时器分频为分频,得Hz     T0MCR = 0x03;                               // 匹配通道匹配中断并复位T0TC     T0MR0 = 110592;                            // 比较值(1S定时值)     T0TCR = 0x03;                               // 启动并复位T0TC     T0TCR = 0x01;         /* 设置定时器中断IRQ */     VICIntSelect = 0x00;                    // 所有中断通道设置为IRQ中断     VICVectCntl0 = 0x24;                    // 定时器中断通道分配最高优先级(向量控制器)     VICVectAddr0 = (uint32)IRQ_Time0;         // 设置中断服务程序地址向量     VICIntEnable = 0x00000010;                // 使能定时器中断 } /**************************************************************************** * 名  称:main() * 功  能:初始化I/O及定时器,然后等待中断。 * 说  明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。 ****************************************************************************/ int  main(void) {      PINSEL0 = 0x00000000;                    // 设置管脚连接GPIO       IO0DIR = LED1;                         // 设置I/O为输出     Time0Init();                            // 初始化定时器及使能中断     while(1);                                // 等待定时器中断或定时器匹配输出        return(0); } 看了上面的代码就清楚了,中断方式就是把查询方式的这条语句   while( (T0IR0x01) == 0 );               用定时器中断来做。 While语句下面的要做的事情在中断服务程序里面做。
  • 热度 25
    2012-4-4 12:36
    3078 次阅读|
    0 个评论
    每个mcu都有定时器功能,如果要实现在1秒,或者1毫秒,或1微妙等时间间隔的定时操作,则需要mcu提供的定时器功能。(在掌握了一种MCU的定时器原理,其他MCU的定时器操作就很好理解了),下面以philips的lpc2136(arm7)定时器0的匹配功能为例。 1:首先要搞清楚几个寄存器的作用 如果上面的关系搞清楚了,程序就很好写了! 2: TCR,MCR两个寄存器的控制原理 2.1关于TCR TCR 是使能位,为1时,同时使能“预分频计数器”和“定时器计数器”计数; 为0时,同时禁止“预分频计数器”和“定时器计数器”计数;TCR 是控制“预分频计数器”和“定时器计数器”在PCLK的上升沿同步复位; 2.2关于MCR LPC2114定时器0有四个匹配通道,我们这里只讲匹配通道0,即MR0. MCR 当该位为1,TC与MR0(匹配寄存器)匹配产生中断;当该位为0,TC与MR0(匹配寄存器)匹配中断禁止; MCR 当该位为1,TC与MR0(匹配寄存器)匹配将使TC复位;当该位为0,该特性被禁止; MCR 当该位为1,TC与MR0(匹配寄存器)匹配将使TC和PC停止计数;当该位为0,该特性被禁止。 3 接下来就可以等待中断了 对于一个新手来说也许你还是不知如何着手写程序,所以这就是入门的难处,当你对某个MCU会控制了,或者说入门了,那么再去写程序控制其他的MCU就很容易的,因为原理在那里,可以举一反三。 3.1 中断状态寄存器 其实,不管是那个MCU中的哪个控制器,如I2C,SPI,Ethernet,LCD等等,都有一个中断状态寄存器,有些控制器还有其他状态寄存器! Lpc2136中的定时器0就有T0IR(中断寄存器)来指示当前是哪个中断发生,用户就可以通过读这个寄存器来判断。   如:我们这里设置了匹配通道0,即MR0。我们可以在主程序中不断的读T0IR 位,如果为1则说明中断发生。 注意:在中断处理结束后必须通过对相应为写1才能复位中断,方便第二次中断发生。 4 如何写代码 一般分查询方式(polling)和中断方式(interrupt): 查询方式就是不停的去判断中断状态寄存器相关位是否置位,如果置位说明有中断发生。 中断方式就是通过MCU的中断控制器irq实现。 (未完,下文: 《4.1查询方式的相关代码》 )