历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | linux系统学习1-8:第1个ARM裸板程序及引申

2020-03-28 来源:eefocus

第001节:辅线1_硬件知识_LED原理图

实现点亮LED的步骤: 

1.看原理图,确定控制led的引脚 

通过主芯片使用引脚输出:3.3V点亮led;0V熄灭led。 

-接法: 

这里写图片描述

引脚驱动能力不足:使用三极管,

接法介绍: 

-接法1: 

这里写图片描述

-接法2: 

这里写图片描述

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

3.写程序


第002节:辅线1_硬件知识_s3c2440启动流程与GPIO操作

知识点:


网络net,同名的net表示连接在一起

网络中的n,常表示低电平有效

怎么让GPF4输出1/0 

先配置为输出引脚

设置状态 

这里写图片描述

设置GPFCON[9:8]=0b01(0b表示二进制,9为0,8为1),GPF4配置为输出

设置GPFDAT[4]=1:输出高电平,led熄灭

设置GPFDAT[4]=0:输出低电平,led点亮

S3C2440框架与启动过程:


S3C2440框架图: 

这里写图片描述

启动过程:大多数ARM芯片从0地址启动

Nor启动时候,Nor Flash基地址为0;片内RAM地址为0x4000,0000 

cpu读出Nor上第一个指令(前4字节),执行,

cpu继续读出其他指令执行。

Nand启动,片内4kRAM基地址为0; Nor Flash不可以访问 

2440硬件把Nand前4k内容复制到片内RAM,

然后cpu从0地址取出第一条指令执行。


第003节:编写第一个程序点亮LED

怎么让GPF4输出1/0的方法:


先配置为输出引脚

设置状态 

 这里写图片描述 

设置GPFCON[9:8]=0b01(0b表示二进制:9为0,8为1),GPF4配为输出 

-==>把0x100写入GPFCON,即写到地址0x5600,0050上

设置GPFDAT[4]=1:输出高电平,led熄灭 

-==>把0x10写到地址0x5600,0054上

设置GPFDAT[4]=0:输出低电平,led点亮 

-==>把0写到地址0x5600,0054上 

补充知识: 

这里写图片描述

几条汇编代码:


LDR(load):读内存命令, 

LDR RO,[R1]:假设R1的值为x,则读取地址x上的数据(4字节),保存到R0中

STR(store):写内存命令 

STR R0,R[1]:假设R1的值为x,把R0的值写入地址x(4字节)

B:跳转

MOV(move): 

MOV R0, R1:把R1的值赋给R0,即R0=R1

MOV R0,#0x100:即把R0=0x100

LDR R0, =0X12345678:伪指令,它会被拆分为几条真正的RAM指令

引入伪指令, “LDR R0,=任意值”的原因: 

-ARM指令一共32位,会有部分字节表示指令,某些存储R0,其余剩余的不足32位,不能表示任意值,只能表示简单值(被称为立即数)。

安装arm-linux-gcc注意事项以及相关重点:


安装32位库

如何判断ubuntu的版本

第004节:汇编与机器码

CPU寄存器及其别名:

image.png?imageView2/2/w/550

详细介绍: 

program counter:程序计数器=当前指令+8 

流水线:当前执行地址A的指令,已经在对地址A+4的指令进行译码,已经在读取地址A+8(即PC的值)的指令

反汇编指令理解:

