bohunzhu的个人空间 https://blog.eetop.cn/bohun [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

LPCARM的"手动激活"串口发送中断问题

已有 1351 次阅读| 2007-5-7 17:40 |个人分类:单片机

天气: 舒适
心情: 平静
LPCARM的"手动激活"串口发送中断问题
雁塔菜农 发表于 2006-12-20 23:53:00
hotpower 发表于 2006-12-20 23:42 

11楼: 最后折算为指针与数组,51与ARM的关系

问题一:
指针与数组最大的不同是数组有"家",而指针是路边的"野花".

当uint8   FIFO_STR[]="FIFO_TEST" ;后
一般用FIFO_STR[i]=0x..;用数组名访问数组.
也可用*(FIFO_STR+i)=0x..;用"固定指针"访问数组.
但都离不开"家"---FIFO_STR.
正如00所说,FIFO_STR是数组名,它不能移动"家"!!!
即不能FIFO_STR++.
只能用FIFO_STR[i]或*(FIFO_STR+i)在"家"附近忽悠.

如想要分家,必须先建个小家---申请指针变量.
即00所说的---uint8   * pFIFO_STR=FIFO_STR;

这样就可用U0THR = *pFIFO_STR ++; 胡作非为了~~~

不过分家后一定要小心指针带来的后患...

指针与数组的关系很微妙,在某些场合他们的很多方面确实是一样的,
也可从编译后的代码看出.

可能在某些场合数组的效率甚至超过了指针,这要看编译器了.

问题二:
首先:
U0THR = 'F';   //"上善若水"提示说要先发送一字符再使能中断,随便送个字
U0IER |= 0x02;     //使能THRE发送中断

大家知道51的TI可以强制置'1'而"手动激活"发送中断.
而ARM等却不能,因为这是考虑"安全"的举动,但也对FIFO的发送带来了负面影响.

即要激活发送中断必须要向U0THR写入才能实现!!!

实际也可仿效51的方法来实现"手动激活"发送中断,我认为这样才更能体现FIFO的作用.
因为在实际应用中,发送首字节很罗嗦~~~

再者FIFO的最大好处是"闭着眼睛黑发"---爽~~~

//"手动激活"发送中断
if (!Uart.TxBusy) {//发送FIFO不忙并且以换行符为界
  VIC->SoftInt = (1 << VICIntSel_UART0);//软件中断模拟激活UART0中断
}



extern "C" void IRQ_UART0 (void) __irq
{
static unsigned char cData = 0;
unsigned char ch;
  Status = U0->IIR & 0x0f;
  switch (Status) {
    case 0x06://接收线状态
      switch (U0->LSR) {
        case 0x63:
          break;
      }
      break;
    case 0x04://接收数据可用
    case 0x0c://字符超时指示
      while((U0->LSR & 0x01) == 1) {
        ch = U0->RBR;
        if (ch == '$') {
          cData = '$';
          RxBuffer[RxCount ++] = ch;
        }
        else if(cData == '$'){
          if (ch >= 0x20) {
            RxBuffer[RxCount ++] = ch;
          }
          else if (ch == 0x0d) {
            RxBuffer[RxCount ++] = ch;
          }
          else if (ch == 0x0a) {
            if (RxBuffer[RxCount] == 0x0d) {
              cData = 0;
              RxBuffer[RxCount ++] = ch;
//isr_evt_set (DefBeep_1, Beep_Task);
              isr_evt_set (1, Uart_Task);
            }
          }
        }
      }
      break;
    case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断
     if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断
       break;//正常的UART0中断退出
     }
    case 0x02://THRE中断
        TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送
      for (int i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节
        ch = TxBuffer[(TxdCount ++) & 0x3ff];//取出缓冲区1个字节数据
        if (ch >= 0x0a) {//防止非法字符漏入
          U0->THR = ch;//将缓冲区1个字节数据写入FIFO
        }
      }
      break;
//    case 0x0f://保留中断
//      break;
  }   
  VIC->SoftIntClr = (1 << VICIntSel_UART0);
  VIC->VectAddr = 0x00;    
}

点赞

发表评论 评论 (1 个评论)

Guest 2007-6-10 15:13
http://2f7527b0c7b6801c32007e264d455dd7-t.xioitp.info <a href="http://2f7527b0c7b6801c32007e264d455dd7-h.xioitp.info">2f7527b0c7b6801c32007e264d455dd7</a> [url]http://2f7527b0c7b6801c32007e264d455dd7-b1.xioitp.info[/url] [url=http://2f7527b0c7b6801c32007e264d455dd7-b2.xioitp.info]2f7527b0c7b6801c32007e264d455dd7[/url] [u]http://2f7527b0c7b6801c32007e264d455dd7-b3.xioitp.info[/u] bccf7e83ddcf628556e16e8f14e26853

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 25

    评论
  • 134

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 18:33 , Processed in 0.023183 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部