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

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

?? uart.c

?? 自己編寫的bootloader for S3c4510. 1、支持串口下載
?? C
字號:
#include "Main.h"

void UART_init(unsigned int ch,unsigned int baud)
{
     if(ch)
     {
          UARTLCON1=0x3;     // 8-bit no pariy 1 stop-bit
          UARTCONT1=0x9;     // rx/tx interrupt
          UARTBRD1 =((int)(MCLK_MHz/(baud<<5)))<<4;  
     }
     else 
     {
          UARTLCON0=0x3;
          UARTCONT0=0x9;
          UARTBRD0 =((int)(MCLK_MHz/(baud<<5)))<<4;  //(int)(MCLK/(32*baud)-1);
     	  Enable_Int(nUART0_RX_ERR_INT);
     }
     init_queue(&Uart_buffer);
}
//-***********************************************-//
//    串口發送出一個字符串
//-***********************************************-//
void Print_URAT(int port,char *s)
{
     if(port==0)
     for(;*s!='\0';s++)
     {
         for(;(!(UARTSTAT0&0x40)););
         UARTTXH0=*s;   
     }
     else if(port==1)
     for(;*s!='\0';s++)
     {
         for(;(!(UARTSTAT1&0x40)););
         UARTTXH1=*s;   
     }
}

/* printp() ------------ a simply version of printf()                */


/*修改了部分printp()代碼,
 打印時如果 %后面的x,d為大寫,打印的數不區分正負數
                      為小寫,區分正負數
                 加l為取長型變量。

例如打印如下語句:

	printp("\n here i is 0xF123ABCD, j is 0xF123");
	printp("\n 1 : %%X i is: %X",i);
	printp("\n 2 : %%x i is: %x",i);
	printp("\n 3 : %%D i is: %D",i);
	printp("\n 4 : %%d i is: %d",i);
	printp("\n 5 : %%X j is: %X",j);
	printp("\n 6 : %%x j is: %x",j);
	printp("\n 7 : %%D j is: %D",j);
	printp("\n 8 : %%d j is: %d",j);
結果為:
	 here i is 0xF123ABCD, j is 0xF123
	 1 : %X i is: F123ABCD
	 2 : %x i is: -EDC5433
	 3 : %D i is: 4045646797
	 4 : %d i is: -249320499
	 5 : %X j is: F123
	 6 : %x j is: F123
	 7 : %D j is: 61731
	 8 : %d j is: 61731  */
 
/************************************************************************/


#define CR_as_CRLF  TRUE             // if true , you can use "\n" to act as CR/LF, 
                                     // if false , you have to use "\n\r",but can get a higher speed



void uart_putchar(unsigned char ch)
{
  for(;(!(UARTSTAT0&0x40)););
         UARTTXH0=ch;
}

static int do_padding;
static int left_flag;
static int len;
static int num1;
static int num2;
static char pad_character;

/*---------------------------------------------------*/
/*                                                   */
/* This routine puts pad characters into the output  */
/* buffer.                                           */
/*                                                   */
static void padding( const int l_flag)
{
   int i;

   if (do_padding && l_flag && (len < num1))
      for (i=len; i<num1; i++)
          uart_putchar( pad_character);
   }

/*---------------------------------------------------*/
/*                                                   */
/* This routine moves a string to the output buffer  */
/* as directed by the padding and positioning flags. */
/*                                                   */
static void outs( char* lp)
{
   /* pad on left if needed                          */
   len = strlen( lp);
   padding( !left_flag);

   /* Move string to the buffer                      */
   while (*lp && num2--)
      uart_putchar( *lp++);

   /* Pad on right if needed                         */
   len = strlen( lp);
   padding( left_flag);
   }

/*---------------------------------------------------*/
/*                                                   */
/* This routine moves a number to the output buffer  */
/* as directed by the padding and positioning flags. */
/*                                                   */
static void reoutnum(unsigned long num, unsigned int negative, const long base ) 
{
   char* cp;
   char outbuf[32];
   const char digits[] = "0123456789ABCDEF";
   
   /* Build number (backwards) in outbuf             */
   cp = outbuf;
   do {
      *cp++ = digits[(int)(num % base)];
      } while ((num /= base) > 0);
   if (negative)
      *cp++ = '-';
   *cp-- = 0;

   /* Move the converted number to the buffer and    */
   /* add in the padding where needed.               */
   len = strlen(outbuf);
   padding( !left_flag);
   while (cp >= outbuf)
      uart_putchar( *cp--);
   padding( left_flag);
}


