ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

IMX6ULL裸机第一次汇编点亮LED

2020-04-30 21:04:51  阅读:513  来源: 互联网

标签:GPIO1 r0 r1 裸机 ldr str LED 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。

标签:GPIO1,r0,r1,裸机,ldr,str,LED,IMX6ULL,led
来源: https://blog.csdn.net/qq_41906031/article/details/105832935

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有