找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1699|回复: 0
打印 上一主题 下一主题
收起左侧

ARM UART0中断例程问题

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-6 13:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
void __irq IrqUart0(void)
{
  //  uint8 i;
  //  uint8 RxData;

    OS_ENTER_CRITICAL();

    //判断是否有中断挂起,如果有进入中断
    while( (U0IIR & 0x01) == 0)
    {
       switch( (U0IIR & 0x0E))
        {        
        case 0x06:                         //RLS中断
            while( (U0LSR &  0x01) == 0);   
       //     RxData = U0RBR;            
            U0THR = 'A';           
             while( (U0LSR & 0x40)==0);            
             break;            
        case 0x04:                     //RDA中断   读取数据,接收数据可用
                DealPack();      
                break;      
        case 0x0C:                     //CTI中断   禁止接收及字符超时中断
              DealPack();            
              break;      
        case 0x02:                    //THRE中断
          //  while( (U0LSR &  0x20) == 1);   
          //  RxData = U0RBR;         
            U0THR = 'D';            
             while( (U0LSR & 0x40)==0);
              break;   
        }
    }   
    OS_EXIT_CRITICAL();   
    VICVectAddr = 0;
}
谁哪位大哥帮忙释一下这个程序,为什么U0IIR与0X0E相与呢,而不跟别的值相与呢,哪里是不是有这样的规定必须与0X0E相与啊??谢谢!


最佳答案

你可以查一下ARM资料,在UART0中断处理的表格中,U0IIR[3:0]为0001时,表示没有该中断,最后不为1表示有中断,所以对应程序看,与0X01与,没有中断就不进入while循环。后面switch( (U0IIR & 0x0E)) 可以写成switch(U0IIR) 本身没有错误,但对于资深的程序员,这样的习惯是非常好的。由于判断前三位,所以就是应该与上1110也就是十六位的E。
程序后面翻译可以理解为,如果有中断产生,数值0X06,4,C,2分别对应相应的功能,就可以判断具体的中断原因了。具体功能还是去看ARM的UART0一章便非常清楚了。
如果还有问题可以继续提问。希望你满意。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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