实验内容:
编写GPIO模块程序,实现对FS_6818平台的上的LED灯实现。
实验目的:
熟悉开发环境的使用。
掌握FS6818处理器GPIO功能使用。
实验平台:
FS6818开发板,Ubuntu, secureCRT
PCB板:印制电路板
sheet:原理图
FS6818底板原理图.pdf ----------》 底板对应的原理图
FS6818核心板原理图.pdf ---------》 核心板对应的原理图
有一个器件对应的唯一的编号“RGBLED1”。
专业术语:开发板上白色的编号称为丝印,使用对器件进行标识。
每个器件的丝印在PCB板上都是唯一的。丝印在开发板原理图上,
具有唯一的对应关系。
作用:网络标号相同的两个引脚具有电气连接属性,反映到PCB板上,
说明两个引脚通过导线连接。
三极管:
三极管特性:放大特性,开关特性。
NPN:基极为高电平时,CE导通,基极为低电平时,CE截止
PNP:基极为高电平时,EC截止,基极为低电平时,EC导通
MCU_CAM1_PCLK网络标号应该连接到SOC(S5P6818)的的一个GPIO引脚上。
在原理图底板上搜索“MCU_CAM1_PCLK”网络标号
在核心板原理图上继续搜索“MCU_CAM1_PCLK”网络标号,找到以下信息:
通过以上分析红色LED灯由SOC的GPIOA28引脚进行驱动。
编写程序让GPIOA28引脚输出高电平,点亮红色LED灯,
让GPIOA28引脚输出低电平,熄灭红色LED灯,
芯片的引脚是多功能复用引脚:
一个引脚具有多个功能,这样的引脚叫做多功能复用引脚。
使用这个引脚时,选择一个功能进行使用即可。
S5P6818芯片的内存映射图,在芯片手册15.3.3章节:
分析芯片手册的GPIO章节:
S5P6818总共有160个GPIO引脚,将这160个引脚分成5组,每组32个引脚,
分别为GPIOA,GPIOB,GPIOC,GPIOD,GPIOE。
功能:设置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引脚输出低电平。
功能:设置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引脚为输入模式。
功能:设置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即可。
在修改寄存器中的值是,需要保证其他的位不变。其他的位对应着其他的引脚,
其他的引脚有其他的功能,程序运行时不可以随意修改。
1》拷贝led灯的可执行文件.bin文件到windows
2》 开发板硬件连接
3》设置开发板的启动方式
EMMC启动 :1-ON 2-OFF 3-ON
SD/TF卡启动:1-OFF 2-OFF 3-OFF
4》打开SecureCRT串口工具
5》开发板上电,在串口工具上会打印很多信息,最后出现一个倒计时,在倒计时减到0之前按任意键,进入一下界面。
6》下载程序
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;
}