GPIO / LED---- 驱动开发编程
一般来说,GPIO的Pin都是可选功能的:
GPIO[x] :selects the function of GPIO Pin.
为什么?不要问.
操作:
1.将某一个GPIO选择功能复用为GPIO.
2.将该GPIO选择为GPIO输出.
3.控制该管脚输出高/低电平.
C语言回顾:
1.指针: int a; a = 100; *(&a) = 100; *((int *) 0x10000000) = 100; 地址 (volatile int *) 0x10000000 访问 *(volatile int *) 0x10000000 2.位操作: // 错误的 误将其他管脚的功能改变了 //应该只改变需要改变的位,其他的位应该保持不变. *(volatile int *) 0x10000000 = 0x01000000; //bit 24位置1,bit 25位置 0 // 正确做法 先将 24 25 位置0,再将 24位置1 *(volatile int *) 0x10000000 &= 0xfcffffff; *(volatile int *) 0x10000000 |= 0x01000000; // 标准做法: *(volatile int *) 0x10000000 &= ~(3 << 24); *(volatile int *) 0x10000000 |= 1 << 24;
LED 驱动编程:
#define GPIOCOUT (*(volatile unsigned int *)0xc001c000)
#define GPIOCOUTENB (*(volatile unsigned int *)0xc001c004)
#define GPIOALTFN0 (*(volatile unsigned int *)0xc001c000)
void delay (unsigned int);
void led_test(void)
{
GPIOALTFN0 &= ~(3 << 24);
GPIOALTFN0 |= (1 << 24);
GPIOCOUTENB |= (1 << 12);
while (1) {
GPIOCOUT &= ~(1 << 12);
delay (0x1000000);
GPIOCOUT |= (1 << 12);
}
}
void delay (unsigned int n)
{
while (n--);
}
总结:
LED驱动程序:
1) 看懂电路原理图:
找到要驱动的硬件和CPU是怎样连接的(管脚)
2) cpu data sheet
特殊功能寄存器是软件驱动硬件的媒介
3) 编辑代码
*((volatile unsigned int *) 0x10000000)
ARM中的特殊功能寄存器都是32bit
操作时必须按照4字节操作
操作原则:只改变需要改变的bit
可以通过位操作实现
4) 编译代码
arm-cortex…-gcc hello.c -o hello
5) 执行代码
tftp 48000000 bin
go 48000000



