打印
[ZLG-ARM]

串口0中断接受

[复制链接]
1255|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skaler|  楼主 | 2007-11-7 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "config.h"
#define ledcon 0xf0000000
#define uart_bps  115200


 uint8 rcv_data[8];          //UART0接受数据缓冲区
 volatile uint8 rcv_new;    //接受新数据标志
/******************************
delay()
*******************************/
void delayns(uint32 dly)
{
 // uint32 i;
  for(;dly>0;dly--)
           ;
 }
 
/*
 uart0_int()
*/
void uart0_init(void)
{
  uint16 fdiv;
  U0LCR=0x83;            //8bit enable 除数
  fdiv=(Fpclk/16)/uart_bps;
  U0DLM=fdiv/256;
  U0DLL=fdiv%256;
  U0LCR=0x03;          //8bit disable 除数
  }
  

 
#if 1
void   __irq IRQ_UART0(void)    //uart0接受中断
{
 uint8 i;
 if((U0IIR&0x0f)==0x04)  //判断UART0接受数据可用标志
   {
    rcv_new=1;
    for(i=0;i<8;i++)
     rcv_data=U0RBR;
    }
   
 VICVectAddr=0;
 }
#endif

#if 0
void uart0_rcvbyte(void)
{
 uint8 i;
 while((U0LSR&0x01)==0);
  rcv_new=1;
  for(i=0;i<8;i++)
      rcv_data=U0RBR;
 }
#endif

int main (void)
{// add user source code 
   uint8 i;
   char disp_buf[30];
   volatile uint32 aAA;
   
   
 PINSEL0=0x00000005;            //设置IO连接到UART0   ,p014为io
 PINSEL2=PINSEL2&0xfffffff7;      //P1管脚选择设置    ,p16:25为IO
 //选中电子开关
 IO0DIR=0x4000;      //p014 output
 IO1DIR=0x00e00000;  //p121:23 output
 IO0CLR=0x4000;      //p014 output L
 IO1CLR=0x00e00000;  //p121:23 output L选中电子开关X3Y3,及J4
 
   uart0_init();
#if 1
 U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
 U0IER = 0x01;                        // 允许RBR中断,即接收中断

 VICIntSelect=0x00000000;     //VIC_uart0中断初始化
 VICVectCntl0=0x20|6;
 VICVectAddr0 = (int)IRQ_UART0;
 VICIntEnable=1<<6; 
#endif   
//uart0_rcvbyte();   
   IO2DIR=ledcon;
   T0PR=0;
   while(1)
   {
    if(rcv_new==1)   //接受中断等待
    {
     for(i=0;i<8;i++)
     disp_buf=rcv_data;
    }
    }
    return 0;
}

问题:
   我用的模板是周立功的ARM EXecutable image for lpac2200,并把修改设置系统模式堆栈处的代码为“MSRCPSR_c, #0x5f”也改了,即使能IRQ 中断。
   1)这个程序在接受数据时进不了中断,不知道问题出在哪里?
   (在LPC2214的RXT0脚上用示波器能检测到我发送的数据(数据>=8位),但是就是芯片里中断不处理。)
   2)我用查询方式时不管发送什么数据,都能收到两次,但是这个数据与我发的数据不一样。
   (比如说发送12345678,第一次接受为1F#D22#3,第二次接受34567888,“#”表示乱码)

相关帖子

沙发
WangArm| | 2007-11-7 23:35 | 只看该作者

你这程序写的大有问题

1    
void uart0_rcvbyte(void)
{
uint8 i;
while((U0LSR&0x01)==0);
  rcv_new=1;
  for(i=0;i<8;i++)
      rcv_data=U0RBR;
}
触发点与中断有关,在查询接收下U0LSR&0x01只能表示有数据,但不能表示有多少个数据,所以在查询接收下有误.
2
 进不了中断,你可以在调试的方式下看一年CPSR的I位置位没有,U0IIR置位没有,VICIntEnable正确配置没有,如果都正确,就没有问题.
3
可以先将程序简化,分开调试,这样程序看起来不方便,也容易出错.

使用特权

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

本版积分规则

3

主题

8

帖子

0

粉丝