2020.3.18-19

裸机点亮LED可以分为三步:

  • 看原理图,确定控制LED的引脚

  • 看芯片手册,确定如何设置/控制引脚

  • 编写驱动程序

一.硬件知识

1.LED原理图

原理图将LED抽象化,就像下面这样:

LDE的电阻一般很小,而电压一般为3.3V,这样以来电流就很大了,为了避免LED被大电流烧坏,需要给LED串联一个保护电阻。

然而电路中不是依靠我们手动打开电路开关的,可以通过芯片的引脚电平输出3.3V来点亮LED :

或者如下,控制芯片引脚输出0V来点亮LED:

当引脚的驱动能力不足时(电压不够3.3V),可以使用三极管。

如示,只要引脚输出电压满足三极管导通,就可以使3.3V电压加在LED上,这里引脚的输出控制三极管的导通,从而控制3.3V电压在LED上的导通,间接实现了引脚高电平点亮LED:

如示,这种情况,引脚输出1.2V低电压,使第一个三极管导通,这样俩个三极管的连接点电压就接近于0(导通了第一个三极管的GND),这样第二个三极管就不能导通,LED处于熄灭状态;反之,当引脚输出低电平时,俩个三极管之间有电压,第二个三极管导通,点亮LDE,间接实现了引脚低电平点亮LED:

简单来说,主芯片引脚输出高电平或者低电平,即可改变LED的状态。

但是我们不关心GPIO引脚输出的电压是3.3V还是1.2V,我们只关注输出的是高电平还是低电平,即输出的逻辑电平是1还是0!

2.芯片手册

Ⅰ.找LED原理图

先找出JZ2440的LED原理图,可以看出,LED是低电平点亮的:

Ⅱ.找对应引脚

根据同名的nLED 1(n表示低电平有效)的信息找出,与之相连的GPIO引脚,可以看出与GPF4引脚相连:

Ⅲ.在芯片手册中查找引脚信息

这时候打开JZ2440的芯片手册来查看引脚说明,看出总共有8组引脚,GPF4:

然后查看GPF4引脚所支持功能:

可以看出GPF4引脚可以作为通用IO引脚,也可以作为外部中断触发引脚。

Ⅳ.查看寄存器说明

可以通过配置寄存器使GPF4输出相应电平:

1.先配置为输出引脚模式

2.再设置引脚状态

这个与STM32的引脚配置类似

在芯片手册中转到GPFx引脚的配置寄存器说明:

可以看出主要是由俩个寄存器来控制:GPFCON(配置寄存器)、GPFDAT(数据寄存器)

可以得知GPFCON的信息:

  • 起始地址:0X56000050

  • 可读可写

  • 复位值为0

  • 可以配置引脚的模式:

GPFDAT的信息:

  • 起始地址:0X56000054
  • 可读可写
  • 可以配置引脚的输出电平:

Ⅴ.配置寄存器

所以要想点亮LED1,只需要使GPF4输出低电平,可以在GPF4的GPFCON寄存器中的对应位写入01(代表输出)、在GPFDAT寄存器的对应位中写入0(代表低电平)!

也就是在:
0X56000050地址中写入0X100

0X5600054地址中写入0

二.S3C2440框架与启动过程

S3C2440的核心是SOC, SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既MCU(51,avr)那样有内置RAM、ROM同时又像MPU那样强大,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一) 。

S3C2440中的SOC框架大体如下:

可以看出,有:CPU、GPIO控制器、SRAM、Nand FLASH控制器,外面还有Nor FLASH、Nand FLASH。

前面了解了,一般裸机的程序都是烧录在Nor FLASH中,也就是程序的bin文件存储在Nor FLASH中,而且起始地址为Nor FLASH的0位。

大多数的ARM芯片都是从0地址启动的:

  • 以Nor FLASH方式启动时,Nor FLASH基地址就为0,SRAM地址为0X4000,000,这是因为SRAM大小为4K,CPU会之间从Nor FLASH中读取执行指令。
  • 以Nand FLASH方式启动时,硬件会把Nand FLASH的前4K内容复制到SRAM中,然后CPU从SRAM读取执行指令,此时SRAM的基地址就是0。

