hbchf 发表于 2011-5-18 21:18:28

下面这段lpc23xx的uart0收发程序,很是奇怪程序总是进不了中断发送,各位帮我看看!

///////////////////////////////main.c/////////////////////
#include "lpc23xx.h"
#include "type.h"
#include "target.h"
#include <stdio.h>
#include "io.h"
#define led 1 << 8 | 1<< 9 | 1<< 10 | 1<< 11 | 1<< 12 | 1<< 13

voidUart0Init(void);
void TargetInit(void);
void DelayNS(void);

/************led_init()*****************/
void led_init(void)          
{
           PINMODE8 &= 0xffff0000;//P40--P47 上拉
        FIO4DIR0 |= 0xff;//P4.0-P4.7// 输出
        FIO4DIR1 |= 0x3f;//P4.8-P4.13输出
        FIO4MASK1 |= 0xc0;
}


int main(void)
{               
        IOInit();
        led_init();
        TargetInit();
        Uart0Init(57600);

        while(1)
        {
        }

}

//////////////////////comm232.c///////////////////////////////
#include <stdio.h>
#include "constant.h"
#include "type.h"
#include "lpc23xx.h"
#include "target.h"

/********DelayNs()********/
void DelayNS(u32 dly)
{
u32 i ;
for(;dly>0;dly--)
    for(i=0;i<10000;i++);

}
void __irq UART0Handler(void) //
{
        vu8 UartTemp;
        vu8 UartTemp1;
        vu8 UartTemp2;
       
        UartTemp = U0IIR;
        if((UartTemp & 0x01) == 0)//有中断挂起
        {
                UartTemp >>= 1;
                UartTemp &= 0x07;
                switch(UartTemp)
                {
                  case 3://接收线状态中断
                   UartTemp2 = U0LSR;
                   break;
                       
                  case 2://接收中断
                   FIO4SET = 1<<8;          
                   for(UartTemp1=0;UartTemp1<8;UartTemp1++)
                     {
                        Uart0_ReceiveBuffer = U0RBR;
                      }

                  break;
                   case 6://字符超时
                     UartTemp2=0;
                     FIO4SET = 1<<9;
                      while((UartTemp1 = U0LSR)&0x01)
                        {
                          Uart0_ReceiveBuffer = U0RBR;
                          UartTemp2++;               
                        }
                  break;
                  case 1://发送中断                  (程序没发进入这个条件)
                  
                        U0THR = Uart0_ReceiveBuffer;
                        Uart0.tx_read_pointer = (Uart0.tx_read_pointer + 1)%UART0_TX_BUF_LENGTH;               
                        break;
                  default:
                        FIO4SET = 1<<12;       
                        break;       
                  }                       
          }
        VICVectAddr = 0;        
}
/*********************************/

void Uart0Init(u32 baudrate)
{
        u32 BRdiv;

        U0LCR = 0x83;
        BRdiv = (Fpclk/16)/baudrate;
        U0DLL = BRdiv%256;
        U0DLM = BRdiv/256;

        U0LCR = 0x03;
        U0FCR = 0x07;
        U0FCR = 0x87;
        U0IER = 0x07;//开接收中断   发送中断   线状态中断

        VICVectAddr6 = (u32)UART0Handler;
        VICVectPriority6 = 0x0e; //最低优先级       
}

///////////////////////start.s////////////////////

PRESERVE8

Mode_USR      EQU   0x10
Mode_FIQ      EQU   0x11
Mode_IRQ      EQU   0x12
Mode_SVC      EQU   0x13
Mode_ABT      EQU   0x17
Mode_UND      EQU   0x1B
Mode_SYS      EQU   0x1F

I_Bit         EQU   0x80            ; when I bit is set, IRQ is disabled
F_Bit         EQU   0x40            ; when F bit is set, FIQ is disabled

;// <h> Stack Configuration (Stack Sizes in Bytes)
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
;//   <o1> Supervisor Mode   <0x0-0xFFFFFFFF:8>
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
;// </h>

UND_Stack_SizeEQU   0x00000000
SVC_Stack_SizeEQU   0x00000100
ABT_Stack_SizeEQU   0x00000000
FIQ_Stack_SizeEQU   0x00000000
IRQ_Stack_SizeEQU   0x00000100
USR_Stack_SizeEQU   0x00000200

Stack_Size      EQU   (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
                         FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

Stack_Top       EQU   Stack_Mem + Stack_Size

;// <h> Heap Configuration
;//   <o>Heap Size (in Bytes) <0x0-0xFFFFFFFF>
;// </h>

Heap_Size       EQU   0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem      SPACE   Heap_Size

; Area Definition and Entry Point
;Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ARM

; Exception Vectors
;Mapped to Address 0.
;Absolute addressing mode must be used.
;Dummy Handlers are implemented as infinite loops which can be modified.

Vectors         LDR   PC, Reset_Addr         
                LDR   PC, Undef_Addr
                LDR   PC, SWI_Addr
                LDR   PC, PAbt_Addr
                LDR   PC, DAbt_Addr
                NOP                            ; Reserved Vector

                LDR   PC,    ; Vector from VicVectAddr
                LDR   PC, FIQ_Addr

Reset_Addr      DCD   Reset_Handler
Undef_Addr      DCD   Undef_Handler
SWI_Addr      DCD   SWI_Handler
PAbt_Addr       DCD   PAbt_Handler
DAbt_Addr       DCD   DAbt_Handler
                DCD                0xB9206E28             ; Reserved Address
IRQ_Addr      DCD   IRQ_Handler
FIQ_Addr      DCD   FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler   B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler   B       IRQ_Handler
FIQ_Handler   B       FIQ_Handler

; Reset Handler

                EXPORTReset_Handler
Reset_Handler   

; Setup Stack for each mode
                LDR   R0, =Stack_Top

;Enter Undefined Instruction Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #UND_Stack_Size

;Enter Abort Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #ABT_Stack_Size

;Enter FIQ Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #FIQ_Stack_Size

;Enter IRQ Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #IRQ_Stack_Size

;Enter Supervisor Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #SVC_Stack_Size

;Enter User Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_USR
                MOV   SP, R0
                SUB   SL, SP, #USR_Stack_Size
                               
                IMPORT        TargetResetInit
                BL                TargetResetInit

; Enter the C code

                IMPORT__main
                LDR   R0, =__main
                BX      R0


; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT__use_two_region_memory
                EXPORT__user_initial_stackheap
__user_initial_stackheap

                LDR   R0, =Heap_Mem
                LDR   R1, =(Stack_Mem + USR_Stack_Size)
                LDR   R2, = (Heap_Mem +      Heap_Size)
                LDR   R3, = Stack_Mem
                BX      LR

                END

在网上我听人家说可能是启动代码的IRQ设置不对,启动代码看得不怎么明白的,麻烦高手指点下!
工程文件ourdev_640784BWYFR6.rar(文件大小:269K) (原文件名:usart0.rar)
页: [1]
查看完整版本: 下面这段lpc23xx的uart0收发程序,很是奇怪程序总是进不了中断发送,各位帮我看看!