为什么定时器中断进不去

THEFUTURE111 2013-07-12 08:53:45
/****************************************Copyright (c)************************************
** Suzhou University of Science and Technology.
** CEIE, EMBEDDED LAB.
**
**--------------File Info----------------------------------------------------------------
**
** File name: main.c
** Date: 2012-03-16
** Last modified Date: 2012-03-21
** Last Version: 1.0
** Descriptions: 测试程序
** Compiler: IAR ARM V5.3
**
******************************************************************************************
**----------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
******************************************************************************************/
#include <stdio.h>
#include <intrinsics.h>

#include "..\inc\config.h"

/*****************************************************************************************
** void PLL_Init(void), PLL初始化
******************************************************************************************/
//#include "E:\Baskatball_24s\pro\config.h"

#define CLK1 0x00000001 /*P0.0*/
#define DATA1 0x00000002 /*P0.1*/
#define CS1 0x00000004 /*P0.2*/

#define CLK2 0x20000000 /*P0.29*/
#define DATA2 0x40000000 /*P0.30*/
#define CS2 0x80000000 /*P0.31*/


#define KEY_run_stop 0x00001000 /*P0.12*/

uint8 state=0;
uint8 sec=60,min=11,jie=1;
const unsigned char SEGMENT_DATA[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//void IRQ_Time0(void);
/****************************************************************************
* 名称:Delay_ms()
* 功能:软件延时
* 入口参数: time延时参数,延时时间 time*ms
* 出口参数:无
****************************************************************************/
void Delay_ms(uint32 time) //1 毫秒延时
{
uint32 i;
for(;
time>0;time--)
for(i=929;i>0;i--);

}
void delay(uint8 t)
{
int i;
for(i=0;i>100;i++);
}
void PLL_Init(void)
{
/* 设置系统各部分时钟 */
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}

/*****************************************************************************************
** main()函数
******************************************************************************************/
void HC595_SendDat_seg8x4(uint8 dat)
{
uint8 i;
for(i=0;i<8;i++)
{
IO0CLR=CLK1;
if( (dat&0x80)!=0 )
IO0SET=DATA1;
else
IO0CLR=DATA1;
dat<<=1;
IO0SET=CLK1;
}
}
void Write_All_HC595(uint8 dat1,uint8 dat2)
{
IO0CLR=CS1;
HC595_SendDat_seg8x4(dat1);
HC595_SendDat_seg8x4(dat2);
IO0SET=CS1;
}
void HC595_SendDat_seg7(uint8 dat)
{
uint8 i;
IO0CLR=CS2;
for(i=0;i<8;i++)
{
IO0CLR=CLK2;
if( (dat&0x80)!=0 )
IO0SET=DATA2;
else
IO0CLR=DATA2;
dat<<=1;
IO0SET=CLK2;
}
IO0SET=CS2;
}
void Key_scan(void)
{
if( (IO0PIN & KEY_run_stop)==0)
{
state=1;
sec--;
Delay_ms(20);
delay(50);
}
}
void Disp_seg8x4(uint8 x,uint8 y)
{
Write_All_HC595(1,SEGMENT_DATA[x/10]);
Delay_ms(1);
Write_All_HC595(2,SEGMENT_DATA[x%10]&0x7f);
Delay_ms(1);
Write_All_HC595(4,SEGMENT_DATA[y/10]);
Delay_ms(1);
Write_All_HC595(8,SEGMENT_DATA[y%10]);
Delay_ms(1);
}
/****************************************************************************
* 名称:__irq IRQ_Time0(void)
* 功能:定时器中断服务函数
****************************************************************************/
__irq __arm void IRQ_Time0(void)
{
sec--;
if(sec==0)
{ min--;
sec=60;

if(min==0)
{
T0TCR=0x00;
}
}
T0IR=0x01;
VICVectAddr = 0; // Clear interrupt in VIC
}
/********************************************************
* 名称:Time0Init()
* 功能:初始化定时器 0,定时时间为 1S。
* 入口参数:无
* 出口参数:无
********************************************************/
void Time0Init(void)
{
/* Fcclk = Fosc*4 = 12MHz*4 = 48MHz
Fpclk = Fcclk/4 = 48MHz/4 = 12MHz*/
T0PR = 99; // 设置定时器 0 分频为 100 分频,得12000Hz
T0MCR = 0x03; // 匹配通道 0 匹配中断并复位 T0TC
T0MR0 = 120000; // 比较值(1S 定时值)
T0TCR = 0x03; // 启动并复位 T0TC
/T0TCR = 0x01;
/*设置定时器0中断IRQ*/
VICIntSelect=0x00; //所有中断通道设置为IRQ中断
VICVectCntl0=0x20|4; //定时器0 中断通道分配最高级优先级(向量控制器0)
VICVectAddr0=(uint32)IRQ_Time0;//设置中断服务程序地址向量
VICIntEnable=1<<4;//使能定时器0中断
}
/****************************************************************************
* 名称:main()
* 功能:控制 LED 闪烁
****************************************************************************/
void main(void)
{
PLL_Init(); //锁相环初始化 该函数配置了 晶振 系统时钟 CPU时钟等关系 这样我们就知道一条指令执行的时间了
Time0Init();
PINSEL0 = 0x00000000; // 设置所有管脚连接 GPIO
IO0DIR = 0xffffefff; // 设置 按键引脚为输入引脚 其它引脚为输出引脚
//IO0SET = COM1;
//IRQ_Time0();
HC595_SendDat_seg7(SEGMENT_DATA[1]);
Disp_seg8x4(12,0); //显示12.00
//IRQ_Time0();
while(1)
{
Key_scan(); //按键检测 检测启动或者暂停
if(state==1)
{
;
}
while(T0IR &0x01==0)
{
Disp_seg8x4(min,sec); //显示分,秒
}
T0IR=0x01;
sec--;

Disp_seg8x4(min,sec); //显示分,秒
}
}
...全文
932 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxianbin 2013-07-13
  • 打赏
  • 举报
回复
看起来很乱,什么芯片?
l3533630 2013-07-13
  • 打赏
  • 举报
回复
你好我也是新手,你的程序好长卡不懂。不过可以提醒一下你是不是优先级的问题,因为我之前碰到过类似的问题

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