s5p6818裸机程序的设计:以GPIO为例
为了调试方便,首先确保对于硬件的控制没有问题。
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为例的更多相关文章
- s3c2440 lcd 显示图片裸机程序
因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...
- JZ2440学习笔记之第一个裸机程序(Keil-MDK)
CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...
- JZ2440 裸机驱动 第5章 GPIO接口
本章目标: 掌握嵌入式开发的步骤:编程.编译.烧写程序.运行 通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍 S3C2440A有130个多功能输入/输出口引脚 ...
- tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一 ...
- Java学习笔记13---一个循环程序的设计范例
package welcome; import java.util.Scanner; /* * 一个循环程序的设计范例 * 首先编写仅执行一次的程序(当无循环时) * 循环的设计步骤: * 1.确定程 ...
- 基于KEIL4开发ARM9(S3C2440)的裸机程序
本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...
- Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。
#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...
- 12个优秀用户体验的移动应用程序 UI 设计
最美丽的,现代化的和惊人的移动 UI 设计就在这里.今天,我们挑选了12个来自 Behance 和 Dribbble 网站的优秀用户体验的手机界面设计.这些界面设计作品都是由世界各地的优秀设计师分享, ...
- ubuntu15.10跑裸机程序跑.bin文件
1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...
随机推荐
- 我的BO之状态控制
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 MIS常有状态 信息管理系统(MIS)常常有流程,一个流程由多个环节构成,不同的环节的流转通过状 ...
- resin初识
Resin初识 1. resin简介 刚入职的公司用的后台服务器是resin,故因此学习记录一下. resin是一个非常流行的web引用服务器,对servlet和jsp提供了良好的支持,自身采用jav ...
- IOS添加真机调试设备
注意点: 有时需要同意协议什么的,很多时候刷新出来都是白屏,解决办法: 对于不能确认新协议的问题,我发现了一个解决方法:登陆后,直接在浏览器的地址框访问:https://developer.apple ...
- Java 中的JSON 字符串
类库选择 Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库. 下面是几个常用的 JSON 解析类库: Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿 ...
- pgpool 的配置文件详解
listen_addresses = 'localhost' # Host name or IP address to listen on: # '*' for all, '' for no TCP/ ...
- 贝济埃曲线quadTo与传统的手势轨迹平滑度对比分析
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- ObjectAnimator简单示例
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 如何正确查看Linux机器内存使用情况
如何正确查看Linux机器内存使用情况 背景 只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区. 为什么top命 ...
- delete 删除指针
危险的代码: int* p=new int(1); delete p; delete p; 安全的代码: int* p=new int(1); delete p; p = NULL; ...
- PAT 甲级 1056 Mice and Rice (25 分) (队列,读不懂题,读懂了一遍过)
1056 Mice and Rice (25 分) Mice and Rice is the name of a programming contest in which each program ...