I.MX6U开发板:LED汇编驱动实验

实验分析

为什么要学习Cortea-A 汇编:
1.需要用汇编初始化一些SOC外设
2.使用汇编初始化DDR(I.MX6U不需要)
3.设置sp指针,一般指向DDR,设置好C语言运行环境

实验学习板电路分析:
这里使用的正点原子的阿尔法开发板
看见灯是一个3.3v上拉的电路,所以需要芯片下拉才能把灯点亮
在这里插入图片描述
然后,找到LED0接着的是I.MX的GPIO1_3的银角(原理图里的GPIO_3就是GPIO1_3)
在这里插入图片描述
接下来的操作就是配置I.MX的内部寄存器,让GPIO1_3输出低电平。

STM32 IO 初始化流程
在学习I.MX6U的初始化也可以类比STM32的初始化流程

STM32I.MX6U
使能GPIO时钟使能时钟(CCGR0~CCGR6这7个寄存器控制着6ULL所以的外设时钟使能)
设置IO复用,将其复用为GPIO通过IOMUXC_MUX配置寄存器位,来复用不同的功能
配置GPIO的电气属性通过IOMUXC_PAD配置寄存器位,配置电气属性
使用GPIO输出高/低电平通过GPIO寄存器

时钟控制寄存器是CCM(PDF678页左右)

IMX6ULL的IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00寄存器(PDF1329页)

GPIO寄存器(PDF1155页左右)

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00

小Hint:
如果只想看每个 IO 能复用什么外设的话可以直接查阅《IMX6UL 参考手册》的第 4 章“Chapter 4 External Signals and Pin Multiplexing”。
如果我们要编写代码,设置某个 IO 的复用功能的话就需要查阅第 30 章“Chapter 30: IOMUX Controller(IOMUXC)”,第 30 章详细的列出了所有 IO 对应的复用配置寄存器。

GPIOx寄存器功能
DR存放银角电平状态
GDIR银角输入(0)/输出(1)
PSR读取银角电平状态(只读)
ICR1配置低16位,中断触发方式
ICR2配置高16位,中断触发方式
IMR配置银角的中断使能(1为使能)
ISR中断触发标志位,写入1复位中断标志位
EDGE_SEL设置边沿触发中断(置1为双边沿触发,优先级大于ICR)

ICR寄存器:
ICR寄存器
GPIO配置寄存器跳转(PDF1154)

LED汇编代码

.global _start /*  全局标号*/


_start:

/*1.使能所有的时钟 */
                ldr     r0,     =       0x020C4068      /*寄存器CCGR0 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C406C      /*寄存器CCGR1 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C4070      /*寄存器CCGR2 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C4074      /*寄存器CCGR3 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C4078      /*寄存器CCGR4 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C407C      /*寄存器CCGR5 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

                ldr     r0,     =       0x020C4080      /*寄存器CCGR6 */
                ldr     r1,     =       0xFFFFFFFF
                str     r1,     [r0]

/*2.设置GPIO的银角复用 */ 
                ldr     r0,     =       0x020E0068      /*寄存器GPIO1_IO03_MUX */
                ldr     r1,     =       0x5
                str     r1,     [r0]

/*3.设置GPIO的电气属性 */
                ldr     r0,     =       0x020E02f4      /*寄存器GPIO1_IO03_PAD */
                ldr     r1,     =       0x10B0
                str     r1,     [r0]

/*4.设置GPIO为输出 */ 
                ldr     r0,     =       0x0209C004      /*寄存器GPIO1_GDIR*/
                ldr     r1,     =       0x8
                str     r1,     [r0]               

/*5.打开LED0,设置GPIO1_IO03为低电平 */ 
                ldr     r0,     =       0x0209C000      /*寄存器GPIO1_DR*/
                ldr     r1,     =       0x0
                str     r1,     [r0]    

/*死循环 */
loop:
        b       loop

程序编译

将.c .s文件编译成.o文件

在文件夹下终端输入命令编译

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

在这里插入图片描述

将.o文件链接为elf格式的可执行文件

链接:
链接就是把所有的.0文件链接在一起,并且链接到指定的地方。链接要指定起始地址,链接起始地址是代码运行的起始地址。

对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM,也就是DDR。6ULL内部RAM地址范围0x900000-0x91FFFF。也可以放到外部RAM中,对于I.MX6U开发版,512MBDDR版本,DDR的范围就是0x80000000-0x9FFFFFFF。对于256MBDDR版本就是,0x80000000-0x8FFFFFFF。

本次实验起始地址为0x87800000,要使用DDR,那么需要初始化DDR,对于I.MX来说bin文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系统SOC内部boot rom会从SD卡,EMMC等外部存储中读取头部信息,然后初始化DDR,并且将bin文件拷贝到指定地方

bin的运行地址一定要和链接起始地址一致。位置无关代码除外

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

编程成了elf文件

将elf文件转化为bin文件

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

编译成了bin文件

bin生成反汇编文件

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

烧写代码

在Ubuntu下向SD卡烧写裸机bin文件,烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对地址上,而且对于I.MX而言,不能直接烧写bin1文件。需要在bin文件的前面添加头部(包含DDR的初始化),这里使用的是正点原子提供的工具imxdownload

imxdownload的使用方法,确定要烧写的SD卡文件

给予imxdownload可执行权限:

$ chmod 777 imxdownload 

烧写命令

$ ./imxdownload led.bin /dev/sdb

在这里插入图片描述
生成了imx文件,这个文件就是最后烧写到sd卡里面的

使用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

结果:
在这里插入图片描述
注意事项:
在这里插入图片描述

vsvdoe TAB键默认是空格,空格会报错

setting选项里
搜索renderControlCharacters,勾选选项即可
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值