历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Exynos4412汇编LED操作代码

2018-10-14 来源:eefocus

从今天开始就正式进入到tiny4412的开发学习中了,今天主要看了一下Tiny4412的启动流程及存储器映射及Exynos4412数据手册,用汇编写了一个跑马灯程序(后续会有C语言版本的出来),先说一下我的开发环境吧:

开发板:Tiny4412 增强版 (底板是Tiny4412ADK 1312)

开发工具:UltraEdit

宿主机:VmWare Ubuntu12.04(64bit)

编译工具:arm-linux-gcc4.5.1

为了便于分类管理,特意开了一个Tiny4412学习专区,希望对大家有所帮助,下面进入正题,说一下跑马灯程序。

一、控制原理说明

tiny4412核心板

tiny4412核心板

先看一下原理图:

tiny4412-led原理图

tiny4412-led原理图

tiny4412-led原理图

tiny4412-led原理图

如上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。我们要做的工作就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低即可。

二、程序说明

1.led.S

由原理图可知,程序只进行了两步操作;

第一步:设置GPM4_0~GPM4_3相对应的控制寄存器GPM4CON,使GPM4_0~ GPM4_3四个引脚为输出功能。

Tiny4412-GPM4CON

Tiny4412-GPM4CON

第二步:设置其对应的数据寄存器GPM4DAT对应的4个bit位为0,使GPM4_0~ GPM4_3为低电平,4个LED灯全亮,等待一段时间将第0位设置为0,其余位设置为1,这样只有第一个灯亮;等待一段时间将第1位设置为0,其余位设置为1,这样只有第二个灯亮;等待一段时间将第2位设置为0,其余位设置为1,这样只有第三个灯亮;等待一段时间将第3位设置为0,其余位设置为1,这样只有第四个灯亮;等待一段时间使GPM4_0~ GPM4_3全为高电平,4个LED灯全灭。这样就实现了跑马灯效果。

程序代码中,也有相关解释这里不做过多说明。

===================================================================

.text

.globl _start

_start:

 

// set GPM4 as output

ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0

ldr r1, [r0] // 先读出原值

bic r1, r1, #0xff00 // 清除bit[15:8]

bic r1, r1, #0xff // 清除bit[7:0]

orr r1, r1, #0x1100 // 设置bit[15:8]为0b00010001

orr r1, r1, #0x11 // 设置bit[7:0]为0b00010001

str r1, [r0] // 写入GPM4CON


//set GPM4DAT as Low For leds

ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E0

ldr r1, [r0] // 读出原值

 

leds_loop:

bic r1, r1, #0xf // 清除bit[0-3]为0 全亮

str r1, [r0] // 写入GPM4DAT

ldr r2,=0xffffff

bl delay

 

orr r1, r1, #0xe // 设置bit[0]为0 LED1亮

str r1, [r0] // 写入GPM4DAT

ldr r2,=0xffffff

bl delay

 

bic r1, r1, #0x3 // 设置bit[1]为0 LED2亮

orr r1, r1, #1

str r1, [r0] // 写入GPM4DAT

ldr r2,=0xffffff

bl delay

 

bic r1, r1, #0x6 // 设置bit[2]为0 LED3亮

orr r1, r1, #2

str r1, [r0] // 写入GPM4DAT

ldr r2,=0xffffff

bl delay

 

bic r1, r1, #0xc // 设置bit[3]为0 LED4亮

orr r1, r1, #4

str r1, [r0] // 写入GPM4DAT

ldr r2,=0xffffff

bl delay

 

orr r1, r1, #0xf

str r1, [r0] // 写入GPM4DAT 全灭

ldr r2,=0xffffff

bl delay

 

b leds_loop

halt_loop:

b halt_loop

 

delay:

//跑马灯延时程序

sub r2,r2,#1 //sub 减法

cmp r2,#0x0 //将r0 与0比较

