实验1 —— 点亮一个LED

1.看原理图确定硬件如何连接

原理图中表示了芯片控制LED的硬件电路以及芯片的引脚与LED如何连接。

2. 看主芯片手册确定如何控制引脚

具体:如何让GPF4输出高低电平?

2.1.配置GPF4为输出模式(GPFCON)

设置GPFCON寄存器的第[9:8]位=0b01。

2.2.配置GPF4输出高/低电平(GPFDAT)

GPFDAT的第4位为0-低电平,1-高电平。(注:corresponding,相应的)

3.汇编程序访问寄存器控制LED

3.1.编辑程序

@ brief:点亮连接在GPF4的LED

@ author:mculover666

@ date:2019/3/1

.text

.global _start

_start:

@ 设置GPFCON寄存器,GPF4为输出模式

LDR R0,=0x56000050

LDR R1,=0x0100

STR R1,[R0]

@ 设置GPFDAT寄存器,GPF4输出低电平

LDR R0,=0X56000054

LDR R1,=0

STR R1,[R0]

@程序暂停

halt:

B halt

3.2.编译程序

汇编为二进制目标文件

arm-linux-gcc -c led_on.s -Wall -o led_on.o

链接为可执行文件elf

arm-linux-ld -Ttext 0 led_on.o -o led_on.elf

转换为bin文件

arm-linux-objcopy -O binary -S led_on.elf led_on.bin

整个编译步骤可编写为一个makefile:

TARGET = led_on

#输出所有warning

CFLAGS = -Wall

$(TARGET).bin:$(TARGET).elf

arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin

$(TARGET).elf:$(TARGET).o

arm-linux-ld -Ttext 0 $(TARGET).o -o $(TARGET).elf

$(TARGET).o:$(TARGET).s

arm-linux-gcc -c $(TARGET).s $(CFLAGS) -o $(TARGET).o

clean:

rm -rf *.o *.elf *.bin

download_to_nand:

#下载到nand flash

oflash 0 1 0 0 0 $(TARGET).bin

3.3.烧写程序

使用oflash烧写bin文件到Nand Flash的0地址:

oflash 0 1 0 0 0 .\led_on.bin

3.4.运行程序

设置启动开关选择为Nand启动;

重新上电;

实验结果

4.C程序访问寄存器控制LED

4.1.运行C程序的前提——启动文件

C语言入口函数是main()函数,main函数由启动文件(刚上电时执行的汇编程序)来调用;

在调用时会进行压栈操作,调用完毕进行出栈操作,所以需要设置好栈顶指针SP;

main函数调用完毕返回启动文件调用处。

启动文件start.s:初始化C语言运行环境,引入C程序

@ brief:S3C2440启动文件

@ author:mculover666

.text

.global_start

_start:

@ 关闭看门狗

LDRR0,=0x53000000

MOVR1,#0

STRR1,[R0]

@ 设置栈顶指针SP(从Nand启动)

LDR SP,=4096

@ 调用main函数,保存返回地址,转入C程序

BLmain

@ main函数返回,程序暂停

halt:

Bhalt

4.2.编写C程序——指针+位操作

int main(void)

