平台:jz2440

作者:庄泽彬(欢迎转载,请注明作者)

说明:韦东山一期视频学习笔记

一、我们首先来做第一个实验,用汇编语言点亮板子上的LED。

1.1 LED的原理图

从下面的原理图可知LED1是连接到芯片的GPF4

                       

1.2 相关的GPIO寄存器的配置

我们要点亮LED,就要把相关的端口配置成输出口,并且输出低电平。看看芯片手册,要GPF4输出低电平要配置GPFCON寄存器设置相应的位位01即为输出状态,在配置GPFDAT相应的位为0即可输出低电平。

1.3相关代码:

led_on.S文件
 .text
.global _start
_start:
LDR R0,=0x56000050 @ 设置R0为GPFCON寄存器
@ 用于配置端口的输入、输出状态 mov R1,#0x00000100
str R1,[R0] @ 设置GPF4端口为输出口 ldr R0,=0x56000054 @ 设置R0为GPFDAT寄存器
@ 用于配置端口输出的高低电平 mov R1,#0x00000100
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 0x00000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm led_on.bin led_on_elf *.o

1.4 执行结果

看一下图片LED是点亮了啊。

二、我们升级一下上一个程序,我们使用C语言的方式点亮LED灯.

2.1 我们要设置好C语言的运行环境,要关闭看门狗以及设置栈,函数的参数都是存放在栈里的,因此要用C语言的方式点亮LED,把栈设置好是很重要的。

查看芯片手册关闭看门狗的方法:

往WTCON寄存器写入0即可关闭

栈指针的设置:

目前我们的开发板是设置nandflash启动的,启动的时候会拷贝nandflash的前4K的内容到芯片内部的ram中运行,因此栈指针的范围不要超过4K

2.2相关代码

crt0.S

 .text
.global _start
_start: ldr R0,=0x53000000 @ 设置为看门狗寄存器地址 mov R1,#0x0
str R1,[R0] ldr sp,=* @ 设置的sp范围不要超过4K bl main halt_loop:
b halt_loop

led_on_c.c

 #define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) int main()
{
GPFCON = 0x00000100; //配置GPF4为输出口
GPFDAT = 0x00000000; //输出低电平 return ;
}

Makefile

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 0x00000000 -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_elf led_on_c.dis led_on_c.bin *.o

2.3 编译与执行结果

执行make生成我们的目标文键led_on_c.bin,led_on_c.dis是反汇编文件

现象跟上一次的实验一下,这里就不贴图了啊。

3.1在修改一下上面的例子,改成流水灯

其他的文件我们保持不变只修改led_on_c.c,这个只是应用编程,想怎么改都ok,

led_on_c.c源码:

 #define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPF4_OUT (1<<(4*2))
#define GPF5_OUT (1<<(5*2))
#define GPF6_OUT (1<<(6*2)) void delay(volatile unsigned long delay)
{
for (;delay > ;delay --);
} int main()
{
unsigned long i = ; GPFCON = GPF4_OUT|GPF5_OUT|GPF6_OUT; //配置为输出端口 while(){
delay();
GPFDAT = (~(i<<));
if (++i == ){
i = ;
}
} return ;
}

效果图如下:

  

  

 三、我们在做另外一个实验用按键来控制LED灯的亮灭,

3.1按键连线

 key0  --- GPF0

 key1  --- GPF1

    key3  --- GPG3

GPG寄存器的地址如下图,需要注意的是,我们的按键是配置成输入引脚。

3.2相关代码

crt0.S

 .text
.global _start
_start: ldr R0,=0x53000000 @ 设置为看门狗寄存器 mov R1,#0x0
str R1,[R0] ldr SP,=* @ 设置栈指针 bl main
halt_loop:
b halt_loop

key_leds.c

 #define GPFCON    (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064) //LED1,LED2,LED3
