当前位置: 首页 > article >正文

正点原子阿尔法ARM开发板-IMX6ULL(四)——汇编LED驱动实验-下

文章目录

  • 一、驱动编写
    • 1.1 配置GPIO的电气属性
    • 1.2 配置GPIO的功能(GDIR寄存器)
    • 1.3 设置输出(DR寄存器)
    • 1.4 最终代码
  • 二、编译程序
    • 2.1 编译程序
    • 2.2 链接文件
    • 2.3 格式转换成BIN文件
    • 2.4 反汇编
  • 三、烧写bin到SD卡中并运行
    • 3.1 准备工作
    • 3.2 向SD卡烧写bin文件
    • 3.3 插入阿尔法的tf卡槽
  • 四、makefile的补充
  • 五、其他

一、驱动编写

1.1 配置GPIO的电气属性

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

根据设置换算成十六进制
在这里插入图片描述

    /*配置GPIO的电气属性
    即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    地址为:0X020E02F4

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

    */
    ldr r0, =0X020E02F4
    ldr r1, =0X10B0
    str r1, [r0]

1.2 配置GPIO的功能(GDIR寄存器)

GDIR,共32位,每一位控制一个GPIO
在这里插入图片描述
在这里插入图片描述

/*
    设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
    GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
    也就是设置GPIO1_GPIO03为输出
    */

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

1.3 设置输出(DR寄存器)

在这里插入图片描述
在这里插入图片描述

    /*
    LED点亮,设置输出为0
    也就是设置DR寄存器
    */
    ldr r0, =0x0209C000
    ldr r1, =0
    str r1, [r0]

loop:
    b loop @死循环

1.4 最终代码


.global _start @全局标号

_start:
    /*使能所有寄存器*/
    ldr r0, =0x020C4068 @写入CCGR0的地址
    ldr r1, =0xFFFFFFFF @要写入的数据(全部使能)
    str r1, [r0]        @写入CCGR0

    ldr r0, =0x020C406C @写入CCGR1的地址(由于CCGR都是紧挨着的,每个间隔4位)
    str r1, [r0]        @写入CCGR1

    ldr r0, =0x020C4070 @写入CCGR2的地址
    str r1, [r0]        @写入CCGR2

    ldr r0, =0x020C4074 @写入CCGR3的地址
    str r1, [r0]        @写入CCGR3

    ldr r0, =0x020C4078 @写入CCGR4的地址
    str r1, [r0]        @写入CCGR4

    ldr r0, =0x020C407C @写入CCGR5的地址
    str r1, [r0]        @写入CCGR5

    ldr r0, =0x020C4080 @写入CCGR6的地址
    str r1, [r0]        @写入CCGR6

    /*配置GPIO1_3,使复用方式变为GPIO
    写入0101,即5
    寄存器是IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    */
    ldr r0, =0x020E0068 @写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
    ldr r1, =0x5        @要写入的数据
    str r1, [r0]        @写入

    /*配置GPIO的电气属性
    即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    地址为:0X020E02F4

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

    */
    ldr r0, =0x020E02F4
    ldr r1, =0x10B0
    str r1, [r0]

    /*
    设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
    GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
    也就是设置GPIO1_GPIO03为输出
    */

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

    /*
    LED点亮,设置输出为0
    也就是设置DR寄存器
    */
    ldr r0, =0x0209C000
    ldr r1, =0
    str r1, [r0]

loop:
    b loop @死循环

二、编译程序

2.1 编译程序

  1. 使用arm-linux-gnueabihf-gcc,将.c.s文件变为.o文件
  2. 将所有的.o文件连接为elf格式的可执行文件。
  3. 将elf文件转为bin文件。
  4. 将elf文件转为汇编,反汇编。

输入指令,编译文件
arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
其中 ““-g”选项是产生调试信息 GDB能够使用这些调试信息进行代码调试。“ “-c”选项是编译源文件,但是不链接。

2.2 链接文件

