基于ARM COTEX—A9 的 流水灯实验总结

目录

实验准备:

准备知识:

GPIO至少有两个寄存器:

对引脚操作3种:

 1。GPxCON寄存器

2. GPXDAT寄存器

3. GPxUP寄存器

查用户手册的步骤:

完整代码展示:


实验准备:

Win系统电脑软件:SecureCRT 7 eclipse CDT开发环境cortex -a9开发板一块,串口线一条

实验所需手册:coreboard v2手册SEC_ Exynos 4412用户用户手册Devboard手册

准备知识:

GPIO至少有两个寄存器:

1.通用IO控制寄存器 
2.通用IO数据寄存器

注意:数据寄存器每一位都直接引导芯片,对这种寄存器中的每一位的,即每一位信号的流通方向,则可以对控制器中的对应位,比如可以设置某个管脚的属性为输入,输出或者是其他特殊功能。

ARM的几组GPIO引脚,功能相似,GPxCON控制引脚功能,GPxD用于读写引脚数据。另外,GPxUP用于确定是否使用上拉电阻.x为A,B,H / J1。输出高低电平2,检测引脚状态3中断

对引脚操作3种:

1.输出高低电平
2.检测引脚状态
3中断

 

 1。GPxCON寄存器

用于配置引脚功能。配置PORT A与PORT B~PORT H / J在功能选择上有所不同,GPACON中每一位对应一根引脚,共23 
个引脚。当某位被设为0此时我们可以在GPADAT中相应的写入1或者0来让此引脚输出高电平或者低电平;当某位被设为1时,相应引脚为地址线或用于地址控制,此时GPxDAT寄存器无用。

 一般而言GPACON通常被设为1,以便访问外部器件.PORT
 B~PORT H / J在寄存器操作方面完全相同,GPxCON中每两位控制一根引脚,00输入,01输出,10特殊功能, 11保留不用

2. GPXDAT寄存器

GPxDAT寄存器GPxDAT用于读写引脚,当引脚被设为输入时候,读此寄存器可知道相应引脚的电平状态高还是低,当引脚被设为输出时候,写此寄存器的位,令柯林斯引脚输出高电平还是低电平。

3. GPxUP寄存器

GPxUP寄存器上拉电阻作用在于,当GPIO引脚处于第三种状态时候,既不是输出高电平,也不是输出低电平。而是呈现高阻态,相当于没有接芯片。它的电平状态由上下拉电阻决定GPxUP寄存器某位为1时,相应管脚没有内部上拉电阻;为0时候相应管脚有内部上拉电

 

查用户手册的步骤:

  1.        devboard
  2.        芯板
  3.        用户手册

          在Devboard手册查找LED,查询所需要的寄存器如下:

基于ARM COTEX—A9 的 流水灯实验总结_第1张图片

我们先以设置LED2为例:发现LED2的所匹配的寄存器是CHG_FLT,下一步在核心板里面查找CHG_FLT,如下:

基于ARM COTEX—A9 的 流水灯实验总结_第2张图片

 

 找到了GPX2_7寄存器,下一步在用户手册里面查找GPX2 :,如下:

基于ARM COTEX—A9 的 流水灯实验总结_第3张图片

 

我们找到GPX2_7寄存器,如上。为了让LED2亮起来,我们要让其处于输出状态,也就是输出,从截图我们能看到,这个时候值为0x1。

 

所以设置GPIO LED2:GPX2.CON初始值为0x0000 0000要将0xf左移28位取反与上GPX2.CON在或上(0x1左移28位)

//配置GPIO,选择LED2
    GPX2.CON = GPX2.CON&〜(0xf << 28)| 0x1 << 28; OX1

//点亮LED2,(DAT控制CON亮灭)

GPX2.DAT = 1 << 7;

//灭掉LED2

GPX2.DAT = 0 << 7;

同理LED 3,LED 4,LED 5可以很轻松的配置出来。

 

完整代码展示:

/*
 * main.c
 *
 *  Created on: 2018-11-22
 *      Author: Dala达
 */

#include "exynos_4412.h"

//定义布尔型变量
typedef enum {
	false, true
} bool;

// 延时函数
void mydelay_ms(int ms) {
	int i, j;
	while (ms--) {
		for (i = 0; i < 5; i++)
			for (j = 0; j < 514; j++)
				;
	}
}
void init_led(bool flag) {
	//打开LED
	if (flag == true) {
		GPX2.DAT = 1 << 7;
		GPX1.DAT = 1;
		GPF3.DAT = 11 << 4;
		//GPX3.DAT = 1 << 5;
	}
	//关闭LED
	else {
		GPX2.DAT = 0 << 7;
		GPX1.DAT = 0;
		GPF3.DAT = 00 << 4;
		//GPF3.DAT = 0 << 5;

	}

}
void led2_init() {
	GPX2.DAT = 1 << 7;
	mydelay_ms(800);
	GPX2.DAT = 0 << 7;

}

void led3_init() {
	GPX1.DAT = 1;
	mydelay_ms(800);
	GPX1.DAT = 0;

}

void led4_init() {
	GPF3.DAT = 1 << 4;
	mydelay_ms(800);
	GPF3.DAT = 0 << 4;
}

void led5_init() {
	GPF3.DAT = 1 << 5;
	mydelay_ms(800);
	GPF3.DAT = 0 << 5;
}

int main(int argc, char **argv) {
	//配置GPIO,选择LED2
	GPX2.CON = GPX2.CON & ~(0xf << 28) | 0x1 << 28;
	//选择 LED3
	GPX1.CON = GPX1.CON & ~0xf | 0X1;
	//选择 LED4
	GPF3.CON = GPF3.CON & ~(0Xf << 16) | 0x1 << 16;
	//选择 LED4
	GPF3.CON = GPF3.CON & ~(0xf << 20) | 0x1 << 20;
	while (1) {
		//四灯齐亮

		/*init_led(true);
		mydelay_ms(600);
		init_led(false);
		mydelay_ms(600);*/

		// 流水灯

		led2_init();

		led3_init();

		led4_init();

		led5_init();


	}
}

 

 

你可能感兴趣的:(ARM实验总结)