下面这段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]