2410lib.c
上传用户:mhstny
上传日期:2022-08-05
资源大小:793k
文件大小:20k
源码类别:

微处理器开发

开发平台:

Unix_Linux

  1. //===================================================================
  2. // File Name : 2410lib.c
  3. // Function  : S3C2410 PLL,Uart, LED, Port Init
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : March 20, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (February 20,2002) -> SOP
  9. //===================================================================
  10. #include "def.h"
  11. #include "option.h"
  12. #include "2410addr.h"
  13. #include "2410lib.h"
  14. #include "2410slib.h" 
  15. #include "timer.h" 
  16. #include <stdarg.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. //#include <stdio.h>
  20. #include <ctype.h>
  21. extern char Image$$RW$$Limit[];
  22. void *mallocPt=Image$$RW$$Limit;
  23. //***************************[ SYSTEM ]***************************************************
  24. static int delayLoopCount = 400;
  25. void Delay(int time)
  26. {
  27.       // time=0: adjust the Delay function by WatchDog timer.
  28.       // time>0: the number of loop time
  29.       // resolution of time is 100us.
  30.     int i,adjust=0;
  31.     if(time==0)
  32.     {
  33.         time   = 200;
  34.         adjust = 1;
  35.         delayLoopCount = 400;
  36.             //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
  37.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); 
  38.         rWTDAT = 0xffff;                              //for first update
  39.         rWTCNT = 0xffff;                              //resolution=64us @any PCLK 
  40.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
  41.     }
  42.     for(;time>0;time--)
  43.         for(i=0;i<delayLoopCount;i++);
  44.     if(adjust==1)
  45.     {
  46.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); //Watch-dog timer stop
  47.         i = 0xffff - rWTCNT;                     //1count->64us, 200*400 cycle runtime = 64*i us
  48.         delayLoopCount = 8000000/(i*64);         //200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
  49.     }
  50. }
  51. //***************************[ PORTS ]****************************************************
  52. void Port_Init(void)
  53. {
  54.     //CAUTION:Follow the configuration order for setting the ports. 
  55.     // 1) setting value(GPnDAT) 
  56.     // 2) setting control register  (GPnCON)
  57.     // 3) configure pull-up resistor(GPnUP)  
  58.     //32bit data bus configuration  
  59.     //*** PORT A GROUP
  60.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  61.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
  62.     //Binary :  1     0      1  , 1   1   1    1   ,  1     1     1     1
  63.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  64.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
  65.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      0
  66.     rGPACON = 0x5ffffe; 
  67.     //**** PORT B GROUP
  68.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  69.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  70.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
  71.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  72.     rGPBCON = 0x044555;
  73.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]
  74.     //*** PORT C GROUP
  75.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  76.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  77.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  78.     rGPCCON = 0xaaaaaaaa;       
  79.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0] 
  80.     //*** PORT D GROUP
  81.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  82.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  83.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  84.     rGPDCON = 0xaaaaaaaa;       
  85.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]
  86.     //*** PORT E GROUP
  87.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  88.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
  89.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     10  ,     
  90.     //-------------------------------------------------------------------------------------------------------
  91.     //Ports  :  GPE3   GPE2  GPE1    GPE0    
  92.     //Signal : I2SSDI CDCLK I2SSCLK I2SLRCK     
  93.     //Binary :  10     10  ,  10      10 
  94.     rGPECON = 0x5aaaaaaa;       
  95.     rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  96.     //*** PORT F GROUP
  97.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  98.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  99.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  100.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  101.     rGPFCON = 0x55aa;
  102.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]
  103.     //*** PORT G GROUP
  104.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6    
  105.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  106.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  107.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  108.     //-----------------------------------------------------------------------------------------
  109.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0    
  110.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  111.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  112.     //Binary :     11         11   ,  10      11  ,  10        10
  113.     rGPGCON = 0xff81ffba; //GPG10 input,GPG9 input
  114.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]
  115.     //*** PORT H GROUP
  116.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
  117.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  118.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  119. rGPHCON = 0xfaaa;//0x2afaaa;
  120.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]
  121.     
  122.     //External interrupt will be falling edge triggered. 
  123.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  124.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  125.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  126. }
  127. //***************************[ UART ]******************************
  128. extern U32 SYS_PCLK;
  129. static int whichUart=0;
  130. void Uart_Init(int pclk,int baud)
  131. {
  132.     int i;    
  133. rGPHCON = rGPHCON & (~(0xffff)) ;
  134. rGPHCON = rGPHCON | (0xaaa0) ;
  135.     rGPHUP  = 0x0;    // The pull up function is enable
  136.     if(pclk == 0) pclk = SYS_PCLK;
  137. // pclk    = PCLK;    
  138.     rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
  139.     rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
  140.     rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
  141.     rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
  142.     rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
  143. //UART0
  144.     rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
  145.      //    [10]       [9]     [8]        [7]        [6]      [5]         [4]           [3:2]        [1:0]
  146.      // Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
  147.      //     0          1       0    ,     0          1        0           0     ,       01          01
  148.      //   PCLK       Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling
  149.     rUCON0  = 0x245;   // Control register
  150.     rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0
  151. //UART1
  152.     rULCON1 = 0x3;
  153.     rUCON1  = 0x245;
  154.     rUBRDIV1=( (int)(pclk/16./baud) -1 );
  155. //UART2
  156.     rULCON2 = 0x3;
  157.     rUCON2  = 0x245;
  158.     rUBRDIV2=( (int)(pclk/16./baud) -1 );    
  159.     for(i=0;i<100;i++);
  160. }
  161. //===================================================================
  162. void Uart_Select(int ch)
  163. {
  164.     whichUart = ch;
  165. }
  166. //*****************************************************************************
  167. //在串口1和2之间切换
  168. //*****************************************************************************
  169. void Uart2_Test( void )
  170. {
  171. U8 m ;
  172. U8 n = 0 ;
  173. rGPHCON = rGPHCON & (~(0xffff)) ;
  174. rGPHCON = rGPHCON | (0xaaa0) ;
  175.     rGPHUP  = 0x0;    // The pull up function is enable
  176. SetClockDivider(1, 1);
  177. SetSysFclk(DFT_FCLK_VAL);
  178. Delay( 0 ) ;
  179. Uart_Init(0, UART_BAUD);
  180. Uart_Select(0);
  181.     Uart_Printf( "nUART2 Testn" ) ;
  182.     Uart_Printf( "nPlease pull out COM cable and plug into the UART2 connectorn" ) ;
  183.    
  184.     Uart_Select( 1 ) ;
  185. while( (m=Uart_GetKey()) != ESC_KEY )
  186. {
  187.     if( m != 0 )  
  188.     {
  189.     puts( "'ESC' key return to UART1, The input of you is " ) ;
  190.     putch( m ) ; puts( "n" ) ;
  191.     n = 1 ;
  192.     }
  193.     else  
  194.     {
  195.     if( n==0 )
  196.     {
  197.     puts( "Now is UART2 output, do you see?  Any key to display, 'ESC' key return to UART1 n" ) ;
  198.     n = 0 ;
  199.     Delay( 6000 ) ;
  200.     }
  201.     }
  202. }
  203.     Uart_Printf( "nPlease pull out COM cable and plug into the UART1 connectorn" ) ;
  204.     Uart_Select( 0 ) ;
  205. while( (m=Uart_GetKey()) != ESC_KEY )
  206. {
  207.     Uart_Printf( "Please Enter 'ESC' key to Main menu n" ) ;
  208.     Delay( 6000 ) ;
  209. }
  210. }
  211. //===================================================================
  212. void Uart_TxEmpty(int ch)
  213. {
  214.     if(ch==0)
  215.         while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty.
  216.           
  217.     else if(ch==1)
  218.         while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
  219.         
  220.     else if(ch==2)
  221.         while(!(rUTRSTAT2 & 0x4)); //Wait until tx shifter is empty.
  222. }
  223. //=====================================================================
  224. char getch(void)
  225. {
  226.     if(whichUart==0)
  227.     {       
  228.         while(!(rUTRSTAT0 & 0x1)); //Receive data ready
  229.         return RdURXH0();
  230.     }
  231.     else if(whichUart==1)
  232.     {       
  233.         while(!(rUTRSTAT1 & 0x1)); //Receive data ready
  234.         return RdURXH1();
  235.     }
  236.     else if(whichUart==2)
  237.     {
  238.         while(!(rUTRSTAT2 & 0x1)); //Receive data ready
  239.         return RdURXH2();
  240.     }
  241.     return 0;
  242. }
  243. //====================================================================
  244. char getkey(void)
  245. {
  246.     if(whichUart==0)
  247.     {       
  248.         if(rUTRSTAT0 & 0x1)    //Receive data ready
  249.             return RdURXH0();
  250.         else
  251.             return 0;
  252.     }
  253.     else if(whichUart==1)
  254.     {
  255.         if(rUTRSTAT1 & 0x1)    //Receive data ready
  256.             return RdURXH1();
  257.         else
  258.             return 0;
  259.     }
  260.     else if(whichUart==2)
  261.     {       
  262.         if(rUTRSTAT2 & 0x1)    //Receive data ready
  263.             return RdURXH2();
  264.         else
  265.             return 0;
  266.     }    
  267.     return 0;
  268. }
  269. //====================================================================
  270. void gets(char *string)
  271. {
  272.     char *string2 = string;
  273.     char c;
  274.     while((c = getch())!='r')
  275.     {
  276.         if(c=='b')
  277.         {
  278.             if( (int)string2 < (int)string )
  279.             {
  280.                 printf("b b");
  281.                 string--;
  282.             }
  283.         }
  284.         else 
  285.         {
  286.             *string++ = c;
  287.             putch(c);
  288.         }
  289.     }
  290.     *string='';
  291.     putch('n');
  292. }
  293. //=====================================================================
  294. int Uart_GetIntNum(void)
  295. {
  296.     char str[30];
  297.     char *string = str;
  298.     int base     = 10;
  299.     int minus    = 0;
  300.     int result   = 0;
  301.     int lastIndex;    
  302.     int i;
  303.     
  304.     gets(string);
  305.     
  306.     if(string[0]=='-')
  307.     {
  308.         minus = 1;
  309.         string++;
  310.     }
  311.     
  312.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  313.     {
  314.         base    = 16;
  315.         string += 2;
  316.     }
  317.     
  318.     lastIndex = strlen(string) - 1;
  319.     
  320.     if(lastIndex<0)
  321.         return -1;
  322.     
  323.     if(string[lastIndex]=='h' || string[lastIndex]=='H' )
  324.     {
  325.         base = 16;
  326.         string[lastIndex] = 0;
  327.         lastIndex--;
  328.     }
  329.     if(base==10)
  330.     {
  331.         result = atoi(string);
  332.         result = minus ? (-1*result):result;
  333.     }
  334.     else
  335.     {
  336.         for(i=0;i<=lastIndex;i++)
  337.         {
  338.             if(isalpha(string[i]))
  339.             {
  340.                 if(isupper(string[i]))
  341.                     result = (result<<4) + string[i] - 'A' + 10;
  342.                 else
  343.                     result = (result<<4) + string[i] - 'a' + 10;
  344.             }
  345.             else
  346.                 result = (result<<4) + string[i] - '0';
  347.         }
  348.         result = minus ? (-1*result):result;
  349.     }
  350.     return result;
  351. }
  352. //*****************************************************************************
  353. //get a number for the uart
  354. //*****************************************************************************
  355. int Uart_GetIntNum_GJ(void)
  356. {
  357.     char string[16] ;
  358.     char *p_string = string ;
  359.     char c;
  360.     int i = 0 ;
  361.     int data = 0 ;
  362.     while(   (c=getch()) != 'r'  )
  363.     {
  364. if(c=='b') p_string--;
  365. else *p_string++=c;
  366. putch( c ) ;
  367.     }
  368.     *p_string = '';
  369. i = 0 ;
  370. while( string[i] != '' )
  371. {
  372. data = data * 10 ;
  373. if( string[i]<'0'||string[i]>'9' )
  374. return -1 ;
  375. data = data + ( string[i]-'0' ) ;
  376. i++ ;
  377. }
  378. return data ;
  379. }
  380. //*****************************************************************************
  381. //=====================================================================
  382. void wait_print_end(void)
  383. {
  384. int i;
  385. while(!(rUTRSTAT0 & 0x2));
  386. i = 10000;
  387. while(i--);
  388. }
  389. void putch(int data)
  390. {
  391.     if(whichUart==0)
  392.     {
  393.         if(data=='n')
  394.         {
  395.             while(!(rUTRSTAT0 & 0x2));
  396.             Delay(1);                 //because the slow response of hyper_terminal 
  397.             WrUTXH0('r');
  398.         }
  399.         while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
  400.         Delay(1);
  401.         WrUTXH0(data);
  402.     }
  403.     else if(whichUart==1)
  404.     {
  405.         if(data=='n')
  406.         {
  407.             while(!(rUTRSTAT1 & 0x2));
  408.             Delay(1);                 //because the slow response of hyper_terminal 
  409.             rUTXH1 = 'r';
  410.         }
  411.         while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
  412.         Delay(1);
  413.         rUTXH1 = data;
  414.     }   
  415.     else if(whichUart==2)
  416.     {
  417.         if(data=='n')
  418.         {
  419.             while(!(rUTRSTAT2 & 0x2));
  420.             Delay(1);                 //because the slow response of hyper_terminal 
  421.             rUTXH2 = 'r';
  422.         }
  423.         while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
  424.         Delay(1);
  425.         rUTXH2 = data;
  426.     }       
  427. }               
  428. //====================================================================
  429. void puts(char *pt)
  430. {
  431.     while(*pt)
  432.         putch(*pt++);
  433. }
  434. //=====================================================================
  435. //If you don't use vsprintf(), the code size is reduced very much.
  436. typedef int *__va_list[1];
  437. int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);
  438. void printf(char *fmt,...)
  439. {
  440.     va_list ap;
  441.     char string[256];
  442.     va_start(ap,fmt);
  443.     vsprintf(string,fmt,ap);
  444.     puts(string);
  445.     va_end(ap);
  446. }
  447. //=============================================================
  448. char DbgPause(char *str)
  449. {
  450. if(str)
  451. puts(str);
  452. else
  453. puts("Debug breakpoint, press any key to continue...n");
  454. return getch();
  455. }
  456. //**************************[ BOARD LED ]*********************************
  457. void Led_Display(int data)
  458. {
  459.           //Active is low.(LED On)
  460.           // GPF7  GPF6   GPF5   GPF4
  461.           //nLED_8 nLED4 nLED_2 nLED_1
  462. //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  463.     rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);    
  464. }
  465. void Led_Test( void )
  466. {
  467. Uart_Printf( "nLED TESTn" );
  468. Uart_Printf( "Press 'ESC' key to Exit this program !nn" );
  469. while( Uart_GetKey() != ESC_KEY )
  470. {
  471. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 8<<4 ) ;
  472. Delay( 3000 ) ;
  473. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 4<<4 ) ;
  474. Delay( 3000 ) ;
  475. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 2<<4 ) ;
  476. Delay( 3000 ) ;
  477. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 1<<4 ) ;
  478. Delay( 3000 ) ;
  479. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 0<<4 ) ;
  480. Delay( 3000 ) ;
  481. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 1<<4 ) ;
  482. Delay( 3000 ) ;
  483. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 2<<4 ) ;
  484. Delay( 3000 ) ;
  485. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 4<<4 ) ;
  486. Delay( 3000 ) ;
  487. rGPFDAT = rGPFDAT & (~(0xf<<4)) | ( 8<<4 ) ;
  488. Delay( 3000 ) ;
  489. }
  490. }
  491. void Buzzer_Freq_Set( U32 freq )
  492. {
  493. rGPBCON &= ~3; //set GPB0 as tout0, pwm output
  494. rGPBCON |= 2;
  495. rTCFG0 &= ~0xff;
  496. rTCFG0 |= 15; //prescaler = 15+1
  497. rTCFG1 &= ~0xf;
  498. rTCFG1 |= 2; //mux = 1/8
  499. rTCNTB0 = (PCLK>>7)/freq;
  500. rTCMPB0 = rTCNTB0>>1; // 50%
  501. rTCON &= ~0x1f;
  502. rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  503. rTCON &= ~2; //clear manual update bit
  504. }
  505. void Buzzer_Stop( void )
  506. {
  507. rGPBCON &= ~3; //set GPB0 as output
  508. rGPBCON |= 1;
  509. rGPBDAT &= ~1;
  510. }
  511. //***************************[ BOARD BEEP ]*******************************
  512. void Beep(U32 freq, U32 ms)
  513. {
  514. Buzzer_Freq_Set( freq ) ;
  515. Delay( ms ) ;
  516. Buzzer_Stop() ;
  517. }
  518. /****************************************************************************
  519. 【功能说明】蜂鸣器PWM测试
  520. ****************************************************************************/
  521. void BUZZER_PWM_Test( void )
  522. {
  523. U16 freq = 2000 ;
  524. Uart_Printf( "nBUZZER TEST ( PWM Control )n" );
  525.     Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !n" ) ;
  526. Uart_Printf( "Press 'ESC' key to Exit this program !nn" );
  527. Buzzer_Freq_Set( freq ) ;
  528.     while( 1 )
  529.     {
  530. U8 key = Uart_Getch();
  531. if( key == '+' )
  532. {
  533. if( freq < 20000 )
  534. freq += 10 ;
  535. Buzzer_Freq_Set( freq ) ;
  536. }
  537. if( key == '-' )
  538. {
  539. if( freq > 11 )
  540. freq -= 10 ;
  541. Buzzer_Freq_Set( freq ) ;
  542. }
  543. Uart_Printf( "tFreq = %dn", freq ) ;
  544. if( key == ESC_KEY )
  545. {
  546. Buzzer_Stop() ;
  547. return ;
  548. }
  549. }
  550. }
  551. //*************************[ Timer ]********************************
  552. void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
  553. {
  554.     rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3);  //Watch-dog timer control register
  555.     rWTDAT = 0xffff;  //Watch-dog timer data register
  556.     rWTCNT = 0xffff;  //Watch-dog count register
  557.       // Watch-dog timer enable & interrupt  disable
  558.     rWTCON = rWTCON |(1<<5) & !(1<<2);  
  559. }
  560. //=================================================================
  561. int Timer_Stop(void)
  562. {
  563.     rWTCON = ((PCLK/1000000-1)<<8);
  564.     return (0xffff - rWTCNT);
  565. }
  566. //*************************[ MPLL ]*******************************
  567. void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
  568. {
  569.     rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  570. }
  571. //************************[ HCLK, PCLK ]***************************
  572. void ChangeClockDivider(int hdivn,int pdivn)
  573. {
  574.      // hdivn,pdivn FCLK:HCLK:PCLK
  575.      //     0,0         1:1:1 
  576.      //     0,1         1:1:2 
  577.      //     1,0         1:2:2
  578.      //     1,1         1:2:4
  579.     rCLKDIVN = (hdivn<<1) | pdivn;    
  580.     if(hdivn)
  581.         MMU_SetAsyncBusMode();
  582.     else 
  583.         MMU_SetFastBusMode();
  584. }
  585. //**************************[ UPLL ]*******************************
  586. void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
  587. {
  588.     rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  589. }
  590. //*************************[ General Library ]**********************
  591. void * malloc(unsigned nbyte) 
  592. //Very simple; Use malloc() & free() like Stack
  593. //void *mallocPt=Image$$RW$$Limit;
  594. {
  595.     void *returnPt = mallocPt;
  596.     mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte
  597.     if( (int)mallocPt > HEAPEND )
  598.     {
  599.         mallocPt = returnPt;
  600.         return NULL;
  601.     }
  602.     return returnPt;
  603. }
  604. //-------------------------------------------------------------------
  605. void free(void *pt)
  606. {
  607.     mallocPt = pt;
  608. }