为了调试方便,首先确保对于硬件的控制没有问题。

Makefile

#         Makefile edited by Schips
# 2019-06-21 schips@dingtalk.com # 文件类型
PSFS =.c # 源文件所在目录
SRC_LIST = .
# 头文件所在目录
INCLUDE = . inc # 编译选项
CFLAGS = -nostdlib -O3 # 库路径
LDLIBS = # 库名
LIBS = # 输出文件名
TGT = demo
OTHER_CSRC =
OTHER_ASRC =
ASRC = ########################################
# 不需要改动
INC_P = -I
LIBD_P = -L
LIB_P = -l
CFLAGS += $(addprefix $(INC_P), $(INCLUDE))
LDFLAGS += $(addprefix $(LIBD_P), $(LDLIBS))
LIB_ALL += $(addprefix $(LIB_P), $(LIBS))
SRC_LIST ?= .
SRCSS += $(addsuffix /*$(PSFS), $(SRC_LIST))
CSRC += $(wildcard $(SRCSS)) OBJS = $(CSRC:$(PSFS)=.o) $(ASRC:.S=.o)
NOLINK_OBJS = $(OTHER_CSRC:$(PSFS)=.o) $(OTHER_ASRC:.S=.o)
DEPS = $(OBJS:.o=.d) $(NOLINK_OBJS:.o=.d)
BIN = $(TGT) .PHONY: clean all all: $(BIN) $(BIN): $(OBJS) $(NOLINK_OBJS)
@arm-none-linux-gnueabi-ld -Ttext 0x40000000 -o $@.elf $^
@arm-none-linux-gnueabi-objcopy -O binary $@.elf $@.bin
@arm-none-linux-gnueabi-objdump -D $@.elf > $@.dis clean:
@rm -f $(DEPS)
@rm -f $(OBJS) $(NOLINK_OBJS)
@rm *.o *.elf *.bin *.dis -f # ---------------------------------------------------------------------------
# rules for code generation
# ---------------------------------------------------------------------------
%.o: %$(PSFS)
@arm-none-linux-gnueabi-gcc -o $@ $< -c $(CFLAGS) %.o: %.S
@arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib # ---------------------------------------------------------------------------
# # compiler generated dependencies
# ---------------------------------------------------------------------------
-include $(LWOS_DEPS) $(PORT_DEPS) $(APPL_DEPS)

示例代码

/*
# schips@dingtalk.com
# https://gitee.com/schips/
# Thu 18 Jul 2019 03:33:59 PM HKT
*/ #if 1
#define TO_ADDR(addr, pos) (*((volatile unsigned int *)((addr)+ (pos))))
#else
// 测试用(能够直接确定 访问的地址是哪个)
#include <stdio.h>
#define TO_ADDR(addr, pos) (((volatile unsigned int )((addr)+ (pos))))
#endif #define SET_BIT(value, bit) ((value) |= (1 << (bit)))
#define CLR_BIT(value, bit) ((value) &= ~(1 << (bit)))
#define GET_BIT(value, bit) ((((value)>>(bit)) & 0x01)==1)
#define SET_BYTE(value, byte) ((value) |= (byte))
#define CLR_BYTE(value, byte) ((value) &= ~(byte))
#define GET_BYTE(value, byte) (((value) & (byte)) == (byte) ) #define GPIO_A_BASE 0xC001a000
#define GPIO_B_BASE 0xC001b000
#define GPIO_C_BASE 0xC001c000
#define GPIO_D_BASE 0xC001d000
#define GPIO_E_BASE 0xC001e000 #define POS_GPIO_OUT 0x00
#define POS_GPIO_ENB 0x04
#define POS_GPIO_ALTFEN0 0x20
#define POS_GPIO_ALTFEN1 0x24 #define GPIO_A_OUT TO_ADDR(GPIO_A_BASE, POS_GPIO_OUT)
#define GPIO_B_OUT TO_ADDR(GPIO_B_BASE, POS_GPIO_OUT)
#define GPIO_C_OUT TO_ADDR(GPIO_C_BASE, POS_GPIO_OUT)
#define GPIO_D_OUT TO_ADDR(GPIO_D_BASE, POS_GPIO_OUT)
#define GPIO_E_OUT TO_ADDR(GPIO_E_BASE, POS_GPIO_OUT) #define GPIO_A_OUTENB TO_ADDR(GPIO_A_BASE, POS_GPIO_ENB)
#define GPIO_B_OUTENB TO_ADDR(GPIO_B_BASE, POS_GPIO_ENB)
#define GPIO_C_OUTENB TO_ADDR(GPIO_C_BASE, POS_GPIO_ENB)
#define GPIO_D_OUTENB TO_ADDR(GPIO_D_BASE, POS_GPIO_ENB)
#define GPIO_E_OUTENB TO_ADDR(GPIO_E_BASE, POS_GPIO_ENB)
//( 0 ~ 15 )
#define GPIO_A_ALTFN0 TO_ADDR(GPIO_A_BASE, POS_GPIO_ALTFEN0)
#define GPIO_B_ALTFN0 TO_ADDR(GPIO_B_BASE, POS_GPIO_ALTFEN0)
#define GPIO_C_ALTFN0 TO_ADDR(GPIO_C_BASE, POS_GPIO_ALTFEN0)
#define GPIO_D_ALTFN0 TO_ADDR(GPIO_D_BASE, POS_GPIO_ALTFEN0)
#define GPIO_E_ALTFN0 TO_ADDR(GPIO_E_BASE, POS_GPIO_ALTFEN0)
// (16 ~ 31)
#define GPIO_A_ALTFN1 TO_ADDR(GPIO_A_BASE, POS_GPIO_ALTFEN1)
#define GPIO_B_ALTFN1 TO_ADDR(GPIO_B_BASE, POS_GPIO_ALTFEN1)
#define GPIO_C_ALTFN1 TO_ADDR(GPIO_C_BASE, POS_GPIO_ALTFEN1)
#define GPIO_D_ALTFN1 TO_ADDR(GPIO_D_BASE, POS_GPIO_ALTFEN1)
#define GPIO_E_ALTFN1 TO_ADDR(GPIO_E_BASE, POS_GPIO_ALTFEN1)
/*
//OK
*(volatile unsigned int *)(0xC001e000) &= ~(1<<13);
GPIO_E_OUT |= (1<<13);
*(volatile unsigned int *)(0xC001e000) |= (1<<13);
*/ void delay(int val); void _start(void)
{
CLR_BYTE(GPIO_E_ALTFN0, << (*)); SET_BIT(GPIO_E_OUTENB, ); while()
{
SET_BIT(GPIO_E_OUT, );
delay(0x4000000); CLR_BIT(GPIO_E_OUT, );
delay(0x4000000);
}
} void delay(int val)
{
volatile int i = val;
while(i--); } #if 0
int main(int argc, char *argv[])
{
int i = 0xf0;
printf("%x[%d] : %d\n", i, , GET_BIT(i, ));
i = SET_BIT(i, );
printf("%x\n", i); printf("%x[%d] : %d\n", i, , GET_BIT(i, ));
i = CLR_BIT(i, );
printf("%x\n", i);
printf("%x[%d] : %d\n", i, , GET_BIT(i, ));
return ;
printf("GPIO_E_BASE \t%x\n", GPIO_E_BASE );
printf("GPIO_A_OUT \t%x\n", GPIO_A_OUT );
printf("GPIO_C_OUTENB \t%x\n", GPIO_C_OUTENB);
printf("GPIO_D_ALTFN0 \t%x\n", GPIO_D_ALTFN0);
printf("GPIO_B_ALTFN1 \t%x\n", GPIO_B_ALTFN1); return ;
}
#endif

烧写方式

  软件通过uboot的tftp命令传入。由于uboot本身的问题,导致ftfp命令需要输入至少2次才能够正常工作。

  tftp以后到指定的地址 使用go命令即可

s5p6818裸机程序的设计:以GPIO为例的更多相关文章

  1. s3c2440 lcd 显示图片裸机程序

    因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...

  2. JZ2440学习笔记之第一个裸机程序(Keil-MDK)

    CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...

  3. JZ2440 裸机驱动 第5章 GPIO接口

    本章目标:     掌握嵌入式开发的步骤:编程.编译.烧写程序.运行     通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍     S3C2440A有130个多功能输入/输出口引脚 ...

  4. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  5. Java学习笔记13---一个循环程序的设计范例

    package welcome; import java.util.Scanner; /* * 一个循环程序的设计范例 * 首先编写仅执行一次的程序(当无循环时) * 循环的设计步骤: * 1.确定程 ...

  6. 基于KEIL4开发ARM9(S3C2440)的裸机程序

    本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...

  7. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  8. 12个优秀用户体验的移动应用程序 UI 设计

    最美丽的,现代化的和惊人的移动 UI 设计就在这里.今天,我们挑选了12个来自 Behance 和 Dribbble 网站的优秀用户体验的手机界面设计.这些界面设计作品都是由世界各地的优秀设计师分享, ...

  9. ubuntu15.10跑裸机程序跑.bin文件

    1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...

随机推荐

  1. 深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    打破双亲委派模型 JNDI JNDI 的理解   JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一 ...

  2. 2018-2019-2 网络对抗技术 20165202 Exp7 网络欺诈防范

    博客目录 一.实践目标 二.实践内容 简单应用SET工具建立冒名网站 (1分) ettercap DNS spoof (1分) 结合应用两种技术,用DNS spoof引导特定访问到冒名网站.(1.5分 ...

  3. RT-Thread 柿饼GUI

    目前主流的嵌入式GUI开发技术中,RT-Thread/Persimmon.TouchGFX和emWin是最受人瞩目的.   RT-Thread/ Persimmon是国内主导开发的实时线程操作系统RT ...

  4. VVDocumenter-Xcode

      从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性.因此Xcode版本更新之后需要在VVDocumenter-Xcode的Info.plist文件中添加Xcode的UUID. 步骤 ...

  5. requests与urllib.request

    requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...

  6. 013-多线程-基础-Fork/Join框架、parallelStream讲解

    一.概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 它同ThreadPoolExecut ...

  7. (十)java虚拟机性能监控工具

    一. jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息.语法格式如下: 命令行参数选项说明如下: 1.1 案例 ...

  8. shutter 安装和设置快捷键

    1. 打开系统设置 2. 打开 Keyboard 键盘设置 3. 添加成功的状态 4. 单击右侧 Disabled,然后快速按下 Ctrl+Alt+A 如下图 5. Ctrl+Alt+A 测试OK. ...

  9. WPF引入OCX控件

    (方法一) https://www.cnblogs.com/guaniu/archive/2013/04/07/3006445.html (方法二) 1.先注册OCX控件:(有的把OCX 控件封装到E ...

  10. 红绿灯 promise和原始方式实现

    Promise 方式 async+await function sleep(duration){ return new Promise(function(resolve){ setTimeout(re ...