실험 6-직렬

23175 단어 직렬 포트
하나.컨디션
개발판: jz2440
시스템: ubuntu 12.04
컴파일러:arm-linux-gcc
둘.UART
아껴.
셋.직접 부호 붙이기
 Makefile
 1 objs := head.o init.o serial.o main.o

 2 

 3 uart.bin: $(objs)

 4     arm-linux-ld -Ttext 0x00000000 -o uart_elf $^

 5     arm-linux-objcopy -O binary -S uart_elf $@

 6     arm-linux-objdump -D -m arm uart_elf > uart.dis

 7     

 8 %.o:%.c

 9     arm-linux-gcc -Wall -O2 -c -o $@ $<

10 

11 %.o:%.S

12     arm-linux-gcc -Wall -O2 -c -o $@ $<

13 

14 clean:

15     rm -f uart.bin uart_elf uart.dis *.o        

16     

head.S:
 1 @******************************************************************************

 2 @ File:head.S

 3 @   :  SDRAM,      SDRAM,    SDRAM    

 4 @******************************************************************************       

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 Reset:                  

11     ldr sp, =4096           @      ,    C  ,        

12     bl  disable_watch_dog   @   WATCHDOG,  CPU     

13     bl  clock_init          @   MPLL,  FCLK、HCLK、PCLK

14 

15     ldr pc, =on_sdram                   @   SDRAM     

16 on_sdram:

17     ldr sp, =0x34000000     @      

18     ldr lr, =halt_loop      @       

19     ldr pc, =main           @   main  

20 halt_loop:

21     b   halt_loop

init.c
 1 /*

 2  * init.c:        

 3  */ 

 4 

 5 #include "s3c24xx.h"

 6  

 7 void disable_watch_dog(void);

 8 void clock_init(void);

 9 

10 

11 /*

12  *   WATCHDOG,  CPU     

13  */

14 void disable_watch_dog(void)

15 {

16     WTCON = 0;  //   WATCHDOG   ,       0  

17 }

18 

19 #define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

20 #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

21 /*

22  *   MPLLCON   ,[19:12] MDIV,[9:4] PDIV,[1:0] SDIV

23  *        :

24  *  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)

25  *  S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

26  *    : m = MDIV + 8, p = PDIV + 2, s = SDIV

27  *       ,Fin = 12MHz

28  *   CLKDIVN,     :FCLK:HCLK:PCLK=1:2:4,

29  * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

30  */

31 void clock_init(void)

32 {

33     // LOCKTIME = 0x00ffffff;   //        

34     CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

35 

36     /*   HDIVN 0,CPU        “fast bus mode”  “asynchronous bus mode” */

37 __asm__(

38     "mrc    p15, 0, r1, c1, c0, 0
" /* */ 39 "orr r1, r1, #0xc0000000
" /* “asynchronous bus mode” */ 40 "mcr p15, 0, r1, c1, c0, 0
" /* */ 41 ); 42 43 /* S3C2410 S3C2440 */ 44 if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) 45 { 46 MPLLCON = S3C2410_MPLL_200MHZ; /* ,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ 47 } 48 else 49 { 50 MPLLCON = S3C2440_MPLL_200MHZ; /* ,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ 51 } 52 }

main.c
 1 #include "serial.h"

 2 

 3 int main()

 4 {

 5     unsigned char c;

 6     uart0_init();   //    115200,8N1(8    ,    ,1    )

 7 

 8     while(1)

 9     {

10         //         ,          ,    1   

11         c = getc();

12         if (isDigit(c) || isLetter(c))

13             putc(c+1);

14     }

15 

16     return 0;

17 }

serial.h:
1 void uart0_init(void);

2 void putc(unsigned char c);

3 unsigned char getc(void);

4 int isDigit(unsigned char c);

5 int isLetter(unsigned char c);

serial.c
 1 #include "s3c24xx.h"

 2 #include "serial.h"

 3 

 4 #define TXD0READY   (1<<2)

 5 #define RXD0READY   (1)

 6 

 7 #define PCLK            50000000    // init.c  clock_init    PCLK 50MHz

 8 #define UART_CLK        PCLK        //  UART0      PCLK

 9 #define UART_BAUD_RATE  115200      //    

10 #define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)

11 

12 /*

13  *    UART0

14  * 115200,8N1,   

15  */

16 void uart0_init(void)

17 {

18     GPHCON  |= 0xa0;    // GPH2,GPH3  TXD0,RXD0

19     GPHUP   = 0x0c;     // GPH2,GPH3    

20 

21     ULCON0  = 0x03;     // 8N1(8    ,   ,1    )

22     UCON0   = 0x05;     //     ,UART    PCLK

23     UFCON0  = 0x00;     //    FIFO

24     UMCON0  = 0x00;     //      

25     UBRDIV0 = UART_BRD; //     115200

26 }

27 

28 /*

29  *       

30  */

31 void putc(unsigned char c)

32 {

33     /**/

34     while (!(UTRSTAT0 & TXD0READY));

35     

36     /*  UTXH0        ,UART          */

37     UTXH0 = c;

38 }

39 

40 /*

41  *     

42  */

43 unsigned char getc(void)

44 {

45     /**/

46     while (!(UTRSTAT0 & RXD0READY));

47     

48     /*     URXH0   ,           */

49     return URXH0;

50 }

51 

52 /*

53  *           

54  */

55 int isDigit(unsigned char c)

56 {

57     if (c >= '0' && c <= '9')

58         return 1;

59     else

60         return 0;       

61 }

62 

63 /*

64  *             

65  */

66 int isLetter(unsigned char c)

67 {

68     if (c >= 'a' && c <= 'z')

69         return 1;

70     else if (c >= 'A' && c <= 'Z')

71         return 1;       

72     else

73         return 0;

74 }

좋은 웹페이지 즐겨찾기