S3C2440 开发板实战(纯Ubuntu环境)(3):编译概念 + LED点亮闪烁

基于我原先有STM32等单片机的基础,内容是结合我所新学习到的知识进行书写,所以基础知识可能不会涉及到请见谅。

一、LED点亮

我们直接通过C程序对寄存器进行操作(汇编语言使用尽量少),通过原理图可看出开发板上的LED对应的GPIO口为GPF4、5、6,所以这里首先以GPF4对应的LED进行点亮,从芯片手册寻找GPF4对应的寄存器(I/O port 章节),就可以看到S3C2440芯片控制IO口对应的寄存器为下图所示:

GPIO寄存器
GPIO寄存器

然后就是和单片机操作一样,对他进行一一设置,对于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;
}

烧入程序运行现象为两个灯轮流闪烁。可以动手试试改为单个灯闪烁。太晚了在这里我就不试了。