基于我原先有STM32等单片机的基础,内容是结合我所新学习到的知识进行书写,所以基础知识可能不会涉及到请见谅。
一、LED点亮
我们直接通过C程序对寄存器进行操作(汇编语言使用尽量少),通过原理图可看出开发板上的LED对应的GPIO口为GPF4、5、6,所以这里首先以GPF4对应的LED进行点亮,从芯片手册寻找GPF4对应的寄存器(I/O port 章节),就可以看到S3C2440芯片控制IO口对应的寄存器为下图所示:
然后就是和单片机操作一样,对他进行一一设置,对于LED的电量只要利用GPFCON和GPFDAT寄存器这两就行,
1. 首先对GPFCON进行设置,查找GPFCON表找到GPF4,如下所示:
很简单,我们的IO口只是要做输出,所以我们设置为01=output:
GPFCON &= ~(3 << 8); // 初始化 00
GPFCON |= (1 << 8); // 设置GPF4的GPFCON寄存器 01 输出
其中GPFCON为宏定义,代表GPFCON的地址,以及其他寄存器的定义类似如下所示
#defind GPFCON *(volatile unsigned int *)(0x56000050)
2、接着设置GPFDAT,由于我们使用的是输出引脚,所以对应的位应该置1,这从芯片手册上简介就可以看出
不做过多的解释,看就行了,然后配置他
GPFDAT &= ~(7 << 4);
GPFDAT |= (6 << 4); // GPF4对应的位 置0
最后来看下LED点亮的main程序
#define GPFCON *(volatile unsigned int *)(0x56000050)
#define GPFDAT *(volatile unsigned int *)(0x56000054)
int main(void)
{
GPFCON &= ~(3 << 8); // 初始化 00
GPFCON |= (1 << 8); // 设置GPF4的GPFCON寄存器 01 输出
GPFDAT &= ~(7 << 4); // 全部IO口初始化不输出
GPFDAT |= (6 << 4); // GPF4对应的位 置1
return 0;
}
然后配套上章节中的Strat.S文件,在程序的结尾上引用该main函数就可以实现LED的点亮了
二、LED流水灯
在单片机中的流水灯是通过delay函数(在函数中疯狂循环)。所以通过小小的改动即可实现流水灯操作
#include "s3c2440_soc.h"
void my_delay(volatile int d)
{
while(d--);
}
int main(void)
{
uart0_init();
int val =0x0001;
GPFCON &= ~((3 << 8) | (3 << 10) | (3 << 12));
GPFCON |= ((1 << 8) | (1 << 10) | (1 << 12));
while(1)
{
GPFDAT &= ~(7 << 4);
GPFDAT |= (val << 4);
val = val << 1;
if(val == 0x8)
val = 0x0001;
my_delay(300000);
}
return 0;
}
烧入程序运行现象为两个灯轮流闪烁。可以动手试试改为单个灯闪烁。太晚了在这里我就不试了。