开发目的:将单板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