static void outnum(long num, const long base ,unsigned char sign)//1, signed  0 unsigned
{   unsigned int negative;

   if ( (num < 0L) && sign ) 
   {  negative=1;
      num = -num;
      }
   else negative=0;
   
   reoutnum(num,negative,base);  
} 
/*---------------------------------------------------*/
/*                                                   */
/* This routine gets a number from the format        */
/* string.                                           */
/*                                                   */
static int getnum( char** linep)
{
   int n;
   char* cp;

   n = 0;
   cp = *linep;
   while (isdigit(*cp))
      n = n*10 + ((*cp++) - '0');
   *linep = cp;
   return(n);
}

/*---------------------------------------------------*/
/*                                                   */
/* This routine operates just like a printf/sprintf  */
/* routine. It outputs a set of data under the       */
/* control of a formatting string. Not all of the    */
/* standard C format control are supported. The ones */
/* provided are primarily those needed for embedded  */
/* systems work. Primarily the floaing point         */
/* routines are omitted. Other formats could be      */
/* added easily by following the examples shown for  */
/* the supported formats.                            */
/*                                                   */

void printp( char* ctrl, ...)
{

   int long_flag;
   int dot_flag;

   char ch;
   va_list argp;		//由于為可變參數函數,需要進行參數提取;argp依次批向各可變參數

   va_start( argp, ctrl);//初始化argp,使它指向第一個參數

   for ( ; *ctrl; ctrl++) 
   {
      /* move format string chars to buffer until a  */
      /* format control is found.                    */
      if (*ctrl != '%') 
      {
         uart_putchar(*ctrl);
		 #if CR_as_CRLF==TRUE         
         if(*ctrl=='\n') uart_putchar('\r');
         #endif         
         continue;
      }
      /* initialize all the flags for this format.   */
      dot_flag   =
      long_flag  =
      left_flag  =
      do_padding = 0;
      pad_character = ' ';
      num2=0x7fffffff;

try_next:
      ch = *(++ctrl);

      if (isdigit(ch)) 
      {
         if (dot_flag)
            num2 = getnum(&ctrl);
         else {
            if (ch == '0')
               pad_character = '0';

            num1 = getnum(&ctrl);
            do_padding = 1;
         }
         ctrl--;
         goto try_next;
      }

      switch (ch) 
      {
         case '%':
              uart_putchar( '%');
              continue;

         case '-':
              left_flag = 1;
              break;

         case '.':
              dot_flag = 1;
              break;

         case 'd':
                        outnum( va_arg(argp, int), 10,1);
              		    continue;
         case 'D':

              		    outnum( va_arg(argp, unsigned int),10,0);
              		    continue;

         case 'x':    // X 無符號 , x  有符號
                        outnum( va_arg(argp, int), 16 ,1);
              		    continue;
         case 'X':
              		    outnum( va_arg(argp, unsigned int), 16 ,0);
              		    continue;

                 //如果按照16進制打印,將全部按照無符號數進行
                    continue;

         case 's':
               outs( va_arg( argp, char*));
               continue;

         case 'c':
              uart_putchar((char)va_arg( argp, int));
              continue;

         default:
              continue;
      }
      goto try_next;
   }
   va_end( argp);
}
/*
How to use variable argument function
C語言支持va函數,作為C語言的擴展--C++同樣支持va函數,但在C++中并不推薦使用,
C++引入的多態性同樣可以實現參數個數可變的函數。不過,C++的重載功能畢竟只能
是有限多個可以預見的參數個數。比較而言,C中的va函數則可以定義無窮多個相當于
C++的重載函數,這方面C++是無能為力的。va函數的優勢表現在使用的方便性和易用
性上,可以使代碼更簡潔。C編譯器為了統一在不同的硬件架構、硬件平臺上的實現,
和增加代碼的可移植性,提供了一系列宏來屏蔽硬件環境不同帶來的差異。

 
ANSI C標準下,va的宏定義在stdarg.h中,它們有:va_list,va_start(),va_arg(),va_end()。 

 
 
va_list arg_ptr:定義一個指向個數可變的參數列表指針;

va_start(arg_ptr, argN):使參數列表指針arg_ptr指向函數參數列表中的第一個可選參數,
說明:argN是位于第一個可選參數之前的固定參數,(或者說,最后一個固定參數;…之前的一個參數)
,函數參數列表中參數在內存中的順序與函數聲明時的順序是一致的。如果有一va函數的聲明是
void va_test(char a, char b, char c, …),則它的固定參數依次是a,b,c,最后一個固定參數argN為c,
因此就是va_start(arg_ptr, c)。

va_arg(arg_ptr, type):返回參數列表中指針arg_ptr所指的參數,返回類型為type,并使指針arg_ptr
指向參數列表中下一個參數。

va_copy(dest, src):dest,src的類型都是va_list,va_copy()用于復制參數列表指針,將dest初始化為src。

va_end(arg_ptr):清空參數列表,并置參數指針arg_ptr無效。說明:指針arg_ptr被置無效后,可以
通過調用va_start()、va_copy()恢復arg_ptr。每次調用va_start() / va_copy()后,必須得有相應
的va_end()與之匹配。參數指針可以在參數列表中隨意地來回移動,但必須在va_start() … va_end()之內。
*/
char get_char(unsigned int channel) 
{ 
    char ch;
    if(channel) 
    { 
    	while(!(UARTSTAT1 & USTAT_RCV_READY))
        ch = UARTRXB1;
    }
    else 
    { 
    	while(!(UARTSTAT0 & USTAT_RCV_READY))
        ch = UARTRXB0;
    }
    return ch;
}
void Uart0_R_interrupt(void)
{
    char ch;
    ch = UARTRXB0;
    if(command_flag == TRUE)
    { 
      if(Enqueue(&Uart_buffer,ch) == FALSE)
      printp("\n Uart_buffer is full!");
    }
    else
    {
      *Puart_receiver_buffer++ = ch;
      printp("%x  ",ch);
      uart_receiver_count++;
      if(!(uart_receiver_count%5000)) printp("*");
      Uart_receiving_file = TRUE;
      Time0_count = 0;
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
樱花草国产18久久久久| 国产精品一区免费视频| 裸体在线国模精品偷拍| 99精品久久免费看蜜臀剧情介绍| 欧美吻胸吃奶大尺度电影 | fc2成人免费人成在线观看播放| 欧美日韩视频在线观看一区二区三区 | 欧美在线观看一区二区| 国产欧美视频在线观看| 蜜臀av一区二区在线免费观看| 91在线视频免费91| 国产午夜精品一区二区三区四区 | 国产精品视频yy9299一区| 北岛玲一区二区三区四区| 91精品国产色综合久久不卡电影 | 不卡av免费在线观看| 精品人在线二区三区| 天堂午夜影视日韩欧美一区二区| www.欧美日韩| 国产精品欧美久久久久无广告| 久久99精品久久久久久国产越南| 欧美精三区欧美精三区| 亚洲激情成人在线| 91香蕉视频污| 亚洲精选免费视频| 色综合久久88色综合天天6| 国产精品丝袜一区| 高清在线成人网| 欧美激情在线看| 福利一区二区在线| 日本一区二区三级电影在线观看| 韩国av一区二区三区在线观看| 欧美乱妇15p| 日本欧美一区二区在线观看| 91精品国产高清一区二区三区| 午夜一区二区三区视频| 91精品一区二区三区久久久久久| 亚洲成a人片综合在线| 欧美人与性动xxxx| 日韩国产欧美在线视频| 日韩一级片网站| 精品亚洲国产成人av制服丝袜| 精品国产1区2区3区| 国产一区二区三区| 国产精品欧美久久久久无广告| eeuss鲁片一区二区三区在线观看| 中文字幕亚洲一区二区va在线| 91女神在线视频| 亚洲成人一区二区| 亚洲免费av在线| 欧洲精品在线观看| 日欧美一区二区| 久久久蜜桃精品| 97久久精品人人爽人人爽蜜臀| 亚洲午夜电影网| 欧美tk—视频vk| 成人av影视在线观看| 亚洲欧美视频一区| 欧美一区二区三区日韩视频| 久久99精品国产麻豆婷婷洗澡| 欧美国产精品v| 欧美日韩国产系列| 国内精品免费在线观看| 亚洲人精品一区| 日韩欧美三级在线| av不卡在线播放| 日本午夜精品视频在线观看| 久久人人超碰精品| 欧美午夜精品一区| 国产乱一区二区| 亚洲高清免费视频| 久久中文字幕电影| 91高清视频免费看| 国产精品综合在线视频| 一区二区三区鲁丝不卡| 久久久久久久久97黄色工厂| 欧美午夜不卡在线观看免费| 国产黄色成人av| 亚洲成av人片在线观看| 中文字幕欧美日韩一区| 91精品国产91久久久久久一区二区| 国产成人8x视频一区二区| 暴力调教一区二区三区| 美女视频黄 久久| 一区二区欧美精品| 欧美高清在线一区二区| 91精品国产全国免费观看| 一本久久精品一区二区| 国产精品99久久久久久似苏梦涵| 一区二区成人在线视频| 国产精品久久一级| 久久久九九九九| 日韩欧美专区在线| 欧美久久一区二区| 色婷婷综合在线| 丁香天五香天堂综合| 奇米777欧美一区二区| 亚洲国产日产av| 亚洲色图制服诱惑| 中文字幕国产一区| 国产丝袜欧美中文另类| 日韩欧美在线1卡| 91精品国产综合久久香蕉的特点| 91蜜桃传媒精品久久久一区二区| 国产成人精品亚洲日本在线桃色| 久久国产尿小便嘘嘘尿| 亚洲成人精品一区二区| 洋洋成人永久网站入口| 亚洲欧美电影一区二区| 1024成人网| 日韩理论片一区二区| 中文字幕国产一区| 国产精品伦一区二区三级视频| 久久精品一级爱片| 国产亚洲精品资源在线26u| 久久婷婷色综合| 久久男人中文字幕资源站| 日韩高清在线观看| 日本中文字幕一区| 日韩av电影免费观看高清完整版| 亚洲国产va精品久久久不卡综合| 亚洲国产精品尤物yw在线观看| 一区二区三区在线免费| 一区二区三区四区蜜桃| 午夜影院久久久| 蜜桃一区二区三区四区| 国产一区二区三区香蕉| 国产精一品亚洲二区在线视频| 国产精品一二三四五| 国产精品自产自拍| 97久久精品人人做人人爽| 日本电影亚洲天堂一区| 在线电影欧美成精品| 精品福利在线导航| 亚洲欧洲日本在线| 亚洲一卡二卡三卡四卡五卡| 日本不卡1234视频| 国产成人超碰人人澡人人澡| 99久久99久久精品免费看蜜桃| 在线亚洲精品福利网址导航| 欧美午夜精品免费| 久久丝袜美腿综合| 中文字幕一区二区三区四区不卡| 亚洲午夜久久久久| 极品美女销魂一区二区三区免费| 精品免费99久久| 国产精品久久久久aaaa| 亚洲国产精品视频| 国产一区二区看久久| 一本高清dvd不卡在线观看| 日韩欧美一级在线播放| 中文av一区特黄| 偷拍一区二区三区| 粉嫩久久99精品久久久久久夜| 色欧美片视频在线观看在线视频| 日韩欧美激情四射| 亚洲欧美偷拍卡通变态| 日本伊人午夜精品| 99久久精品费精品国产一区二区| 欧美精品日韩精品| 国产精品久久久久久久久久久免费看| 亚洲成在人线免费| av不卡在线播放| wwww国产精品欧美| 丝袜亚洲另类欧美综合| 暴力调教一区二区三区| 日韩一级成人av| 亚洲综合在线视频| 大白屁股一区二区视频| 日韩一二三区视频| 一区二区成人在线观看| 成人免费毛片app| 欧美电影免费观看高清完整版在线观看| 中文字幕视频一区| 国产麻豆一精品一av一免费| 欧美女孩性生活视频| 日韩一区在线看| 国产成人av福利| 日韩欧美黄色影院| 视频一区在线播放| 欧美影视一区二区三区| 综合电影一区二区三区| 国产成人综合在线播放| 日韩欧美一级二级三级久久久| 亚洲第一搞黄网站| 日本道免费精品一区二区三区| 欧美国产一区视频在线观看| 精品一二三四区| 日韩午夜激情av| 日本成人在线一区| 欧美精品 日韩| 香蕉成人伊视频在线观看| 中文字幕精品三区| 国产电影一区二区三区| 亚洲精品一区二区在线观看| 久久精品av麻豆的观看方式| 538在线一区二区精品国产| 丝袜美腿成人在线| 在线不卡免费av| 日韩国产欧美一区二区三区|