실험 7 - 시계
시스템: 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 실험 설명을 참조하십시오. 그렇지 않으면 실험이 성공하지 못합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.