【I.MX6ULL学习笔记·五】 点灯

终于要开始单片机的Helloworld了
首先跟着手册先了解一下I.MX4ULL的IO口相关知识。

I.MX6ULL 的 IO 分为两类:SNVS 域的和通用的
他的IO口和STM32一样可以复用,需要的时候去查手册就行
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。每组 GPIO 8 个寄存器。我们来看一下这 8 个寄存器都是
什么含义。
GPIO结构图
DR寄存器
在这里插入图片描述
该寄存器是32位寄存器,每个位都对应一个GPIO,当GPIO被配置为输出功能后就会输出高电平。比如要设置 GPIO1_IO00 输出高电平,那么就应该设置 GPIO1.DR=1。当GPIO被配置为输入模式后,此寄存器就保存着对应IO的电平值。

GDIR寄存器

在这里插入图片描述

用来设置IO的工作方向是输入还是输出,每个IO对应一个位。如果要设置GPIO1_IO00 为输出的话,就设置GPIO1.GDIR=1。要设置 GPIO1_IO00 为输入,那么 GPIO1.GDIR=0。
PSR寄存器
在这里插入图片描述

PSR是状态寄存器,一个GPIO对应一个位,读取相应的位即可获得对应的GPIO状态,功能与输入状态下的DR寄存器相同

ICR1和ICR2寄存器

在这里插入图片描述

这俩都是中断控制寄存器,其中ICR1用来控制低16个GPIO。ICR2用于配置高16个GPIO,使用方法一样,以ICR1为例,一个GPIO用两位,这两位用来配置中断的触发方式。

00 低电平触发
01 高电平触发
10 上升沿触发
11 下降沿触发

以 GPIO1_IO15 为例,
如果要设置 GPIO1_IO15 为上升沿触发中断,
那么 GPIO1.ICR1=2<<30,
如果要设置 GPIO1 的 IO16~31 的话就需要设置 ICR2 寄存器了。

IMR寄存器

在这里插入图片描述
IMR寄存器是中断屏蔽寄存器,一个GPIO对应一位,用来控制GPIO的中断禁止和使能,使能中断则将相应位设置为1,禁止中断则设置成0

ISR寄存器
在这里插入图片描述
ISR寄存器是32位寄存器,只要GPIO的中断发生,那么ISR中相应的位就会置1,可以通过读取ISR寄存器来判断GPIO中断是否发生。

EDGE_SEL寄存器

在这里插入图片描述
EDGE_SEL寄存器用来设置边沿中断,这个寄存器会覆盖ICR1和ICR2的设置,一个GPIO对应一位,如果相应的位被置1,就相当于设置了对应的GPIO是双边沿触发中断,无论CR1的值设置为多少都是双边沿触发。

CCM里的外设时钟使能寄存器
CMM 有CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 I.MX6U 的所有外设时钟开关。
以CCM_CCGR0为例。

在这里插入图片描述
CCM_CCGR0是32位寄存器,其中每两位控制一个外设的时钟,有四种操作方式。

00 所有模式下都关闭外设时钟。
01 只有在运行模式下打开外设时钟,等待模式和停止模式下均关闭外设时钟。
10 未使用(保留)。
11 除了停止模式以外,其他所有模式下时钟都打开。

点灯开始~

看手册得知在I.MX6U开发板上,LED灯是连在GPIO_3上,另一端连载3.3V的高电平上,所以我们接下来要进行的就是把I.MX6U拉低,这样就会点亮。

1.创建工程文件

#为了以后学习方便,博主把打算将一切工程文件都放到一个文件夹下面,便于以后查阅
bj@bj-MS-7C83:~$ mkdir imx6u
bj@bj-MS-7C83:~$ cd imx6u/
bj@bj-MS-7C83:~/imx6u$ mkdir 1_bling
bj@bj-MS-7C83:~/imx6u$ cd 1_bling/
#创建汇编文件和一个.vscode目录
bj@bj-MS-7C83:~/imx6u/1_bling$ touch led.s
bj@bj-MS-7C83:~/imx6u/1_bling$ touch .vscode
bj@bj-MS-7C83:~/imx6u/1_bling$ ls -a
.  ..  led.s  .vscode

在VScode里面打开刚才创建的led.s,写入代码

.global _start @全局标号
_start:
@使能所有时钟
     ldr r0, =0X020C4068  /*寄存器CCGR0 */
     ldr r1, =0XFFFFFFFF
     str r1, [r0]  @将数据写入寄存器中

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

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

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

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

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

     ldr r0, =0X020C4080/*寄存器CCGR0 */
     str r1, [r0]  
@设置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]
/* 、配置 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
 ldr r1, =0X10B0
/*寄存器 SW_PAD_GPIO1_IO03_BASE */
 str r1,[r0]
@配置 GPIO1_IO03为输出
ldr r0, =0X0209C004
ldr r1, =0X0000008
str r1,[r0]

@打开LED0
ldr r0, =0X0209C000
ldr r1, =0
str r1,[r0]
loop:
            b loop
            

在终端cd到你的工程目录下,进行编译,所有C 文件和汇编文件都会生成一个对应的.o文件

bj@bj-MS-7C83:~/imx6u/1_bling$ arm-linux-gnueabihf-gcc -g -c led.s -o led.o

接下来我们需要将这些文件链接起来

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

得到.elf文件后,我们还需要把他转为.bin文件

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

接下来我们需要按照NXP规则将代码烧写到SD卡中,博主使用的就是正点编写的imxdownload,将这个软件放到.bin 文件同一目录下,并且把imxdownlode的权限改为777

接下来准备一张空白的SD卡插在电脑上,首先查看一下SD卡挂载位置

ls /dev/sd*

我的sd卡就是sdb1
请添加图片描述
一开始博主这个命令是不能运行的,后来给了root权限就可以了

接下来向SD卡烧写bin文件

bj@bj-MS-7C83:~/imx6u/1_bling$ ./imxdownload led.bin /dev/sdb1

请添加图片描述
ls文件,会看到一个名为load.imx的文件出现,最终就是要把这个文件下载到SD卡中,博主一开始很憨的把这个文件复制粘贴到了sd卡,其实根本不需要,上面那个过程已经完成了代码的烧录,接下来只需要将SD卡插入开发板的SD卡槽,设置拨码开关为SD卡启动请添加图片描述
请添加图片描述
点灯成功~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值