嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动

这篇具有很好参考价值的文章主要介绍了嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录



前言

现在开始正式在开发板上进行开发,仍然看的是正点原子的资料


IMX6ULL介绍

主要资料

使用的是Cortex-A7
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
点击芯片名字打开介绍,主要参考的手册是:
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
以及数据手册:
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

IO表现形式

对于一般的STM32来说,IO的表现形式为:
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
管教名为PA1,管脚的功能在倒数第二列

对于IMX6ULL,IO形式在参考手册里面,且没有上面的表格:目录列表即管教名:SNVS_TAMPER2这样格式的,是对寄存器介绍的。
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
下图的这两种,有MUX的表示本节介绍的是复用功能
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
配置其电气模式:就是速度、上下拉类似stm32那些
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统


汇编LED驱动

Cortex-A汇编的功能:

  • 初始化SOC外设
  • 初始化DDR(一般内部ROM存放了启动代码,读取DDR配置信息,完成DDR初始化)
  • 设置SP指针,一般指向DDR,设置好C语言环境

原理图

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

初始化流程

参考STM32的初始化过程:
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

  • 使能GPIO时钟
  • 设置IO复用,复用为GPIO
  • 配置电气属性
  • 使用

时钟设置

对IMX6ULL来说:CCM为其时钟控制
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
打开发现CCGR0-6,控制了其所有的外设时钟
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
有几种模式,但先直接初始化为11,所有模式下都开启,且CG0-CG15都这样,即0xfffffff
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
这里有地址:0x20C4068
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

IO复用设置

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

需要设置为0101,即复用为GPIO模式
SION寄存器,设置为默认0就行

电气属性设置

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
SRE(bit0): 对应图 8.1.4.2 中的 SRE,设置压摆率,当此位为 0 的时候是低压摆率,当为 1的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间(高速通信就用高压摆率),要过EMC就用低压摆率。

DSE(bit5:3):对应图 8.1.4.2 中的 DSE,当 IO 用作输出的时候用来设置 IO 的驱动能力,111驱动能力最强。
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
SPEED(bit7:6): 对应图 8.1.4.2 中的 SPEED,当 IO 用作输出的时候,此位用来设置 IO 速度
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
PUE(bit13):当 IO 作为输入的时候,为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。状态保持器在当外部电路断电以后此 IO 口可以保持住以前的状态。

PKE(bit12): 此位为0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。

ODE(bit11):当 IO 作为输出的时候,此位为 0 的时候禁止开路输出, 当此位为 1 的时候就使能开路输出功能。

PUS(bit15:14): 用来设置上下拉电阻的
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
HYS(bit16):使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器。

使用GPIO

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

  • DR:读写数据

  • GDIR:IO是输入还是输出

  • PSR:功能和输入状态下的DR寄存器一样,读取IO状态

  • ICR1、ICR2:中断控制寄存器,ICR1配置IO0-15,ICR2配置IO16-31
    嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
    要设置 GPIO1_IO15为上升沿触发中断,那么 GPIO1.ICR1=2<<30

  • IMR:中断屏蔽寄存器,使能某个 GPIO 的中断,那么设置相应的位为 1 即可,反之,如果要禁止中断,那么就设置相应的位为 0,使能 GPIO1_IO00 的中断,那么就可以设置 GPIO1.MIR=1

  • ISR:中断状态寄存器,32 位寄存器,只要某个 GPIO 的中断发生,那么ISR 中相应的位就会被置 1

  • EDGE_SEL:边沿选择寄存器,设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 双边沿触发。

各个地址在这里:
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
以GDIR为例子:每一位代表一个IO,IO3为1即0x8
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

编写驱动

.global _start   //全局start入口

_start:
    //使能所有外设时钟
    ldr r0, =0x020C4068 //CCGR0寄存器地址
    ldr r1, =0xffffffff //写入的数据
    str r1, [r0]        

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

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

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

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

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

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

    // 设置 GPIO1_IO03 复用为 GPIO
    ldr r0, =0X020E0068 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
    ldr r1, =0X5 /* 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MUX_MODE 为 5 */
    str r1,[r0]

    /* 3、配置 GPIO1_IO03 的 IO 属性
    *bit [16]:    0 HYS 关闭
    *bit [15:14]: 00 默认下拉
    *bit [13]: 0 kepper 功能
    *bit [12]: 1 pull/keeper 使能
    *bit [11]: 0 关闭开路输出
    *bit [7:6]: 10 速度 100Mhz
    *bit [5:3]: 110 R0/6 驱动能力
    *bit [0]: 0 低转换率
    */
    ldr r0, =0X020E02F4 /*寄存器 SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

    //设置为输出模式
    ldr r0, =0X0209C004 /*寄存器 GPIO1_GDIR */ 
    ldr r1, =0X0000008
    str r1,[r0]

    //输出低电平
    ldr r0, =0X0209C000 /*寄存器 GPIO1_DR */
    ldr r1, =0
    str r1,[r0]

    //loop循环
loop:
    b loop

编译程序

编译.o文件

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

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

用交叉编译器进行编译,“-g”选项是产生调试信息, GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。

地址链接.elf

在STM32中,keil会链接存储的起始地址和运行地址0x80000000
我们烧写到SD卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF),也可以在外部的 DDR 中。

拷贝到DDR中:
链接起始地址为 0X87800000。 I.MX6U-ALPHA 开发板的 DDR 容量有两种: 512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址,不容易记混。

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

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
最后还需要格式转换到bin文件:

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

格式转换.bin

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

“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

反汇编(其他)

反汇编:多数是用 C 语言写的,有时候查看其汇编代码来调试,一般可以将 elf 文件反汇编

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

“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

综合成Makefile完成一步编译

创建Makefile文件:

