S5P6818裸机编程(点灯和按键点灯)步骤和详解

2023-05-16

一、分析LED的原理图

这里写图片描述

二、裸机编程的思路

分析原理图,理解硬件的控制原理—>找到控制LED的GPIO—>查找CPU的使用手册,找到控制GPIO的寄存器—>理解寄存器的控制原理—>编写程序,通过寄存器的地址来访问寄存器。

三、寄存器

CPU使用:SEC_S5P6818X_Users_Manual_preliminary_Ver_0.00.pdf (S5P6818说明手册)

1、引脚功能配置寄存器

可以将一个引脚配置成普通的GPIO,引脚的功能对应关系,需要查看手册的第二章。

这里写图片描述

这里写图片描述

2、设置GPIO为输入/输出模式

这里写图片描述

3、GPIO输出电平的设置寄存器

当一个普通GPIO设置成输出后,可以通过这个寄存器设置输出的电平

这里写图片描述

4、检测GPIO输出的电平寄存器

当一个引脚配置成输入引脚后,通过这个寄存器读取引脚输入的电平

这里写图片描述

四、LED控制程序的流程(以GPIOE13控制D7为例)

寄存器分析:
这里写图片描述

1、将控制引脚配置成普通的GPIO
(0xC001E020) GPIOEALTFN0[27:26] = 00b

2、将GPIO配置成输出模型
(0xC001E004) GPIOEOUTENB[13]=1b

3、让GPIO输出低电平,LED亮
(0xC001E000) GPIOEOUT[13] = 0b

4、让GPIO输出高电平,LED灭
(0xC001E000) GPIOEOUT[13] = 1b

六、编译裸机程序步骤

1、写程序和Makefile文件

程序:

// GPIOE13 ---- D7

//寄存器的定义
#define     GPIOEOUT        (*(volatile unsigned int *)0xC001E000)  //GPIOEOUT-->寄存器的内容
#define     GPIOEOUTENB     (*(volatile unsigned int *)0xC001E004)
#define     GPIOEALTFN0     (*(volatile unsigned int *)0xC001E020)
#define     GPIOEALTFN1     (*(volatile unsigned int *)0xC001E024)


//裸机程序不能使用标准C库,如果要使用,需要移植标准C库

void delay(unsigned value);

//裸机程序的入口是_start(),_start()需要放在源文件的最开始位置
void _start(void)
{
    //1、将控制引脚配置成普通的GPIO, GPIOEALTFN0[27:26] = 00b  
    GPIOEALTFN0 &= ~(3<<26);

    //2、将GPIO配置成输出模型 ,GPIOEOUTENB[13]=1b
    GPIOEOUTENB |= (1<<13);

    while(1)
    {
        //3、让GPIO输出电平取反,LED反转
        GPIOEOUT ^= (1<<13);

        delay(0x2000000);
    }
}

void delay(unsigned value)
{
    while(value--); 
}

Makefile 文件程序

led.bin: demo1.o 
    arm-none-linux-gnueabi-ld -Ttext 0x40000000 -o led.elf $^
    arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
    arm-none-linux-gnueabi-objdump -D led.elf > led.dis 
%.o : %.S
    arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib

%.o : %.c
    arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib

clean:
    rm *.o *.elf *.bin *.dis -f

Makefile 详解图片:

这里写图片描述

2、Ubuntu上编译程序

将写好的C程序和Makefile放在一个文件里面,放在Ubuntu的共享目录里,然后用make进行编译生成一些文件。(arm-none-linux-gnueabi-gcc)

3、将编译好的led.bin 文件传入到开发板中

注意:
1、因为Linux系统中不能跑裸机程序,所以需要在u-boot中跑程序(即开发板启动后,需进入u-boot界面,在进入Linux操作系统前按键使进入u-boot界面)

2、uboot中是否有网卡驱动?

(有网卡驱动时是这样显示的)
这里写图片描述

如果没有,需要更新系统。
下载程序有问题
1)uboot网卡驱动是否安装
2)uboot的IP设置是否正确
3)关闭wifi
4)windows防火墙
5)tftp服务器是否有问题。

3、只能用tftp软件进行传输,所以需要在u-boot界面中配置好IP地址。

4、GPIO口的配置
设置GPIO功能的寄存器有两个

首先可以打印出当前IP信息:
X6818# printenv
gatewayip=192.168.7.1
ipaddr=192.168.7.5   ---->GEC6818开发板的IP
netmask=255.255.254.0
serverip=192.168.7.3   ---->TFTP服务器的IP

设置IP信息:
setenv   ----->设置环境变量
X6818# setenv bootdelay 5
X6818# setenv ipaddr 192.168.7.5
X6818# setenv serverip 192.168.7.3
X6818# setenv gatewayip 192.168.7.1
X6818# saveenv
Saving Environment to MMC...
Writing to MMC(2)... done

使用tftp将led,bin下载到GEC6818上的DDR3内存的0x40000000地址上。
X6818# tftp 0x40000000 led.bin //一般需要传两次

4)执行这个裸机程序

X6818# go 0x40000000
## Starting application at 0x40000000 ...

5、现象

可以用裸机编程点亮cortex A53 开发板的LED灯!

这里写图片描述

下面是按键点灯的代码:

//寄存器的宏定义
#define                  GPIOAALTFN1    (*(volatile unsigned int *)0xC001A024) //功能选择寄存器1
#define         GPIOAOUTENB (*(volatile unsigned int *)0xC001A004)     //选择输入还是输出寄存器 
#define                  GPIOAPAD_28        ((*(volatile unsigned int *)0xC001A018) & (1<<28))  //读取某位的电平的寄存器

#define                  GPIOBALTFN1    (*(volatile unsigned int *)0xC001B024)
#define                  GPIOBALTFN0    (*(volatile unsigned int *)0xC001B020)
#define         GPIOBOUTENB (*(volatile unsigned int *)0xC001B004)
#define                  GPIOBPAD_31        ((*(volatile unsigned int *)0xC001B018) & (1<<31))
#define                  GPIOBPAD_30        ((*(volatile unsigned int *)0xC001B018) & (1<<30))
#define                  GPIOBPAD_9          ((*(volatile unsigned int *)0xC001B018) & (1<<9))

#define     GPIOCALTFN0     (*(volatile unsigned int *)0xC001C020)
#define     GPIOCALTFN1     (*(volatile unsigned int *)0xC001C024)
#define     GPIOCOUTENB     (*(volatile unsigned int *)0xC001C004)
#define     GPIOCOUT        (*(volatile unsigned int *)0xC001C000)  

#define     GPIOEOUT        (*(volatile unsigned int *)0xC001E000)  //GPIOEOUT-->输出寄存器的内容
#define     GPIOEOUTENB     (*(volatile unsigned int *)0xC001E004)
#define     GPIOEALTFN0     (*(volatile unsigned int *)0xC001E020)
#define     GPIOEALTFN1     (*(volatile unsigned int *)0xC001E024)

//裸机程序不能使用标准C库,如果要使用,需要移植标准C库

void delay(unsigned value);

