智果芯
服务于百万大学生和电子工程师!

使用I.MX6ULL IO点亮LED

嵌入式linux学习者大体可以分为两类,一类是进阶用户,主要指已经有大量mcu工作经验的开发者, 他们希望进阶到更有难度,薪资更高的mpu开发中去。另一类则是学生用户,主要是刚开始接触嵌入式开发的大学生群体。

I.MX应用处理器包括I.MX8、I.MX7、I.MX6及I.MX28系列,被广泛应用于工业控制、汽车电子领域,久经市场考验。而且它的产品线非常丰富,用户熟悉其中一款产品后就能非常方便地迁移至不同的平台。

一般拿到一款全新的芯片,第一个要做的事情的就是驱动其GPIO,控制其GPIO输出高低电平,我们学习I.MX6U也一样的,先来学习一下I.MX6U的GPIO。在学习I.MX6U的GPIO之前,我们可以对比一下STM32的GPIO初始化(如果没有学过 STM32 就不用回顾了),我们以最常见的STM32F103为例来看一下STM32的GPIO初始化,示例代码如下:

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能 PB 端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB5 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度
    GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化 GPIOB.5
    GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
}

STM32初始化流程

1、使能指定GPIO的时钟。

2、初始化 GPIO,比如输出功能、上拉、速度等等。

3、STM32 有的 IO 可以作为其它外设引脚,也就是 IO 复用,如果要将 IO 作为其它外设引脚使用的话就需要设置 IO 的复用功能。

4、最后设置GPIO输出高电平或者低电平。

I.MX6U的GPIO一共有5组:GPIO1、GPIO2、GPIO3、GPIO4和GPIO5,其中GPIO1有32个IO,GPIO2有22个IO,GPIO3有29个IO、GPIO4有29个IO,GPIO5最少,只有12个IO,这样一共有124个GPIO

I.MX6ULL IO初始化流程

1、使能时钟,CCGR0—CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0~CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。

2、IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO

3、寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。

4、配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

汇编由一条一条指令构成,指令就涉及到汇编指令。

Int a,b;
a=b;

假设a地址为0X20,b地址为0x30

LDR R0, =0X30
LDR R1, [R0]
LDR R0, =0X20
STR R1, [R0]

我们在使用汇编编写驱动的时候最常用的就是LDRSTR这两个指令。

1、新建工程

新建工程文件夹

新建裸机驱动文件夹
新建LED灯文件夹

2、在VSCode中编写代码

ubuntu中我们使用的是VScode编辑器来写代码,跟在windows中新建项目一样,新建项目、保存工作区,然后编写代码。

3、编写代码

.global _start  /* 全局标号 */

_start:

    /* 1、使能所有时钟 ldf如果用大写就全部用大写,如果小写就全部用小写*/
    ldr r0, =0X020C4068 //将寄存器CCGR0地址0X020C4068 存放到 寄存器R0 中
    ldr r1, =0XFFFFFFFF //把寄存器x地址0Xffffffff存放到 寄存器r1 中
    str r1, [r0]//把寄存器r1中的值(0XFFFFFFFF) 写入到寄存器r0里面的值作为地址的内存里面

    ldr r0, =0X020C406C/*将寄存器CCGR1地址(0X020C4068) 存放到 寄存器R0 中*/
    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]

    /* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
    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]

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

    /* 5、打开LED0
     * 设置GPIO1_IO03输出低电平
     */
    ldr r0, =0X0209C000 /*寄存器GPIO1_DR */
   ldr r1, =0        
   str r1,[r0]

/*
 * 描述:    loop死循环
 */
loop:
    b loop              
.global _start @全局标号
/**/

4、编译代码

使用如下三条命令来编译代码

arm-linux-gnueabihf-gcc -g -c leds.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
编译、链接、格式转换

最终生成了led.o led.elf led.bin三个文件

5、烧写代码

STM32中代码烧写到内部FLASH。IMX6ULL支持SD卡、EMMC、NAND、nor、SPI flash等启动。裸机例程选择烧写到SD卡里面。在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。

利用FileZilla Client软件将imxdownload软件发送到工程目录下

烧写的三个命令

ls /dev/sd* -l
chmod 777 imxdownload 
./imxdownload led.bin /dev/sdb

Imxdownload使用方法,确定要烧写的SD卡文件,需要使用ls /dev/sd* -l命令来检测SD是哪一个文件,我的是/dev/sdb

插拔SD卡可以看到两个的区别

给予imxdownload可执行权限:Chmod 777 imxdownload

烧写:./imxdownload led.bin /dev/sdb

向SD卡烧写完成

Imxdownlaod会向led.bin添加一个头部,生成新的load.imx文件,这个load.imx文件就是最终烧写到SD卡里面去的。

这里要注意的是如果烧写的速度在几十MB/S左右的话,那么可能意味着烧写失败了。而且是因为SD卡没找到而导致烧写失败,这个问题只能重启 ubuntu解决。

之后就可以从读卡器中把SD拔下来,然后插入到开发板中,将拨码开关拔止SD卡模式,供电之后,蓝色LED亮,红色LED灭,两秒钟之后红色LED亮。

赞(3) 打赏
未经允许不得转载:智果芯 » 使用I.MX6ULL IO点亮LED

评论 抢沙发

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

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