ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验

实验内容:

编写GPIO模块程序,实现对FS_6818平台的上的LED灯实现。

实验目的:

熟悉开发环境的使用。

掌握FS6818处理器GPIO功能使用。

实验平台:

FS6818开发板,Ubuntu, secureCRT

实验1 LED灯实验

  1. 分析电路图

PCB板:印制电路板

sheet:原理图

FS6818底板原理图.pdf  ----------》 底板对应的原理图

FS6818核心板原理图.pdf ---------》 核心板对应的原理图

 

  1. 在PCB板上找到LED灯对应的器件所在位置,在LED灯器件的旁边

有一个器件对应的唯一的编号“RGBLED1”。

专业术语:开发板上白色的编号称为丝印,使用对器件进行标识。

每个器件的丝印在PCB板上都是唯一的。丝印在开发板原理图上,

具有唯一的对应关系。

  1. 在原理图上搜索丝印,找到LED灯对应的原理图。

专业术语::网络标号。

作用:网络标号相同的两个引脚具有电气连接属性,反映到PCB板上,

说明两个引脚通过导线连接。

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第1张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第2张图片

三极管:

三极管特性:放大特性,开关特性。

NPN:基极为高电平时,CE导通,基极为低电平时,CE截止

 

PNP:基极为高电平时,EC截止,基极为低电平时,EC导通

 

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第3张图片

MCU_CAM1_PCLK网络标号应该连接到SOC(S5P6818)的的一个GPIO引脚上。

在原理图底板上搜索“MCU_CAM1_PCLK”网络标号

在核心板原理图上继续搜索“MCU_CAM1_PCLK”网络标号,找到以下信息:

通过以上分析红色LED灯由SOC的GPIOA28引脚进行驱动。

编写程序让GPIOA28引脚输出高电平,点亮红色LED灯,

让GPIOA28引脚输出低电平,熄灭红色LED灯,

 

芯片的引脚是多功能复用引脚:

一个引脚具有多个功能,这样的引脚叫做多功能复用引脚。

使用这个引脚时,选择一个功能进行使用即可。

 

  1. 分析芯片手册

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第4张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第5张图片

 

S5P6818芯片的内存映射图,在芯片手册15.3.3章节:

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第6张图片

分析芯片手册的GPIO章节:

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第7张图片

  1. 设置GPIO引脚为GPIO功能
  2. 设置GPIO引脚为输出功能
  3. 设置GPIO引脚输出高低电平

S5P6818总共有160个GPIO引脚,将这160个引脚分成5组,每组32个引脚,

分别为GPIOA,GPIOB,GPIOC,GPIOD,GPIOE。

 

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第8张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第9张图片

  1. GPIOxOUT寄存器分析

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第10张图片

功能:设置GPIO引脚输出高低电平的

GPIOAOUT地址 = 基地址+偏移地址 = 0xC001_A000

GPIOAOUT这个寄存器管理这GPIOA这一组的32个引脚。引脚编号从0-31

因此:

GPIOAOUT[0]  -----》GPIOA0

GPIOAOUT[1]  -----》GPIOA1

GPIOAOUT[2]  -----》GPIOA2

。。。。。。

GPIOAOUT[28]  -----》GPIOA28

。。。。。。

GPIOAOUT[31]  -----》GPIOA31

 

GPIOAOUT寄存器对应的地址0xC001_A000,

给这个地址的28位写1,GPIOA28引脚输出高电平,

给这个地址的28位写0,GPIOA28引脚输出低电平。

 

 

  1. GPIOxOUTENB寄存器分析

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第11张图片

功能:设置GPIO引脚为输入模式换是输出模式

GPIOAOUTENB地址 = 基地址+偏移地址 = 0xC001_A004

GPIOAOUTENB这个寄存器管理这GPIOA这一组的32个引脚。引脚编号从0-31

因此:

GPIOAOUTENB[0]  -----》GPIOA0

GPIOAOUTENB[1]  -----》GPIOA1

GPIOAOUTENB[2]  -----》GPIOA2

。。。。。。

GPIOAOUTENB[28]  -----》GPIOA28

。。。。。。

GPIOAOUTENB[31]  -----》GPIOA31

 

GPIOAOUTENB寄存器对应的地址0xC001_A004,

给这个地址的28位写1,GPIOA28引脚为输出模式,

给这个地址的28位写0,GPIOA28引脚为输入模式。

  1. GPIOAALTFN0和GPIOAALTFN1寄存器详解

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第12张图片

功能:设置GPIO引脚功能选择寄存器

GPIOAALTFN0地址 = 基地址+偏移地址 = 0xC001_A020

 

GPIOAALTFN1地址 = 基地址+偏移地址 = 0xC001_A024

 

GPIOAALTFN0这个寄存器管理着GPIOA这一组的[15:0]引脚。

GPIOAALTFN1这个寄存器管理着GPIOA这一组的[31:16]引脚。

因此:

GPIOAALTFN0[1:0]  -----》GPIOA0

