亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? niosii_uart.c

?? 基于NIOSII的UART的原代碼
?? C
字號:

//www.21control.com
//#include <stdio.h>
#include "system.h"
#include <alt_types.h>
#include "sys/alt_irq.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_uart.h"

//接收\發送緩沖大小
#define TXBUFSIZE 256
#define RXBUFSIZE 256

//全局變量
unsigned char RxBuf[RXBUFSIZE]; //接收緩沖
int RxHead =0;                  //接收緩沖位置索引 頭
int RxTail =0;                 //接收緩沖位置索引 尾
unsigned char TxBuf[TXBUFSIZE]; //發送緩沖
int TxHead =0;                  //發送緩沖位置索引 頭
int TxTail =0;                  //發送緩沖位置索引 尾

int RevStatus = 0;              //接收幀狀態,0空閑,1收到幀頭,2收到命令碼
unsigned char Code = 0;   //命令碼,0空閑,'s'字符串,'x'十六進制,'d'切換顯示
unsigned char FrameData[255];   //幀數據
int FrameIndex = 0;             //幀位置索引
int ShowHex = 0;                //是否顯示十六進制碼

int _putchar(int in_char);      //發送一個數據
int _puts(unsigned char* str);  //發送一串數據
void serial_ISR(int context);   //串口中斷服務子程序
int _bufdone();                 //處理接收緩沖區數據流

//main 主程序
int main()
{
    int context = 0;
 // _putchar('o');
    //安裝串口中斷服務子程序
   // /  nr_installuserisr(na_uart1_irq, serial_ISR, context);
        alt_irq_register(UART_0_IRQ,context,serial_ISR);
  
    //使能串口接收中斷
    ///na_uart1->np_uartcontrol = np_uartcontrol_irrdy_mask;
       IOWR_ALTERA_AVAL_UART_CONTROL(UART_0_BASE, 0x80|0x10);
  
    //循環等待處理串口數據
    while(1) 
    {
       //處理串口接收數據
       if(!_bufdone())
             break;
    }
  
    //關閉串口中斷
   /// na_uart1->np_uartcontrol = 0;
      IOWR_ALTERA_LON_UART_CONTROL(UART_0_BASE,0);
    //卸載串口中斷程序
    ///nr_installuserisr(na_uart1_irq, 0, 0);
  //   alt_irq_register(UART_0_IRQ,0,0);


    //退出程序,\004即Ctrl-D,表示已結束
    printf("\n\004");
}

