【裸机驱动LED】使用汇编代码驱动LED(一)—— 寄存器解析篇

为了后续使用C语言驱动LED,事先学习汇编代码驱动LED,有如下好处:

  • 熟悉一些基本的汇编语法
  • 了解驱动LED的基本流程
  • 了解驱动LED需要用到哪些寄存器
  • 作为一个初学者,可以锻炼自己阅读开发文档的能力

本文的主要目的是了解驱动LED的基本流程,以及要驱动LED需要使用哪些寄存器。


目录

一、原理图分析

二、驱动LED的基本流程

三、寄存器设置

1、使能外设时钟(CCGRx)

2、设置IO复用(IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03)

3、初始化 IO 复用(IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03)

4、初始化GPIO(GPIOx_GDIR、GPIOx_DR)


一、原理图分析

我们先在《imx6ull 底板原理图》上找到 LED 模块,底板上LED名称为 LED0。 

然后我们在《核心板原理图》上找一下 LED0 连到了核心板的哪个引脚。我们发现是 GPIO_3,那么这里就表示的是 GPIO1_3,即 GPIO1 的第3个引脚。(这个可以在后面设置 IO 复用得到验证)

当LED0 给低电平的时候,二极管导通了,此时LED0亮;当LED0给高电平时,二极管阻断,此时LED0灭。

二、驱动LED的基本流程

既然是和GPIO相关,那就可以往设置GPIO的方向考虑。stm32驱动LED的基本流程为:

  • 使能外设时钟
  • 设置IO复用,将其复用为GPIO。(GPIO只是IO众多功能的一种)
  • 初始化复用引脚。即设置引脚的电气属性,比如设置输入还是输出、上下拉、速度等
  • 初始化GPIO。即设置 GPIO 输出高电平还是低电平。

对于 imx6ull, 我们驱动 LED 可以采取和stm32一样的步骤。

三、寄存器设置

接下来我们将针对每一步,详细了解寄存器的设置方法。

1、使能外设时钟(CCGRx)

led灯闪烁,说白了就是高低电平的转换,但是每隔多久转换一次,这就需要时钟来控制了。我们要去《IMX6ULL参考手册》第18章CCM了解时钟源的初始化。不同模块对应的时钟源是不一样的,我们可以在 18.4 找到GPIO模块对应的时钟源。

从下图我们可以看到,GPIO模块的时钟源使能由寄存器 CCGRx 控制,GPIO模块有 5 组。CCGR1 寄存器的 CG13(即第27-16 bit)控制着 GPIO1 的时钟源。(其他类似)

方式一:仅初始化CCGR1 的 bit 27- 26 

时钟源(寄存器): CCGR1
起始地址: 0x20C406C    # 一个时钟源占32bit,即4字节(0x20C406C - 0x20C4068 = 4)
初始化值操作:
    CCGR1 |= (3 << 26);

方式二:暴力初始化 

还有另一种做法,索性初始化所有时钟源 (CCGR0~6) 的所有模块(CG0~15,即引脚 0-32)。(可以在参考手册的18.6.25 找到每个时钟源CCGRx对应的基地址)

时钟源(寄存器): CCGR0
起始地址: 0x20C4068
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR1
起始地址: 0x20C406C    # 一个时钟源占32bit,即4字节(0x20C406C - 0x20C4068 = 4)
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR2
起始地址: 0x20C4070
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR3
起始地址: 0x20C4074
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR4
起始地址: 0x20C4078
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR5
起始地址: 0x20C407C
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR6
起始地址: 0x20C4080
初始化值:0xFFFFFFFF

