OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UART0 各位老大帮忙~~关于UART0接收中断的一个比较郁闷的问题

共2条 1/1 1 跳转至

UART0 各位老大帮忙~~关于UART0接收中断的一个比较郁闷的问题

院士
2006-12-22 22:43:00    评分
UART0 各位老大帮忙~~关于UART0接收中断的一个比较郁闷的问题



关键词: UART0     各位     老大     帮忙     关于     接收     中断         

院士
2006-12-22 22:43:00    评分
2楼
问 使用中断方式接收UART0数据,但是如果一次发送触发点所设置的字节个数时,就会没完没了的触发中断,其实这个时候我什么也没发。
比如我设置的触发点为8个字节,如果我一次发1~7个字节,都没问题,但是一次发8个字节,就会不停的中断N次,N大概是几千次吧。
下面是我的程序关于UART0的片段,设置的是1字节触发,也就是说只要我一发就肯定没完没了的中断。

这是初始化部分:

UART0_INI            
    STMFD    SP!,{LR}
    LDR    R0,=U0LCR        ;// 设置UART工作模式
    MOV    R1,#0x80        ;// DLAB = 1,可设置波特率
    STR    R1,[R0]                    
                    
    LDR    R0,=U0DLL        ;// 设置波特率
    MOV    R1,#(FPCLK/16/9600):MOD:256                
    STR    R1,[R0]    
    LDR    R0,=U0DLM                                
    MOV    R1,#(FPCLK/16/9600)/256    
    STR    R1,[R0]
                
    LDR    R0,=U0LCR                
    MOV    R1,#0x03    
    STR    R1,[R0]        ;// N81    
        
    LDR    R0,=U0FCR                
    MOV    R1,#0x01    
    STR    R1,[R0]
            
    LDR    R0,=U0IER                
    MOV    R1,#0x01    
    STR    R1,[R0]
            
    LDMFD    SP!,{PC}        ;// 返回    


这是中断设置部分:

    LDR    R0,=VIC_BASE
    LDR    R1,=0x0
    STR    R1,[R0,#0x0C]    ;// VICIntSelect=0x00000000
    MOV    R1,#0x25
    STR    R1,[R0,#0x200]    ;// VICVectCntl0=0x25
    MOV    R1,#0x26
    STR    R1,[R0,#0x204]    ;// VICVectCntl1=0x26
    LDR    R1,=IRQ_TIME1
    STR    R1,[R0,#0x100]    ;// VICVectAddr0=(int)IRQ_TIME1
    LDR    R1,=IRQ_UART0
    STR    R1,[R0,#0x104]    ;// VICVectAddr1=(int)IRQ_UART0
    MOV    R1,#0x00000060
    STR    R1,[R0,#0x10]    ;// VICIntEnable=0x00000060        


这是中断服务程序,每接收一字节就会发送回去:

IRQ_UART0
    STMFD    SP!,{R0-R7}
    
    LDR    R0,=U0RBR                
    LDR    R1,[R0]

    LDR    R0,=U0THR            
    STR    R1,[R0]        ; 发送数据

    LDR    R0,=U0LSR        ; 等待发送完毕
UART0_SEND_LOOP        
    LDR    R1,[R0]
    ANDS    R1,R1,#0x40
    BEQ    UART0_SEND_LOOP    
    
    LDR    R0,=VICVectAddr
    MOV    R1,#0
    STR    R1,[R0]                
    
    LDMFD    SP!,{R0-R7}
       SUBS    PC,LR,#4        ; IRQ中断返回


郁闷啊,用光盘上的C程序就没这问题,但是我觉得程序上没问题啊。
现在必须用汇编,必须用中断,所以这个问题必须解决。
各位老大帮忙! 1: 暂时解决了在中断结束前加:
LDR    R0,=U0IIR                    
LDR    R1,[R0]
就可以了,仿佛是中断被挂起了


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]