GPIOAALTFN0[3:2]  -----》GPIOA1

。。。。。。

GPIOAALTFN0[31:30]  -----》GPIOA15

 

GPIOAALTFN1[1:0]  -----》GPIOA16

GPIOAALTFN1[3:2]  -----》GPIOA17

。。。。。。

GPIOAALTFN1[31:30]  -----》GPIOA31

 

GPIOAALTFN1寄存器对应的地址0xC001_A024,

给这个地址的[25:24]位写0b00,GPIOA28引脚为GPIO功能,

在S5P6818芯片手册中搜索GPIOA28即可。

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第13张图片

 

在修改寄存器中的值是,需要保证其他的位不变。其他的位对应着其他的引脚,

其他的引脚有其他的功能,程序运行时不可以随意修改。

  1. 编写代码

 

  1. 下载调试

1》拷贝led灯的可执行文件.bin文件到windows

 

2》 开发板硬件连接

        1. 电源线插上
        2. 串口线,USB端链接电脑,串口端链接开发板的UART0端口

3》设置开发板的启动方式

       EMMC启动 :1-ON  2-OFF 3-ON

       SD/TF卡启动:1-OFF  2-OFF 3-OFF

4》打开SecureCRT串口工具

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第14张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第15张图片

 

5》开发板上电,在串口工具上会打印很多信息,最后出现一个倒计时,在倒计时减到0之前按任意键,进入一下界面。

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第16张图片

6》下载程序

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第17张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第18张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第19张图片

ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验_第20张图片

7》观察LED灯到的现象

如果需要重复下载程序,重步骤5,6即可。

main.c


// 寄存器的声明
#define  uint32_t  unsigned int 
typedef struct{
	uint32_t OUT;
	uint32_t OUTENB;
	uint32_t DETMODE0;
	uint32_t DETMODE1;
	uint32_t INTENB;
	uint32_t DET;
	uint32_t PAD;
	uint32_t RSVD;
	uint32_t ALTFN0;
	uint32_t ALTFN1;
}gpio_t;

#define  GPIOA (*(volatile gpio_t*)0xC001A000)
#define  GPIOB (*(volatile gpio_t*)0xC001B000)
#define  GPIOC (*(volatile gpio_t*)0xC001C000)
#define  GPIOD (*(volatile gpio_t*)0xC001D000)
#define  GPIOE (*(volatile gpio_t*)0xC001E000)


typedef enum{
	LED_OFF = 0,
	LED_ON,
}stu_t;

void delay_ms(unsigned int ms)
{
	unsigned int i,j;
	for(i = 0; i < ms; i++)
		for(j = 0; j < 1800; j++);
}

void hal_led_init(void)
{
	// GPIO引脚为GPIO功能
	// GPIO引脚为输出功能
	// RED   GPIOA28
	GPIOA.ALTFN1 = GPIOA.ALTFN1 & (~(0x3 << 24));
	GPIOA.OUTENB = GPIOA.OUTENB | (1 << 28);
	// GREEN  GPIOE13
	GPIOE.ALTFN0 = GPIOE.ALTFN0 & (~(0x3 << 26));
	GPIOE.OUTENB = GPIOE.OUTENB | (1 << 13);
	
	// BLUE  GPIOB12
	GPIOB.ALTFN0 = GPIOB.ALTFN0 & (~(0x3 << 24));
	GPIOB.ALTFN0 = GPIOB.ALTFN0 | (0x2 << 24);
	GPIOB.OUTENB = GPIOB.OUTENB | (1 << 12);	
}

void hal_red_led_stutes(stu_t stu)
{
	if (stu == LED_ON){
		//点亮
		GPIOA.OUT |= (1 << 28);
	}
	else {
		// 熄灭
		GPIOA.OUT &= (~(1 << 28));
	}
}
void hal_green_led_stutes(stu_t stu)
{
	if (stu == LED_ON){
		//点亮
		GPIOE.OUT |= (1 << 13);
	}
	else {
		// 熄灭
		GPIOE.OUT &= (~(1 << 13));
	}

}
void hal_blue_led_stutes(stu_t stu)
{
	if (stu == LED_ON){
		//点亮
		GPIOB.OUT |= (1 << 12);
	}
	else {
		// 熄灭
		GPIOB.OUT &= (~(1 << 12));
	}

}

int main()
{
	hal_led_init();
	while(1)
	{
		// 三色LED灯交替闪烁
		hal_red_led_stutes(LED_ON);
		delay_ms(500);
		hal_red_led_stutes(LED_OFF);
		delay_ms(500);

		hal_green_led_stutes(LED_ON);
		delay_ms(500);
		hal_green_led_stutes(LED_OFF);
		delay_ms(500);
		
		hal_blue_led_stutes(LED_ON);
		delay_ms(500);
		hal_blue_led_stutes(LED_OFF);
		delay_ms(500);
	}
	return 0;
}

 

你可能感兴趣的:(ARM平台FS6818/s5p6818开发板实验1 —— LED灯实验)