{

/* 设置GPFCON寄存器,配置GPF4引脚为输出模式 */

*(unsigned int *)0x56000050 &= ~(3<

*(unsigned int *)0x56000050 |= 1<

/* 设置GPFDAT寄存器,GPF4输出低电平,点亮LED */

*(unsigned int *)0x56000054 &= ~(1<<4);

/* 程序暂停 */

while(1);

}

4.3.编译

TARGET = led_on

CFLAGS = -Wall#输出所有warning

$(TARGET).bin:$(TARGET).elf

arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin

#注意:启动文件必须第一个链接

$(TARGET).elf:start.o $(TARGET).o

arm-linux-ld -Ttext 0 start.o $(TARGET).o -o $(TARGET).elf

$(TARGET).o:$(TARGET).c

arm-linux-gcc -c $(TARGET).c $(CFLAGS) -o $(TARGET).o

start.o:start.s

arm-linux-gcc -c start.s $(CFLAGS) -o start.o

clean:

rm -rf *.o *.elf *.bin

download_to_nand:

#下载到nand flash

oflash 0 1 0 0 0 $(TARGET).bin

4.4.烧写运行

oflash 0 1 0 0 0 .\led_on.bin

实验2 —— 按键检测

1.看原理图确定硬件如何连接

2. 看主芯片手册确定如何控制引脚

2.1.配置GPF0为输入模式(GPFCON)

2.2.读取GPF0的状态(高/低电平)(GPFDAT)

3.C程序访问寄存器检测按键

3.1.编写程序

int main(void)

{

volatile int GPF0_state;

/* 设置GPFCON寄存器 */

//设置GPF4为输出

*(unsigned int *)0x56000050 &= ~(3<

*(unsigned int *)0x56000050 |= (1<

//设置GPF0为输入

*(unsigned int *)0x56000050 &= ~(3<

/* 程序死循环检测按键 */

while(1)

{

/* 读取GPFDAT寄存器 */

GPF0_state = *(unsigned int *)0x56000054;

/* 检测GPF4引脚的状态 */

if(GPF0_state & 0x01)

{

//按键未按下,上拉电阻拉为高电平,熄灭LED

*(unsigned int *)0x56000054 |= (1<<4);

}

else

{

//按键按下,低电平,点亮LED

*(unsigned int *)0x56000054 &= ~(1<<4);

}

}

}

3.2.编译程序

TARGET = key_scan

CFLAGS = -Wall#输出所有warning

$(TARGET).bin:$(TARGET).elf

arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin

#注意:启动文件必须第一个链接

$(TARGET).elf:start.o $(TARGET).o

arm-linux-ld -Ttext 0 start.o $(TARGET).o -o $(TARGET).elf

$(TARGET).o:$(TARGET).c

arm-linux-gcc -c $(TARGET).c $(CFLAGS) -o $(TARGET).o

start.o:start.s

arm-linux-gcc -c start.s $(CFLAGS) -o start.o

clean:

rm -rf *.o *.elf *.bin

download_to_nand:

#下载到nand flash

oflash 0 1 0 0 0 $(TARGET).bin

3.3.烧写程序运行

oflash 0 1 0 0 0 .\led_on.bin

实验1、2总结

通过这两个实验:

在S3C2440这颗处理器方面,掌握了:

如何控制S3C2440的GPIO引脚:输出高低电平和检测外部输入电平(GPFCON寄存器和GPFDAT寄存器)

5条常用的ARM汇编指令:MOV、LDR、STR、BL、B;

编写汇编程序的基本格式;

在C语言方面,掌握了:

在启动文件中汇编是如何转入C语言的:BL调用main函数;

调用函数需要大量的使用栈,体现出启动时设置栈顶指针SP的重要性;

使用C语言指针访问寄存器,使用C语言位操作语法改变寄存器数据;

在开发工具方面,掌握了:

arm-linux-gcc系列工具和makefile的使用;

Mculover666

博客专家

发布了167 篇原创文章 · 获赞 506 · 访问量 21万+

私信

关注

标签:bin,03,LED,TARGET,elf,裸机,start,linux,arm

来源: https://blog.csdn.net/Mculover666/article/details/88058160

s3c2440汇编语言,S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)相关推荐

  1. STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效

    STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效 点亮LED GPIO初始化函数:GPIO_Init() GPIO电平操作库函数:GPIO_WriteHigh().GPIO_ ...

  2. 蓝牙芯片nRF51822开发系列(一):环境搭建和GPIO使用(点亮LED)

    蓝牙芯片nRF51822开发系列(一):环境搭建和GPIO使用(点亮LED) 前言(文章末尾获取工程源码) 一.开发必备 二.开发环境搭建 1.创建文件 2.新建工程 三.编写代码 GPIO详解 使用 ...

  3. arm裸机【4】 --- 一步步点亮LED(一)

    目录 1. 一步步点亮LED1_硬件工作原理及原理图查阅 2.数据手册查阅及相关寄存器浏览 3.从零开始手写汇编点亮LED a.GPxCON.GPxDAT寄存器分析 b.从零开始写代码操作寄存器 c. ...

  4. stm8s: GPIO配置,点亮LED!PB4,PB5引脚LED点不亮

    最近两天在做STM8S103的开发,调完硬件后,就开始编写软件了,第一步当然又是点亮LED灯了,结果很尴尬的死活点不亮!后来各种百度,认真查看数据手册,才发现一个很大的坑,由于粗心大意,没有看到,做个 ...

  5. 树莓派教程 - 1.0 树莓派GPIO库wiringPi 点亮LED

    Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git 电脑需要提前安装的工具: SSH.串口 - 终端神器 MobaXterm,官网下载链接:ht ...

  6. S3C2440之裸机之C语言按键点亮LED灯

    虚拟机环境:Oracle VM VirtualBox Linux系统:ubuntu_14.04.6 交叉编译工具:[100ask分享的所有文件](https://eyun.baidu.com/s/3b ...

  7. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

  8. ARM裸机篇(五)——异常和中断

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  9. 一些解密必备知识(2)- 基础篇03|解密系列

    一些解密必备知识(2)- 基础篇03 让编程改变世界 Change the world by program   软件安全是信息安全领域的重要内容,本系列视频教程将涉及到软件相关的加密.解密.逆向分析 ...

  10. PEInfo编程思路讲解03 - 工具篇03|解密系列

    PEInfo编程思路讲解03 - 工具篇03 让编程改变世界 Change the world by program   软件安全是信息安全领域的重要内容,本系列视频教程将涉及到软件相关的加密.解密. ...

最新文章

  1. Redis学习笔记02--主从数据库配置
  2. 怎样才不浪费IP的价值?
  3. Dotnet Core IHttpClientFactory深度研究
  4. 载波恢复算法 Blind Phase Search 算法(盲相位搜索算法 BPS算法)
  5. 站在信息安全角度 人脸识别面临五大问题
  6. Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
  7. 解决word错误提示宏错误提示和模板错误提示
  8. gcc 找不到 boot python 链接库的问题: /usr/bin/ld: cannot find -lboost_python
  9. 使用SecureCRT在远程主机和本地之间传输文件
  10. c语言调试的意义,C语言的调试
  11. 海思烧录工具HiTool的使用方法以及烧录uboot
  12. A(AI)、B(BigData)、C(Cloud)通俗介绍
  13. iphone双重认证关闭不了怎么办_Apple id双重认证,没有关闭的选项?
  14. 战神引擎传奇手游源码【诛仙玛法单职业五大陆】
  15. 将VMware与SoftICE基于网络的远程调试功能相结合
  16. 1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数
  17. 树莓派云台舵机怎么用_基于树莓派的多舵机控制的定位拍照云台
  18. js-array数组-slice-splice
  19. Android加载预览PDF文件
  20. Android开发--使用实体类解析JSON文本

热门文章

  1. 用css设置多段背景色
  2. 牛客小白月赛2 J.美
  3. Excel如何动态获取某个产品最新的库存信息
  4. python中平方_python中平方
  5. nebula模拟器_Nebula街机模拟器使用方法 Nebula街机模拟器怎么用
  6. L4RE学习笔记——服务介绍
  7. C语言 数据结构 线性循环队列 基本操作代码
  8. cocos2d-x打飞机实例总结
  9. 美国卡内基梅隆大学计算机排名,美国卡内基梅隆大学世界排名情况
  10. JAVA 学习第三天 Scanner顺序\选择\循环结构!