//裸机程序的入口是_start(),_start()需要放在源文件的最开始位置
void _start(void)
{
    //1、LED灯GPIO模式的配置
    GPIOEALTFN0 &= ~(3<<26);  //GPIOE13的配置 将控制引脚配置成普通的GPIO
    GPIOCALTFN1 |= (1<<17);    //GPIOC17的配置 将控制引脚配置成普通的GPIO
    GPIOCALTFN0 |= (1<<7);     //GPIOC7的配置 将控制引脚配置成普通的GPIO
    GPIOCALTFN0 |= (1<<8);      //GPIOC8的配置 将控制引脚配置成普通的GPIO

    //    LED灯输入输出类型的配置
    GPIOEOUTENB |= (1<<13);   //将GPIOE13配置成输出模型 ,GPIOEOUTENB[13]=1b
    GPIOCOUTENB |= (1<<17);   //将GPIOC17配置成输出模型
    GPIOCOUTENB |= (1<<7);    //将GPIOC7配置成输出模型
    GPIOCOUTENB |= (1<<8);    //将GPIOC8配置成输出模型

    //2、按键GPIO模式的配置  
    GPIOBALTFN1  |= (1<<30) ;       //KEY4配置  将控制引脚配置成普通的GPIOB31
    GPIOBALTFN1  |= (1<<28) ;       //KEY3配置  将控制引脚配置成普通的GPIOB30
    GPIOAALTFN1  &= ~(3<<24) ;    //KEY2配置  将控制引脚配置成普通的GPIOA28
    GPIOBALTFN0  &= ~(3<<18) ;    //KEY6配置  将控制引脚配置成普通的GPIOB9

    //    按键输入输出类型的配置
    GPIOBOUTENB &= ~(1<31) ;  //KEY4配置   将GPIOB31配置成输入模型 
    GPIOBOUTENB &= ~(1<30) ;  //KEY3配置   将GPIOB30配置成输入模型 
    GPIOAOUTENB &= ~(1<28) ;  //KEY2配置   将GPIOA28配置成输入模型 
    GPIOBOUTENB &= ~(1<9) ;   //KEY6配置    将GPIOB9配置成输入模型 


    while(1)
    {
        if(  GPIOBPAD_31 == 0 )    //  KEY4 控制 GPIOE led灯的亮灭
        {
            delay(0x200);
            if(  GPIOBPAD_31  == 0 )
            {
                while( GPIOBPAD_31  == 0);    //等待按键松开
                GPIOEOUT ^= (1<<13);         //让GPIOE13 反转电平    
            }
        }

        if(  GPIOBPAD_30 == 0 )    //  KEY3 控制 GPIOC17 led灯的亮灭
        {
            delay(0x200);
            if(  GPIOBPAD_30  == 0 )
            {
                while( GPIOBPAD_30  == 0);    //等待按键松开
                GPIOCOUT ^= (1<<17);         //让GPIOC17 反转电平
            }
        }

        if(  GPIOAPAD_28 == 0 )    //  KEY2 控制 GPIOC8 led灯的亮灭
        {
            delay(0x200);
            if(  GPIOAPAD_28  == 0 )
            {
                while( GPIOAPAD_28  == 0);    //等待按键松开
                GPIOCOUT ^= (1<<8);      //让GPIOC8 反转电平 
            }
        }

        if(  GPIOBPAD_9 == 0 )    //  KEY6 控制 GPIOC7 led灯的亮灭
        {
            delay(0x200);
            if(  GPIOBPAD_9  == 0 )
            {
                while( GPIOBPAD_9  == 0);    //等待按键松开
                GPIOCOUT ^= (1<<7);           //让GPIOC7 反转电平    
            }
        }
    }
}

