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

发布者:GoldenSerenity最新更新时间:2020-04-11 来源: eefocus关键字:S3C2440  点亮LED  裸机开发 手机看文章 扫描二维码
随时随地手机看文章

裸机点亮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


这是因为我们不需要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  点亮LED  裸机开发 引用地址:S3C2440—3.用点亮LED来熟悉裸机开发的详细流程

上一篇:十五.ARM裸机学习之I2C通信详解
下一篇:第一个ARM裸机程序

推荐阅读最新更新时间:2024-11-10 16:59

S3C2440裸机程序【2】串口uart程序
学习ARM7芯片stm32时,裸机程序开发可以很方便的根据库函数在工程模板上进行开发,而ARM9主要是移植Linux开发,很少有裸机程序开发,因此在玩S3C2440希望最终形成一个keil环境下的模板。用的淘宝上的JZ2440v2板子,因为是裸机程序开发其他板子都一样。 S3C2440.s是keil自动生成的启动文件,其他都是按stm32库函数模板写的,技术很差,自学娱乐,若有需求可自行改动。 main.c文件: #include S3C2440Reg.h #include S3C2440Init.h #include led.h #include uart.h void delay(int t) {
[单片机]
<font color='red'>S3C2440</font><font color='red'>裸机</font>程序【2】串口uart程序
51单片机控制sim900a,接收到短信点亮LED
已经经过测试,直接上程序,不懂@me #include reg52.h #include string.h #define uchar unsigned char #define uint unsigned int //以下是板子上LED的配置,把Px_x改成自己对应的脚。 #define LED1_ON P3_2 = 1 #define LED1_OFF P3_2 = 0 #define LED2_ON P3_3 = 1 #define LED2_OFF P3_3 = 0 #define LED3_ON P3_4 = 1 #define LED3_OFF P3_4 = 0 #define LED4_ON P3_5 = 1 #
[单片机]
S3C2440 进行微秒级、毫秒级延时函数
/****************************************************** *说 明:S3C2440 进行微秒级、毫秒级延时函数 ******************************************************/ MCLK:405MHz HCLK:135MHz PCLK:67.5MHz 在这里定时器时钟频率为PCLK/8=67.5/8=8.4375MHz 定时器0示例代码: 1 void T0DelayNus(UINT16 t) 2 { 3 rTCFG1 &= ~0x0F; 4 rTCFG1 |= 2; 5
[单片机]
一起学mini2440裸机开发(十三)--ADC原理与实验
概述 S3C2440的CMOS模拟数字转换器ADC可以对8通道模拟输入信号进行循环检测,S3C2440的ADC和触摸屏公用一个ADC转换器,所以学习ADC也是学习触摸屏的基础。 S3C2440ADC的主要特性如下: ●分辨率:10位 ●最大转换速率:500KSPS ●微分线性度误差:±1.0 LSB ●积分线性度误差:±2.0 LSB ●供电电压:3.3V ●模拟输入电压范围:0~3.3V ADC原理 ADC是一种将模拟信号转化为数字信号的方法,一般要经过采样、保持、量化、编码4个步骤。在实际电路中,有些过程是合并进行的,如采样和保持,量化和编码在转换过程中时同时实现的。
[单片机]
一起学mini2440<font color='red'>裸机</font><font color='red'>开发</font>(十三)--ADC原理与实验
移植ucGUI到s3c2440
说明:此文档,可能遗漏一些修改过的地方,根据编译情况,自行修改。 会在以后的完善过程中更新文档。 1、在 http://www.ucgui.com/zuoping.asp 下载uc/GUI 3.24版源码 2、参考《基于MDK+jlink平台s3c2440裸机程序》建立工程S3C2440-ucGUI。 直接用友善之臂裸机下的s3c2440 LCD底层驱动,在MDK环境调通LCD驱动。 3、复制源码到工程目录下 A.复制Config和gui目录到工程目录下。 B.复制Sample目录下的GUI_X目录到工程目录下,要用到GUI_X.c 4、添加源代码到工程中。 A.在Project Workspace下
[单片机]
STM32入门系列-使用库函数点亮LEDLED初始化函数
要点亮LED,需要完成LED的驱动, 在工程模板上新建一个led.c和led.h文件,将其存放在led文件夹内。这两个文件需要我们自己编写。 通常xxx.c文件用于存放编写的驱动程序,xxx.h文件用于存放xxx.c内的stm32头文件、管脚定义、全局变量声明、函数声明等内容。 因此在led.c文件内编写如下代码: #include led.h /******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED 初始化函数 * 输 入 : 无 * 输 出 : 无
[单片机]
基于ARM9S3C2440处理器的测控系统通信接口设计
  控制终端是测控装置中不可缺少的主要组成部分,目前应用的许多测控系统都具有规模大、控制点分散、大多控制点计算密度较低、受控体及接口种类繁多等特点。文章设计了ARM9S3C2440处理器下的RS485、RS232、 CAN 、IO输入/输出、I IC 等通信控制接口,本文重点介绍其设计方法和过程。   控制终端是测控装置中不可缺少的主要组成部分,是测控系统存在的基础,目前应用的许多测控系统都具有规模大、控制点分散、大多控制点计算密度较低、受控体及接口种类繁多等特点。   近年来嵌入式系统以体积小、功耗低、控制功能较强、能够嵌入操作系统、易于扩展外围接口(包括各种现场总线和百兆网等)等优点,很适合计算密度较低的分布式控制终端的应
[单片机]
基于ARM9S3C2440处理器的测控系统通信接口设计
【蓝桥杯嵌入式主板G4】第三章 点亮一个LED
第一节硬件解读 任何一个实验都是从点亮一个LED开始的,本次将教大家如何用stm32cubeMX+MDK在蓝桥杯嵌入式主板上面点亮一个LED。 先看蓝桥杯嵌入式主板的原理图:从图中可以看出一共有8个LED灯,分别是LD1到LD8。以LD1为例,该LED灯的左侧(正极)连接了一个R7(300欧姆的电阻)和VDD(电源),其中R7的电阻是起限流作用;右侧通过一个74HC753连接到PC8,也就是连接到MCU了。现在重点是搞懂74HC573是什么。 关于74HC573,我们可以在资源包的芯片手册里面找到该芯片的数据手册,在数据手册中可以找到以下关键信息: 从上图可以看出,74HC573是一种锁存器,在`O`E为L(低电平)
[单片机]
【蓝桥杯嵌入式主板G4】第三章 <font color='red'>点亮</font>一个<font color='red'>LED</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved