실험 7 - 시계

41196 단어
하나.플랫폼
시스템: ubuntu 12.04
개발판: jz2440
컴파일러:gcc
둘.시계 시스템
덧붙이다
셋.코드
Makefile:
 1 objs := head.o init.o interrupt.o main.o

 2 

 3 timer.bin: $(objs)

 4     arm-linux-ld -Ttimer.lds -o timer_linux $^

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

 6     arm-linux-objdump -D -m arm timer_linux > timer.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 timer.bin timer_linux timer.dis *.o        

16     

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

 2 @ File:head.S

 3 @   :   ,      、      ,         

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

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 @******************************************************************************       

11 @     ,    , Reset HandleIRQ ,         

12 @******************************************************************************       

13     b   Reset

14 

15 @ 0x04:               

16 HandleUndef:

17     b   HandleUndef 

18  

19 @ 0x08:          ,  SWI       

20 HandleSWI:

21     b   HandleSWI

22 

23 @ 0x0c:                 

24 HandlePrefetchAbort:

25     b   HandlePrefetchAbort

26 

27 @ 0x10:                 

28 HandleDataAbort:

29     b   HandleDataAbort

30 

31 @ 0x14:   

32 HandleNotUsed:

33     b   HandleNotUsed

34 

35 @ 0x18:          

36     b   HandleIRQ

37 

38 @ 0x1c:           

39 HandleFIQ:

40     b   HandleFIQ

41 

42 Reset:                  

43     ldr sp, =4096           @      ,    C  ,        

44     bl  disable_watch_dog   @   WATCHDOG,  CPU     

45     bl  clock_init          @   MPLL,  FCLK、HCLK、PCLK

46     bl  memsetup            @           SDRAM

47     bl  copy_steppingstone_to_sdram     @  SDRAM 

48     ldr pc, =on_sdram                   @   SDRAM     

49 on_sdram:

50     msr cpsr_c, #0xd2       @       

51     ldr sp, =4096           @          

52 

53     msr cpsr_c, #0xdf       @       

54     ldr sp, =0x34000000     @          ,

55 

56     bl  init_led            @    LED GPIO  

57     bl  timer0_init         @       0   

58     bl  init_irq            @          , init.c 

59     msr cpsr_c, #0x5f       @   I-bit=0, IRQ  

60     

61     ldr lr, =halt_loop      @       

62     ldr pc, =main           @   main  

63 halt_loop:

64     b   halt_loop

65 

66 HandleIRQ:

67     sub lr, lr, #4                  @       

68     stmdb   sp!,    { r0-r12,lr }   @          

69                                     @   ,   sp      sp

70                                     @          4096

71     

72     ldr lr, =int_return             @     ISR EINT_Handle          

73     ldr pc, =Timer0_Handle          @         , interrupt.c 

74 int_return:

75     ldmia   sp!,    { r0-r12,pc }^  @     , ^   spsr     cpsr

