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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)