bne delay //b是跳 ne 是不相等 ,不相等就跳到delay

mov pc,lr //lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回

==================================================================

2. MakeFile说明

1

2

3

4

5

6

7

led.bin : led.S

arm-linux-gcc -c -o led.o led.S

arm-linux-ld -Tled.lds -N led.o -o led.elf

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

arm-linux-objdump -D -m arm led.elf > led.dis

clean:

rm -f *.dis *.bin *.elf *.o

当我们在Makefile所在目录下执行make命令时,系统会进行如下操作:

第一步 执行arm-linux-gcc -c -o led.o led.S命令将当前目录下存在的汇编文件led.S编译成led.o文件;

第二步 执行arm-linux-ld -Tled.lds -N led.o -o led.elf将.o文件链接成elf文件,-Tled.lds 其中led.lds位链接脚本,告诉连接器如何对程序进行链接,以及链接地址等等(下面会有讲解);

第三步 执行arm-linux-objcopy -O binary -S led.elf led.bin将elf文件抽取为可在开发板上运行的bin文件;

第四步 执行arm-linux-objdump -D -m arm led.elf > led.dis将elf文件反汇编,便于我们对程序的分析,查找错误等等;

3. 链接脚本led.lds说明

1

2

3

4

5

6

7

SECTIONS {

. = 0x02023400;

.text : { *(.text) }

.rodata ALIGN(4) : {*(.rodata*)}

.data ALIGN(4) : { *(.data*) }

.bss ALIGN(4) : { *(.bss) *(COMMON) }

}

本文不对链接脚本的具体语法进行介绍,读者可以自已自行google了解

第2行表示程序的连接地址从0x02023400开始,这表示我们的程序运行之前应该位于内存地址0x02023400字节处,

BL1会把 BL2复制到0x02023400地址处,再启动它。

第 3~6行,表示从 0x02023400 开始,依次排放程序的代码段、 只读数据段、数据段、BSS段。

三、程序编译及烧写

1.编译

通过FTP或者其他工具将led.s、Makefile、led.lds 三个文件上传到服务器上去,输入make命令进行编译将得到led.bin文件。

2.烧写

将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:

1

sudo ./sd_fusing.sh /dev/sdb ../01.led/led.bin

Tiny4412-Prog

Tiny4412-Prog

如图所示,SD卡烧写成功,将SD卡插到Tiny4412开发板上,并设置为SD卡启动,这时你就会看到LED灯在闪烁。

说明:sd_fusing.sh是一个shell脚本,这个脚本文件,一键烧写程序到 SD 卡中。我们分析该脚本程序,发现其核心命令就3条

1

2

3

4

5

dd iflag=dsync oflag=dsync if=/work/4412/tools/E4412_N.bl1.bin of=$1 seek=$signed_bl1_position

 

dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position

 

sync

第 1行的命令用于将E4412_N.bl1.bin烧写到 SD卡的第 1个扇区 (扇区从 0编号 );

第 2行的命令用于将bl2.bin烧写到SD卡的第17个扇区;

第 3行的命令用于将内存缓冲区数据写入磁盘.

E4412_N.bl1.bin(BL1) 是由三星原厂提供, 没有源码;

bl2.bin 是通过 mkbl2 工具处理源文件得到,具体实现如下:

1

./mkbl2 leds_on.bin bl2.bin 14336

mkbl2 是用来生成 bl2.bin 的工具,通过编译 V310-EVT1-mkbl2.c 文件得到,具体如下:

1

gcc -o mkbl2 V310-EVT1-mkbl2.c

通过分析 V310-EVT1-mkbl2.c源码,我们可以知道它主要做了这些工作:

1). 从源文件中读取14K 的数据到 Buf 当中;

2). 处理 Buf 中前14332 字节的数据,得到 4字节的checksum ;

3). 组装 Buf 中前 14332 字节的数据和 4字节的 checksum,得到一个新的 14K 的 Buf 数据;

