Mini 2440 beeper的裸机程序及详解(基于MDK)

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: Mini 2440 beeper的裸机程序及详解(基于MDK)

这个程序属于比较简单的,通过这么一个简单的例子,可以把ARM指令运用下。

首先看电路原理图,这样我们知道通过ARM的哪个寄存器去控制这个beeper. 图如下:

通过这个原理图,我们晓得是GPB0控制的,如果GPB0是高电平,那么beeper 将蜂鸣,我们再去看三星S3c2440手册,去看下这个对应的寄存器配置:

看了这个IO口的一些资料,那么我们就要针对 GPBCONF, GPBDAT, GPBUP进行一些操作,其实我们主要是将GPB0给设置为01(output),然后GPBDAT最后一位写1或者0去控制蜂鸣的开或者关,GPBUP是上拉电阻,我们看原理图里并不需要,直接赋值1即可。综上,代码如下:

	AREA beep_test, CODE, READONLY ;定义代码段,名字beep_test,只读
	ENTRY ;程序入口

pGPBCON EQU 0x56000010 ;定义GPBCONF宏
pGPBDAT EQU 0X56000014 ;定义GPBDAT宏
pGPBUP	EQU	0x56000018 ;定义GPBUP宏

start	;程序标号
	LDR	R0, =pGPBCON ;将GPBCON的数据加载到R0寄存器
	LDR R1, [R0] ;将R0的数据给R1
	ORR R1, R1, #0x01 ;R1与01或运算,最后两位是01
	STR R1, [R0] ;将R1写到R0

	LDR R0, =pGPBUP ;将GPBUP的数据加载到R0寄存器
	LDR R1, [R0] ;将R0的值加载到R1
	ORR	R1, R1, #0X01 ;置GPBUP最后一位为1
	STR R1, [R0] ;把R1写回去

;Beep on
beep_on
	LDR R0, =pGPBDAT ;将GPBDAT的值加载到R0上
	LDR R1, [R0] ;将R0的值加载到R1上
	ORR R1, R1, #0X01 ;GPBDAT最后一位置1
	STR R1, [R0] ;将修改后的R1再次写到R0

	MOV R2, #0X100000 ;给R2赋值
	BL	delay ;跳转到delay标号,并且保存PC到LR

;Beep off
beep_off
	LDR R0, =pGPBDAT ;将GPBDAT的值加载到R0上
	LDR R1, [R0] ;将R0的值加载到R1上
	BIC R1, R1, #0X01 ;GPBDAT最后一位置0
	STR R1, [R0] ;将修改后的R1再次写到R0

	MOV R2, #0X100000 ;给R2赋值
	BL	delay ;跳转到delay标号,并且保存PC到LR
	B  beep_on ;接着执行beep_on

delay
	SUB R2, R2, #0X01 ;R2的值减1
	CMP	R2, #0X0 ;比较R2跟0
	BNE delay ;如果不相等,就接着执行delay
	MOV PC, LR ;从LR寄存器读值,跳转

	NOP	;空
	END	;结束

具体源代码,详情参考这里:

Mini 2440 beeper的裸机程序及详解(基于MDK)源码下载http://www.jyguagua.com/bbs/forum.php?mod=viewthread&tid=178&fromuid=1

 

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: Mini 2440 beeper的裸机程序及详解(基于MDK)

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: