本帖最后由 擦肩的阳光 于 2016-1-6 12:48 编辑
上次写道:把nanopi2官方给的img中的2ndboot.bin拷贝到sd卡,串口显示如下:
Launch to 0x42c00000
这次接着来gpio的:
这是datasheet中关于gpio输出的配置,基本和其他芯片差不多:
1.配置为GPIO模式
2.配置为输出模式
3.使能管脚
4.设置输出值
找到nanopi2原理图中led的位置:
后面那个中括号表明的是在pdf中的页数,但是还觉得好奇怪……
GPIO的寄存器也挺多的,看看目录就知道了:
我就不列具体功能了。
今天先做C语言的编程:
- int main(void)
- {
- GPIOBALTFN0 &=~(0x3<<24);
- GPIOBALTFN0 |=(0x2<<24);
- GPIOBOUTENB |=(1<<12);
- while(1)
- {
- GPIOBOUT |=(1<<12);
- delay(2000000);
- GPIOBOUT &=~(1<<12);
- delay(2000000);
- }
-
- return 0;
- }
复制代码
具体的代码就是刚才所说的要配置的寄存器,程序来自于微博:http://weibo.com/p/1001603914481641084833?mod=zwenzhang
搜索GPIOB12,找如下:
管脚复用功能为 :Alternate Function 2
其中,寄存器的说明如上,因此相应寄存器置为0x2
使能和输出状态也是类似的。
下面就是编译连接:
- start:start.S main.c gpio.h
- ARM-linux-gcc -c start.S -o start.o
- arm-linux-gcc -c main.c -o main.o
- arm-linux-ld -Ttext=0x42C00000 start.o main.o -o main
- arm-linux-objcopy -I elf32-littlearm -O binary main main.bin
- arm-linux-objdump -D -S main.elf >dump
复制代码
目标代码的起始地址为0x42c00000 就是上一篇当中提到的“Launch to 0x42c00000”
然后按照上一次的操作,把生成的main.bin的烧写到0x8200位置处,上电:
汇编程序也不复杂,我比较菜,写错了一个寄存器的值,半天不出来……
- .text
- .global _start
- _start:
- b start
- .word 0x00000000
- .word 0x00000000
- .word 0x00000000
- .word 0x00000000
- .word 0x00000000
- .word 0x00000000
- .word 0x00000000
- start:
- #define GPIOBALTEN0_VAL (0x2<<24)
- #define GPIOBOUTENB_VAL (0x1<<12)
- #define GPIOBOUT_VAL0 (0x0<<12)
- #define GPIOBOUT_VAL1 (0x1<<12)
- ldr r0, =0xc001b020
- ldr r1, =GPIOBALTEN0_VAL
- str r1, [r0]
- ldr r0, =0xc001b004
- ldr r1, =GPIOBOUTENB_VAL
- str r1, [r0]
-
- ldr r0, =0xc001b000
- ldr r1, =GPIOBOUT_VAL1
- str r1, [r0]
-
- loop:
- ldr r1, =100000000
- ldr r2, =GPIOBOUT_VAL0
- str r2, [r0]
- loop_1:
- sub r1, r1, #1
- cmp r1, #0
- bne loop_1
-
- ldr r1, =100000000
- ldr r2, =GPIOBOUT_VAL1
- str r2, [r0]
- loop_2:
- sub r1, r1, #1
- cmp r1, #0
- bne loop_2
-
- b loop
复制代码
就不多解释了
c.zip
(1.99 KB, 下载次数: 17
)
|