首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

高分!100分!及待高手解决LPC2148的入门有关问题

2012-09-28 
高分!!100分!!!及待高手解决LPC2148的入门问题望高手指点,一个小的定时器中断程序,在中断程序里面清oled的

高分!!100分!!!及待高手解决LPC2148的入门问题
望高手指点,一个小的定时器中断程序,在中断程序里面清oled的显示
定时时间为1s,使用芯片为LPC2148

问题解决后,立马给分!!!
#include <NXP/IOLPC2148.h>
#include "config.h"

void Time0Init();
void Timer0_ISR();

void Time0Init()
{
  //定时时间=MR*(PR+1)/FPCLK
  T0IR=1;//清除中断
  T0TC=0;//定时器设置为0
  T0PR=0;//时钟不分频,即每个PCLK周期,32位TC(定时器计数器)加1,PCLK=11.0592MHz
  T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断 
  T0MR0=Fpclk;//设置匹配寄存器,该句设置MR0为115,即每过115个PCLK周期,定时器计数器TC加1
  T0TCR=0x01;//启动定时器T0
  
  
  //VICVectAddr = 0;  
  VICIntSelect=VICIntSelect&(~(1<<4));//定时器0中断分配为IRQ中断
  VICVectCntl0=0x20|4;
  VICVectAddr0=(uint32)Timer0_ISR;
  VICIntEnable=(0<<4);
}
void main(void)
{
  Init_SO12864(); 
  OLED_Init();
  OLED_CLS();
  Dis_String(0,0,"WELCOME ++TO");
  Delay_ms(2000);
  Time0Init();
  while(1);  
}

void Timer0_ISR()
{
  OLED_CLS();  
}

[解决办法]
有什么问题》》》》
[解决办法]
参考例子
http://bbs.21ic.com/icview-207401-1-1.htmlhttp://blog.21ic.com/user1/3841/archives/2008/49938.html
[解决办法]

探讨
3#
问题是:改程序进入不了中断

[解决办法]
C/C++ code
__irq void Timer0_ISR(){  OLED_CLS();   }
[解决办法]
探讨

C/C++ code
__irq void Timer0_ISR()
{
OLED_CLS();
}

[解决办法]
有的CPU, 用 while(1); 是會無法跳到 ISR, LZ 可以在 while-loop 中做一些不會被最佳化移除的程式碼試試.

Paul, Chao @ Techware

[解决办法]
探讨

有的CPU, 用 while(1); 是會無法跳到 ISR, LZ 可以在 while-loop 中做一些不會被最佳化移除的程式碼試試.

Paul, Chao @ Techware

[解决办法]
说你什么好呢,看这
void Time0Init()
{
//定时时间=MR*(PR+1)/FPCLK
T0IR=1;//清除中断
T0TC=0;//定时器设置为0
T0PR=0;//时钟不分频,即每个PCLK周期,32位TC(定时器计数器)加1,PCLK=11.0592MHz
T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断
T0MR0=Fpclk;//设置匹配寄存器,该句设置MR0为115,即每过115个PCLK周期,定时器计数器TC加1
T0TCR=0x01;//启动定时器T0
 
 
//VICVectAddr = 0;
VICIntSelect=VICIntSelect&(~(1<<4));//定时器0中断分配为IRQ中断
VICVectCntl0=0x20|4;
VICVectAddr0=(uint32)Timer0_ISR;
VICIntEnable=(0<<4);
}
最后一行: VICIntEnable=(0<<4);
你到底还想要不要中断呢,你不许中断了,还想中断服务,切

[解决办法]
#include <LPC21xx.h>
//#include "config.h"
#define Fpclk12000000

void Time0Init(void);
void Timer0_ISR(void);


void OLED_CLS(void)
{}
void Delay_ms(unsigned int i)
{
while(i) i--;
}

void Time0Init()
{
//定时时间=MR*(PR+1)/FPCLK
T0IR=1;//清除中断
T0TC=0;//定时器设置为0
T0PR=0;//时钟不分频,即每个PCLK周期,32位TC(定时器计数器)加1,PCLK=11.0592MHz
T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断
T0MR0=Fpclk;//设置匹配寄存器,该句设置MR0为115,即每过115个PCLK周期,定时器计数器TC加1
T0TCR=0x01;//启动定时器T0
 


 
//VICVectAddr = 0;
VICIntSelect=VICIntSelect&(~(1<<4));//定时器0中断分配为IRQ中断
VICVectCntl0=0x20|4;
VICVectAddr0=(unsigned int)Timer0_ISR;
VICIntEnable=(1<<4);
}
int main(void)
{
unsigned char done;

OLED_CLS();

Delay_ms(2000);
Time0Init();
done=0;
while(!done);
return 0;
}

void Timer0_ISR()
{
OLED_CLS();
}

这段代码加上一个startup.s在keil4下面软仿真可进中断。

热点排行