I.MX6ULL嵌入式Linux驱动学习---《LED》

目录

文章目录

  • 目录
  • 摘要
  • 1LED的原理图学习
  • 2.初始化LED的GPIO时钟
  • 3.设置IO为复用功能
  • 4.配置GPIO1_IO03
  • 5.设置GPIO
  • 6.控制GPIO的输出电平
  • 7.编写代码
    • 1.编写leds.s汇编代码
    • 2.编写Makefile文件
    • 3.烧写到SD卡中

摘要


本节主要记录自己学习汇编LED灯的实验。


1LED的原理图学习

I.MX6ULL嵌入式Linux驱动学习---《LED》_第1张图片
通过电路原理图可以看出我们要配置的LED是接到GPIO1_IO03上了,因此我们只需要设置这个引脚为高电平或者低电平就可以实现对LED灯的亮灭控制。

2.初始化LED的GPIO时钟

I.MX6ULL嵌入式Linux驱动学习---《LED》_第2张图片

因此我们只需要配置CCM_CCGRx寄存器就可以配置对应的时钟,
I.MX6ULL嵌入式Linux驱动学习---《LED》_第3张图片
I.MX6ULL嵌入式Linux驱动学习---《LED》_第4张图片
I.MX6ULL嵌入式Linux驱动学习---《LED》_第5张图片
为了方便我们全部设置CCM_CCGRx(x=0…6)成1

3.设置IO为复用功能

找到 GPIO1_IO03 的复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为
0X020E0068,然后设置此寄存器,将 GPIO1_IO03 这个 IO 复用为 GPIO 功能,也就是 ALT5。

I.MX6ULL嵌入式Linux驱动学习---《LED》_第6张图片

4.配置GPIO1_IO03

找到 GPIO1_IO03 的配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”的地址为
0X020E02F4,根据实际使用情况,配置此寄存器。
I.MX6ULL嵌入式Linux驱动学习---《LED》_第7张图片
I.MX6ULL嵌入式Linux驱动学习---《LED》_第8张图片

5.设置GPIO

I.MX6ULL嵌入式Linux驱动学习---《LED》_第9张图片

6.控制GPIO的输出电平


经过前面几步, GPIO1_IO03 已经配置好了,只需要向 GPIO3_DR 寄存器的 bit3 写入 0 即可控制 GPIO1_IO03 输出低电平,打开 LED,向 bit3 写入 1 可控制 GPIO1_IO03 输出高电平,关闭 LED。


7.编写代码


1.编写leds.s汇编代码


.global _start //这是一个全局标号

_start:
    /****步骤一:使能所有外设时钟******/
    ldr r0, =0x020c4068 @CCGR0
    ldr r1,=0xffffffff  @要向CCGR0写入到的数据
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c406c @CCGR1
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c4070 @CCGR2
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c4074 @CCGR3
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c4078 @CCGR4
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c407c @CCGR5
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

    ldr r0, =0x020c4080 @CCGR6
    str r1 , [r0]         @将0xffffffff写入到CCGR0中

   /*****步骤二:设置GPIO1_IO03复用功能
   * GPIO1_IO03的复用为GPIO,也就是设置 
   * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5
   * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址为0x020E0068h
   *****/
    ldr r0, =0x020E0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    ldr r1,=0x05  @要向IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03写入到的数据
	str r1 , [r0]         @将0x05写入到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中

    /*步骤三:配置GPIO01-IO03的电气属性,也就是寄存器
    * IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    * 寄存器地址:0x20E02F4h

    *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 低转换率
    * 最终设置:0000 10 1011 0000==0x10b0
    */
    ldr r0,=0x020e02F4
    ldr r1,=0x10B0
    str r1, [r0]

   /*************步骤四:配置GPIO功能*******************
   *  GPIO1_GDIR  地址:0x209C004
   *  GPIO1_GDIR: 对应位设置
   *              0输入
   *              1输出
   *
   ***************************************************/
    ldr r0,=0x209C004
    ldr r1,=0x8
    str r1, [r0]
    /*步骤五打开LED
    *  打开LED,也就是设置GPIO1_IO03设置0 
    *   GPIO1_DR 寄存器地址0x0209C000
    */
    ldr r0,=0x0209C000  //亮
	ldr r1 , =0
	str r1 , [r0]  

loop:
	b loop

	
	



2.编写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

3.烧写到SD卡中


准备一张新的 SD(TF)卡,确保 SD 卡里面没有数据,因为我们在烧写代码的时候可能会格式话 SD 卡!!!
Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”
里面,其中存储设备都是以“/dev/sd”开头的。我们要先看一下不插 SD 卡的时候电脑都有哪些
存储设备,以防插入 SD 卡以后分不清谁是谁。输入如下所示命令
在这里插入图片描述
这里我们用的是/dev/sdb

向 SD 卡烧写 bin 文件

./imxdownload leds.bin /dev/sdb

I.MX6ULL嵌入式Linux驱动学习---《LED》_第10张图片
输入密码完成下载。
I.MX6ULL嵌入式Linux驱动学习---《LED》_第11张图片

取出SD卡放入到开发板中的卡槽重启开发板即可完成。

你可能感兴趣的:(linux学习总结,makefile,汇编语言学习)