搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2011-5-18 21:18:28 | 显示全部楼层 |阅读模式
///////////////////////////////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

void  Uart0Init(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[UartTemp1] = U0RBR;
                      }

                    break;
                   case 6://字符超时
                     UartTemp2=0;
                     FIO4SET = 1<<9;
                      while((UartTemp1 = U0LSR)&0x01)
                        {
                          Uart0_ReceiveBuffer[UartTemp2] = U0RBR;
                          UartTemp2++;               
                        }
                    break;
                  case 1://发送中断                  (程序没发进入这个条件)
                    
                        U0THR = Uart0_ReceiveBuffer[Uart0.tx_read_pointer];
                        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_Size  EQU     0x00000000
SVC_Stack_Size  EQU     0x00000100
ABT_Stack_Size  EQU     0x00000000
FIQ_Stack_Size  EQU     0x00000000
IRQ_Stack_Size  EQU     0x00000100
USR_Stack_Size  EQU     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, [PC, #-0x0120]     ; 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

                EXPORT  Reset_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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表