GPIO

开发目的:将单板Err Led点亮

1.硬件连接




2.控制原理

GPIO1_23连接至LED3(Error),低电平点亮LED,此管教为复用管教,通过MuxReg3[14:15]去控制端口的模式,GPIO模式写入值为0x11.

在开发板光盘资料《MCIMX28RM.pdf》中找到了对应的管教描述:



3.操作流程


GPIO的操作需要按照上图进行:

1. 操作HW_PINCTRL_MUXSELx,选定管脚模式为GPIO;

2. 操作HW_PINCTRL_DRIVEx确定管脚驱动电流容量,以及HW_PINCTRL_PULLx使能上拉电阻;

3. HW_PINCTRL_DOUTx确定管脚输出值;

4. HW_PINCTRL_DOEx将3中写入值输出至管脚,只有完成这一步,pin才能真正的输出控制写入的电压;

其中,步骤2中通过HW_PINCTRL_DRIVEx可选电压1.8 3.3v,电流容量 4 8 12 mA,可见飞思卡尔的这款芯片设计还是相当精细的。


寄存器地址:

HW_PINCTRL_MUXSELx


HW_PINCTRL_DRIVEx



HW_PINCTRL_PULLx


HW_PINCTRL_DOUTx


HW_PINCTRL_DOEx



禁用看门狗

HW_CLKCTRL_RESET



在上述寄存器中写入配置值就可以将Err LED点亮了。

程序下载方法:

其实测试裸机程序,可以直接在uboot环境下执行,据体执行方法:

1.首先设置好tftp服务器,并将uboot的serverip设置为服务器ip

MX28 U-Boot>setenv serverip 192.168.0.123

MX28 U-Boot>saveenv

2.将编译好的led.bin文件下载至内存运行:

MX28 U-Boot >  tftp led.bin                                       
Using FEC0 device                                                 
TFTP from server 192.168.0.123; our IP address is 192.168.0.27    
Filename 'led.bin'.                                               
Load address: 0x41600000                                          
Loading: T #                                                      
done                                                              
Bytes transferred = 184 (b8 hex)        

3. 记住Load address, 并使用go命令跳转至此地址执行程序。

MX28 U-Boot > go 0x41600000               
## Starting application at 0x41600000 ... 



gpio.h

//GPIO1_23-err-0 Light
typedef unsigned long UINT32;

#define HW_CLKCTRL_RESET		(UINT32 *)((volatile UINT32)(0x800401E0))

#define BANK_NUM			(1)
#define PIN_NUM			(23)
#define HW_PINCTRL_MUXSEL(x)	(UINT32 *)((volatile UINT32)(0x80018100 + x*0x10))
#define HW_PINCTRL_DRIVE(x)		(UINT32 *)((volatile UINT32)(0x80018300 + x*0x10))
#define HW_PINCTRL_PULL(x)		(UINT32 *)((volatile UINT32)(0x80018600 + x*0x10))
#define HW_PINCTRL_DOUT(x)		(UINT32 *)((volatile UINT32)(0x80018700 + x*0x10))
#define HW_PINCTRL_DOE(x)		(UINT32 *)((volatile UINT32)(0x80018B00 + x*0x10))
gpio.c
#include "gpio.h"

int main()
{
	//led Err is below to BANK1_PIN23
	//1. set PIN mode =GPIO
	*HW_PINCTRL_MUXSEL(3) |= (0b11UL << 14);
	//2. set PIN V=0v, I=12mA pull-up register
	*HW_PINCTRL_DRIVE(6) |= (0b111UL << 28);
	*HW_PINCTRL_DRIVE(6) &= ~(0b1UL << 28);
	*HW_PINCTRL_PULL(BANK_NUM) &= ~(0b1UL << PIN_NUM);
	//3.  set PIN output value
	*HW_PINCTRL_DOUT(BANK_NUM) &= ~(0b1UL << PIN_NUM);
	//4. enable PIN output
	*HW_PINCTRL_DOE(BANK_NUM) |= (0b1UL << PIN_NUM);
	while(1);
	return 0;
}
start.s
@.test
.global _start
_start:
	ldr	r0, =0x800401E0	@Disable WatchDog
	ldr	r1, [r0]
	orr	r1, r1, #0x20
	str	r1, [r0]

	ldr	sp, =1024*4		@set stack
	bl	main			@jump to main()

halt_loop:
	b	halt_loop

MAKEFILE

led.bin : start.s gpio.c
	arm-linux-gcc -g -c -o start.o start.S
	arm-linux-gcc -g -c -o gpio.o gpio.c
#	arm-linux-ld -Ttest 0x00000000 -g start.o gpio.o -o led_elf
	arm-linux-ld -g start.o gpio.o -o led_elf
	arm-linux-objcopy -O binary -S led_elf led.bin

clean:
	rm -f *.o





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值