打印

新手关于LPC2131无法进入中断服务函数的问题,有完整程序请

[复制链接]
2116|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
newdsd|  楼主 | 2007-5-4 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <LPC213x.h>
/*调用此函数库前要先设置好波特率和VPB频率*/
#define UARTBaudrate 9600   /*波特率*/
#define Fpclk         11059200/4   /*VPB频率*/ 
/*ReceivedData为接收到的数据,RecNewData为接收数据标志位,RecNewData为"1"是表示有新数据
,为"0"时没有新数据*/
unsigned char ReceivedData = 0,RecNewData = 0;
/*IRQ中断开关,Flag>0时开中断,Flag=0时关中断*/
void EnableIRQ(unsigned char Flag)
{
   unsigned int temp = 0;
   if(Flag)
   {
      __asm
   {
         MRS   temp, SPSR
         BIC   temp, temp, #0x80
         MSR   SPSR_c, temp
         /*MOVS    PC, LR */
   }
   }
   else
   {
      __asm
   {
         MRS   temp, SPSR
         ORR   temp, temp, #0x80
         MSR   SPSR_c, temp
        /*MOVS    PC, LR */
   }
   }
}

/*IRQ中断开关,Flag>0时开中断,Flag=0时关中断*/
void EnableFIQ(unsigned char Flag)
{
   unsigned int temp = 0;
   if(Flag)
   {
      __asm
   {
         MRS   temp, SPSR
         BIC   temp, temp, #0x40
         MSR   SPSR_c, temp
         /*MOVS    PC, LR */
   }
   }
   else
   {
      __asm
   {
         MRS   temp, SPSR
         ORR   temp, temp, #0x40
         MSR   SPSR_c, temp
        /*MOVS    PC, LR */
   }
   }
}
/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 功能 :串口初始化,8位数据,1位停止位,无奇偶校验,
*********************************************************************************************************
*/
void UART0_Init (void)
{
 unsigned short Fdiv;
 /*UART线控制寄存器,设置数据长度,停止位,奇偶校验,除数锁存访问位等
 此处设置为:8位数据,1位停止位,无奇偶校验,允许设置波特率*/
 U0LCR = 0x83;
 /*Fpclk为VPB时钟频率(外围器件时钟频率),为处理器时钟频率的1/4,1/2或全速,
 由寄存器VPBDIV决定,默认为1/4;Fdiv为UART除数锁存值*/      
 Fdiv  = (Fpclk / 16) / UARTBaudrate;
 /*设置波特率*/ 
 U0DLM = Fdiv / 256;
 U0DLL = Fdiv % 256;
 /*8位数据,1位停止位,无奇偶校验,不允许设置波特率*/
 U0LCR = 0x03;
 /*将IO口连接到UART0*/
 PINSEL0 |= 0x00000005;
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 功能 :以查询方式从串口发送一字节出去,并等待,发送结束后退出

*********************************************************************************************************
*/
void UART0_SendByte (unsigned char dat)
{
 U0THR = dat;
 /*U0LSR,UART线状态寄存器,等待,当发送完一个字节后结束等待*/
 while ((U0LSR & 0x40) == 0);  
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 功能 :UART0接收、发送中断函数
*********************************************************************************************************
*/
void IRQ_UART0 (void) __irq 
{

    UART0_SendByte (0x11);
 /*发送完一字节,再发送0xF1*/
 if (U0IIR & 0x02)
 {
   
    UART0_SendByte (0xF1) ;
    
 } 
 /*接收到一字节*/
 if (U0IIR & 0x04)
 {
    ReceivedData = U0RBR;
    RecNewData = 1;
   
 } 
 
 /*结束中断,重新设置向量值*/
 VICVectAddr = 0x00;   
}
 

main (void)
{
 
 UART0_Init();
    /*使能FIFO,中断触发点为一个字节*/
 U0FCR = 0x01;
 /*允许接收和发送中断*/
 U0IER = 0x03; 
 /*使能中断*/   
 EnableIRQ(1);
 /*设置所有中断分配为IRQ中断*/
 VICIntSelect = 0x00000000;    
 /*将UART0中断分配到0通道(向量IRQ中的最高优先级)*/
 VICVectCntl0 = 0x20 | 0x06;     
 /*设置中断服务程序地址*/
 VICVectAddr0 = (unsigned int)IRQ_UART0; 
 /* 使能UART0中断*/
 VICIntEnable = 1 << 0x06; 
  
   UART0_SendByte (0xAB);
 while (1)
 { 
  if (RecNewData)
  {    
     UART0_SendByte (0xAC);
     RecNewData = 0;
     UART0_SendByte (ReceivedData);
  }
 }
    
}
用查询方式可以正常运用UART0,用中断模式后进入不了ISR,向各位请教。编译环境为keil MDKARM 3.04

相关帖子

沙发
王紫豪| | 2007-5-4 11:20 | 只看该作者

沙个发,那么长,懒得看,不好意思

使用特权

评论回复
板凳
newdsd|  楼主 | 2007-5-4 15:41 | 只看该作者

没人啦?还没放完假哦

没人啦?还没放完假哦

使用特权

评论回复
地板
sasinop| | 2007-5-4 15:59 | 只看该作者

到我的板上找个代码看看

在ADS环境下的
UART 
USB 都调试通过了

完整的工程文件,
LPC2146

使用特权

评论回复
5
ayb_ice| | 2007-5-4 16:18 | 只看该作者

这都是简单的问题...

这都是简单的问题,程序太长而且还有汇编,懒得看,不好意思...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

34

帖子

1

粉丝