打印
[ZLG-ARM]

串口发送数据中断问题

[复制链接]
1669|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houn|  楼主 | 2008-8-11 23:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周工;
     你好,我做了串口中断处理程序,我通过通过中断来发送数据,结果发送数据中断不响应,请帮忙看看是怎么回事,程序如下:
//设置波特率
#include "config.h"
#define UART0BPS    115200
#define BEEPCON        1 << 7

static uint8 readData;
uint8* sentData;
//设置引脚
void Pinsel0_Init()
{
    PINSEL0 = 0x05;
    IO0DIR = BEEPCON;
    IO0SET = BEEPCON;
}
//初始化串口0
void Uart0_Init(void)
{    
    uint16 bps = (Fpclk / 16) / UART0BPS;
    U0LCR = 0x83;            //设置DLAB = 1
    U0DLL = bps % 256;        //设置波特率余数
    U0DLM = bps / 256;        //设置波特率除数
    U0FCR = 0x00;            //    
    U0LCR = 0X03;            //设置DLAB = 0,1位停止位,无奇偶校验 字长度8    
    U0FCR = 0x00;  
    //U0IER = 0x05;            
}
//串口0中断程序
void __irq Uart0_IRQ(void)
{
    uint8 iir;
    uint8 lsr;
    //IO0CLR = BEEPCON;
    while(((iir = U0IIR) & 0x01) == 0)    //清除中断  iir = U0IIR;
    {
        switch(iir &0x0e)
        {
            case 0x06:                    //接收线状态
                lsr = U0LSR;            //清除中断                
                break;
            case 0x04:        
                readData = U0RBR;        //接收数据,同时清除中断            
                break;
            case 0x02:        
                while(*sentData++ != '\0')
                    U0THR = *sentData;    //发送数据,同时清除中断                                
                break;
            case 0x0a:        //字符超时中断                
                break;
        }
    }                
    VICVectAddr =0;            //VIC控制器禁止中断
}

void Uart_INT()
{
    VICIntSelect = 0x00000000;
    VICVectCntl5 = 0x26;
    VICVectAddr5 = (uint32)Uart0_IRQ;
    VICIntEnable = 0x00000040;
}
//读取数据
uint8 ReadData(void)
{
    while((U0LSR & 0x01) == 0x00);
        U0IER = 0x01;
    return readData;    
}

int main (void)
{
    uint8 test[23] = {"Hello,How old are you\n"};
    //int num = 21;
    
    Pinsel0_Init();
    Uart0_Init();
    Uart_INT();
    sentData = test;    
    U0IER = 0x02;
    while(1);
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

相关链接:https://bbs.21ic.com/upfiles/img/20079/200792623533657.rar

相关帖子

沙发
zLgArM| | 2008-8-12 18:13 | 只看该作者

楼主

您好!
   使用了IRQEnable来打开内核的中断允许开关了吗?

使用特权

评论回复
板凳
houn|  楼主 | 2008-8-12 21:47 | 只看该作者

回复

1.在Startup.S文件中
;设置系统模式堆栈
        MSR     CPSR_c, #0x5f
        LDR     SP, =StackUsr
2. 设置中断向量,都设置好了啊      
         VICIntSelect = 0x00000000;
    VICVectCntl5 = 0x26;
    VICVectAddr5 = (uint32)Uart0_IRQ;
    VICIntEnable = 0x00000040;
设置都正确啊,就是不响应中断,周工在帮我看看吧

使用特权

评论回复
地板
houn|  楼主 | 2008-8-14 16:53 | 只看该作者

问题的解决

串口中断发送数据不能响应的问题,主要在于没有了解发送数据中断包括中断使能和中断要求初始条件,发送中断初始条件没有掌握好,使数据不能发送原因.可以看看周立功提供的课件有关串口一章介绍

使用特权

评论回复
5
armecos| | 2008-8-15 08:12 | 只看该作者

串口和中断还可以进一步抽象,

    实现万能中断模板,自适应多串口驱动,你的写法暴露了底层寄存器,移植性、可扩展性不好,不够自动化不够通用。好的代码应该适应各种硬件体系结构:NXP、AT、ST或者ARM7、ARM9、MIPS、POWERPC、X86、SH等,自动识别各种16C55X串口硬件版本。

更多内容,详见:
《培训系列“丛书”》
www.armecos.com
-----------------------------------
More details, see:
《"Series Books" of Training》
www.armecos.com

使用特权

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

本版积分规则

11

主题

21

帖子

0

粉丝