【Linux】ARM篇五--C语言寄存器封装与流水灯实验



一、前言

本篇使用华清远见的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_7GPX1_0GPF3_4GPF3_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);

	}
}

六、实验效果

在这里插入图片描述


到这里就结束啦!
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值