#define GPF4_OUT (1<<(4*2))
#define GPF5_OUT (1<<(5*2))
#define GPF6_OUT (1<<(6*2)) #define GPF4_MASK (3<<(4*2))
#define GPF5_MASK (3<<(5*2))
#define GPF6_MASK (3<<(6*2)) //KEY1,KEY2,KEY3
#define GPF0_IN (0<<(0*4))
#define GPF2_IN (0<<(2*4))
#define GPG3_IN (0<<(3*4)) #define GPF0_MAKS (3<<(0*2))
#define GPF2_MAKS (3<<(2*2))
#define GPG3_MAKS (3<<(3*2)) int main()
{
unsigned long key_status; //LED设置为输出引脚
GPFCON = GPFCON & ~(GPF4_MASK|GPF5_MASK|GPF6_MASK);
GPFCON = GPFCON | (GPF4_OUT|GPF5_OUT|GPF6_OUT);
//KEY设置为输入引脚
GPFCON = GPFCON & ~(GPF0_MAKS|GPF2_MAKS);
GPFCON = GPFCON | (GPF0_IN|GPF2_IN); GPGCON = GPGCON & ~(GPG3_MAKS);
GPGCON = GPGCON | GPG3_IN; while(){
key_status = GPFDAT; if (key_status & (<<))
GPFDAT |= (<<);
else
GPFDAT &= ~(<<); if (key_status & (<<))
GPFDAT |= (<<);
else
GPFDAT &= ~(<<); key_status = GPGDAT; if (key_status & (<<))
GPFDAT |= (<<);
else
GPFDAT &= ~(<<);
}
return ;
}

Makefile

 key_leds.bin:crt0.S key_leds.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o key_leds.o key_leds.c
arm-linux-ld -Ttext 0x00000000 -g crt0.o key_leds.o -o key_leds_elf
arm-linux-objcopy -O binary -S key_leds_elf key_leds.bin
arm-linux-objdump -D -m arm key_leds_elf > key_leds.dis
clean:
rm *.o *.bin *.dis key_leds_elf

实验现象:

  

相关的代码大家可以从我的github账号上下载:

https://github.com/zzb2760715357/100ask

目录结构如下:

  

JZ2440裸机点亮LED【学习笔记】的更多相关文章

  1. Raspberry PI 系列 —— 裸机点亮LED灯

    Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...

  2. Tiny6410 裸机开发--裸机点亮LED

    环境搭建 由于我不喜欢使用虚拟机,双系统无法同时烧程序.最近才折腾好Windows10下编译和下载程序,使用的是韦东山做的easy open jtag,资料十分齐全,之前使用jlink搭建环境碰到了一 ...

  3. 一、2440裸机点亮led

    从代码開始(先写一个像普通单片机一样的代码): /********led.c************************/ #define GPFCON  (*(volatile unsigned ...

  4. jz2440移植QT5.6【学习笔记】【原创】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 交叉编译工具:arm-linux-gcc (GCC)4.4.3 linux:linu3.4.2 PC环境:ubuntu18.04 一.修改/o ...

  5. S3C2440—3.用点亮LED来熟悉裸机开发的详细流程

    文章目录 一.硬件知识 1.LED原理图 2.芯片手册 Ⅰ.找LED原理图 Ⅱ.找对应引脚 Ⅲ.在芯片手册中查找引脚信息 Ⅳ.查看寄存器说明 Ⅴ.配置寄存器 二.S3C2440框架与启动过程 三.要用 ...

  6. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  7. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

  8. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  9. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

随机推荐

  1. python入门(四):标准输出和文件读写

    Python输出 1.表达式语句 str(): 函数返回一个用户易读的表达形式,可以使用 str.format() 函数来格式化输出值. repr(): 产生一个解释器易读的表达形式. 2.print ...

  2. java的Date类型转换为MySQL数据库的Date类型

    最近遇到一个问题,需要把java中的日期类型存放为MySQL数据库的日期类型,两个日期之间需要进行转化才能进行存储,转化代码如下: package com.alphajuns.demo1; impor ...

  3. Http服务器实现文件上传与下载(五)

    一.引言 欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Conte ...

  4. IE的文档模式, 及Textarea呈现bug一例

    做了个非常简单的页面, 仅有几行html代码, 内容如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtm ...

  5. 7.15;linux命令

    麦克维瀑布 https://farm5.staticflickr.com/4269/34749113172_d6c1ba274a_k.jpg ----------------------------- ...

  6. webpack 构建项目入门

    参考http://www.cnblogs.com/eyunhua/p/6398885.html ---------------------------------------------------- ...

  7. delphi -----TListView的用法

    层次关系: TListView:           ->Columns:           ->Items  : -->TListItems:                   ...

  8. cygwin简介,安装及卸载(体验UNIX & Linux环境)

    对于爱好者或初学者来说,为了体验UNIX & Linux环境,去安装虚拟机或双系统稍显麻烦,cygwin是一个很好的选择 具/原料   安装windows的电脑一台(可以联网) 法/步骤   ...

  9. 原!总结 quartz集群 定时任务 测试运行ok

    由于项目优化重构,想将定时任务从quartz单机模式变成集群或分布式的方式.于是,百度了一圈....修修改改...用集群的方式部署定时任务,测试可以... 集群?分布式?什么区别? 集群:同一个业务, ...

  10. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...