韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯
搜索开发板原理图LED的走线

LED8是网线接口的指示灯.
在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册


有原理图可知,如果需要点亮LED1,需要控制s3c2440的GPF4引脚输出低电平.
GPFCON = 0x56000050
GPFDAT = 0x56000054
GPFUP = 0x56000058
=========================
直接set 0x56000050 = 0x100 设置GPF4为引脚为输出模式
set 0x56000054 0x00 设置GPF4输出电平为0
set 0x56000058 0x10 不使能GPF4内部拉高
这样就可以控制改灯常亮,汇编应该怎么写?
1. 通过汇编点亮一个LED
代码:
.text
.global _start
_start:
LDR R0,=0x56000050 @ 这是个内存操作命令, 先将寄存器的地址装入R0中
@
@
MOV R1,#0x00000100 @ 将0x00赋值给R1
STR R1,[R0] @ 内存的反向操作, 将R1的值存到R0地址处. 括号代表类似于取指针 LDR R0,=0x56000054 @ 同样操作
@
MOV R1,#0x00000000 @
@
STR R1,[R0] @
MAIN_LOOP: @ 死循环
B MAIN_LOOP
Makefile
led_on.bin : led_on.S # 编译的顺序 -- 预处理, 编译, 汇编, 链接
arm-linux-gcc -g -c -o led_on.o led_on.S # 汇编
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf #链接并指定运行地址
arm-linux-objcopy -O binary -S led_on_elf led_on.bin #将ELF格式的可执行文件转换成二进制文件
clean:
rm -f led_on.bin led_on_elf *.o
上电,通过tftp下载, tftp 0x3000000 led_on.bin
go 0x3000000, 可以看到有一个led点亮了.测试成功.
2. 通过c点亮一个LED
要通过汇编来调用c函数
crt0.S
.text
.global _start @系统起来会先从_start开始跑
_start:
ldr r0, =0x53000000 @ 这个寄存器是WATCHDOG控制寄存器, 需要写0来关闭看门狗,不然会一直重启,为什么全汇编的时候不需要做硬件初始化?
mov r1, #0x0
str r1, [r0] @ ldr sp, =* @ 因为s3c2440有4k大的内部RAM,将栈的位置设在这里
@
bl main @ 跳到main函数然后返回,往下执行halt_loop
halt_loop:
b halt_loop
c文件
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) int main()
{
GPFCON = 0x00001000; //
GPFDAT = 0x00000000; // return ;
}
Makefile
led_on_c.bin : crt0.S led_on_c.c #编译的目标为 led_on_c.bin 需要依赖 crt0.S led_on_c.c 这两个文件
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis
clean:
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
tftp 30000000 led_on_c.bin
nand erase bootloader
nand write 0x30000000 bootloader
选择从nand启动, 重启开发板
韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯的更多相关文章
- 韦东山嵌入式Linux学习笔记02--如何给开发板烧录程序
购买韦东山嵌入式开发板jz2440 v3会标配两根usb线和一根网线,OpenJtag需要单独购买, 我暂时还没买到该工具. 下面介绍usb烧录以及通过网线烧录程序. 1.usb烧录程序: 借助DNW ...
- 韦东山嵌入式Linux学习笔记03--如何搭建软件环境
1. 从网上下一个虚拟机,比如vmvare station 2.下一个ubuntu镜像回来安装, 我下了14.04来安装.参考链接: https://blog.csdn.net/qq1326702 ...
- 韦东山嵌入式Linux学习笔记08--中断体系结构
中断是什么? 举个栗子, 系统怎么知道你什么时候插入鼠标这个设备? 可以有两种处理方式: 1. 查询方式: 轮询去检测是否有设备插入; 2. 中断的方式 当鼠标插入这个事件发生时, 置位某个寄存器,告 ...
- 韦东山嵌入式Linux学习笔记07--Nandflash
常用的flash有两种, Norflash和Nandflash, 前几年市场上的产品比较常见的方案时Norflash和Nandflash搭配使用, 因为norflash比较昂贵,相同的容量norfla ...
- 韦东山嵌入式Linux学习笔记05--存储管理器
SDRAM: 原理图如下: jz2440 v3开发板上面用的内存芯片为钰创科技公司生产的EM63A165TS,一片内存大小为32MB大小,一共有两块,共64MB的大小. SDRAM接 ...
- 韦东山嵌入式Linux学习笔记01--转载: 板子ping不通PC怎么办
请参考链接:https://blog.csdn.net/u013490896/article/details/71250060 我的环境: window 10 jz2440 v3 我采用的连接方式如下 ...
- 韦东山 嵌入式linux教程 笔记
@ 目录 资源链接 一.常用命令 二.shell 三.如何更改PATH? 四.路径 五.vi编辑器 六.进阶命令 七.NAT配置网络 (第2篇-P34) 八.开发板挂载 Ubuntu 的 NFS 目录 ...
- 嵌入式Linux学习笔记之第一阶段---基础篇
嵌入式Linux学习分五个阶段 第一阶段: 01嵌入式环境搭建初期 02C语言语法概述 03C语言内存操作 04c语言函数 05linux基础 06gun基础 第二阶段: 01-linux之io系统编 ...
- 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...
随机推荐
- js解析后台传过来的json
java ,action public void print(String rs){ PrintWriter out; try { HttpServletResponse response = Ser ...
- FTP\SFTP连接命令
五.ftp连接 输入:ftp 10.18.49.19 2121六.输入账号密码 zhangsan/sdjg34t#七.输入:ls 查看文件是否上传 如上传 输入:bye ...
- 关于docker安装、docker镜像、docker容器等
1.Ubuntu安装docker sudo apt install docker.io 注意以下命令需在root下进行 sudo -s 2.查看docker当前容器 docker ps -a 3.启动 ...
- delphi中and和or的特殊用法
1=1 10=2 100=4 1000=8 1 or 2 = 3(11); 1 and 3 = 1; 2 and 3 = 2; 2 or 4 = 6(110); 2 and 6 = 2; 4 and ...
- POJO是什么,javabean是什么,以及POJO与javabean的区别
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称.使用POJO名称是为了避免和EJB混淆起来, 而 ...
- docker pull / docker login 报错 Error response from daemon: Get https://registry-1.docker.io/v2/: x509
docker pull 和 docker login 的时候报错 Error response from daemon: Get https://registry-1.docker.io/v2/: x ...
- Python学习之初识
第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏-->段落-->选择标题 1.1.2 有序列表与 ...
- 对JavaScript事件处理程序/事件监听器的设定的简单介绍
下面是一些对事件处理进行设定的方式. 指定为HTML元素的属性(事件处理程序) 指定为DOM元素的属性(事件处理程序) 通过EventTarget.addEventListener()进行指定(事件监 ...
- 吉首大学2019年程序设计竞赛(重现赛)-K(线段树)
题目链接:https://ac.nowcoder.com/acm/contest/992/K 题意:给一个大小为1e5的数组,由0 1组成,有两种操作,包括区间修改,将一段区间内的0换成1,1换成0; ...
- PTA(Basic Level)1026.程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间.这个时间单位是 clock ...