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

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. BZOJ3262陌上花开

    三维偏序的模板. 当然各种树套树都可以搞,这里用CDQ分治弄一下. 首先利用排序使第一维有序,然后利用cdq函数开始执行类似归并排序的操作,由于左区间的第一维一定小于右区间的第一维,所以我们在归并过程 ...

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

    1.实践目标 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容 (1)简单应用SET工具建立冒名网站 (1分) apachectl start开启服务 ser ...

  3. Macbook上打开多个终端的方法

    方法有如下两种 1.首先是的焦点在终端上(使用鼠标点击下终端).然后使用快捷键command+N 即可得到另一个终端界面. (如果现在光标的焦点在浏览器上,那么就是新打开一个浏览器窗口) 2.同样,光 ...

  4. 超详细Qt5.9.5移植攻略

    本文就来介绍下如何将Qt5.9.5移植到ARM开发板上. 以imx6开发板为例,使用Ubuntu14.04虚拟机作为移植环境. 准备工作 1.主机环境:Ubuntu14.04: 开发板:启扬IAC-I ...

  5. OpenJudge计算概论-整数的个数

    /*========================================================== 整数的个数 总时间限制: 1000ms 内存限制: 65536kB 描述 给定 ...

  6. 原生JavaScript实现函数的防抖和节流

    原生JavaScript实现函数的防抖和节流 参考:https://www.jianshu.com/p/c8b86b09daf0 想详细了解的直接戳上面链接了,讲得非常清楚.下面只给代码和我自己写的注 ...

  7. ISO/IEC 9899:2011 条款6.2.6——类型的表示

    6.2.6 类型的表示 6.2.6.1 通用类型 1.所有类型的表示都是未指定的,除了在本小节所描述的之外. 2.除了位域(bit-field),对象由连续的一个或多个字节序列构成,这些字节序列的字节 ...

  8. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_01-用户认证-用户认证流程分析

    1 用户认证 1.1 用户认证流程分析 用户认证流程如下: 访问下面的资源需要携带身份令牌和jwt令牌,客户端可以通过身份认证的令牌从服务端拿到长令牌, 一会要实现认证服务请求用户中心从数据库内来查询 ...

  9. 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()

    我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...

  10. iOS使用UIImageView展现网络图片(转载)

    在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下: [cpp] view plaincopy   - (void)viewDidLoad { [sup ...