76     

 
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 void memsetup(void);

 10 void copy_steppingstone_to_sdram(void);

 11 void init_led(void);

 12 void timer0_init(void);

 13 void init_irq(void);

 14 

 15 /*

 16  *   WATCHDOG,  CPU     

 17  */

 18 void disable_watch_dog(void)

 19 {

 20     WTCON = 0;  //   WATCHDOG   ,       0  

 21 }

 22 

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

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

 25 /*

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

 27  *        :

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

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

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

 31  *       ,Fin = 12MHz

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

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

 34  */

 35 void clock_init(void)

 36 {

 37     // LOCKTIME = 0x00ffffff;   //        

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

 39 

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

 41 __asm__(

 42     "mrc    p15, 0, r1, c1, c0, 0
" /* */ 43 "orr r1, r1, #0xc0000000
" /* “asynchronous bus mode” */ 44 "mcr p15, 0, r1, c1, c0, 0
" /* */ 45 ); 46 47 /* S3C2410 S3C2440 */ 48 if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) 49 { 50 MPLLCON = S3C2410_MPLL_200MHZ; /* ,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ 51 } 52 else 53 { 54 MPLLCON = S3C2440_MPLL_200MHZ; /* ,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ 55 } 56 } 57 58 /* 59 * SDRAM 60 */ 61 void memsetup(void) 62 { 63 volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; 64 65 /* , ( mmu ) 66 * , ” ”, 67 * SDRAM steppingstone 68 */ 69 /* 13 */ 70 p[0] = 0x22011110; //BWSCON 71 p[1] = 0x00000700; //BANKCON0 72 p[2] = 0x00000700; //BANKCON1 73 p[3] = 0x00000700; //BANKCON2 74 p[4] = 0x00000700; //BANKCON3 75 p[5] = 0x00000700; //BANKCON4 76 p[6] = 0x00000700; //BANKCON5 77 p[7] = 0x00018005; //BANKCON6 78 p[8] = 0x00018005; //BANKCON7 79 80 /* REFRESH, 81 * HCLK=12MHz: 0x008C07A3, 82 * HCLK=100MHz: 0x008C04F4 83 */ 84 p[9] = 0x008C04F4; 85 p[10] = 0x000000B1; //BANKSIZE 86 p[11] = 0x00000030; //MRSRB6 87 p[12] = 0x00000030; //MRSRB7 88 } 89 90 void copy_steppingstone_to_sdram(void) 91 { 92 unsigned int *pdwSrc = (unsigned int *)0; 93 unsigned int *pdwDest = (unsigned int *)0x30000000; 94 95 while (pdwSrc < (unsigned int *)4096) 96 { 97 *pdwDest = *pdwSrc; 98 pdwDest++; 99 pdwSrc++; 100 } 101 } 102 103 /* 104 * LED1-4 GPB5、GPB6、GPB7、GPB8 105 */ 106 #define GPB5_out (1<<(5*2)) // LED1 107 #define GPB6_out (1<<(6*2)) // LED2 108 #define GPB7_out (1<<(7*2)) // LED3 109 #define GPB8_out (1<<(8*2)) // LED4 110 111 #define GPFCON (*(volatile unsigned long *)0x56000050) 112 113 #define GPF4_out (1<<(4*2)) 114 #define GPF5_out (1<<(5*2)) 115 #define GPF6_out (1<<(6*2)) 116 117 118 /* 119 * K1-K4 GPG11、GPG3、GPF2、GPF3 120 */ 121 #define GPG11_eint (2<<(11*2)) // K1,EINT19 122 #define GPG3_eint (2<<(3*2)) // K2,EINT11 123 #define GPF3_eint (2<<(3*2)) // K3,EINT3 124 #define GPF2_eint (2<<(2*2)) // K4,EINT2 125 126 void init_led(void) 127 { 128 GPFCON = GPF4_out|GPF5_out|GPF6_out; // LED1,2,4 GPF4/5/6 129 } 130 131 /* 132 * Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value} 133 * {prescaler value} = 0~255 134 * {divider value} = 2, 4, 8, 16 135 * Timer0 =100MHz/(99+1)/(16)=62500Hz 136 * Timer0 0.5 : 137 */ 138 void timer0_init(void) 139 { 140 TCFG0 = 99; // 0 = 99 141 TCFG1 = 0x03; // 16 142 TCNTB0 = 31250; // 0.5 143 TCON |= (1<<1); // 144 TCON = 0x09; // , “ ” , 0 145 } 146 147 /* 148 * 0 149 */ 150 void init_irq(void) 151 { 152 // 0 153 INTMSK &= (~(1<<10)); 154 }

interrupt.h
1 void EINT_Handle();

interrupt.c
 1 #include "s3c24xx.h"

 2 

 3 void Timer0_Handle(void)

 4 {

 5     /*

 6      *      4 LED    

 7      */

 8     if(INTOFFSET == 10)

 9     {

10         GPFDAT = ~(GPFDAT & (0x7 << 4));

11     }

12     //   

13     SRCPND = 1 << INTOFFSET;

14     INTPND = INTPND;     

15 }

링크 스크립트:
1 SECTIONS {

2     . = 0x30000000;

3     .text          :   { *(.text) }

4     .rodata ALIGN(4) : {*(.rodata)} 

5     .data ALIGN(4) : { *(.data) }

6     .bss ALIGN(4)  : { *(.bss)  *(COMMON) }

7 }

main.c와 s3c24xx.h위에 다 있어요. 여기 아껴요.
 
지난번 실험은 중단되었는데 안에SDRAM이 사용되지 않았다면 이 실험도 가능할까요?당연하다
먼저 timer를 삭제합니다.lds
그리고 Makefile에서 timer.lds에서 -Ttext 0x00000000으로 변경
그리고 헤드.S 수정은 다음과 같습니다.
 1 @******************************************************************************

 2 @ File:head.S

 3 @   :   ,      、      ,         

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

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 @******************************************************************************       

11 @     ,    , Reset HandleIRQ ,         

12 @******************************************************************************       

13     b   Reset

14 

15 @ 0x04:               

16 HandleUndef:

17     b   HandleUndef 

18  

19 @ 0x08:          ,  SWI       

20 HandleSWI:

21     b   HandleSWI

22 

23 @ 0x0c:                 

24 HandlePrefetchAbort:

25     b   HandlePrefetchAbort

26 

27 @ 0x10:                 

28 HandleDataAbort:

29     b   HandleDataAbort

30 

31 @ 0x14:   

32 HandleNotUsed:

33     b   HandleNotUsed

34 

35 @ 0x18:          

36     b   HandleIRQ

37 

38 @ 0x1c:           

39 HandleFIQ:

40     b   HandleFIQ

41 

42 Reset:                  

43     ldr sp, =4096           @      ,    C  ,        

44     bl  disable_watch_dog   @   WATCHDOG,  CPU     

45     bl  clock_init          @   MPLL,  FCLK、HCLK、PCLK

46 

47     msr cpsr_c, #0xd2       @       

48     ldr sp, =4096           @          

49 

50     msr cpsr_c, #0xdf       @       

51     ldr sp, =0x34000000     @          ,

52 

53     bl  init_led            @    LED GPIO  

54     bl  timer0_init         @       0   

55     bl  init_irq            @          , init.c 

56     msr cpsr_c, #0x5f       @   I-bit=0, IRQ  

57     

58     ldr lr, =halt_loop      @       

59     ldr pc, =main           @   main  

60 halt_loop:

61     b   halt_loop

62 

63 HandleIRQ:

64     sub lr, lr, #4                  @       

65     stmdb   sp!,    { r0-r12,lr }   @          

66                                     @   ,   sp      sp

67                                     @          4096

68     

69     ldr lr, =int_return             @     ISR EINT_Handle          

70     ldr pc, =Timer0_Handle          @         , interrupt.c 

71 int_return:

72     ldmia   sp!,    { r0-r12,pc }^  @     , ^   spsr     cpsr

73     

그럼 지난 실험과 중단이 일치합니다.
본 실험은 한편으로는 시계에 중점을 두었고 다른 하나는 위치가 부호와 무관하다는 것이다.
SDRAM 실험 설명을 참조하십시오. 그렇지 않으면 실험이 성공하지 못합니다.

좋은 웹페이지 즐겨찾기