天嵌 ARM开发社区

 找回密码
 注册
查看: 1781|回复: 0

定时器0中断流水灯问题

[复制链接]
liuliya21c 发表于 2011-11-1 21:26:06 | 显示全部楼层 |阅读模式
本帖最后由 liuliya21c 于 2011-11-1 21:27 编辑

在裸奔用定时器做个定时中断,用小灯来检测下,无奈做了一天一直没解决问题,总是进不去中断,而且程序的switch语句在JLINK仿真时也有问题,只能在部分的case语句那放置断点,请指点下,谢谢,下面我贴下我的程序
#define GLOBAL_CLK  1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
//宏定义---------------------------------------------------------
#define LED1_ON   (rGPBDAT&=(0<<5))
#define LED1_OFF  (rGPBDAT&=(1<<5))
#define LED2_ON   (rGPBDAT&=(0<<6))
#define LED2_OFF  (rGPBDAT&=(1<<6))
#define LED3_ON   (rGPBDAT&=(0<<7))
#define LED3_OFF  (rGPBDAT&=(1<<7))
#define LED4_ON   (rGPBDAT&=(0<<8))
#define LED4_OFF  (rGPBDAT&=(1<<8))
#define M_DIV    92
#define M_PDIV   1
#define M_SDIV   1
#define U_DIV    56
#define U_PDIV   2
#define U_SDIV   2
#define CLKDIVN_VAL 5
#define CNT_TIM0  25000
//变量声明--------------------------------------
unsigned char ucFlag1s;
unsigned char ucCntTime;
//----------定时器0中断处理子程序---------------
void __irq TIME0_INT()
{
rSRCPND|=(1<<10);//写1来清除标志位
rINTPND|=(1<<10);;//写1来清除标志位
if(++ucCntTime==10)
{
  ucCntTime=0;
  ucFlag1s=1;
}
}
//-----------初始化GPORTB用来控制LED-------------------
void init_PORT()
{                                 
  rGPBUP =0x7ff;
    rGPBCON =0x155555;    //设置为输出  
    rGPFCON =0X0000;    //设置为输入  
    rGPBDAT |=0x1e0;   //
}
//------------初始化TIME0作为定时功能
void init_Time0()
{
rLOCKTIME=0xFFFFFFFF;   //锁定时间计数寄存器
rUPLLCON=(U_DIV<<12)+(U_PDIV<<2)+U_SDIV;
//UPLL控制寄存器:Fin=12M,UCLK=48M
rMPLLCON=(M_DIV<<12)+(M_PDIV<<2)+M_SDIV;
//MPLL控制寄存器:Fin=12M,FCLK=400M
rCLKDIVN=CLKDIVN_VAL;           //时钟分频控制寄存器:运算结果PCLK=FCLK/8=50M
//定时器输入时钟频率=PCLK/{预分频值+1}/分频值
rTCFG0&=~0xFF;     //定时器0配置寄存器
rTCFG0=99;     //预分频值=99;
rTCFG1=0;      //MUX0=1/2;
//至此,计数周期为250000
rTCNTB0=CNT_TIM0;  //25000/250000=0.1s,即0.1s中断一次
rTCON|=0x0000000f;    //开定时器0中断,开启手动更新,自动重载
rTCON|=(1<<1);    //关闭手动更新
rINTMSK &=~(1<<10); //开中断
pISR_TIMER0=(U32)TIME0_INT;//中断处理函数
}
//-----------初始化看门狗-----------------------
void init_WatchDog()
{
rWTCON=0x0000;    //关狗
}
//-----------主程序的初始化---------------------
void init_main()
{
init_WatchDog();
init_Time0();
init_PORT();
ucFlag1s=0;
}
//-----------显示主程序-------------------------
//1s到了,LED顺序点亮,再顺序熄灭
void DispLed()
{
static unsigned char ucTemp;
if(ucFlag1s==0)return;
ucFlag1s=0;
switch(ucTemp)
{
  case 0:
   LED1_OFF;
   LED2_OFF;
   LED3_OFF;
   LED4_OFF;
   break;
  case 1:
   LED1_ON;
   break;
  case 2:
   LED2_ON;
   break;
  case 3:
   LED3_ON;
   break;
  case 4:
   LED4_ON;
   break;
  case 5:
   LED4_OFF;
   break;
  case 6:
   LED3_OFF;
   break;
  case 7:
   LED2_OFF;
   break;
  case 8:
   LED1_OFF;ucTemp=0;
   break;
  default :ucTemp=0;break;
}
ucTemp++;
}
//-----------主程序循环-------------------------
void Main(void)
{
init_main();
while(1)
{
  DispLed();
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 10:42 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表