另外,CPU内部还有一些寄存器,当CPU访问内部寄存器时,之间按照寄存器名字就可以,当CPU访问CPU外部寄存器,比如GPIO控制器中的GPFDAT寄存器时,就要从地址来访问了。

三.要用到的软件

1.远程登陆工具 MobaXterm

MobaXterm是一个全功能的终端软件。支持SSH连接,支持FTP、串口等协议。

这个软件可以通过建立SSH连接远程登陆Ubuntu(前提是Ubuntu是开着的),前提是Ubuntu中安装了ssh。Ubuntu中安装SSH,并开启SSH的命令行如下:

sudo apt install ssh
sudo /etc/init.d/ssh start

完成之后,打开 MobaXterm的SSH登录界面:

输入远程登陆的Ubuntu的IP地址和用户名,端口默认为22

打开后输入登陆密码就可以远程登陆Ubuntu了:

2.FTP传输工具FileZilla

使用FileZilla可以将Windows下编写好的程序文件传输到Ubuntu中,由arm-linux-gcc交叉编译工具将程序编译为可执行文件,bin文件,然后传回Windows,在Windows下烧录进裸机。

FileZilla登录界面如下,可以之间将文件传到Ubuntu中:

3.交叉编译工具arm-linux-gcc

之前在Linux中,只要使用gcc就可以生成可执行文件,但gcc仅仅适用于PC机,要想在ARM板子上运行程序,就要生成ARM可执行的文件,这个时候就用到Linux中的交叉编译工具arm-linux-gcc了

四.编写点亮LED的程序

1.汇编语言版

要知道,能够使机器识别的语言只有0、1,也就是二进制语言,也就是机器码(一般以十六进制显示),所以程序最终都是转化为机器码执行的。

然鹅,程序员所编写的一般是C语言,或者是汇编语言,这些代码都是要经过编译器的编译后的得到机器码,然后存储在内存中,CPU会通过读写这些机器码来执行相关的程序。

所以,编写程序可以使用汇编语言,一般是C语言写的,这里体会一下汇编语言的魅力。

涉及到的汇编代码:

  • LDR(load):读内存命令

  • STR(store):写内存命令

  • B:跳转

  • MOV(move):赋值

用法如下:

LDR R0,[x]   ;读取地址x开始的四个字节的数据,赋值给R0
LDR R0,=0X12345678 ;伪指令,会被拆分成几条真正的ARM指令
STR R0,[x] ;把R0的值写到地址x
MOV R0,R1 ;把R1的值赋值给R0
MOV R0,#0X4a ;把0X4a 赋值给R0

出现伪指令的原因是:ARM是32位的,一次只能操作32位的指令,指令中不仅包含了值,还包含了操作对象的信息,所以当赋值过大时,就会拆分为几次指令,来实现。

0X56000050地址中写入0X100

0X5600054地址中写入0

汇编.S代码为:

.text
.global _start _start:
ldr r1, =0X56000050
ldr r0, =0X100
str r0, [r1] ;将0X100写入寄存器地址0X56000050 ldr r1, =0X56000054
ldr r0, =0
str r0, [r1] ;将0写入寄存器地址0X56000054 halt:
b halt ;死循环在这里

接下来就是把.S代码通过FileZilla上传到Ubuntu中,经过交叉编译后,返回Windows,再由oflash烧写进S3C2440

我们可以通过交叉编译工具的反汇编,来查看我们编写的汇编代码的机器码形式:


可以看出,我们反汇编所得到的汇编码与我们的不同,这是因为我们编写汇编语言的时候用到了伪指令,而反汇编的时候已经转换为汇编语言的正规军了。此外也可以查看机器码与汇编码的关系,可以通过手册来查看汇编代码与机器码之间的关系,更进一步加深我们对程序的理解。

2.C语言版

C语言实现点亮LED,通过对GPF4的对应寄存器地址实现操作来。

C的main函数如下:

