汇编驱动LED闪烁—正点原子Linux阿尔法开发板

1. I.MX6ULL IO初始化流程:

①、使能时钟:CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能

②、IO复用:寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03控制着GPIO1_IO03口复用

③、配置电气属性:寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性

④、配置GPIO功能,设置输入输出:设置GPIO1_DR寄存器bit3控制着GPIO1_IO03口输出高低电平,为1表示输出高电平,为0表示输出低电平。

2.汇编语言程序代码

.global _start @全局标号

_start:
    /*使能所有外设时钟 */
    ldr r0, =0x020c4068 @CCGR0
    ldr r1, =0xffffffff @要写入CCGR0的数据
    str r1, [r0]        @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c406c @CCGR1
    str r1, [r0]        @将0xffffffff写入到CCGR1中

    ldr r0, =0x020c4070 @CCGR2
    str r1, [r0]        @将0xffffffff写入到CCGR2中

    ldr r0, =0x020c4074 @CCGR3
    str r1, [r0]        @将0xffffffff写入到CCGR3中

    ldr r0, =0x020c4078 @CCGR4
    str r1, [r0]        @将0xffffffff写入到CCGR4中

    ldr r0, =0x020c407c @CCGR5
    str r1, [r0]        @将0xffffffff写入到CCGR5中

    ldr r0, =0x020c4080 @CCGR6
    str r1, [r0]        @将0xffffffff写入到CCGR6中

    /*设置GPIO1_IO03 PIN的复用为GPIO 
      也就是设置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5
      IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器地址为
      0x020e0068 */
    ldr r0, =0x020e0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    ldr r1, =0x5        @要写入的数据
    str r1, [r0]        @将5写入到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中

    /*配置GPIO1_IO03的电气属性 也就是寄存器:
      IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
      寄存器地址为0x020e02f4
      
      bit0:     0 低速率
      bit5:3    110   R0/6驱动能力 
      bit7:6    10   100MHz速度
      bit11     0    关闭开路输出
      bit12     1    使能pull/kepper
      bit13     0    kepper
      bit5:14   00   100K下拉
      bit16     0    关闭hys*/

    ldr r0, =0x020e02f4
    ldr r1, =0x10b0
    str r1, [r0]

    /*设置GPIO
      设置GPIO1_GDIR,设置GPIO1_IO03为输出
      GPIO1_GDIR寄存器地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1
      也就是设置GPIO1_IO03为输出
    */

    ldr r0, =0x0209c004
    ldr r1, =0x8 
    str r1, [r0]

    /*先使LED处于熄灭状态,也就是设置GPIO_DR寄存器的bit3为1
      进入延时
      然后打开LED,设置GPIO_DR寄存器的bit3为0
      GPIO_DR寄存器地址为0x0209c000
    */

LED:
    ldr r0, =0x0209c000
    ldr r1, =0x8
    str r1, [r0]
    bl delay

    ldr r1, =0
    str r1, [r0]
    bl delay
    b LED             @循环指令,无限循环LED函数

    b .               @死循环,防止CPU跑飞
    /*延时函数*/

delay:
    ldr r2, =1000000
    ldr r3, =0
delay_loop:
    sub r2, r2, #1    @r2=r2-1
    cmp r2, r3        @cmp 比较r2 r3 如果相等Z为1
    bne delay_loop    @bne 为当Z为1时执行跳转
    mov pc, lr        @函数调用返回

3.编译程序

Makefile文件编写

led.bin : led.s
        arm-linux-gnueabihf-gcc -g -c led.s -o led.o
        arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
        arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin 
        arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
        rm -rf *.o led.bin led.elf led.dis

在终端中进入保存文件的文件夹之后,make生成.bin文件后,并不能直接将该文件烧入开发板中,使用官方提供的imxdownlaod文件,拷贝到该文件夹后,在终端中输入:

./imxdownload <.bin file> <SD Card>

:插入读卡器之后,将读卡器与虚拟机进行连接,即可通过以下代码查看SD卡位置:

ls /dev/sd*

拔插读卡器,对比前后区别,确定读卡器在虚拟机中的位置。
烧录完成后,将SD卡插入开发板中,确保开发板拨位开关在SD卡所对应的位置上,如图:
汇编驱动LED闪烁—正点原子Linux阿尔法开发板_第1张图片
设置好以后,通电按一下复位,即可观察到LED灯在闪烁。

你可能感兴趣的:(嵌入式,正点原子开发板,visual,studio,c语言,程序人生,经验分享)