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

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

?? 串口中斷_niosii.c

?? 用NiosII寫的串口中斷程序
?? 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_AVALON_UART_CONTROL(UART_0_BASE, 0x80|0x10);
  
    //循環等待處理串口數據
    while(1) 
    {
       //處理串口接收數據
       if(!_bufdone())
             break;
    }
  
    //關閉串口中斷
   /// na_uart1->np_uartcontrol = 0;
      IOWR_ALTERA_AVALON_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 != RxHead)
  {
    //如果檢測到鍵盤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; //如果照到幀頭字符,進入下一個接收狀態
             break;
      case 1://已接收到幀頭字符
    
          Code = RxBuf[RxTail];
          if (Code != 's' && Code != 'S' &&
              Code != 'x' && Code != 'X' &&
              Code != 'd' && Code != 'D' )
          {
            RevStatus = 0;  //接收到無效命令字符,返回到初始狀態
          _puts("\nInvalid 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 (FrameIndex >= 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 (FrameIndex >= 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
                   {
                     ShowHex = 1;   //打開ASCII碼顯示功能
                 _puts("ON\n");
                 }
               }
             break;
             default:  //無效的命令字符
                       _puts("\nInvalid command code.\n");
                       RevStatus = 0;     //回到初始狀態
               FrameIndex = 0;    //FrameData數組索引清零
             break;
         }
         break;
        }
        
        //處理下一個接收字符,如果已到達接收緩沖區尾部,返回接收緩沖區頭部
        if  (++RxTail > (RXBUFSIZE - 1))
             RxTail = 0;
    }

    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 = TxHead - 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_AVALON_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指針指向下一個字符
        count++;              //成功發送,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_ALTERA_AVALON_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 ((++RxHead) > (RXBUFSIZE - 1))
      {
        //如果RxHead索引值已到數組末尾,返回數組頭部
      RxHead = 0;
    }
    
    //串口狀態寄存器清零
    ///na_uart1->np_uartstatus = 0;
            IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE, 0);
     }  //接收中斷處理完成
}















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
7799精品视频| 欧美三级电影网| 日韩中文字幕不卡| 亚洲制服欧美中文字幕中文字幕| 久久久美女毛片| 久久夜色精品国产噜噜av | 免费的国产精品| 亚洲国产精品一区二区久久 | 国产亚洲欧美中文| 精品国产91洋老外米糕| 欧美一区二区人人喊爽| 日韩一级黄色大片| 日韩亚洲欧美一区| 欧美videofree性高清杂交| 日韩久久精品一区| 日韩欧美一级特黄在线播放| 日韩一级完整毛片| 欧美成人精品1314www| 精品国产一区二区三区久久久蜜月 | 中文字幕一区二区三| 中文字幕乱码久久午夜不卡| 国产人伦精品一区二区| 国产精品理论在线观看| 亚洲同性gay激情无套| 亚洲日本va在线观看| 亚洲女与黑人做爰| 亚洲制服丝袜av| 美洲天堂一区二卡三卡四卡视频| 日韩激情一区二区| 国产一区二区在线视频| 成人少妇影院yyyy| 欧美性猛交xxxx黑人交| 7799精品视频| 中文欧美字幕免费| 一区二区理论电影在线观看| 亚洲第一会所有码转帖| 久久99久久精品| 成人av午夜电影| 欧美电影在线免费观看| 久久久不卡网国产精品二区| 亚洲男帅同性gay1069| 亚洲国产视频a| 黑人巨大精品欧美一区| 91在线porny国产在线看| 精品视频全国免费看| 精品国产91洋老外米糕| 亚洲人成伊人成综合网小说| 蜜臀av性久久久久蜜臀aⅴ| 岛国av在线一区| 日韩三级中文字幕| 一区在线观看免费| 久久精品国产亚洲a| 一本一本大道香蕉久在线精品 | 天堂av在线一区| 国产传媒久久文化传媒| 欧美亚洲国产一区二区三区va| 日韩久久精品一区| 亚洲欧美aⅴ...| 高清在线不卡av| 91麻豆精品91久久久久同性| 国产精品久久久久久久久动漫| 男男gaygay亚洲| 欧美性做爰猛烈叫床潮| 欧美韩日一区二区三区| 日本美女一区二区三区| 色综合天天综合网天天看片| 国产精品欧美一级免费| 午夜欧美2019年伦理| 99久久99久久精品免费看蜜桃| 亚洲精品在线一区二区| 亚洲成人一区二区在线观看| 99热这里都是精品| 久久久精品tv| 国产在线不卡视频| 精品久久久久99| 天天操天天色综合| 91福利视频久久久久| 中文字幕乱码久久午夜不卡 | 久久免费看少妇高潮| 奇米四色…亚洲| 欧美午夜电影网| 亚洲综合激情网| 精品奇米国产一区二区三区| 欧美精品18+| 97精品超碰一区二区三区| 欧美成人性福生活免费看| 免费久久精品视频| 99久久综合色| 欧美写真视频网站| 亚洲高清一区二区三区| 欧美高清在线一区| 欧美一区二区视频在线观看2022| 成人天堂资源www在线| 免费在线观看一区| 丝袜诱惑制服诱惑色一区在线观看| 国产视频一区二区三区在线观看| 欧美喷水一区二区| 99久久国产综合色|国产精品| 蜜桃久久精品一区二区| 亚洲激情自拍偷拍| 国产欧美日本一区视频| 日韩视频在线观看一区二区| 一本大道av一区二区在线播放| 国产精品综合一区二区三区| 视频一区二区国产| 亚洲小少妇裸体bbw| 国产精品福利av| 欧美国产日韩在线观看| 精品久久99ma| 91精品国产综合久久精品app| 色一区在线观看| 91一区二区在线| 成人黄色综合网站| 风间由美一区二区三区在线观看| 麻豆成人久久精品二区三区小说| 午夜私人影院久久久久| 亚洲精品中文在线影院| 自拍偷拍亚洲激情| 国产精品久久久久婷婷二区次| 久久久亚洲高清| 久久亚区不卡日本| 久久午夜老司机| 久久综合国产精品| 久久久精品天堂| 久久精品一区二区三区四区| 欧美r级电影在线观看| 日韩视频免费观看高清完整版| 这里是久久伊人| 欧美一级专区免费大片| 91精品国产综合久久婷婷香蕉| 欧美理论电影在线| 欧美一级夜夜爽| 欧美一级黄色片| 久久影院视频免费| 久久久国际精品| 中文字幕在线观看不卡视频| 日韩一区有码在线| 亚洲自拍另类综合| 调教+趴+乳夹+国产+精品| 日产国产高清一区二区三区| 免费在线观看一区二区三区| 狠狠色狠狠色综合| 成人性生交大合| 91欧美激情一区二区三区成人| 精品视频在线免费| 欧美成人综合网站| 国产精品污www在线观看| 亚洲免费三区一区二区| 午夜成人在线视频| 国内精品写真在线观看| 97久久超碰精品国产| 欧美特级限制片免费在线观看| 91精品免费在线观看| 久久蜜桃一区二区| 亚洲精品成人在线| 美日韩黄色大片| www.日韩在线| 日韩欧美激情四射| 国产精品成人免费精品自在线观看| 亚洲小说春色综合另类电影| 美脚の诱脚舐め脚责91 | 日韩午夜av一区| 中文无字幕一区二区三区| 亚洲欧美一区二区三区久本道91| 亚洲1区2区3区4区| 国产精品夜夜嗨| 欧美日韩色综合| 日本一区二区综合亚洲| 亚洲高清视频在线| 粉嫩一区二区三区在线看| 欧美三电影在线| 国产精品欧美久久久久一区二区| 日日骚欧美日韩| 91尤物视频在线观看| 日韩区在线观看| 一个色在线综合| 国产91对白在线观看九色| 7777精品伊人久久久大香线蕉完整版 | 在线一区二区三区做爰视频网站| 日韩精品在线一区二区| 亚洲小说欧美激情另类| 99久久夜色精品国产网站| 精品国产免费一区二区三区香蕉| 亚洲一区在线播放| 成人三级在线视频| 精品国产乱码久久久久久浪潮| 一区二区三区在线免费播放| 国产91富婆露脸刺激对白| 日韩一卡二卡三卡四卡| 亚州成人在线电影| 色婷婷狠狠综合| 成人免费在线视频观看| 久久99热这里只有精品| 欧美精品高清视频| 一区二区三区不卡视频在线观看| 成人激情免费网站| 国产日韩欧美电影| 国产一区二区精品在线观看| 日韩久久久精品| 久久精品国产久精国产|