我是靠谱客的博主 秀丽战斗机,最近开发中收集的这篇文章主要介绍(一)arm裸机开发---汇编led驱动程序一.硬件原理图二.初始化流程三.编写驱动程序四.编译下载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学习新的系列,arm裸机开发。主芯片使用的是imx.6ull芯片,平台使用的是正点原子的imx.6ull alpha开发板。本节介绍汇编led驱动的开发过程。

为什么我们要用汇编来写led程序呢?因为cortex-a芯片上电之后sp指针(堆栈指针)没有初始化,没有c语言运行的环境。所以必须先用汇编语言初始化sp指针,ddr等,把c语言运行环境搭好。

目录

  • 一.硬件原理图
  • 二.初始化流程
    • 1.使能GPIO1_3的时钟
    • 2.设置GPIO的复用功能为IO
    • 3.设置GPIO的电器属性
    • 4.设置GPIO的输入输出
  • 三.编写驱动程序
  • 四.编译下载
    • 1.编写makefile
    • 2.烧到SD卡。

一.硬件原理图

从下方原理图可以看到将GPIO1_3设置为低就可以点亮灯。
led
gpio1_3

二.初始化流程

1.使能GPIO1_3的时钟
2.设置GPIO的复用功能为io
3.设置GPIO的电器属性
4.设置GPIO的输入输出

1.使能GPIO1_3的时钟

简单起见,我们将所有模块的时钟都使能。即CCM_CCGR0~CCM_CCGR6寄存器都设置为0Xffff_ffff,地址从0x020C_4068 ~ 0x020C_4080.

2.设置GPIO的复用功能为IO

查找文献(芯片参考手册)可知,设置GPIO1_3复用功能的寄存器为IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03,地址为0x020E_0068。值要设置为0x5.

3.设置GPIO的电器属性

查找文献可知,设置GPIO1_3电器属性的寄存器为IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,地址为
0x020E_02F4。值要设置为0x000010B0

4.设置GPIO的输入输出

查找文献可知,GPIO1_GDIR用来设置输入/输出,地址是0x0209_C004,值为0x8。
查找文献可知,GPIO1_DR用来设置输出为0还是1,地址是0x0209_C000,值为0x0

三.编写驱动程序

将上面的步骤汇编实现。

.global _start 
/*
 *描述:这是一个点亮led的项目;
 *分为以下几步:
 *1.使能GPIO1_3的时钟
 *2.设置GPIO的复用功能为io
 *3.设置GPIO的电器属性
 *4.设置GPIO的输入输出
 */

 _start:
@使能所有时钟
ldr r0,=0x020C4068
ldr r1,=0Xffffffff
str r1,[r0]

ldr r0, =0x020C406c
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4070
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4074
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4078
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C407c
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4080
ldr r1, =0Xffffffff
str r1, [r0]

@设置GPIO的复用功能为io
ldr r0, =0x020E0068
ldr r1, =0X5
str r1, [r0]

@设置GPIO的电器属性
ldr r0, =0x020E02F4
ldr r1, =0x000010B0
str r1, [r0]

@设置GPIO的输入输出
ldr r0, =0x0209C004
ldr r1, =0x00000008
str r1, [r0]

ldr r0, =0x0209C000
ldr r1, =0x0
str r1, [r0]

@死循环
loop:
    b loop

四.编译下载

1.编写makefile

led.bin:led.s
	#gcc编译为.o文件
	arm-linux-gnueabihf-gcc -g -c led.s -o led.o
	#ld链接,并且指定运行地址
	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

.PHONY:clean
clean:
	rm -r *.o led.elf led.bin led.dis

2.烧到SD卡。

首先调整拨码开关为sd卡启动。
使用imxdownload将bin文件烧到sd卡中,前提sd卡的文件格式是fat32,给imxdownload执行权限。
chmod 755 imxdownload

#烧写
./imxdownload led.bin /dev/sdd

imxdownload 在 led.bin 文件前面添加了一些数据头以后生成load.imx 。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而非led.bin。

tips:之前学51的时候,点一个灯是一个很简单的事,没想到放到arm_imx.6ull这么复杂。路漫漫其修远兮,吾将上下而求索。

最后

以上就是秀丽战斗机为你收集整理的(一)arm裸机开发---汇编led驱动程序一.硬件原理图二.初始化流程三.编写驱动程序四.编译下载的全部内容,希望文章能够帮你解决(一)arm裸机开发---汇编led驱动程序一.硬件原理图二.初始化流程三.编写驱动程序四.编译下载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部