这个程序属于比较简单的,通过这么一个简单的例子,可以把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
文章的脚注信息由WordPress的wp-posturl插件自动生成