0: e59f1014 ldr r1, [pc, #20] ; 1c  

r1=[pc+20]=[8+20]=[0x1c]=0x56000050

8: e5810000 str r0, [r1] 

把r0即0x100,写入r1对应的内存,0x100–>[0x56000050]:即GPFCON寄存器

c: e59f100c ldr r1, [pc, #12] ; 20  

r1=[pc+12]=[0xc+8+12]=[32]=[0x20]=0x56000054:即GPFDAT寄存器

GPFCON/GPFDAT在CPU中,都是作为内存

完整代码:

led_on.elf:     file format elf32-littlearm



Disassembly of section .text:


00000000 <_start>:

   0:   e59f1014    ldr r1, [pc, #20]   ; 1c

   4:   e3a00c01    mov r0, #256    ; 0x100

   8:   e5810000    str r0, [r1]

   c:   e59f100c    ldr r1, [pc, #12]   ; 20

  10:   e3a00000    mov r0, #0

  14:   e5810000    str r0, [r1]


00000018 :

  18:   eafffffe    b   18

  1c:   56000050    undefined instruction 0x56000050

  20:   56000054    undefined instruction 0x56000054


Disassembly of section .ARM.attributes:


00000000 <.ARM.attributes>:

   0:   00001941    andeq   r1, r0, r1, asr #18

   4:   61656100    cmnvs   r5, r0, lsl #2

   8:   01006962    tsteq   r0, r2, ror #18

   c:   0000000f    andeq   r0, r0, pc

  10:   00543405    subseq  r3, r4, r5, lsl #8

  14:   01080206    tsteq   r8, r6, lsl #4

  18:   Address 0x00000018 is out of bounds.


练习题: 

修改len_on.s到点亮LED2

直接修改led_on.bin点亮LED2

mov指令机器码:

4: e3a00c01 mov r0, #256 ; 0x100 

这里写图片描述 
这里写图片描述

故:当代码为mov r0,#0x400,即修改最后的12位立即数(=immed_8循环右移(2*rotate)位) 

12位立即数中高4位,表示rotate,低8位:immed_8

具体介绍: 

这里写图片描述

举一反三: 

这里写图片描述

第005、006节:编程知识_进制-字节序

进制:


如何快四转化2/8/16进制:

8421 

这里写图片描述

0b开头:2进制

0开头:8进制

0x开头:16进制

字节序:


低位存放低地址:小字节序(little endian)

高位存在低地址:大字节序(big endian)

位操作:


移位: 

左移:int a=0x123; int b=a<<2=? 

-通过8421来转化为二进制,即a=0001,0010,0011,故b=0100,1000,1100=8421=0x48C=0x123*(2^2)=0x123*4

右移:int a=0x123; int b=a>>2=? 

-故a=0001,0010,0011; 则b=00,0100,1000=0x48=0x123/4=0x48

取反: 原来为0的位变为1;原来为1的位变为0 

int a=0x123; int b=~a=0xfffffedc???

位与: c=a&b 

1 and 1 = 1;

1 and 0 = 0;

0 and 1 = 0;

o and 0 = 0;

位或:c=a|b 

1 or 1 = 1;

1 or 0 = 1;

0 or 1 = 1;

o or 0 = 0;

置位: 

int a=0x123,把bit7,8置位

int b=a|(1<<7)|(1<<8) 

这里写图片描述

清位:


int a=0x123,把bit7,8清除

int b=a&(~(1<<7))&(~(1<<8)) 

这里写图片描述

第007节:编写C程序控制LED

C指针操作:

1.所有的变量在内存中都有一块区域 

这里写图片描述

可以通过变量/指针来操作内存


第008节:

几条汇编代码:


LDR(load):读内存命令, 

LDR RO,[R1]:假设R1的值为x,则读取地址x上的数据(4字节),保存到R0中

STR(store):写内存命令 

STR R0,R[1]:假设R1的值为x,把R0的值写入地址x(4字节)

B:跳转

MOV(move): 

MOV R0, R1:把R1的值赋给R0,即R0=R1

MOV R0,#0x100:即把R0=0x100

LDR R0, =0X12345678:伪指令,它会被拆分为几条真正的RAM指令

引入伪指令, “LDR R0,=任意值”的原因: 

-ARM指令一共32位,会有部分字节表示指令,某些存储R0,其余剩余的不足32位,不能表示任意值,只能表示简单值(被称为立即数)。

add: 

add r0,r1, #4==>r0=r1+4

sub: 

sub r0, r1,#4==>r0=r1-4

sub r0, r1,r2==>r0=r1-r2

BL(branch and link):


bl * * *: 

-跳转到* * *; 

-并将返回地址(下一条指令的地址)保存在lr寄存器中

ldm(many):读内存,写入多个寄存器


ldmia:

stm: 把多个寄存器的值写入内存 

stmdb:

过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。

举例: 

这里写图片描述
这里写图片描述

第009节:解析C程序的内部机制


推荐阅读

史海拾趣

Belkin公司的发展小趣事

贝尔金的成功不仅仅局限于美国本土。随着全球市场的不断扩张,贝尔金也在全球范围内建立了广泛的销售网络和物流中心。位于加州洛杉矶的总部、好莱坞的工业设计中心以及纽约州罗切斯特的研发机构,共同构成了贝尔金全球业务的核心。这些机构之间的紧密合作,确保了贝尔金能够迅速响应全球市场的需求,提供高品质的产品和服务。

BK Precision公司的发展小趣事

BK Precision一直将品质管理视为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出厂等各个环节都进行严格把控。同时,公司还注重持续创新,不断推出符合市场需求的新产品。通过引进先进的生产设备和技术手段,BK Precision不断提高生产效率和产品质量,为客户提供更优质的产品和服务。

CML Microcircuits公司的发展小趣事

面对未来电子行业的挑战和机遇,CML Microcircuits公司制定了可持续发展的未来规划。公司将继续加大在研发和创新方面的投入,推动技术的不断进步。同时,CML还将关注环保和可持续发展的问题,积极采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,公司还将加强与全球合作伙伴的合作,共同推动电子行业的可持续发展。

这些故事虽然基于虚构,但它们展示了CML Microcircuits公司可能经历的发展路径和关键事件。在实际情况下,公司的发展可能受到多种因素的影响,包括市场环境、技术趋势、竞争态势等。因此,对于CML Microcircuits公司的真实历史和发展情况,还需要进一步了解和分析相关资料。

DUCATI公司的发展小趣事

在1968年,电子行业正迎来一场技术革新。在这个充满机遇的时代,CML Microcircuits公司应运而生。初创时期的CML专注于研发单芯片解决方案,而不是传统的标准组件组合。这一创新理念使CML在行业中脱颖而出。公司的第一个产品——频率敏感开关,凭借其卓越的性能和可靠性,迅速赢得了市场的认可。这款产品不仅销售了30多年,而且至今仍在某些应用中发挥着关键作用。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc公司在电子行业的初期,就以其技术创新而闻名。公司团队不断研发新的控制技术,成功打破了当时行业的局限。他们推出的首款智能控制系统,不仅提高了生产效率,还大大降低了能源消耗,为电子行业带来了巨大的经济效益。这一创新成果使得Control Sciences Inc在业界崭露头角,赢得了众多客户的青睐。

ERA Transformers公司的发展小趣事

在电子行业中,ERA Transformers公司以其开创性的技术而闻名。该公司专注于研发和生产高效的电子变压器,以满足不断增长的电子设备需求。在一次研发过程中,公司工程师们面临了一个重大挑战:如何提高变压器的能效和稳定性。经过数月的深入研究与反复试验,他们终于开发出了一种新型的高效能变压器,该变压器采用了先进的材料和独特的设计,显著提高了能效和稳定性,这一创新技术的突破使得ERA Transformers公司在电子行业中崭露头角。

问答坊 | AI 解惑

挑战毫微安电流测量技术

对小电流的测量非常微妙。巧妙的模拟设计技术、正确的器件和设备都有助于测量。   要 点   小电流的测量面临物理限制与噪声限制。   早期的机械电表可分辨毫微微安级电流。   JFET和CMOS放大器适用于测量。   要测量毫微微安级 ...…

查看全部问答>

缓冲区溢出光速入门

缓冲区溢出光速入门,你可以看看…

查看全部问答>

基于Windows CEnet平台的COM型嵌入式软件系统的设计与实现.pdf

基于Windows CEnet平台的COM型嵌入式软件系统的设计与实现.pdf…

查看全部问答>

AD598芯片的各引脚功能告诉我吗?

有谁可以帮我讲解一下AD598各引脚的作用,以及怎样设计AD598的外围元件,急!!!!!!!!! 我的QQ:283970042 多谢各位大师啊…

查看全部问答>

sd卡fat文件系统谁能提供帮助

                                  …

查看全部问答>

EDK生成bitstream时出现问题,求高手~

我是新手,目前正在学习用XILINX FPGA 嵌入式开发,昨天新装的ISE和EDK8.2。 在跑历程的时候,发现第一个最简单的实验update bitstream时候会停在 Using Flow File: E:/edk/lab/implementation/fpga.flw Using Option File(s):  E:/edk/lab/ ...…

查看全部问答>

扩频通信系统的fpga设计 郭黎利

谁有郭黎利版的  《扩频通信系统的fpga设计》 一书里的代码?  这本书应该来说是还可以的,特别是里面原理的讲解比较好,但是里面的代码错的有点多,应该都是在排版的时候把代码改动了,好多低级的错误,有点没法忍。。。不知 ...…

查看全部问答>

gpio_dir 和gpio_pull的区别

如题,我知道他们的意思,但如果要说出他们的区别该怎么说呢? …

查看全部问答>

【STM32F7英雄联盟大赛】多功能串口侦测工具---界面设计

        在应用STemWin设计GUI时,可以先用GUIBuilder.exe软件设计界面,其使用非常简单,完全后PC中的VB等软件的使用很类似,点击控件添加在窗体上,可以对窗体的一些属性进行设置,不过,不能对控件的全部属性进行 ...…

查看全部问答>

ccs的Energy Trace功能为什么用不了呢?

最近准备开始学习一下Energy Trace 的使用。 我的板子是自己画的,处理器型号是MSP430FR5739. 调试器型号是MSP-FET430UIF。 下载方式是SBW,请问为什么我打开界面后,上面没有任何信息。 谢谢。 …

查看全部问答>