一、汇编LED

本篇作为IMX6ULL平台学习的开篇,从此很长一段事件将学习IMX6的开发,也在此对自己立下学习要求,当以认真,谦恭的态度往后学习。
好了,开始吧。
拿到每一个新的开发板,进行的第一个实验必然是LED的实验,LED在嵌入式的学习中就和软件中的"Hello world"一样重要,更重要的是通过LED实验了解一个新的平台下的GPIO的操作方法,之前接触过IMX6的开发平台,也没有系统的了解过它的IO操作方法,现在来了解一下

一、IMX6ULL IO管脚复用功能

根据以往的嵌入式开发经验,都知道对于芯片的IO口在使用的过程中最重要的就是IO口的复用功能,作为哪种功能来用,以及IO的电气属性,输入或者而是输出,上下拉之类的
IMX6ULL的IO口的复用和电气属性是分开来配置的,打开芯片参考手册,找到关于IO的章节可以看到它的IO的寄存器分步如下
在这里插入图片描述
它的IO配置寄存器整体上分为两类,一类是名称中包含MUX的寄存器,一类是名称中包含PAD的寄存器,通过阅读芯片手册可以知道MUX寄存器是用来配置IO的复用功能的,PAD寄存器是配置IO的电气属性的。

找第一个IO口(BOOT_MODE0)来看一下,它对应的MUX寄存器的名称为IOMUXC_SNVS_SW_MUX_CTL_PAD_BOOT_MODE0
在这里插入图片描述
从寄存器的最后3位来看,这是选择IO复用功能的位,BOOT_MODE0只能作为GPIO5_IO10功能来用。
在来看BOOT_MODE0对应的PAD寄存器,名为IOMUXC_SNVS_SW_PAD_CTL_PAD_BOOT_MODE0
在这里插入图片描述
寄存器内容较多,不全部罗列出来了,从它的内容来看,就是配置IO口的电气属性,比如驱动能力,电阻值的大小,上下拉选择等。

二、IO功能配置

配置完基本的IO复用之后,要配置IO口输入或者输出,是否是中断功能,这些寄存器都在一起配置,寻找芯片手册的GPIO章节,有一个关于IO的框图,在IOMUX中就包含之前说的MUX和PAD的设置,那么,配置一个IO口作为普通的GPIO来使用的话就需要配置相关的8个寄存器,如下
• Data register (GPIO_DR) :数据寄存器
• GPIO direction register (GPIO_GDIR) :方向寄存器,输入或输出
• Pad sample register (GPIO_PSR) :只读,状态寄存器
• Interrupt control registers (GPIO_ICR1, GPIO_ICR2) :共32个管脚的中断触发条件
• Edge select register (GPIO_EDGE_SEL) : 中断的触发边缘,会覆盖ICR的设置条件,优先级高
• Interrupt mask register (GPIO_IMR) :开启或关闭中断
• Interrupt status register (GPIO_ISR) :中断相关

在这里插入图片描述
IMX6U一共有GPIO0-GPIO5 ,5组GPIO,每一组GPIO都有上面说的8个寄存器,所以上面的8个寄存器共有5组,每一组寄存器包含GOIO0-GPIO31共32个引脚,在每一个寄存器的32个bit中每一个bit就对应的是一个GPIO的某一个管脚的配置。说的比较绕口,寄存器的内容就不看了,后面的实验中使用的时候再看。

三、点灯

了解这些基本的知识之后就可以写代码了,第一步就是查看原理图,找到led的引脚
在这里插入图片描述
led的一端接到了3.3V,那么,另一端给低电平就可以实现led的点亮,跟踪标号LED0,找到它在CPU内部的引脚
在这里插入图片描述
全称是GPIO1_IO3,led的硬件结构跟简单,知道它的IO引脚就可以了,接下来开始写程序,因为现在是从裸机开始编码,所以要写的第一个程序是汇编代码,关于汇编的知识这里不说明,

在开始写代码之前要先说明一点,基本上所有的CPU都会有内部时钟树,所谓时钟树就是时钟系统的分支像树一样散开,蔓延到每一个外设的地方,为外设提供时钟,在IMX6ULL开始点灯之前,也要开启对应的led的时钟,
翻开芯片参考手册,找到系统时钟控制单元,可以看到相关的寄存器
在这里插入图片描述
其中两个Bit对应一个外设的时钟开关,这里选择全部打开

代码


.global _start  @定义全部标号

@从_start开始执行
_start:

    /*
        1、开启外设时钟,找到数据手册系统时钟控制部分,可以看到相关寄存器,11为开启外设时钟
            寄存器为CCM_CCGR0 - CCM_CCGR6
     */
    ldr r0, =0x020C4068     @r0指向CCM_CCGR0寄存器地址
    ldr r1, =0xffffffff     @r1为要写入的值,全F表示开启所有外设时钟
    str r1, [r0]            @通过str把寄存器r1的值写入r0寄存器,要注意,ARM不能直接访问RAM类型寄存器,只能通过内部寄存器间接访问

   @其余几个寄存器写法一样
    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]    

    /*
        2、配置引脚的复用和电气属性,led引脚为GPIO1_IO3
            IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03  0x020E0068
            IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03  0x020E02F4

     */
    ldr r0, =0x020E0068
    ldr r1, =0x5    @对应的复用功能为GPIO1_IO3
    str r1, [r0]

    /*
        bit0    :   0-慢摆率   1-快摆率
        bit3-5  :   驱动能力,110 DSE_6_R0_6 — R0/6
        bit6-7  :   01 速度100MHz
        bit [11]: 0 关闭开路输出
        bit [12]: 1 pull/keeper 使能
        bit [13]: 0 kepper 功能
        bit [15:14]: 00 默认下拉
        bit 16:0 HYS 关闭
     */
    ldr r0, =0x020E02F4
    ldr r1, =0x10b0
    str r1, [r0]

    /*
        3、设置IO引脚的输入输出
     */

    @GPIOx_GDIR 配置输入输出 209_C004,0对应输入,1对应输出
    ldr r0, =0x0209C004
    ldr r1, =0x8
    str r1, [r0]

    @GPIOx_DR 设置输出的值,或者读取输入的值,209_C000
    ldr r0, =0x0209C000
    ldr r1, =0x0
    str r1, [r0]

loop:
    b loop

Makefile

led.bin : led.s
        arm-linux-gnueabihf-gcc -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 led.bin led.elf led.o led.dis

编写汇编程序和Makefile,汇编程序就根据前面分析的来写即可,编译的时候根据Makefile来编译,汇编程序编译为可执行的bin文件的时候要指定程序开始运行的地址,使用命令arm-linux-gnueabihf-ld -Ttext来指定程序运行的地址,然后把bin文件烧录到SD卡,上电,CPU内核ROM中的程序就会把led.bin拷贝到程序指定的运行地址,然后从该地址开始运行。

好了,本篇主要将IO口的运用,关于系统的烧写和启动方式会放到下一节中介绍。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值