leds.bin:leds.s
	arm-linux-gnueabihf-gcc -g -c leds.s -o leds.o
	arm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elf
	arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin
	arm-linux-gnueabihf-objdump -D leds.elf > leds.dis
clean:
	rm -rf *.o leds.bin leds.elf leds.dis

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

烧录程序

imxdownload

I.MX6U 支持从外置的 NOR Flash、 NAND Flash、 SD/EMMC、 SPI NOR Flash和 QSPI Flash 这些存储介质中启动,所以我们可以将代码烧写到这些存储介质中中。在这些存储介质中,除了 SD 卡以外,其他的一般都是焊接到了板子上的,我们没法直接烧写。

将 imxdownload 拷贝到工程根目录下,也就是和 leds.bin 处于同一个文件夹下,给予 imxdownload 可执行权限,给予 imxdownload 可执行权限以后其名字变成了绿色的,如果没有可执行权限的话其名字颜色是白色的。

chmod 777 imxdownload

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统

准备SD卡

ls /dev/sd*

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
查看可知该SD卡挂载/dev/sdb、/dev/sdb1,/dev/sdd 是我的 SD 卡, /dev/sdd1 是 SD 卡的第一个分区

向SD卡烧写程序

./imxdownload <.bin file> <SD Card>

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
注意如果出现MB/s的烧写速度,肯定烧写失败,需要重启Ubuntu,这里我下载错了,应该是/dev/sdb

烧写完成以后会在当前工程目录下生成一个 load.imx 的文件

之后,设置为SD卡启动,按下复位键
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动,嵌入式Linux裸机开发,linux,汇编,嵌入式操作系统文章来源地址https://www.toymoban.com/news/detail-727465.html

到了这里,关于嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.2 嵌入式开发环境搭建

    搭建一个嵌入式开发环境主要包括以下几个部分: 安装交叉编译器 配置集成开发环境(IDE) 安装调试工具 下载和烧录程序 接下来,我们将详细介绍每个部分,并提供相应的实例。 安装交叉编译器 交叉编译器是用于将您编写的ARM汇编代码编译成可执行文件的工具。在本教程

    2024年02月11日
    浏览(55)
  • 嵌入式Linux底层系统开发 +系统移植+内核文件系统(基础)

    搭建交叉编译开发环境 bootloader的选择和移植 kernel的配置、编译、移植和调试 根文件系统的制作 前两个要点通常芯片厂家提供。后边两个要点是公司的工作重点。 学习方法:先整体后局部,层层推进 如何编译—如何添加命令和功能—如何定义自己的开发板。 移植的基本步

    2024年02月03日
    浏览(71)
  • 嵌入式开发——ARM介绍

    ARM是一种芯片架构,由英国的ARM Holdings公司开发和授权,被广泛应用于各种嵌入式系统、移动设备和消费电子产品中。ARM架构被设计成低功耗、高性能、可定制化的特点,能够满足各种应用场景下的需求。 ARM架构主要设计了以下几个部分内容: 指令集架构 (Instruction Set Ar

    2024年02月04日
    浏览(69)
  • 嵌入式Linux:如何进行嵌入式Linux开发?

    目录 1、裸机开发 2、SDK开发 3、驱动开发 3.1、字符设备驱动 3.2、块设备驱动 3.3、网络设备驱动 4、应用开发 嵌入式Linux开发主要有四种方式:裸机开发、SDK开发、驱动开发和应用开发。 裸机开发通常指在没有操作系统支持的环境中直接在硬件上运行程序的开发。这种开发方

    2024年01月25日
    浏览(80)
  • 关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

    这篇文章是关于嵌入式开发的一些基本信息,供想入行的人参考。有一些作者本人的想法,以及来自外网的大拿的文章翻译而来,原文链接在此Learning Linux for embedded systems,再次感谢,支持原创。 普通C开发人员和嵌入式C开发人员之间的 基本区别在于 ,因为嵌入式C程序被设

    2024年02月03日
    浏览(70)
  • 【无标题】嵌入式开发-IIC通信介绍

    IIC(Inter-Integrated Circuit)是一种两线式串行总线协议,用于连接微控制器及其他外围设备。在IIC总线上的数据传输速率可以是标准模式(100Kbit/s),快速模式(400Kbit/s)和高速模式(3.4Mbit/s)。 IIC的起始和停止条件由SCL(Serial Clock Line,串行时钟线)和SDA(Serial Data Line,串行

    2024年02月10日
    浏览(54)
  • 嵌入式:ARM常用开发编译软件介绍

    ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。ADS对汇编、C/C++、java支持的均很好,

    2024年02月06日
    浏览(68)
  • 嵌入式开发:单片机嵌入式Linux学习路径

    SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。高端SOC如基于Cortex-A架构的芯片,如三星、高通、飞卡、全志和瑞芯微等,具备MMU,支持虚拟内

    2024年02月15日
    浏览(57)
  • 嵌入式_一种非常简单实用的基于GD32的裸机程序框架

    搜索了一下关于GD或ST裸机程序的问题,网上有非常多也非常的例子,但是针对裸机开发的程序框架却比较少,这里简单整理了一下在项目中使用过的一种比较小巧便携的裸机程序框架(确切点说算不上框架,只能说一种写法)。 之前常见的裸机程序框架就是流水账框架,比

    2024年02月13日
    浏览(46)
  • 嵌入式开发——基础电路知识

    IC是数字逻辑芯片,其输出的是逻辑电平。逻辑电平0表示输出电压低于阈值电压,逻辑1表示输出电压高于阈值电压。负载则是被驱动的电路或元件,负载大小则指负载的电阻大小。 驱动能力主要表现在几个方面: 负载能力:负载过大表现为外部负载的阻值过小,在电压不变

    2024年04月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包