一、芯片手册
1、板子原理图
2、GPIO使用
(1)GPxCON
3、GPxDAT
二、实现分析
1、初始化led,key
led: GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
key: GPGCON |= GPG0_in | GPG3_in | GPG5_in | GPG6_in;
2、根据key的电平,设置led电平
dwDat = GPGDAT; // 读取GPF管脚电平状态
if (dwDat & (1<<0)) // K1没有按下
GPBDAT |= (1<<5); // LED1熄灭
else
GPBDAT &= ~(1<<5); // LED1点亮
if (dwDat & (1<<3)) // K2没有按下
GPBDAT |= (1<<6); // LED2熄灭
else
GPBDAT &= ~(1<<6); // LED2点亮
if (dwDat & (1<<5)) // K3没有按下
GPBDAT |= (1<<7); // LED3熄灭
else
GPBDAT &= ~(1<<7); // LED3点亮
if (dwDat & (1<<6)) // K4没有按下
GPBDAT |= (1<<8); // LED4熄灭
else
GPBDAT &= ~(1<<8); // LED4点亮
三、实现
1、伪代码
1、关闭看门狗
2、初始化led,key
3、根据key的电平设置led
2、启动实现(start.S)
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
3、c语言读取key设置led
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
/*
* LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
*/
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
/*
* K1,K2,K3,K4对应GPG0,GPG3,GPG5,GPG6
*/
#define GPG0_in (0<<(0*2))
#define GPG3_in (0<<(3*2))
#define GPG5_in (0<<(5*2))
#define GPG6_in (0<<(6*2))
int main()
{
unsigned long dwDat;
// LED1,LED2,LED3,LED4对应的4根引脚设为输出
GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
// K1,K2,K3,K4对应的4根引脚设为输入
GPGCON |= GPG0_in | GPG3_in | GPG5_in | GPG6_in;
while(1){
//若Kn为0(表示按下),则令LEDn为0(表示点亮)
dwDat = GPGDAT; // 读取GPF管脚电平状态
if (dwDat & (1<<0)) // K1没有按下
GPBDAT |= (1<<5); // LED1熄灭
else
GPBDAT &= ~(1<<5); // LED1点亮
if (dwDat & (1<<3)) // K2没有按下
GPBDAT |= (1<<6); // LED2熄灭
else
GPBDAT &= ~(1<<6); // LED2点亮
if (dwDat & (1<<5)) // K3没有按下
GPBDAT |= (1<<7); // LED3熄灭
else
GPBDAT &= ~(1<<7); // LED3点亮
if (dwDat & (1<<6)) // K4没有按下
GPBDAT |= (1<<8); // LED4熄灭
else
GPBDAT &= ~(1<<8); // LED4点亮
}
return 0;
}