2、设置IO复用(IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

无论是设置 IO 复用还是初始化 IO 复用引脚,涉及到复用,便和 IOMUX 有关,我们要到第 32 章 IOMUXC Memory 小节下的 IOMUXC 找到 GPIO 相关的复用寄存器以及初始化复用的寄存器。这些寄存器主要分为两类:

  • 第一类 IOMUXC_SW_MUX_CTL_PAD_<module name>:用于设置 IO 复用
  • 第二类 IOMUXC_SW_PAD_CTL_PAD_<module name>:用于初始化复用引脚,即设置电气属性。

我们现在要将IO 复用为 GPIO,那就要找GPIO相关的。

从这里你会发现,这里只有GPIO1 可以设置IO复用,这就验证了我们最开始在分析原理图所说的,LED0 连接的实际是GPIO1_03。随后我们可以在对应寄存器的介绍小节下找到设置复用的方法。我们只需要设置 MUX_MODE 字段,设置为 0101,其他字段保持不变。

由此可以总结得到

寄存器: IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
基地址: 0x20E0068
初始化值: 0x5    # 低四位为0101,其他位不变

3、初始化 IO 复用(IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03

无论是设置 IO 复用还是初始化 IO 复用引脚,涉及到复用,便和 IOMUX 有关,我们要到第 32 章 IOMUXC Memory 小节下的 IOMUXC 找到 GPIO 相关的复用寄存器以及初始化复用的寄存器。这些寄存器主要分为两类:

  • 第一类 IOMUXC_SW_MUX_CTL_PAD_<module name>:用于设置 IO 复用
  • 第二类 IOMUXC_SW_PAD_CTL_PAD_<module name>:用于初始化复用引脚,即设置电气属性。

接下来我们要初始化复用引脚,此时我们要找到前缀为 IOMUXC_SW_PAD_CTL_PAD 而且跟GPIO相关的寄存器。(这个比较难找,在32.6.156,大概在1793页)接下来我们要逐一设置寄存器中的每一个字段。

0:SRE,表示电压转换速率,我们选择低转换速率,即设为 0

2-1:保留位

5-3:DSE,表示驱动能力,我们选择 R0/6,即设为 110

 7-6:SPEED,表示速度。我们选择100M,即设为10

10-8:保留位

11:ODE,表示是否关闭开路输出,这里选择关闭,设为 0

12:PKE,pull / keeper 使能,这里选择打开,设为 1

13:PUE,选择 keeper功能,设为 0

15–14:PUS,选择上下拉,默认下拉,设为 00 

16:HYS,禁用,设为 0(该字段用的比较少)

31-17:保留位

寄存器: IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
基地址: 0x020E02F4
初始值: 0x10B0

4、初始化GPIO(GPIOx_GDIR、GPIOx_DR

 我们回到第28章,GPIO一共有五组,每一组都有8个寄存器,每个寄存器对应着不同的功能(属性)。但是实际上我们只需要设置其中两个寄存器,即 GPIOx_DR 和 GPIOx_GDIR。

  • GPIOx_DR数据寄存器用于输出或者读取数据,比如GPIO设置为输出,我们就可以使用该寄存器来让引脚输出高电平或者低电平。
  • GPIOx_GDIR方向寄存器用于设置GPIO是输入还是输出。如果是输入,我们就可以从 GPIOx_DR 寄存器读取内容;如果是输出,我们就需要向 GPIOx_DR 寄存器输出内容。
  • PSRGPIO状态寄存器读取相应的位即可获取对应的 GPIO 的状态。
  • ICR1、ICR2中断寄存器用来配置中断的触发方式(上升沿触发、下降沿触发),ICR1 用于 IO0~15 的配置, ICR2 用于 IO16~31 的配置。
  • IMR:中断使能寄存器。用于控制中断的使能和禁止。
  • ISR:中断状态寄存器。
  • EDGE_SEL:设置边缘中断。这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一 个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 是上升沿和下降 沿(双边沿)触发

寄存器: GPIO1_GDIR
基地址: 0x209C004
初始值: 0x00000008    # 因为是GPIO1的第三个引脚设为输出,即第3 bit应为1(00001000)

寄存器: GPIO1_DR
基地址: 0x209C000
初始值: 
    - 低电平: 0
    - 高电平: 0x00000008

LED0输出低电平的时候,二极管导通,此时灯会亮,所以寄存器 DR 的初始值应该为 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值