附件和代码:
所有的裸板程序,都是要根据手册来编写。
那要控制灯的开关的话,
就要先找到相关管脚,再找控制管脚的寄存器,最后配置参数。
(1)找控制灯的管脚,
(2)找控制管脚的寄存器,
(3)配置参数。
那么我们的步骤就是这样:
1.在底板原理图,去找到这些管脚,ctrl+f全盘搜索led:
2.在核心板原理图,找控制这些脚的寄存器,ctrl+f全盘搜索nled:
3.最后发觉原来控制led的寄存器是GPB寄存器!!
那么我们应该继续去s3c2440手册,找这个寄存器,找到他们的寄存器的控制方式,ctrl+f全盘搜索GPB:
4.发觉:
GPBCON:是控制输入输出等其他的控制方式
GPBDAT:是控制数据,高低电平
GPBUP :是控制上下拉电阻
5. 按照上面那一幅图来说的话,由于右端已经是高电平了,
根据二极管特性,只要把左边置地的话,电流就会导通,
那么二极管就会发亮的了。
那我们现在就产生对寄存器有2个主要的步骤:
1.把GPBCON设置为输出的控制方式
2.把GPBDAT设置为置地,即低电平
参考代码:
流水灯:led.s:
AREA led, CODE, READONLY
ENTRY
IMPORT main
start
ldr sp, =0x34000000
bl main
loop
b loop
END
led_c.c:
#define GPBCON (*(volatile unsigned long*)0x56000010)
#define GPBDAT (*(volatile unsigned long*)0x56000014)
#define GPBUP (*(volatile unsigned long*)0x56000018)
#define WATCHDOG (*(volatile unsigned long*)0x53000000)
void wait(unsigned long num)
{
for(; num > 0; num--);
}
int main(void)
{
unsigned long i = 1;
unsigned long j = 5;
GPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));//清零,避免:GPBCON本来是"10",出现相或变成"11"的这种情况
GPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16);//设置为输出端口,不改变其它位的内容
WATCHDOG = 0;//关了看门狗,要不可能会出现自动复位。
//可以自行测试:注释上面一行,看流水灯流,循环流几次就会出现状况的了
while(1)//循环流水灯
{
wait(30000);
GPBDAT = (~(i<<j));//设置灯变为低电平,不改变其它位的的内容
if(j > 7)
j = 5;
else j = j + 1;
}
return 0;
}