gpio的使用----->4412的裸机的使用(第三节)

这一节主要是 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


这份代码也是可以运行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值