历史上的今天
今天是:2024年10月21日(星期一)
2018年10月21日 | ARM裸机程序之LED灯
2018-10-21 来源:eefocus
从3月份开始看arm的裸机程序,到现在一个半月了,做到后来,发现自己越做到综合的程序,越吃力,还是得回头看看,为了最终写一个bootloader打下点基础吧,所以以这篇文章为开始,总结一下之前做过的裸机程序,希望会有所收获,我用的开发板是友善之臂的mini2440。
首先声明一点我都是在linux环境下写裸机程序的,因为这样能知道更多底层的东西,不过在这里面写就是有点不方便的是调试的时候,所以你程序要是调试不出来,你得把程序移植到一些编译器里调试(请注意移植的时候格式有点不同),所以偶尔在keil或ADS里面调试程序。在linux里面写程序最后编译,要配置交叉编译环境,怎么配置交叉编译环境我这里就不介绍了。
下面开始介绍第一个裸机程序,LED灯:
源文件1:led1.s
.text
.global _start
_start:
bl disable_watch_dog @关闭看门狗
ldr r0, =0x56000010 @设置GPBCON寄存器
mov r1, #0x15400 @设置GPB5,GPB6,GPB7,GPB8为输出引脚
str r1, [r0]
ldr r0, =0x56000018 @设置上拉电阻
mov r1, #0x0
str r1, [r0]
ldr r0, =0x56000014 @配置GPBDAT寄存器
MAIN_LOOP: @进入一个死循环,间隔一段时间点亮4个LED
mov r1, #0x0 @点亮LED
str r1, [r0]
mov r2, #0x50000
bl delay @调用下面的延时函数
mov r1, #0x1e0 @相应的位设置成高电平,关闭LED
str r1, [r0]
mov r2, #0x50000
bl delay
b MAIN_LOOP
disable_watch_dog:
ldr r0, =0x53000000
mov r1, #0x0
str r1, [r0]
mov pc, r14 @把链接寄存器里的值给PC,可以实现函数的返回
delay:
sub r2, r2, #0x1
cmp r2, #0x0
bne delay
mov pc, lr
Makefile:
ledpp1.bin : led1.s
arm-linux-gcc -g -c -o led1.o led1.s
arm-linux-ld -Ttext 0x00000000 -g led1.o -o ledpp1_elf
arm-linux-objcopy -O binary -S ledpp1_elf ledpp1.bin
arm-linux-objdump -D -m arm ledpp1_elf > ledpp1.dis
clean:
rm -rf ledpp1.bin ledpp1_elf ledpp1.dis *.o
第一个程序就是这两个文件,程序实现的功能是开发板上4个LED灯 间隔2S左右的时间闪烁,因为这个程序我没有用定时器,所以那个2S是我估算的。
首先分析这个程序的Makefile:第一句表示生成一个ledpp1.bin的可执行文件(这个文件是最后下载到开发板上的),冒号的右边的led1.s文件是这个ledpp1.bin文件锁依赖的文件,也就是说ledpp1.bin依赖于led1.s,还有一点是你可以把这条语句理解成一个条件判断语句,如果led1.s的时间比ledpp1.bin时间新的话,就执行下面4条语句,一下四条分别是汇编生成led1.o文件,链接生成ledpp1_elf文件,arm-linux-objcopy生成.bin文件,最后一步生成反汇编代码。最后clean:里面的就是每次在make的时候删除除了led1.s 和Makefile的其他文件了。
下面分析led1.s的代码,首先关闭看门狗,为了不使程序反复地重启。这里涉及到三个寄存器:1.GPBCON寄存器,可以查看s3c2440A的芯片手册284页,这个寄存器的作用,配置开发板上各个引脚时输入引脚,还是输出引脚,还有中断引脚等等,这里是把LED配置成输出引脚。至于为什么配置成输出引脚,涉及一点硬件的知识,自行百度即可。
2.GPBUP寄存器:设置引脚是否上拉。
3.GPBDAT寄存器:这里写对应上面GPBCON寄存器,例如GPBDAT寄存器的第5位设置为1,表示输出高电平,设置为0表示设置低电平,LED的各个引脚时低电平使能的。
说到这里讲解完毕,几条汇编指令bl指令,ldr指令都挺有意思的,想更深入理解这些指令,可以看看最后生成的反汇编文件ledpp1.dis文件,看懂反汇编,以后去破解破解正版软件好像挺不错的样子
史海拾趣
|
世界因为有了Apple新产品iPad而变得更迷人? 在看A4之前,先回顾一下Apple的应用处理器开发史:从2007年的第一代iPhone开始,Apple每年都推出两款新的移动产品,而且是iPhone与iPod Touch系列交替上市,依序是iPhone、第一代iPod Touch、iPhone 3G ...… 查看全部问答> |
|
由于,我们的产品没有使用wince的图形界面,也为了保护知识产权的需要,需要屏蔽用户对程序名,程序路径的可见性,由于软件又是需要不断更新的,因此需要制作一个nk层上的, 更新程序, 该程序与pc端的升级程序通过usb连接, 通过pc端的升级程序传 ...… 查看全部问答> |
|
我现在有一个filedisk驱动的原码 也有一个调用此驱动将文件虚拟成磁盘的应用程序 我想对我虚拟的磁盘透明加解密 将所有在此盘写入的文件加解密,要用到那些IRP????在 内存中开辟存储区进行加解密????? 请高手指点… 查看全部问答> |
|
本人小菜分解了好多ROM 就是没有这个文件ddi.dll 这是个文件夹名 不是单独的文件。 而且注册表也关联了这个文件夹但分解出来就是找不到 [HKEY_LOCAL_MACHINE\\Drivers\\Display\\Active\\内置 LCD] \"BufferMode\"=dword:1 \"Dll\"=\"ddi.dll\" ...… 查看全部问答> |
|
一台vxworks,一台windows ,如何实现 windows访问vxworks下的一个“共享目录”??????急,请高手出招,谢谢 一台vxworks,一台windows ,如何实现 windows访问vxworks下的一个目录??????急.............. 就好象实现windows访问 windows下的一个共享文件,但我要访问的是vxworks下的“共享文件”,谢谢了!!!… 查看全部问答> |
|
ISE11里面如何判定一个网线是时钟的?、貌似要加一个IBUFG才能被判定为时钟网线否则不被认为是时钟周期约束根本加不上去但IBUFG数目有限用完了怎么办请高手指导一下… 查看全部问答> |
|
我在看DM642的EVM板原理图时发现,SDRAM的数据线与EMIF的数据线相连时,每隔一个字节是按相反顺序连接的,比如:SDRAM的DG[0...7]对应EMIF的ED[7...0],SDRAM的DG[8...15]对应EMIF的ED[8...15],SDRAM的DG[16...23]对应EMIF的ED[23...16].... 这是怎 ...… 查看全部问答> |