arm-linux-gnueabihf-ld用来将众多的 .o文件链接到一个指定的链接位置。
链接就是将所有.o文件链接在一起,并且链接到指定的地方。本实验链接的时候要指定链接起始地址。链接起始地址就是代码运行的起始地址。
对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM.也就是DDR。6ULL内部RAM地址范围0X900000 ~ 0X91FFFF。也可以放到外部DDR中,对于IMX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0X80000000 ~ 0X9 FFFFFFF。对于256MB的DDR来说,那就是0X80000000~0X8 FFFFFFF。
本系列视频,裸机代码的链接起始地址为0X87800000。要使用DDR,那么必须要初始化DDR,对于IMX来说BIN如文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡,EMMC等外置存储中读取头部信息,然后初始化DDR,并且将BIN如文件拷贝到指定的地方。BIN的运行地址一定要和链接起始地址一致。位置无关代码除外。
在这里插入图片描述

总结,就是I.MX有内部ram但是只有128k,但是外部可用的DDR,足足有512MB,所以放到DDR。
然后初始化,可以从外置存储中获取初始化参数

指令
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中 -Ttext就是指定链接地址,“-o”选项指定链接生成的 elf文件名

2.3 格式转换成BIN文件

arm-linux-gnueabihf-objcopy更像一个格式转换工具,我们需要用它将 led.elf文件转换为led.bin文件,命令如下:

指令
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“ ,“-O”选项指定以什么格式输出,后面的 binary”表示以二进制格式输出选项“ “-S”表示不要复制源文件中的重定位信息和符号信息 ,“-g”表示不复制源文件中的调试信息。

2.4 反汇编

大多数情况下我们都是用 C语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf文件反汇编

指令
arm-linux-gnueabihf-objdump -D led.elf > led.dis

在这里插入图片描述
上述代码中的“ “-D”选项表示反汇编所有的段
在这里插入图片描述

三、烧写bin到SD卡中并运行

3.1 准备工作

6U儿L支持SD卡、EMMC、NAND、nor、SPIf1ash等等启动。裸机例程选择烧写到SD卡里面。
在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于lM仪而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。·

首先就是对TF卡进行格式化FAT32
在这里插入图片描述
最右边这个图标,右键,连接,
在这里插入图片描述
在这里插入图片描述
此时,TF卡进入了linux系统
再把imdounload放入文件夹
在这里插入图片描述
imxdownload使用方法,确定烧写的SD卡,确定是/dev/sdb
在这里插入图片描述

3.2 向SD卡烧写bin文件

在这里插入图片描述
所以我的指令是:
./imxdownload led.bin /dev/sdb
实际上生成了load.imx文件,里面有头部文件

3.3 插入阿尔法的tf卡槽

使用SD卡时,编码器如下
在这里插入图片描述
成功点亮

在这里插入图片描述

四、makefile的补充

led.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-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,就会执行
输入make clean,就会清空

五、其他

嵌入式开发,不使用JLINK
使用点灯、串口进行调试


http://www.kler.cn/a/298669.html

相关文章:

  • 前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程
  • 【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果
  • JavaScript的基础知识
  • DDoS攻击防御方案大全
  • 【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
  • 设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析
  • 超微小间距COB大尺寸LED智能会议一体机玩转高清视频会议显示市场
  • 1-14 画框画线画圆 opencv树莓派4B 入门系列笔记
  • 建投数据获批安全生产许可证
  • 通过API方式访问llama3
  • 学习使用双指针
  • 浙大数据结构:04-树6 Complete Binary Search Tree
  • 具有RC反馈电路的正弦波振荡器(文氏桥振荡器+相移振荡器+双T振荡器)
  • 基于SSM架构的农产品朔源系统
  • RAFT协议(算法)
  • C#中的两个问号
  • 后端开发面经系列--百度内容生态C++一面
  • Script-server: 一款开源的脚本管理工具,为你的Python脚本提供一个直观的 Web UI
  • 【机器学习】--- 逻辑回归算法
  • /var/log/secure安全日志分析
  • 基于 Redis 的分布式锁实现原理及步骤
  • Redis访问工具
  • maven-helper插件解决jar包冲突实战
  • day10-配置文件日志多线程
  • Oracle之用TO_CHAR函数将日期格式转化为不带前导零的月份和日
  • 第三部分:3---环境变量