//_bufdone子程序,處理串口接收緩沖區數據
//返回值0表示接收到退出程序命令,1表示數據處理正常
int _bufdone()
{
  
  //循環檢測緩沖區是否為空
  //當RxTail等于RxHead時,表示已處理完接收緩沖區中數據,亦即緩沖區為空
  while (RxTail !Head)
  {
    //如果檢測到鍵盤ESC鍵值,函數返回0,提示退出程序
    if (RxBuf[RxTail] == 27)
    {
      _puts("\nExit uart_isr_test.\n");
 //     nr_delay(10);
      return 0;
    }
    
    //接收幀狀態處理
    switch (RevStatus)
    {
     default:
      case 0://接收幀空閑狀態
        
          if (RxBuf[RxTail] == '-')
              RevStatus = 1; //如果照到幀頭字符,進入下一個接收狀態
             bre
      case 1://已接收到幀頭字符
    
          Code = RxBuf[RxTail];
          if (Code != 's' && Code != 'S' &&
              Code != 'x' && Code != 'X' &&
              Code != 'd' && Code != 'D' )
          {
            RevStatus = 0;  //接收到無效命令字符,返回到初始狀態
          _puts("\nIalid frame.\n");    
          }   
          else
              RevStatus = 2;  //接收命令有效,進入下一個接收狀態
          break;
      case 2://接收到有效命令字符
           //根據不同命令字符,執行相應操作
           switch (Code)
           {
             case 's':  case 'S':  // -s命令幀
             
             *(unsigned int *)LED_BASE =0x01;
             
                 //將接收字符存入FrameData數組
                   FrameData[FrameIndex++] = RxBuf[RxTail];
           
           if (FrameIndex >= 254 || RxBuf[RxTail] == '\n')
                   {
                     //數組已滿或收到回車換行符時,輸出FrameData字符串
                 FrameData[FrameIndex] = '\0';
                     _puts(FrameData);
        
                     RevStatus = 0;     //回到初始狀態,準備接收下一幀
                  FrameIndex 0;    //FrameData數組索引清零
                }
                 break;
             case 'x':  case 'X':  // -x命令幀
                      *(unsigned int *)LED_BASE =0x02;
                       //存入接收字符的ASCII碼表示,例如字符'0'將存入"30"
                      FrameData[FrameIndex++] = (RxBuf[RxTail]>>4) + '0';
                       FrameData[FrameIndex++] = (RxBuf[RxTail] & 0x0F) + (((RxBuf[RxTail] & 0x0F) > 9) ? ('A' - 10) : '0');
                       //每兩個ASCII字符表示間添加空格
                      FrameData[FrameIndex++] = ' ';
  
                       if (Framndex >= 252 || RxBuf[RxTail] == '\n')
                       {
                         //數組已滿或收到回車換行符時,輸出FrameData字符串
                      FrameData[FrameIndex] = '\0';
                           _puts(FrameData);
                           _puts("\n");
  
                           RevStatus = 0;     //回到初始狀態,準備接收下一幀
                  FrameIndex = 0;    //FrameData數組索引清零
                 }
                 break;
             case 'd':  case 'D':  // -d命令幀
                 //存入接收字符到FrameData數組
                FrameData[FrameIndex++] = RxBuf[RxTail];
        
                 if (FrameInd= 252 || RxBuf[RxTail] == '\n')
                       {
                         //數組已滿或收到回車換行符時,輸出FrameData字符串
                  FrameData[FrameIndex] = '\0';
                           _puts(FrameData);
   
                           RevStatus = 0;     //回到初始狀態,準備接收下一幀
                  FrameIndex = 0;    //FrameData數組索引清零
        
                     //切換輸入字符ASCII碼顯示功能
                  if (ShowHex > 0)
                     {
                       ShowHex = 0;   //關閉ASCII碼顯示功能
                       _puts("\n-d OFF\n");
                   }
                   else
                   {
                     Shex = 1;   //打開ASCII碼顯示功能
                 _puts("ON\n");
                 }
               }
             break;
             default:  //無效的命令字符
                       _puts("\nInvalid command code.\n");
                       RevStatus = 0;     //回到初始狀態
               FrameIndex = 0;    //FrameData數組索引清零
             break;
         }
         break;
        }
        
        //處理下一個接收字符,如果已到達接收緩沖區尾部,返回接收緩沖區頭部
        if  (++RxTail > (RXBUFSIZE - 1))
             RxTail =
    }

    return 1;
}

//_putchar子程序,向串口發送一個字符數據in_char
//返回值1表示發送成功,-1表示發送失敗
int _putchar(int in_char)
{
  //發送緩沖區已用空間大小
  int size;
  
  //獲取狀態寄存器的值
  ///int  sr = na_uart1->np_uartstatus;
     int sr = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE)
  //判斷發送緩沖區是否為空并且串口狀態是否已準備好發送
  if ((TxHead == TxTail) && sr&0x40)
  {
    //發送緩沖區為空,直接發送數據in_char
      IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE,in_char);
  }
  else
  {
    //計算發送緩沖區已用空間大小
    if (TxHead >= TxTail) 
        size = - TxTail;
    else
        size = ((TXBUFSIZE - 1) - TxTail) + TxHead;  //循環隊列
    
    //如果發送緩沖區已滿,發送失敗,直接返回 
    if (size > (TXBUFSIZE - 3))  
      return (-1);
      
    //將待發送數據追加到發送緩沖區中的數據流末尾
    TxBuf[TxHead] = in_char;
    if (++TxHead >(TXBUFSIZE - 1))
      TxHead = 0;
      
      //使能itrdy中斷
      IOWR_ALTERA_AVON_UART_CONTROL(UART_0_BASE, 0x40|0x10);//開發送中斷,中斷使能
    }
    return 1;
}

//_puts子程序,向串口發送一個字符串str
//返回值count表示已發送的字符個數
int _puts(unsigned char *str)
{
  //發送字符計數
  int count = 0;
  //字符指針,指向str字符串中當前發送字符
  unsigned char *tmp = str;
  //判斷tmp是否已到str字符串結尾
  while (*tmp != 0)
  {
    if (_putchar(*tmp++) >0)  //發送當前字符,并且tmp指針指向下一個字符
        cot++;              //成功發送,count計數加1
    else
        break;                //發送失敗,跳出while循環
  }
  
  return count;
}