int main(void)
{
/* 寄存器的地址是32位,所以采用无符号整型数据类型(32位) */
unsigned int *GPFCON = (unsigned int*)0X56000050;
unsigned int *GPFDAT = (unsigned int*)0X56000054; *GPFCON = 0X100; //[9:8]=01
*GPFDAT = 0; //都为0 }

看起来和我们平常写的代码没有什么区别,仔细看一下,发现少了头文件:#include <stdio.h>

这是因为我们不需要C的stdio库,我们只是利用了C语言中的指针,对内存地址进行赋值而已。

但问题来了,main函数中的指针指向的地址以何为标准???main函数中也没有指明,而且烧录之后,ARM又是怎么调用main函数呢???

所以还有写一个引导程序,用汇编写一个引导程序的作用有俩点:

  • 确定地址在ARM内存中的起始位置,也就是分配内存空间
  • 引导ARM加载main函数

写的汇编代码如下:

.text
.global _start _start: ;程序从这里开始执行
ldr sp, =4096 ;利用sp栈指针确定程序运行的内存空间,Nand启动时前4K是片内内存 bl main ;跳转执行main函数 halt:
b halt

然后通过FTP软件将.c文件和.S文件传到Ubuntu中,利用交叉编译工具将C文件和S文件分别编译,然后链接起来,最后生成.bin文件,再传回主机,通过oflash将持续烧写到Nand FLASH。

一切就绪后,LED可以正常点亮。

这就是裸机开发的流程。

S3C2440—3.用点亮LED来熟悉裸机开发的详细流程的更多相关文章

  1. S3C2440—1.熟悉裸机开发板

    文章目录 一.板载资源介绍 二.安装驱动及上位机 1.USB的驱动及上位机 2.eop驱动安装 3.安装烧录软件oflash 三.烧写开发板 1.预备知识 2.烧写裸板 3.使用u-boot烧写程序 ...

  2. ARM学习篇一 点亮LED

    要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该 ...

  3. C语言版——点亮LED灯,深入到栈

    在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...

  4. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  5. 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

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

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

  7. Mini2440上的第一个程序——点亮Led

    手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习. 我使用的是友善之臂的Mini2440开发板.韦东山的<嵌入式Linux应用开发完成手册>及其视频 ...

  8. Arduino 极速入门系列–1 点亮 LED

    本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...

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

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

随机推荐

  1. php 扩展kafka

    一.安装librdkafka cd /usr/local/src/ git clone https://github.com/edenhill/librdkafka.git cd librdkafka ...

  2. Windows软件包管理工具:Scoop

    前言 删库跑路后,Windows系统如何快速安装应用程序,部署环境呢? 以前想过这个问题,最近在安装Hugo时发现使用软件包管理工具可以解决这个问题. 阅读建议 首先需要测试下载速度,尝试从官网下载, ...

  3. Linux | 管首命令符号

    简介 管道的意思,在我们日常生活中,意思就是运输一个东西,到下一个地方,所以说 管道命令符 的使用也是差不多的,也是运送一段数据到下一个地方,格式:命令A | 命令B | 命令C .... 所以说,管 ...

  4. 前端-Vue基础2

    1.过滤器 前台通过后台传值,要对后台传过来的变量进行特殊处理,比如根据id转成中文等: 1.1 局部过滤器 局部过滤器只针对一个Vue实例 默认将|左侧count传递给右侧方法 {{count|fi ...

  5. ssh服务两句话

    ssh服务采用"非对称密钥系统":主要通过两把不一样的公钥和密钥来进行加密与解密的过程 公钥(Public Key):提供给远程主机进行数据加密 私钥(Private Key):远 ...

  6. [003] - JavaSE面试题(三):JavaSE语法(1)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [003] - JavaSE面试题(三):JavaSE语法(1) 第1问:& 和 & ...

  7. vue 快速入门 系列 —— vue loader 扩展

    其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...

  8. 传统二三层转发融合SDN Openflow协议的Hybrid交换机转发流程

    Hybrid 交换系统(以下简称Hybrid 交换机)是交换机融合了OVS(Openflow vswitch)原生代码,集传统和Openflow 技术于一体的转发系统.主要解决纯Openflow 基于 ...

  9. Pelles C编译时出现的“POLINK: fatal error: 拒绝访问”问题的一种可能成因

    在使用PellesC编译程序时,第一遍能正常编译执行,第二遍就无法编译,出现以下问题提示: Building NEWprogram2.exe. POLINK: fatal error: 拒绝访问. * ...

  10. ifix vba 读取计算机中的txt文件,截取字符串显示

    利用vba脚本,使用Scripting.FileSystemObject对象可以实现对文本文件的操作,下面以一个朋友的实际例子为例将截获的字符串进行页面显示. Private Sub CommandB ...