IMX6ULL裸机第一次汇编点亮LED

博客介绍
硬件:正点原子linux开发板IM6ULL
开发环境:Ubuntu下的VSCode
功能:配置引脚GPIO1_IO03驱动LED的亮灭。
参考:IMX6ULL串口手册.pdf、I.MX6U 嵌入式 Linux 驱动开发指南 V1.3.pdf

IMX6ULL点亮LED主要分一下四步:


第一步:编写汇编程序

leds.s文件

/*
文件功能:使用汇编点灯
使用引脚:GPIO1_IO03
*/
.global _start      		@全局标号

_start:
@1.使能所有外设时钟
    @使能CCGR1所有时钟
    ldr r0, =0x020c4068     @CCM_CCGR0 地址
    ldr r1, =0xffffffff     @向CCM_CCGR0中写入的数据,也就是设置时钟参数
    str r1, [r0]            @将数据r1写入CCM_CCGR0所在地址内

    ldr r0, =0x020c406c     @CCM_CCGR1 地址
    str r1, [r0]

    ldr r0, =0x020c4070     @CCM_CCGR2 地址
    str r1, [r0]

    ldr r0, =0x020c4074     @CCM_CCGR3 地址
    str r1, [r0]

    ldr r0, =0x020c4078     @CCM_CCGR4 地址
    str r1, [r0]

    ldr r0, =0x020c407c     @CCM_CCGR5 地址
    str r1, [r0]

    ldr r0, =0x020c4080     @CCM_CCGR6 地址
    str r1, [r0]
@2.配置GPIO1_IO03模式
    @设置引脚模式           操作寄存器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 地址 0x020e0068
    ldr r0, =0x020e0068     @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
    ldr r1, =0x00000005     @设置为ALT5模式 
    str r1, [r0]            @写入配置设置为GPIO1_IO03
@3.配置GPIO1_IO3的电器属性
    @配置引脚的电器属性     操作寄存器 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO3 地址 0x020e02f4
    ldr r0, =0x020e02f4     @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
    ldr r1, =0x000090b0     @配置电器属性寄存器为
    str r1, [r0]
    /* 
    bit16:     YHS:作为输入有效,迟滞比较器     	0       失能
    bit14-15  PUS:设置上下拉与电阻大小         10      上拉电阻100K
    bit13:     PUE:作为输入时使能或禁止上下拉  	0       禁止
    bit12:     PKE:作为输出时使能或禁止下拉     	1       使能
    bit11:     ODE:作用输出时使能开漏输出      	0      	关闭开漏输出
    bit6-7    SPEED:IO作用输出时速度          	10     	100MHz
    bit3-5    DSE:输出时设置驱动能力          	110     R0/6
    bit0:      SRE:设置压摆率                  0       低压摆率
    */
@4.设置GPIO1_IO03引脚方向---输入\输出
    @配置引脚方向为输出          操作寄存器GPIO1_GDIR 地址 0x0209c004
    ldr r0, = 0x0209c004
    ldr r1, [r0]            	@获取原始数据
    orr r1, r1, #0x00000008  	@将GPIO1_GDIR的bit3为设置为1
    str r1, [r0]            	@写入配置将GPIO1_IO03设置为输出

@5.操作GPIO1_IO03引脚的控制寄存器
    @操作引脚输出高低电平           操作寄存器GPIO1_DR 地址 0x0209c000
    ldr r0, =0x0209c000
    ldr r1, [r0]                @获取GPIO1_DR寄存器数据
    and r1, r1, #0xfffffff7     @将GPIO1_DR的bit3为设置为0
    str r1, [r0]                @写入配置将GPIO1_IO03设置为低电平
loop:
    b loop      				@此处为一个死循环,防止程序结束

第二步:编写makefile文件——编译链接文件

makefile文件

leb.bin:leds.s
    arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
    arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
    arm-linux-gnueabilf-objcopy -O binary -S -g led.elf led.bin
    arm-linux-gnueabilf-objump -D led.elf > led.dis

文件将解释:

  1. 编译leds.s生成led.o
    arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
  2. 链接
    arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -led.elf
  3. 转换为二进制文件
    arm-linux-gnueabilf-objcopy -O binary -S -g led.elf led.bin
  4. 反汇编 可以省略
    arm-linux-gnueabilf-objump -D led.elf > led.dis

执行makefile文件
在这里插入图片描述


第三步:将程序烧录到SD卡

  1. 将sd开插入电脑,在虚拟中使用命令:ls /dev/sd* ;查看SD卡的盘符
  2. 使用正点原子提供的烧写工具 imxdownload ; 为 imxdownload文件 添加可执行权限
  3. 烧录:./imxdownload led.bin /dev/sdb
    在这里插入图片描述

第四步:上电

  1. 设置BOOT模式为SD卡启动方式
  2. 插入SD卡
  3. 上电观察

在这里插入图片描述

此处疑问

删除第一步中的1.使能所有外设时钟。程序程序依然能够点亮LED。

原创文章 8 获赞 1 访问量 227

猜你喜欢

转载自blog.csdn.net/qq_41906031/article/details/105832935