linux IMX6 汇编点亮一个LED灯

驱动Linux引脚与驱动STM32其实是一样的,都是在操作寄存器,在相应的寄存器上附上相应的值即可驱动。

IMX6U手册上有各个管脚的命名,跟STM32不同,IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00,是根据功能来命名的

 每个引脚都包含这两个寄存器,表中的 XXXX 表示引脚的名字,例如本芯片中有一个名为 GPIO1_IO03 的引脚,编号为 GPIO1.3,你可以在参考手册的 IOMUXC 章节中找到它的 这 两 个 寄 存 器 : IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04 以 及IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO04,以下简称 MUX 寄存器及 PAD 寄存器。根据寄存器说明即可对该引脚进行相应的配置。

可以看到,该寄存器主要有两个配置域,分别是 SION 和 MUX_MODE,其中 SION用于设置引脚在输出模式下同时开启输入通道。重点是 MUX_MODE 的配置,它使用 4 个寄存器位表示可选的 ALT0~ALT8这 9 个模式,若配置为 ALT5 则引脚会用作普通的 GPIO功能,用于输出高、低电平。

相对来说 PAD 寄存器的配置项就更丰富了,而且图中仅是该寄存器的部分说明,仔细看这些配置项,如 HYS 设置使用施密特模式的滞后功能,PUS 配置上下拉电阻的阻值,其它的还包含 PUE、PKE、ODE、SPEED、DSE 及SRE 的配置。

 接下来则是要使用汇编来给这些寄存器赋值,并驱动它。

流程:

1、使能时钟

2、复用为GPIO

3、配置寄存器管脚

4、设置管脚方向

5、拉低管脚,点亮LED

 1 .global _start
 2 
 3 _start:
 4 ldr R0, =0X020C406C   //赋值给R0 时钟的地址
 5 ldr R1, =0x0C000000   //开启GPIO1的时钟
 6 str R1, [R0]           //赋值
 7 
 8 ldr R0, =0X020E0068   //赋值给R0 IO3的地址
 9 ldr R1, =0x00000005   //IO3设置复用为GPIO_IO3
10 str R1, [R0]            //赋值
11 
12 ldr R0, =0X020E02F4   //赋值给R0 IO3的设置地址
13 ldr R1, =0x000010B0   //配置管脚寄存器
14 str R1, [R0]          //赋值
15 
16 ldr R0, =0X0209C004   //GDIR
17 ldr R1, =0x00000008   //输出
18 str R1, [R0]          //赋值
19 
20 loop:
21     bl led_on
22     bl delay
23     bl led_off
24     bl delay
25 b loop
26 
27 led_on:
28 ldr R0, =0X0209C000   //DR
29 ldr R1, =0x00000000   //输出低
30 str R1, [R0]          //赋值
31 mov pc, lr            //返回被调用处 
32 
33 led_off:
34 ldr R0, =0X0209C000   //DR
35 ldr R1, =0x00000008   //输出低
36 str R1, [R0]            //赋值
37 mov PC, LR            //返回被调用处 
38 
39 delay:
40 move R0, #0x4000
41 for:
42 sub R0, #1
43 cmp R0, #0
44 bne for
45 mov PC, LR            //返回被调用处 

这个代码初始化了GPIO1_3管脚,使用了delay函数,使led灯能闪烁

原文地址:https://www.cnblogs.com/puchi/p/11800434.html