一、前言
本篇使用华清远见的FS4412开发板
,首先使用C语言
对寄存器进行封装,在进行流水灯实验
,通过本次实验来认识ARM开发板的封装原理。
阅读本篇前需要上一节的基础:
ARM篇四–简单使用汇编点亮LED
二、准备工作
FS4412开发板
,我用的是华清远见的FS4412开发板- ubuntu下linux操作系统(包含交叉编译工具)
serial-com8
程序烧入执行工具- 开发板电路原理图、芯片手册
- 开发程序模板
开发板资料、交叉编译工具、程序烧入工具下载(包含教程)
开发板可选择到华清远见官网进行租赁。
三、寄存器封装
寄存器控制LED亮灭的C语言函数
int main()
{
*(unsigned int *)0x11000C40 = 0x10000000; //GPX2CON寄存器
while(1)
{
*(unsigned int *)0x11000C44 = 0x00000080; //GPX2DAT寄存器
delay(1000000);
*(unsigned int *)0x11000C44 = 0x00000000;
delay(1000000);
}
return 0;
}
可以看出单独使用寄存器控制硬件有很多的弊端,包括不易维护、查看不变等,因此需要对寄存器进行封装。
首先,由于引脚的CON、DAT、PUD、DRV
寄存器都是连续的存放在内存的,所有可以用一个结构体
来包含四个寄存器(结构体内元素地址连续),使用时,用一个具体的地址来引出结构体内的元素。
typedef unsigned int u32;
typedef int u16;
typedef struct
{
u32 CON;
u32 DAT;
u32 PUD;
u32 DRV;
}gpx;
对于具体的地址,我们使用define
进行封装,例如
#define GPX_BASH 0x11000000
#define GPF_BASH 0x11400000
#define GPX1_ADDR (GPX_BASH + 0x0C20)
在使用define进行使用封装
#define GPX1 (*(gpx *)GPX1_ADDR)
因此当我们需要配置一个引脚的CON寄存器
时,就可以这样写
GPX2.CON = (0x1<<28);
这样就可以根据直接对寄存器进行控制了。
GPX2.CON
= *(unsigned int *)0x11000C40
在工程模板库文件夹2中的exynos_4412.h
文件对我们以后需要用到的寄存器进行了封装。
这就相当于我们学习51单片机用到的头文件。
四、电路原理图
引脚分别是GPX2_7
、GPX1_0
、GPF3_4
、GPF3_5
。
五、实验程序
void delay(long int i) //延时函数
{
while(i--);
}
typedef unsigned int u32;
typedef int u16;
typedef struct
{
u32 CON;
u32 DAT;
u32 PUD;
u32 DRV;
}gpx;
#define GPX_BASH 0x11000000
#define GPF_BASH 0x11400000
#define GPX1_ADDR (GPX_BASH + 0x0C20)
#define GPX2_ADDR (GPX_BASH + 0x0C40)
#define GPF3_ADDR (GPF_BASH + 0x01E0)
#define GPX1 (*(gpx *)GPX1_ADDR)
#define GPX2 (*(gpx *)GPX2_ADDR)
#define GPF3 (*(gpx *)GPF3_ADDR)
int main()
{
//LED2_init
GPX2.CON = (0x1<<28);
GPX2.DAT &= ~(1<<7);
//LED3_init
GPX1.CON |= 0x1;
GPX1.DAT &= ~1;
//LED4_init
GPF3.CON |= (0x1<<16);
GPF3.DAT &= ~(1<<4);
//LED5_init
GPF3.CON |= (0x1<<20);
GPF3.DAT &= ~(1<<5);
while(1)
{
GPX2.DAT |= (1<<7); //灯亮
delay(1000000);
GPX2.DAT &= ~(1<<7); //灯灭
delay(1000000);
GPX1.DAT |= 1;
delay(1000000);
GPX1.DAT &= ~1;
delay(1000000);
GPF3.DAT |= (1<<4);
delay(1000000);
GPF3.DAT &= ~(1<<4);
delay(1000000);
GPF3.DAT |= (1<<5);
delay(1000000);
GPF3.DAT &= ~(1<<5);
delay(1000000);
}
}
六、实验效果
到这里就结束啦!