//serial_ISR子程序,串口中斷服務子程序
void serial_ISR(int data)
{
  //保存狀態寄存器數值
  int sr = IORD_ALTERA_AVALON_UART_STATUS (UART_0_BASE);
  int si = IORD_ALTAVALON_UART_CONTROL (UART_0_BASE);

  //發送中斷處理
  if(sr & ALTERA_AVALON_UART_STATUS_TRDY_MSK)
  {
    //串口發送端已準備好
    ///if(na_uart1->np_uartcontrol & np_uartcontrol_itrdy_mask)
      if(si & ALTERA_AVALON_UART_CONTROL_TRDY_MSK)

    {
      //如果itrdy中斷已打開,判斷發送緩沖區是否為空
      if (TxTail != TxHead)
      {
        //如果發送緩沖區中還有發送數據,發送一個字節數據
         IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE ,TxBuf[TxTail]);
        //如果已到達數組尾部,TxTail索引值返回數組頭部
        if (++TxTail > (TXBUFSIZE - 1))
          TxTail = 0;
          }
          else
          {   //已經沒有待發送數據,關閉發送中斷,使能接收中斷
           ///na_uart1->np_uartcontrol = np_uartcontrol_irrdy_mask;
                 IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x80|0x10);//開發送中斷,中斷使能

          }
      }
    }   //發送中斷處理完成
    //接收中斷處理
    if(sr & ALTERA_AVALON_UART_STATUS_RRDY_MSK)
    {
      //串口接收端收到新數據,將其放入接收緩沖區數據流末尾
        //RxBuf[RxHead] = na_uart1->np_uartrxdata;
             RxBuf[RxHead] = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
      
      //接收字符回顯
      
       _putchar(RxBuf[RxHead]);
      //顯示接收字符ASCII碼(十六進制)
      if (ShowHex)
          printf("\n%02X\n" , RxBuf[RxHead]);
   
      if ((++) > (RXBUFSIZE - 1))
      {
        //如果RxHead索引值已到數組末尾,返回數組頭部
      RxHead = 0;
    }
    
    //串口狀態寄存器清零
    ///na_uart1->np_uartstatus = 0;
            IOWR_ALERA_AVALON_UART_STATUS(UART_0_BASE, 0);
     }  //接收中斷處理完成
}















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆午夜三级精品| 中文字幕制服丝袜成人av | 国产不卡视频在线观看| www欧美成人18+| 国产成人午夜电影网| 国产视频一区在线观看| www.欧美色图| 亚洲高清免费一级二级三级| 在线不卡一区二区| 日韩精品一卡二卡三卡四卡无卡| 91精品午夜视频| 久久99日本精品| 国产精品久久久久久一区二区三区| 在线观看一区二区精品视频| 日本vs亚洲vs韩国一区三区| 国产午夜精品久久久久久久| 91网上在线视频| 美脚の诱脚舐め脚责91 | 不卡av免费在线观看| 亚洲线精品一区二区三区 | 欧美日韩高清不卡| 韩国精品主播一区二区在线观看| 亚洲欧洲成人精品av97| 欧美性生活大片视频| 国产精品一区一区三区| 亚洲永久免费视频| 久久久亚洲午夜电影| 色婷婷综合久久久中文一区二区| 日韩不卡一二三区| 亚洲天天做日日做天天谢日日欢 | 国产高清成人在线| 一区二区高清在线| 久久精品综合网| 欧美日韩1区2区| 成人国产精品免费| 免费视频最近日韩| 亚洲久草在线视频| 国产亚洲精品免费| 欧美高清激情brazzers| www.欧美色图| 国产一区不卡视频| 天天操天天综合网| 亚洲精品亚洲人成人网| 久久精品综合网| 欧美一级片在线观看| 色综合天天狠狠| 国产99久久久国产精品免费看 | 精品第一国产综合精品aⅴ| 色乱码一区二区三区88| 国产成人综合在线播放| 日韩激情一二三区| 一区二区三区精品在线观看| 国产精品剧情在线亚洲| 久久品道一品道久久精品| 欧美一区二区三区系列电影| 91香蕉视频污在线| av电影在线观看一区| 国产美女久久久久| 久久电影国产免费久久电影 | 蜜臀av性久久久久蜜臀av麻豆 | 制服丝袜国产精品| 精品视频一区三区九区| 在线观看视频91| 91丨九色丨蝌蚪富婆spa| 成人网在线播放| 成人做爰69片免费看网站| 国产一区二区0| 国产呦萝稀缺另类资源| 日韩av在线发布| 天天影视涩香欲综合网| 亚洲成人黄色影院| 亚洲第一激情av| 亚洲va韩国va欧美va精品| 亚洲午夜影视影院在线观看| 亚洲综合丁香婷婷六月香| 亚洲三级久久久| 亚洲精品日日夜夜| 玉米视频成人免费看| 亚洲美女电影在线| 一级女性全黄久久生活片免费| 亚洲欧美福利一区二区| 亚洲欧美一区二区三区极速播放| 国产精品国产三级国产普通话三级 | 麻豆精品久久精品色综合| 日本成人在线网站| 日本不卡在线视频| 久久精品av麻豆的观看方式| 久久99热这里只有精品| 国产精品亚洲午夜一区二区三区 | 亚洲色图视频网| 亚洲国产欧美日韩另类综合 | 波多野结衣一区二区三区 | 欧美亚洲综合在线| 69堂成人精品免费视频| 日韩精品最新网址| 久久精品一区二区三区av| 最好看的中文字幕久久| 亚洲福利视频三区| 视频一区二区欧美| 韩国女主播成人在线| 成人永久免费视频| 在线观看国产一区二区| 日韩精品自拍偷拍| 国产精品福利一区二区三区| 亚洲成人综合网站| 精品中文字幕一区二区 | 欧美视频一区在线| 日韩欧美一区二区三区在线| 国产欧美日韩三级| 一区二区理论电影在线观看| 日本不卡视频一二三区| 成人美女在线视频| 91精品国产91热久久久做人人| 久久精品视频网| 一区二区三区蜜桃网| 国内精品国产成人| 在线看不卡av| 国产亲近乱来精品视频| 亚洲高清不卡在线观看| 成人爽a毛片一区二区免费| 欧美性猛交xxxxxx富婆| 久久久国产午夜精品| 亚洲v日本v欧美v久久精品| 国产成人免费视频网站| 7777精品久久久大香线蕉| 国产精品久久久99| 免费成人在线视频观看| 色综合中文综合网| 狠狠色丁香九九婷婷综合五月 | 欧美日韩一级二级| 久久久久99精品一区| 亚洲午夜在线电影| 国产成人精品影视| 欧美一级黄色录像| 亚洲日本护士毛茸茸| 国产精品乡下勾搭老头1| 欧美精品一二三| 亚洲欧美日韩电影| 成人亚洲精品久久久久软件| 日韩亚洲欧美高清| 亚洲一区欧美一区| 99re这里只有精品首页| 久久女同性恋中文字幕| 蜜臀久久99精品久久久久宅男 | 91丝袜美女网| 国产日产欧美一区二区三区| 捆绑调教美女网站视频一区| 在线免费不卡电影| 一区二区三区在线视频免费观看| 国产成人午夜高潮毛片| 久久亚洲捆绑美女| 另类小说图片综合网| 3751色影院一区二区三区| 亚洲尤物视频在线| 色婷婷av久久久久久久| 亚洲三级电影全部在线观看高清| 国产不卡在线视频| 国产嫩草影院久久久久| 国产剧情一区二区| 欧美r级电影在线观看| 欧美aaa在线| 日韩区在线观看| 日本中文字幕不卡| 制服丝袜av成人在线看| 日韩电影一区二区三区四区| 欧美美女直播网站| 天天色图综合网| 日韩一区二区在线看| 奇米影视7777精品一区二区| 91精品国产一区二区三区香蕉| 亚洲国产精品久久一线不卡| 在线一区二区观看| 亚洲国产日韩av| 8x8x8国产精品| 日本aⅴ精品一区二区三区| 欧美一级理论性理论a| 日本成人中文字幕在线视频| 日韩欧美在线123| 国产精品亚洲人在线观看| 欧美韩国日本一区| 91免费在线看| 丝瓜av网站精品一区二区 | 欧美丰满高潮xxxx喷水动漫| 日韩成人一区二区三区在线观看| 日韩手机在线导航| 国产成人免费视频网站高清观看视频 | 日韩一区二区三区四区五区六区| 奇米精品一区二区三区四区| 精品久久人人做人人爰| 国产高清一区日本| 一区二区三区欧美| 日韩美女视频在线| 成人免费视频视频| 亚洲va国产天堂va久久en| 欧美tk—视频vk| 97se亚洲国产综合自在线不卡 | 国产成人鲁色资源国产91色综| 国产精品色在线| 欧美日韩精品免费观看视频| 国产精品一区二区黑丝|