找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3432|回复: 0
打印 上一主题 下一主题
收起左侧

ARM 2440裸奔实现电子时钟

[复制链接]
跳转到指定楼层
楼主
ID:112317 发表于 2016-4-7 01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2440 ARM裸奔实现电子时钟,对我们学习ARM体系很有帮助,原创全部源码下载: LCD--ZHIKU.rar (1 MB, 下载次数: 15)

  1. //===================================================================
  2. // File Name : 2440lib.c
  3. // Function  : S3C2410 PLL,Uart, LED, Port Init
  4. // Date      : March 20, 2002
  5. // Version   : 0.0
  6. // History
  7. //   0.0 : Programming start (February 20,2002) -> SOP
  8. //===================================================================

  9. #include "def.h"
  10. #include "option.h"
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "2440slib.h"

  14. #include <stdarg.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <ctype.h>

  19. extern char Image$RW$Limit[];
  20. void *mallocPt=Image$RW$Limit;

  21. //***************************[ SYSTEM ]***************************************************
  22. void Delay(int time)
  23. {
  24.         U32 val = (PCLK>>3)/1000-1;
  25.        
  26.         rTCFG0 &= ~(0xff<<8);
  27.         rTCFG0 |= 3<<8;                        //prescaler = 3+1
  28.         rTCFG1 &= ~(0xf<<12);
  29.         rTCFG1 |= 0<<12;                //mux = 1/2

  30.         rTCNTB3 = val;
  31.         rTCMPB3 = val>>1;                // 50%
  32.         rTCON &= ~(0xf<<16);
  33.         rTCON |= 0xb<<16;                //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
  34.         rTCON &= ~(2<<16);                //clear manual update bit
  35.         while(time--) {
  36.                 while(rTCNTO3>=val>>1);
  37.                 while(rTCNTO3<val>>1);
  38.         };
  39. }

  40. //***************************[ PORTS ]****************************************************
  41. void Port_Init0(void)
  42. {
  43.     //CAUTION:Follow the configuration order for setting the ports.
  44.     // 1) setting value(GPnDAT)
  45.     // 2) setting control register  (GPnCON)
  46.     // 3) configure pull-up resistor(GPnUP)  

  47.     //32bit data bus configuration  
  48.     //*** PORT A GROUP
  49.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  50.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
  51.     //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
  52.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  53.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
  54.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
  55.     rGPACON = 0x7fffff;

  56.     //**** PORT B GROUP
  57.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  58.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  59.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT
  60.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  61.     rGPBCON = 0x044555;
  62.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]

  63.     //*** PORT C GROUP for youlong
  64.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  65.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  66.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  67.     rGPCCON = 0xaaaaaaaa;      
  68.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0]
  69.    

  70.     //*** PORT D GROUP
  71.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  72.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  73.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  74.     rGPDCON = 0xaaaaaaaa;      
  75.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]

  76.     //*** PORT E GROUP
  77.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  78.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN
  79.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     00  ,     
  80.     //-------------------------------------------------------------------------------------------------------
  81.     //Ports  :  GPE3   GPE2  GPE1    GPE0   
  82.     //Signal :  IN     IN    IN      IN  
  83.     //Binary :  00     00  ,  00      00
  84.     //rGPECON = 0xaaaaaaaa;      
  85.     //rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  86.         rGPECON = 0xaaaaa800; // For added AC97 setting      
  87.     rGPEUP  = 0xffff;     

  88.      //*** PORT F GROUP
  89.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  90.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  91.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  92.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  93.     rGPFCON = 0x55aa;
  94.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]

  95.     //*** PORT G GROUP
  96.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6   
  97.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  98.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  99.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  100.     //-----------------------------------------------------------------------------------------
  101.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0   
  102.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  103.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  104.     //Binary :     11         11   ,  10      11  ,  10        10
  105.     rGPGCON = 0xff95ffba;
  106.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]

  107.     //*** PORT H GROUP
  108.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0
  109.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  110.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  111.     rGPHCON = 0x2afaaa;
  112.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]

  113.         // Added for S3C2440X, DonGo
  114.         //*** PORT J GROUP
  115.     //Ports  : GPJ12   GPJ11       GPJ10    GPJ9    GPJ8      GPJ7      GPJ6      GPJ5      GPJ4      GPJ3      GPJ2      GPJ1     GPJ0
  116.     //Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0]
  117.     //Binary :   10      10       10        10       10        10        10        10       10         10        10        10      10
  118.     rGPJCON = 0x02aaaaaa;
  119.     rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]
  120.    
  121.     //External interrupt will be falling edge triggered.
  122.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  123.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  124.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  125. }

  126. void Port_Init(void)
  127. {
  128.     //CAUTION:Follow the configuration order for setting the ports.
  129.     // 1) setting value(GPnDAT)
  130.     // 2) setting control register  (GPnCON)
  131.     // 3) configure pull-up resistor(GPnUP)  

  132.     //32bit data bus configuration  
  133.     //*** PORT A GROUP
  134.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  135.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
  136.     //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
  137.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  138.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
  139.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
  140.     rGPACON = 0x7fffff;

  141.     //**** PORT B GROUP
  142.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  143.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  144.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT
  145.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  146.     //rGPBCON = 0x000150;(youlong)
  147.     rGPBCON = 0x015550;
  148.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]

  149.     //*** PORT C GROUP for youlong
  150.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  151.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  152.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  153.     //rGPCCON = 0xaaaaaaaa;      
  154.     //rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0]
  155.    
  156.     //*** PORT C GROUP
  157.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  158.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  159.     //Binary :  10   10  , 10    10  , 10    10  , 10   01  , 01     01  ,  01   10 , 10     10 , 10   10
  160.     rGPCCON = 0xaaa956aa;      
  161.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0]     

  162.     //*** PORT D GROUP
  163.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  164.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  165.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  166.     rGPDCON = 0xaaaaaaaa;      
  167.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]

  168.     //*** PORT E GROUP
  169.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  170.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN
  171.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     00  ,     
  172.     //-------------------------------------------------------------------------------------------------------
  173.     //Ports  :  GPE3   GPE2  GPE1    GPE0   
  174.     //Signal :  IN     IN    IN      IN  
  175.     //Binary :  00     00  ,  00      00
  176.     //rGPECON = 0xaaaaaaaa;      
  177.     //rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  178.         rGPECON = 0xa02aa800; // For added AC97 setting      
  179.     rGPEUP  = 0xffff;     

  180.      //*** PORT F GROUP
  181.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  182.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  183.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  184.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  185.     rGPFCON = 0x55aa;
  186.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]

  187.     //*** PORT G GROUP
  188.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6   
  189.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  190.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  191.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  192.     //-----------------------------------------------------------------------------------------
  193.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0   
  194.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  195.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  196.     //Binary :     11         11   ,  10      11  ,  10        10
  197.     rGPGCON = 0x00a2aaaa;// GPG9 input without pull-up
  198.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]

  199.     //*** PORT H GROUP
  200.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0
  201.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  202.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  203.     rGPHCON = 0x00faaa;
  204.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]

  205.         // Added for S3C2440X, DonGo
  206.         //*** PORT J GROUP
  207.     //Ports  : GPJ12   GPJ11       GPJ10    GPJ9    GPJ8      GPJ7      GPJ6      GPJ5      GPJ4      GPJ3      GPJ2      GPJ1     GPJ0
  208.     //Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0]
  209.     //Binary :   10      10       10        10       10        10        10        10       10         10        10        10      10
  210.     rGPJCON = 0x02aaaaaa;
  211.     rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]
  212.    
  213.     //External interrupt will be falling edge triggered.
  214.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  215.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  216.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  217. }

  218. //***************************[ UART ]******************************
  219. static int whichUart=0;

  220. void Uart_Init(int pclk,int baud)
  221. {
  222.     int i;
  223.     if(pclk == 0)
  224.     pclk    = PCLK;
  225.     rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
  226.     rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
  227.     rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
  228.     rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
  229.     rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
  230. //UART0
  231.     rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
  232.      //    [10]       [9]     [8]        [7]        [6]      [5]         [4]           [3:2]        [1:0]
  233.      // Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
  234.      //     0          1       0    ,     0          1        0           0     ,       01          01
  235.      //   PCLK       Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling
  236.     rUCON0  = 0x245;   // Control register
  237.     rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0
  238. //UART1
  239.     rULCON1 = 0x3;
  240.     rUCON1  = 0x245;
  241.     rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );
  242. //UART2
  243.     rULCON2 = 0x3;
  244.     rUCON2  = 0x245;
  245.     rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );   

  246.     for(i=0;i<100;i++);
  247. }

  248. //===================================================================
  249. void Uart_Select(int ch)
  250. {
  251.     whichUart = ch;
  252. }

  253. //===================================================================
  254. void Uart_TxEmpty(int ch)
  255. {
  256.     if(ch==0)
  257.         while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty.
  258.          
  259.     else if(ch==1)
  260.         while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
  261.         
  262.     else if(ch==2)
  263.         while(!(rUTRSTAT2 & 0x4)); //Wait until tx shifter is empty.
  264. }

  265. //=====================================================================
  266. char Uart_Getch(void)
  267. {
  268.     if(whichUart==0)
  269.     {      
  270.         while(!(rUTRSTAT0 & 0x1)); //Receive data ready
  271.         return RdURXH0();
  272.     }
  273.     else if(whichUart==1)
  274.     {      
  275.         while(!(rUTRSTAT1 & 0x1)); //Receive data ready
  276.         return RdURXH1();
  277.     }
  278.     else if(whichUart==2)
  279.     {
  280.         while(!(rUTRSTAT2 & 0x1)); //Receive data ready
  281.         return RdURXH2();
  282.     }
  283.    
  284.     return 0 ;
  285. }

  286. //====================================================================
  287. char Uart_GetKey(void)
  288. {
  289.     if(whichUart==0)
  290.     {      
  291.         if(rUTRSTAT0 & 0x1)    //Receive data ready
  292.             return RdURXH0();
  293.         else
  294.             return 0;
  295.     }
  296.     else if(whichUart==1)
  297.     {
  298.         if(rUTRSTAT1 & 0x1)    //Receive data ready
  299.             return RdURXH1();
  300.         else
  301.             return 0;
  302.     }
  303.     else if(whichUart==2)
  304.     {      
  305.         if(rUTRSTAT2 & 0x1)    //Receive data ready
  306.             return RdURXH2();
  307.         else
  308.             return 0;
  309.     }   

  310.         return 0 ;
  311. }

  312. //====================================================================
  313. void Uart_GetString(char *string)
  314. {
  315.     char *string2 = string;
  316.     char c;
  317.     while((c = Uart_Getch())!='\r')
  318.     {
  319.         if(c=='\b')
  320.         {
  321.             if( (int)string2 < (int)string )
  322.             {
  323.                 Uart_Printf("\b \b");
  324.                 string--;
  325.             }
  326.         }
  327.         else
  328.         {
  329.             *string++ = c;
  330.             Uart_SendByte(c);
  331.         }
  332.     }
  333.     *string='\0';
  334.     Uart_SendByte('\n');
  335. }

  336. //=====================================================================
  337. int Uart_GetIntNum(void)
  338. {
  339.     char str[30];
  340.     char *string = str;
  341.     int base     = 10;
  342.     int minus    = 0;
  343.     int result   = 0;
  344.     int lastIndex;   
  345.     int i;
  346.    
  347.     Uart_GetString(string);
  348.    
  349.     if(string[0]=='-')
  350.     {
  351.         minus = 1;
  352.         string++;
  353.     }
  354.    
  355.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  356.     {
  357.         base    = 16;
  358.         string += 2;
  359.     }
  360.    
  361.     lastIndex = strlen(string) - 1;
  362.    
  363.     if(lastIndex<0)
  364.         return -1;
  365.    
  366.     if(string[lastIndex]=='h' || string[lastIndex]=='H' )
  367.     {
  368.         base = 16;
  369.         string[lastIndex] = 0;
  370.         lastIndex--;
  371.     }

  372.     if(base==10)
  373.     {
  374.         result = atoi(string);
  375.         result = minus ? (-1*result):result;
  376.     }
  377.     else
  378.     {
  379.         for(i=0;i<=lastIndex;i++)
  380.         {
  381.             if(isalpha(string[i]))
  382.             {
  383.                 if(isupper(string[i]))
  384.                     result = (result<<4) + string[i] - 'A' + 10;
  385.                 else
  386.                     result = (result<<4) + string[i] - 'a' + 10;
  387.             }
  388.             else
  389.                 result = (result<<4) + string[i] - '0';
  390.         }
  391.         result = minus ? (-1*result):result;
  392.     }
  393.     return result;
  394. }

  395. //*****************************************************************************
  396. //get a number for the uart
  397. //*****************************************************************************
  398. int Uart_GetIntNum_GJ(void)
  399. {
  400.     char string[16] ;
  401.     char *p_string = string ;
  402.     char c;
  403.     int i = 0 ;
  404.     int data = 0 ;

  405.     while(   ( c = Uart_Getch()) != '\r'  )
  406.     {
  407.                 if(c=='\b')                p_string--;
  408.                 else                *p_string++=c;
  409.                
  410.                 Uart_SendByte( c ) ;
  411.     }

  412.     *p_string = '\0';

  413.         i = 0 ;
  414.         while( string[i] != '\0' )
  415.         {
  416.                 data = data * 10 ;
  417.                 if( string[i]<'0'||string[i]>'9' )
  418.                         return -1 ;
  419.                 data = data + ( string[i]-'0' ) ;
  420.                 i++ ;               
  421.         }       
  422.        
  423.         return data ;
  424. }
  425. //*****************************************************************************

  426. //=====================================================================
  427. void Uart_SendByte(int data)
  428. {
  429.     if(whichUart==0)
  430.     {
  431.         if(data=='\n')
  432.         {
  433.             while(!(rUTRSTAT0 & 0x2));
  434.            // Delay(1);                 //because the slow response of hyper_terminal
  435.             WrUTXH0('\r');
  436.         }
  437.         while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
  438.       //  Delay(1);
  439.         WrUTXH0(data);
  440.     }
  441.     else if(whichUart==1)
  442.     {
  443.         if(data=='\n')
  444.         {
  445.             while(!(rUTRSTAT1 & 0x2));
  446.             //Delay(1);                 //because the slow response of hyper_terminal
  447.             rUTXH1 = '\r';
  448.         }
  449.         while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
  450.         //Delay(1);
  451.         rUTXH1 = data;
  452.     }   
  453.     else if(whichUart==2)
  454.     {
  455.         if(data=='\n')
  456.         {
  457.             while(!(rUTRSTAT2 & 0x2));
  458.             //Delay(1);                 //because the slow response of hyper_terminal
  459.             rUTXH2 = '\r';
  460.         }
  461.         while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
  462.         //Delay(1);
  463.         rUTXH2 = data;
  464.     }      
  465. }               

  466. //====================================================================
  467. void Uart_SendString(char *pt)
  468. {
  469.     while(*pt)
  470.         Uart_SendByte(*pt++);
  471. }

  472. //=====================================================================
  473. //If you don't use vsprintf(), the code size is reduced very much.
  474. void Uart_Printf(char *fmt,...)
  475. {
  476.     va_list ap;
  477.     char string[256];

  478.     va_start(ap,fmt);
  479.     vsprintf(string,fmt,ap);
  480.     Uart_SendString(string);
  481.     va_end(ap);
  482. }


  483. //**************************[ BOARD LED ]*********************************
  484. void Led_Display(int data)
  485. {
  486.           //Active is low.(LED On)
  487.           // GPF7  GPF6   GPF5   GPF4
  488.           //nLED_8 nLED4 nLED_2 nLED_1
  489. //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  490. //    rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);   
  491.           //Active is low.(LED On)
  492.           // GPF7  GPF6   GPF5   GPF4
  493.           //nLED_8 nLED4 nLED_2 nLED_1
  494.         //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  495.         rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf)<<5);  
  496.         //rGPCDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf0)<<5);   
  497. }

  498. //***************************[ BOARD BEEP ]*******************************
  499. /*
  500. void Beep(U32 freq, U32 ms)
  501. {
  502.         rGPBCON &= ~3;                        //set GPB0 as tout0, pwm output
  503.         rGPBCON |= 2;
  504.                
  505.         rTCFG0 &= ~0xff;
  506.         rTCFG0 |= 15;                        //prescaler = 15+1
  507.         rTCFG1 &= ~0xf;
  508.         rTCFG1 |= 2;                        //mux = 1/8
  509.         rTCNTB0 = (PCLK>>7)/freq;
  510.         rTCMPB0 = rTCNTB0>>1;        // 50%
  511.         rTCON &= ~0x1f;
  512.         rTCON |= 0xb;                        //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  513.         rTCON &= ~2;                        //clear manual update bit
  514.        
  515.         Delay(ms);
  516.        
  517.        
  518.         rGPBCON &= ~3;                        //set GPB0 as output
  519.         rGPBCON |= 1;
  520.         rGPBDAT &= ~1;
  521. }*/
  522. void Buzzer_Freq_Set( U32 freq )
  523. {
  524.         rGPBCON &= ~3;                        //set GPB0 as tout0, pwm output
  525.         rGPBCON |= 2;
  526.                
  527.         rTCFG0 &= ~0xff;
  528.         rTCFG0 |= 15;                        //prescaler = 15+1
  529.         rTCFG1 &= ~0xf;
  530.         rTCFG1 |= 2;                        //mux = 1/8
  531.         rTCNTB0 = (PCLK>>7)/freq;
  532.         rTCMPB0 = rTCNTB0>>1;        // 50%
  533.         rTCON &= ~0x1f;
  534.         rTCON |= 0xb;                        //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  535.         rTCON &= ~2;                        //clear manual update bit
  536. }

  537. void Buzzer_Stop( void )
  538. {
  539.         rGPBCON &= ~3;                        //set GPB0 as output
  540.         rGPBCON |= 1;
  541.         rGPBDAT &= ~1;
  542. }

  543. //***************************[ BOARD BEEP ]*******************************
  544. void Beep(U32 freq, U32 ms)
  545. {
  546.         Buzzer_Freq_Set( freq ) ;
  547.         Delay( ms ) ;
  548.         Buzzer_Stop() ;
  549. }

  550. /****************************************************************************
  551. 【功能说明】蜂鸣器PWM测试
  552. ****************************************************************************/
  553. void BUZZER_PWM_Test( void )
  554. {
  555.         U16 freq = 1000 ;
  556.        
  557.         Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );
  558.            Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;
  559.         Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
  560.        
  561.         Buzzer_Freq_Set( freq ) ;

  562.     while( 1 )
  563.     {
  564.                 U8 key = Uart_Getch();

  565.                 if( key == '+' )
  566.                 {
  567.                         if( freq < 20000 )
  568.                                 freq += 10 ;
  569.                                
  570.                         Buzzer_Freq_Set( freq ) ;
  571.                 }

  572.                 if( key == '-' )
  573.                 {
  574.                         if( freq > 11 )
  575.                                 freq -= 10 ;
  576.                                
  577.                         Buzzer_Freq_Set( freq ) ;
  578.                 }
  579.                
  580.                 Uart_Printf( "\tFreq = %d\n", freq ) ;
  581.                 if( key == ESC_KEY )
  582.                 {
  583.                         Buzzer_Stop() ;
  584.                         return ;
  585.                 }

  586.         }

  587. }

  588. //********************** BOARD LCD backlight ]****************************
  589. void LcdBkLtSet(U32 HiRatio)
  590. {
  591. #define FREQ_PWM1                1000

  592.         if(!HiRatio)
  593.         {
  594.                 rGPBCON  = rGPBCON & (~(3<<2)) | (1<<2) ;        //GPB1设置为output
  595.                 rGPBDAT &= ~(1<<1);
  596.                 return;
  597.         }
  598.         rGPBCON = rGPBCON & (~(3<<2)) | (2<<2) ;                //GPB1设置为TOUT1
  599.        
  600.         if( HiRatio > 100 )
  601.                 HiRatio = 100 ;       
  602.        
  603.         rTCON = rTCON & (~(0xf<<8)) ;                        // clear manual update bit, stop Timer1

  604.         rTCFG0         &= 0xffffff00;                                        // set Timer 0&1 prescaler 0
  605.         rTCFG0 |= 15;                                                        //prescaler = 15+1

  606.         rTCFG1         &= 0xffffff0f;                                        // set Timer 1 MUX 1/16
  607.         rTCFG1  |= 0x00000030;                                        // set Timer 1 MUX 1/16

  608.         rTCNTB1         = ( 100000000>>8 )/FREQ_PWM1;                //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
  609.         rTCMPB1  = ( rTCNTB1*(100-HiRatio))/100 ;        //if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high

  610.         rTCON = rTCON & (~(0xf<<8)) | (0x0e<<8) ;
  611.         //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
  612.         rTCON = rTCON & (~(0xf<<8)) | (0x0d<<8) ;                //开启背光控制
  613. }

  614. /****************************************************************************
  615. 【功能说明】LCD背光亮度控制,PWM控制占空比
  616. ****************************************************************************/
  617. void LCD_BackLight_Control( void )
  618. {
  619.         U8 HiRatio = 50 ;               
  620.            Uart_Printf( "\nNOTE : ONLY SOME type LCD kit  SUPPORT backlight adjust!!!\n" ) ;

  621.            Uart_Printf( "Press +/- to increase/reduce the light of LCD !\n" ) ;
  622.         Uart_Printf( "Press 'ESC' to Exit this test program !\n\n" );
  623.        
  624.         LcdBkLtSet( HiRatio ) ;

  625.     while( 1 )
  626.     {
  627.                 U8 key = Uart_Getch();

  628.                 if( key == '+' )
  629.                 {
  630.                         if( HiRatio < 100 )
  631.                                 HiRatio += 1 ;
  632.                 }
  633.                
  634.                 if( key == '-' )
  635.                 {
  636.                         if( HiRatio > 1 )
  637.                                 HiRatio -= 1 ;
  638.                 }
  639.                
  640.                 if( key == ESC_KEY ) break ;
  641.                
  642.                 LcdBkLtSet( HiRatio ) ;
  643.                 Uart_Printf( "LCD backlight HiRatio %d\n", HiRatio ) ;
  644.         }

  645. }

  646. //*************************[ Timer ]********************************
  647. void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
  648. {
  649.     rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3);  //Watch-dog timer control register
  650.     rWTDAT = 0xffff;  //Watch-dog timer data register
  651.     rWTCNT = 0xffff;  //Watch-dog count register

  652.       // Watch-dog timer enable & interrupt  disable
  653.     rWTCON = (rWTCON & ~(1<<5) & ~(1<<2)) |(1<<5);
  654. }

  655. //=================================================================
  656. int Timer_Stop(void)
  657. {
  658.     rWTCON = ((PCLK/1000000-1)<<8);
  659.     return (0xffff - rWTCNT);
  660. }


  661. //*************************[ MPLL ]*******************************
  662. void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
  663. {
  664.     rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  665. }


  666. //************************[ HCLK, PCLK ]***************************
  667. /*
  668. // for 2410.
  669. void ChangeClockDivider(int hdivn,int pdivn)
  670. {
  671.      // hdivn,pdivn FCLK:HCLK:PCLK
  672.      //     0,0         1:1:1
  673.      //     0,1         1:1:2
  674.      //     1,0         1:2:2
  675.      //     1,1         1:2:4
  676.     rCLKDIVN = (hdivn<<1) | pdivn;   

  677.     if(hdivn)
  678.         MMU_SetAsyncBusMode();
  679.     else
  680.         MMU_SetFastBusMode();
  681. }
  682. */
  683. // Modified for 2440.
  684. void ChangeClockDivider(int hdivn_val,int pdivn_val)
  685. {
  686.         int hdivn=2, pdivn=0;
  687.        
  688.      // hdivn_val (FCLK:HCLK)ratio hdivn
  689.      // 11           1:1       (0)
  690.      // 12           1:2       (1)
  691.      // 13           1:3       (3)
  692.      // 14           1:4       (2)
  693.      // pdivn_val (HCLK:PCLK)ratio pdivn
  694.      // 11           1:1       (0)
  695.      // 12           1:2       (1)
  696.         switch(hdivn_val) {
  697.                 case 11: hdivn=0; break;
  698.                 case 12: hdivn=1; break;
  699.                 case 13:
  700.                 case 16: hdivn=3; break;
  701.                 case 14:
  702.                 case 18: hdivn=2; break;
  703.         }
  704.        
  705.         switch(pdivn_val) {
  706.                 case 11: pdivn=0; break;
  707.                 case 12: pdivn=1; break;
  708.         }
  709.        
  710.         //Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]\n", hdivn, pdivn);
  711.         rCLKDIVN = (hdivn<<1) | pdivn;

  712.         switch(hdivn_val) {
  713.                 case 16:                // when 1, HCLK=FCLK/8.
  714.                         rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
  715.                 break;
  716.                 case 18:         // when 1, HCLK=FCLK/6.
  717.                         rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
  718.                 break;
  719.         }
  720.        
  721.     if(hdivn!=0)
  722.         MMU_SetAsyncBusMode();
  723.     else
  724.         MMU_SetFastBusMode();
  725. }



  726. //**************************[ UPLL ]*******************************
  727. void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
  728. {
  729.     rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  730. }


  731. //*************************[ General Library ]**********************
  732. void * malloc(unsigned nbyte)
  733. //Very simple; Use malloc() & free() like Stack
  734. //void *mallocPt=Image$RW$Limit;
  735. {
  736.     void *returnPt = mallocPt;

  737.     mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte

  738.     if( (int)mallocPt > HEAPEND )
  739.     {
  740.         mallocPt = returnPt;
  741.         return NULL;
  742.     }
  743.     return returnPt;
  744. }

  745. //-------------------------------------------------------------------
  746. void free(void *pt)
  747. {
  748.     mallocPt = pt;
  749. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表