赞
踩
实验学习板电路分析:
这里使用的正点原子的阿尔法开发板
看见灯是一个3.3v上拉的电路,所以需要芯片下拉才能把灯点亮
然后,找到LED0接着的是I.MX的GPIO1_3的银角(原理图里的GPIO_3就是GPIO1_3)
接下来的操作就是配置I.MX的内部寄存器,让GPIO1_3输出低电平。
STM32 IO 初始化流程
在学习I.MX6U的初始化也可以类比STM32的初始化流程
STM32 | I.MX6U |
---|---|
使能GPIO时钟 | 使能时钟(CCGR0~CCGR6这7个寄存器控制着6ULL所以的外设时钟使能) |
设置IO复用,将其复用为GPIO | 通过IOMUXC_MUX配置寄存器位,来复用不同的功能 |
配置GPIO的电气属性 | 通过IOMUXC_PAD配置寄存器位,配置电气属性 |
使用GPIO输出高/低电平 | 通过GPIO寄存器 |
时钟控制寄存器是CCM(PDF678页左右)
IMX6ULL的IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00寄存器(PDF1329页)
GPIO寄存器(PDF1155页左右)
小Hint:
如果只想看每个 IO 能复用什么外设的话可以直接查阅《IMX6UL 参考手册》的第 4 章“Chapter 4 External Signals and Pin Multiplexing”。
如果我们要编写代码,设置某个 IO 的复用功能的话就需要查阅第 30 章“Chapter 30: IOMUX Controller(IOMUXC)”,第 30 章详细的列出了所有 IO 对应的复用配置寄存器。
GPIOx寄存器 | 功能 |
---|---|
DR | 存放银角电平状态 |
GDIR | 银角输入(0)/输出(1) |
PSR | 读取银角电平状态(只读) |
ICR1 | 配置低16位,中断触发方式 |
ICR2 | 配置高16位,中断触发方式 |
IMR | 配置银角的中断使能(1为使能) |
ISR | 中断触发标志位,写入1复位中断标志位 |
EDGE_SEL | 设置边沿触发中断(置1为双边沿触发,优先级大于ICR) |
ICR寄存器:
GPIO配置寄存器跳转(PDF1154)
.global _start /* 全局标号*/ _start: /*1.使能所有的时钟 */ ldr r0, = 0x020C4068 /*寄存器CCGR0 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C406C /*寄存器CCGR1 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C4070 /*寄存器CCGR2 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C4074 /*寄存器CCGR3 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C4078 /*寄存器CCGR4 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C407C /*寄存器CCGR5 */ ldr r1, = 0xFFFFFFFF str r1, [r0] ldr r0, = 0x020C4080 /*寄存器CCGR6 */ ldr r1, = 0xFFFFFFFF str r1, [r0] /*2.设置GPIO的银角复用 */ ldr r0, = 0x020E0068 /*寄存器GPIO1_IO03_MUX */ ldr r1, = 0x5 str r1, [r0] /*3.设置GPIO的电气属性 */ ldr r0, = 0x020E02f4 /*寄存器GPIO1_IO03_PAD */ ldr r1, = 0x10B0 str r1, [r0] /*4.设置GPIO为输出 */ ldr r0, = 0x0209C004 /*寄存器GPIO1_GDIR*/ ldr r1, = 0x8 str r1, [r0] /*5.打开LED0,设置GPIO1_IO03为低电平 */ ldr r0, = 0x0209C000 /*寄存器GPIO1_DR*/ ldr r1, = 0x0 str r1, [r0] /*死循环 */ loop: b loop
在文件夹下终端输入命令编译
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
链接:
链接就是把所有的.0文件链接在一起,并且链接到指定的地方。链接要指定起始地址,链接起始地址是代码运行的起始地址。
对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM,也就是DDR。6ULL内部RAM地址范围0x900000-0x91FFFF。也可以放到外部RAM中,对于I.MX6U开发版,512MBDDR版本,DDR的范围就是0x80000000-0x9FFFFFFF。对于256MBDDR版本就是,0x80000000-0x8FFFFFFF。
本次实验起始地址为0x87800000,要使用DDR,那么需要初始化DDR,对于I.MX来说bin文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系统SOC内部boot rom会从SD卡,EMMC等外部存储中读取头部信息,然后初始化DDR,并且将bin文件拷贝到指定地方
bin的运行地址一定要和链接起始地址一致。位置无关代码除外
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
编程成了elf文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
编译成了bin文件
arm-linux-gnueabihf-objdump -D led.elf > led.dis
在Ubuntu下向SD卡烧写裸机bin文件,烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对地址上,而且对于I.MX而言,不能直接烧写bin1文件。需要在bin文件的前面添加头部(包含DDR的初始化),这里使用的是正点原子提供的工具imxdownload
imxdownload的使用方法,确定要烧写的SD卡文件
给予imxdownload可执行权限:
$ chmod 777 imxdownload
烧写命令
$ ./imxdownload led.bin /dev/sdb
生成了imx文件,这个文件就是最后烧写到sd卡里面的
led.bin:led.s
arm-linux-gnueabihf-gcc -g -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 -rf *.o led.bin led.elf led.dis
结果:
注意事项:
vsvdoe TAB键默认是空格,空格会报错
setting选项里
搜索renderControlCharacters,勾选选项即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。