这一节主要是 4412 的裸机的使用
0 4412 的硬件原理图+ 数据手册
然后是数据手册的解析:
每一组都有这几个 寄存器。
需要注意:
1、 4412 的中断是 与输入,输出在同一个级别的,与stm32不同。
2、 我是在uboot 上进行编程的,所以没有设置时钟,因为uboot 已经设置好了。
1 汇编语言的编写。
1 .globl _start
2 .arm
3 _start:
4 LDR R0,=0x11000100 这是con 寄存器
5 LDR R1,[R0]
6 BIC R1,R1,#0x0000000f 这是将最后4个字节清零
7 ORR R1,R1,#0x00000001 这是将最后4个字节置一,就是设置为输出模式。
8 STR R1,[R0]
9 loop:
10 LDR R0,=0x11000104 这是data寄存器地址。
11 LDR R1,[R0]
12 ORR R1,R1,#0x1 将data寄存器最后一位设置为1 ,也就是输出1
13 STR R1,[R0]
14 BL delay 这是一个延时函数。
15 LDR R1,[R0]
16 BIC R1,R1,#0x1 这是将data寄存器最后一位 置位0,输出低电平。
17 STR R1,[R0]
18 BL delay
19 B loop
20 delay:
21 LDR R2,=0xfffffff 首先给R2 一个很大的数。
22 loop1:
23 SUB R2,R2,#0x1
24 CMP R2,#0x0
25 BNE loop1 减到0 之后,才会推出这个循环。
26 MOV PC,LR 回到调用函数的地方。
27 .end
28
~
~
~
我在板子上测试是可以的。
2 C语言的编写
8 typedef struct {
9 unsigned int CON;
10 unsigned int DAT;
11 unsigned int PUD;
12 unsigned int DRV;
13 }gpl2_0;
14 #define GPL2_0 (* (volatile gpl2_0 *)0x11000100 )
15 /* GPL2 */
16 typedef struct {
17 unsigned int CON;
18 unsigned int DAT;
19 unsigned int PUD;
20 unsigned int DRV;
21 }gpk1_1;
22 #define GPK1_1 (* (volatile gpk1_1 *)0x11000060 )
23
24
25
26
27
28
29 void led_init(void)
30 {
31 GPK1_1.CON = (GPK1_1.CON & (~(0xf <<4))) | (0x1<<4);
32 //GPK1.PUD = GPK1.PUD | 0x05;
33
34 GPL2_0.CON = (GPL2_0.CON & (~(0xf<<0))) | (0x1<<0);
35 //GPL2.PUD = GPL2.PUD | 0x5;
36 }
37
38
39
40 void led_on()
41 {
42 GPK1_1.DAT = GPK1_1.DAT|(0x1<<1);
43 GPL2_0.DAT = GPL2_0.DAT|(0x1<<0);
44 }
45
46
47
48 void led_off()
49 {
50 GPK1_1.DAT = GPK1_1.DAT&(~(0x01<<1));
51 GPL2_0.DAT = GPL2_0.DAT&(~(0x01<<0));
52 }
53
54
55
56
57 void delay_ms(unsigned int num)
58 {
59 int i,j;
60 for(i=num; i>0;i--)
61 for(j=1000;j>0;j--)
62 ;
63 }
8 int main(void)
69 {
70 int i = 0;
71 led_init ();
72
73 #if 1
74 while (1) {
75 led_on();
76 delay_ms(500);
77 led_off();
78 delay_ms(500);
79 }
80 #endif
81 while(1);
82 return 0;
83 }
84
85
86
这份代码也是可以运行的。