//延时函数
void delay(unsigned value)
{
    while(value--); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

S5P6818裸机编程(点灯和按键点灯)步骤和详解 的相关文章

  • MyBatis Mapper代理开发

    文章目录 1 数据库准备2 创建一个maven项目 xff0c 导入mysql驱动坐标和mybatis坐标3 在resources目录下创建配置文件4 在resources目录下创建sql映射文件5 定义mapper接口6 修改配置文件中s
  • spring开启事务

    文章目录 1 概述2 环境准备2 1 spring整合mybatis2 2 添加dao service 在service方法中调用dao方法实现转账效果 2 3 数据库准备 3 不开启事务实现转账3 1 创建测试类 Demo 3 2 运行结
  • spring事务管理原理

    1 环境准备 spring如何开启事务 2 原理 在上面链接文章中吗 xff0c 我们通过A向B转账500在不开启事务情况下 xff0c reduceMoney方法和addMoney分别开启2个不同的事务 xff0c 因此在发生异常后会出现
  • spring事务相关配置之propagation

    文章目录 1 概述2 环境准备2 1 spring整合mybatis2 2 数据库准备2 2 1 account表2 2 2 log表 2 3 创建dao service并开启spring事务2 3 1 AccountDao2 3 2 Lo
  • spring事务相关配置之rollback

    文章目录 1 概述2 环境准备3 使用 96 rollbackFor 96 1 概述 我们知道当开启spring事务后 xff0c 如果出现异常 xff0c 那么数据库数据会进行回滚 但是并不是所有异常都会回滚因此我们可以使用rollbac
  • ios 音频录音、上传至7牛、播放及其与android兼容的问题

    iOS录音使用AVAudioRecorder xff0c 播放用 AVPlayer 就可以很好的解决 xff0c 网上也有很多的教程 这里就不细讲 xff0c 后面会附上代码 先说一下demo内容 xff0c 现在项目要求做一个录音 上传
  • 数据库

    1 查询选修1号课程的学生学号和成绩 xff0c 并要求对查询结果按成绩的降序排列 xff0c 如果成绩相同则按学号的升序排列 Select sno grade From sc Where cno 61 1 Order by grade D
  • linux内存测试工具memtester使用详解

    memtester官网 xff1a http pyropus ca software memtester linux安装 xff1a 下载安装包 1 wget http pyropus ca software memtester old v
  • Mybatis-plus使用pagehelper进行分页

    DROP TABLE IF span class token class name EXISTS span user span class token punctuation span CREATE span class token cla
  • Linux系统迁移(将配置好的系统安装到其它电脑上)

    Linux系统迁移 说在前面 xff1a 下面有几个教程链接 xff0c 我都是通过这几个链接来完成的系统备份与系统恢复 并且遇到过一些问题 xff0c 踩过一些坑 建议先看完我的说明再进行操作 xff0c 少走弯路 没有图是因为下面分享的
  • Linux上用code blocks写fortran代码

    Linux上用code blocks写fortran代码 用GNU带的fortran编译器编译 xff0c 居然出现错误 xff0c undifined reference to gfortran write st 在我删掉了这个proje
  • 字符串相关操作————2015小米笔试内容

    这个是一道小米公司2015的笔试题 xff1a 回文数 xff1a 一个字符串从前看和从后看如果一样的话 xff0c 就是回文串 比如 上海自来水来自上海 就是一个回文串 现在 xff0c 把一个数字看成一个字符串 xff0c 问他是不是一
  • 信息学奥赛C++语言:百钱买百鸡

    题目描述 百钱买百鸡问题 鸡翁一 xff0c 值钱五 xff0c 鸡母一 xff0c 值钱三 xff0c 鸡雏三 xff0c 值钱一 xff0c 百钱买百鸡 xff0c 问鸡翁 鸡母 鸡雏各几何 xff1f xff08 公鸡一只5块 xff
  • 业务运营支撑系统  BOSS(Business & Operation Support System)。

    BOSS名称是由中国移动联合多家咨询公司为传统电信企业 计费系统起的专门名称 xff0c 是世界上第一个对电信计费系统命名并制定相关标准 该系统由电信部门的计费系统发展而来 xff0c 基本功能包括用户资料管理 计费 出帐 结算等 xff0
  • 【C语言】10个数字按照从小到大进行排序(冒泡法)

    include lt stdio h gt main int a 10 61 5 2 4 25 13 11 7 8 0 12 需要进行排序的10个数字 int i j t for i 61 1 i lt 10 i 43 43 for j 6
  • 解决VS2015无法打开WinSock2.h,无法找到ws2_32.lib

    现象 xff1a VS2015无法找到ws2 32 lib xff0c 无法打开WinSock2 h以及nldef h文件 项目使用的SDK是Windows 8 1 SDK xff0c 使用everything在本地搜了一下确实没有找到8
  • apache-options配置之Indexes

    配置 Options Indexes FollowSymLinks Indexs的配置的作用是如果不存在Index html文件的时候 xff0c 将该目录下的文件树列出来 一般在线上使用
  • Ubuntu-有线网络无法上网的问题解决方法汇总

    转载别人的 xff0c 写的很详细很全 xff0c 值得收藏 https blog csdn net u010025211 article details 75043216 另外 xff0c 说一下在设置静态IP时 xff0c 点击右上角的
  • 【跨域问题】Access to XMLHttpRequest at ‘http://xxxx.com/xxx’ from origin ‘null’ has been blocked by

    错误描述 xff1a 项目中写了一个上传图片的接口 xff1b 给到别人使用出现这个错误 xff0c 具体分析原来是跨域报错 xff1b ajax调用接口出现 xff1a Access to XMLHttpRequest at http x
  • 搭建 公网FTP服务器 外网访问

    我是在ubuntu 20 04 上配置的 xff0c 需要用到公网IP 没有公网IP的 xff0c 可以考虑花生壳这类应用来做内网穿透 1 配置FTP服务器 安装vsftpd sudo apt install vsftpd sudo vim

随机推荐