博客介绍
硬件:正点原子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
文件将解释:
- 编译leds.s生成led.o
arm-linux-gnueabihf-gcc -g -c leds.s -o led.o - 链接
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -led.elf - 转换为二进制文件
arm-linux-gnueabilf-objcopy -O binary -S -g led.elf led.bin - 反汇编 可以省略
arm-linux-gnueabilf-objump -D led.elf > led.dis
执行makefile文件
第三步:将程序烧录到SD卡
- 将sd开插入电脑,在虚拟中使用命令:ls /dev/sd* ;查看SD卡的盘符
- 使用正点原子提供的烧写工具 imxdownload ; 为 imxdownload文件 添加可执行权限
- 烧录:./imxdownload led.bin /dev/sdb
第四步:上电
- 设置BOOT模式为SD卡启动方式
- 插入SD卡
- 上电观察
此处疑问
删除第一步中的1.使能所有外设时钟。程序程序依然能够点亮LED。