驱动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