tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

时间:2021-03-13 03:54:50


【说明】

               首先我们要打开TINY6410的LED部分,弄清楚点灯的原理,查看到底是哪个引脚去控制LED的量和灭,再来写代码,由于点亮LED比较简单,所以原理和代码就放一篇博文里记录吧。

 

【原理】

              1】LED原理图

                     tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

                           显然,当引脚输出低电平时,由于VDD_IO的存在,LED将被点亮,反之熄灭

               2】相连的引脚

                          在核心板的原理图上有标明

                           tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

               3】 如何控制引脚

                            在6410手册中搜索GPK,阅读后发现下面几个寄存器

                            tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

                             寄存器的说明

                             tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

                             tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)

                              显然GPKCON0是用来配置引脚功能的,上边截图是一部分,4位控制一个引脚,32位一共控制8个引脚,加上GPKCON1的8个刚好是16个,我们只要设置LED对应的那几个就可以了。

                              GPKDAT就是每一位控制一个引脚的输出,或者表示一个引脚的输入状态,显然我们要输出,直接往相应位清0就可以点亮LED

 

【代码分析】

                     
//汇编
.global _start

_start:
        // 把外设的基地址告诉CPU
    ldr r0, =0x70000000                                      //对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff)
    orr r0, r0, #0x13                                        //外设大小:256M
    mcr p15,0,r0,c15,c2,4                               //把r0的值(包括了外设基地址+外设大小)告诉cpu
   
        // 关看门狗
        ldr r0, =0x7E004000
        mov r1, #0
        str r1, [r0]

        // 设置GPKCON0
        ldr r1, =0x7F008800
        ldr r0, =0x11110000                                   
        str r0, [r1]

        mov r2, #0x1000
led_blink:
        // 设置GPKDAT,使GPK_4/5/6/7引脚输出低电平,LED亮
        ldr r1, =0x7F008808
        mov r0, #0
        str r0, [r1]

        // 延时
        bl delay

        // 设置GPKDAT,使GPK_4/5/6/7引脚输出高电平,LED灭
        ldr r1, =0x7F008808
        mov r0, #0xf0
        str r0, [r1]

        // 延时
        bl delay

        sub r2, r2, #1
        cmp r2,#0
        bne led_blink

halt:
        b halt


delay:
        mov r0, #0x1000000
delay_loop:
        cmp r0, #0
        sub r0, r0, #1
        bne delay_loop
        mov pc, lr

【makefile】                    #makefile
led.bin: start.o
        #链接命令,虚拟地址从0开始
        arm-linux-ld -Ttext 0 -o led.elf $^
        #提出指令和数据部分
        arm-linux-objcopy -O binary led.elf led.bin
        #反汇编,便于调试
        arm-linux-objdump -D led.elf > led_elf.dis

%.o : %.S
        arm-linux-gcc -o $@ $< -c

%.o : %.c
        arm-linux-gcc -o $@ $< -c

clean:
        rm *.o *.elf *.bin *.dis  -rf

  【烧写】             

                 在工程下指令make命令生成led.bin文件以及led_elf.dis反汇编文件,还有led.elf文件,我们需要的是led.bin。以SD启动方式启动开发板,,当然,要先连接好串口,还有就是SD卡内部已经烧好了U-BOOT或者Superboot,在菜单中选择下载绝对地址应用程序,打开DNW工具,这个工具的使用方法很简单,下一个看几下教程就会了。用DNW发送文件,然后把开发板设置成NAND启动,重启

【实验现象】            

                   LED闪烁