4). 将 3) 中构建的Buf 数据写到bl2.bin文件中

四、上电实验

如下图所示,可以看到4个led轮流着点亮及熄灭

tiny4412流水灯效果

tiny4412流水灯效果

 

完整的程序下载地址(解压密码:WWW.techbulo.Com):

下载地址


推荐阅读

史海拾趣

扬州国芯(Gcore)公司的发展小趣事

扬州国芯(Gcore)公司发展的五个故事

故事一:成立与初期发展

扬州国芯半导体有限公司成立于2011年,起初便定位于集成电路产品的设计、测试、销售与服务。公司总部位于历史文化名城扬州,并在深圳设立了销售办事处,以便更好地服务国内外市场。成立初期,扬州国芯便专注于研发集成度高、低噪声、低功耗、高可靠性的模拟芯片及数模混合芯片产品。通过不懈的努力,公司逐渐在运算放大器、比较器、电源管理等领域形成了自己的核心产品线,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品研发

扬州国芯深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进高端人才,并与国内外多所知名高校和科研机构建立了紧密的合作关系。经过多年的努力,扬州国芯成功研发出了一系列具有自主知识产权的芯片产品,如锂电池充电管理芯片、马达驱动芯片等,这些产品性能优越,品质可靠,迅速赢得了市场的认可。此外,公司还积极参与国家标准和行业标准的制定,进一步提升了企业的行业地位和影响力。

故事三:市场拓展与品牌建设

随着产品线的不断丰富和技术的持续创新,扬州国芯开始积极拓展国内外市场。公司通过参加各类行业展会、举办技术研讨会等方式,加强与客户的沟通和交流,不断提升品牌知名度和美誉度。同时,公司还注重售后服务体系的建设,为客户提供全方位、一站式的解决方案和服务。这些措施有效地推动了公司市场份额的快速增长,使扬州国芯在激烈的市场竞争中脱颖而出。

故事四:政府支持与产业合作

扬州国芯的发展离不开当地政府的支持和产业合作。近年来,扬州市政府高度重视电子信息产业的发展,出台了一系列优惠政策和扶持措施,为扬州国芯等高科技企业提供了良好的发展环境。同时,公司还积极与上下游产业链企业开展合作,共同推动产业链的协同发展。这些合作不仅有助于降低生产成本、提高产品质量,还有助于公司更好地把握市场动态和客户需求,实现持续稳健的发展。

故事五:国际化战略与未来展望

面对全球集成电路产业的快速发展和市场竞争的日益激烈,扬州国芯制定了明确的国际化战略。公司积极寻求与国际知名企业的合作机会,引进先进的技术和管理经验,提升企业的国际竞争力。同时,公司还计划在海外设立研发中心和销售网络,以便更好地服务全球客户。展望未来,扬州国芯将继续秉承“以人才为根本、以市场为导向、以技术为核心、以顾客为目标”的经营宗旨,不断开创新的辉煌篇章。

Harvatek Corporation公司的发展小趣事

背景:随着电子技术的飞速发展,Hantronix始终站在技术创新的前沿。公司不断投入研发资源,致力于开发具有自主知识产权的新产品和技术。

发展:Hantronix成功推出了一系列创新产品,如液晶显示器、图形模块、触摸屏等,这些产品不仅性能卓越,而且设计独特,满足了市场多样化的需求。同时,公司还积极申请专利保护,确保其技术成果得到法律的有效保障。

巴丁微公司的发展小趣事

巴丁微深知人才是企业发展的核心动力。因此,公司始终注重团队建设与人才培养。公司拥有一支由行业精英组成的骨干团队,他们在集成电路设计、研发、销售等方面具有丰富的经验和深厚的专业知识。

同时,巴丁微也积极引进和培养新人才,通过定期的培训和学习机会,提升员工的技能水平和综合素质。公司还建立了完善的激励机制,鼓励员工勇于创新、敢于担当,为企业的发展贡献智慧和力量。

