基于我原先有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:
1 2 | GPFCON &= ~(3 << 8); // 初始化 00 GPFCON |= (1 << 8); // 设置GPF4的GPFCON寄存器 01 输出 |
其中GPFCON为宏定义,代表GPFCON的地址,以及其他寄存器的定义类似如下所示
1 | #defind GPFCON *(volatile unsigned int *)(0x56000050) |
2、接着设置GPFDAT,由于我们使用的是输出引脚,所以对应的位应该置1,这从芯片手册上简介就可以看出
不做过多的解释,看就行了,然后配置他
1 2 | GPFDAT &= ~(7 << 4); GPFDAT |= (6 << 4); // GPF4对应的位 置0 |
最后来看下LED点亮的main程序
1 2 3 4 5 6 7 8 9 10 11 12 | #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函数(在函数中疯狂循环)。所以通过小小的改动即可实现流水灯操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #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; } |
烧入程序运行现象为两个灯轮流闪烁。可以动手试试改为单个灯闪烁。太晚了在这里我就不试了。