通过以上五个故事,我们可以看出巴丁微在电子行业发展的历程中,始终坚持以技术创新为核心,不断提升产品质量和市场竞争力。同时,公司也注重团队建设与人才培养,为企业的可持续发展提供了有力保障。未来,我们有理由相信巴丁微将继续在电子行业中取得更加辉煌的成就。

请注意,以上故事是基于公开资料编写的,可能与实际情况存在细微差别。如需获取更详细和准确的信息,建议直接联系巴丁微公司或查阅相关官方资料。

AND Displays公司的发展小趣事

随着技术实力的增强和产品线的丰富,AND Displays开始积极拓展市场。公司不仅在国内建立了完善的销售网络,还积极开拓海外市场。通过与全球各大电子产品制造商的合作,AND Displays的显示面板逐渐进入了全球供应链,品牌影响力不断提升。同时,公司还注重品牌建设,通过参加国际展览、举办技术研讨会等方式,提升品牌知名度和美誉度。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

Excelics Semiconductor自创立之初,就致力于半导体技术的研发与创新。在公司成立的初期,他们成功研发了一款高性能、低功耗的芯片,这一技术突破迅速赢得了市场的认可。随着技术的不断迭代和升级,Excelics Semiconductor逐渐在半导体领域建立了自己的技术壁垒,成为了行业的领军者。

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

问答坊 | AI 解惑

分享你的体验,精彩大奖等你拿!

罗德与施瓦茨 2009年射频微波测量仪器应用 有奖征文竞赛启事 一等奖1 名;奖励价值6000元的奖品 二等奖 3 名;奖励价值4000元的奖品 三等奖若干名:奖励价值1000元的奖品 为了推动射频微波测试与测量技术的发展,适应客户的测试应用需 ...…

查看全部问答>

rs485总线

1490B为全双工方式,如何将其转换为半双工?我只能单独的发送和单独的接收,但并不能实现其半双工工作方式,请问问题出在哪?谢谢~~~…

查看全部问答>

Windows CE提供优质智能家居生活

随着社会的发展,人们对于居住环境的安全、方便、舒适提出了越来越高的要求,希望回到家即可得到100%的休息与享受,尽可能的减少每天所进行的无用功,而出外时如有非法进入、火灾、液化气泄漏等情况,可自动通知户主并报警。因此,智能家居在这种 ...…

查看全部问答>

evc操作sql server CE时,如何捕捉到错误信息?

evc操作sql server CE时,如何捕捉到错误信息? 在VC操作sql server 2000时,我们可以通过: try { ... ... } catch( _com_error &e ) { ... ... } 得到出错的原因,在调试时非常方便,但是evc操作sql server CE时我该如何处理呢?谢谢大 ...…

查看全部问答>

Wince 是否支持大页nand flash?文件格式是dosfs吗?

Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?…

查看全部问答>

CE的内存结构

在某个虚拟地址空间中,把物理地址空间重复地映射了一遍. 为什么要重复映射,重复映射的部分与先前映射的部分有什么区别?…

查看全部问答>

STM8L的LCD控制器怎么使用啊?是不是非要LSE时钟才行啊?

我不想用LSE时钟,我看到手册上说LCD控制器可以使用RTCCLK/2当做时钟输入;也可以直接使用SYSCLK,只需要开启外设时钟的LCD就行。但是我写的程序,COM和SEG咋动都不动一下呢?用示波器看,动都没动,郁闷;下面是几行代码: void LCD_INIT(vo ...…

查看全部问答>

CAN一次最多发多少字节数据?

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){  u32 i = 0;  u8  m=0;  //每次发送的字节数  u8  n=0; ...…

查看全部问答>

请问P0接蜂鸣器该怎么接?

怎么接呢?给个图吧,谢谢。…

查看全部问答>