通过在mini2440平台上控制蜂鸣器,来实现GPIO控制学习
GPB0为控制蜂鸣器的端口
有三个控制寄存器,右边为地址
GPBCON 0x56000010
GPBDAT 0x56000014
GPBUP 0x56000018
S3C2440datasheet:
由此可总结出:
1.GPBCON寄存器是用来控制该对应端口的功能,是输入还是输出
2.GPBDAT是用来接收和发送数据给相对应的端口
3.GPBUP 上拉电阻,0就是使用上拉电阻,1就是不使用上拉电阻,使用上拉电阻是因为,有些引脚是悬空的,容易被干扰,当使用上拉电阻时,与高电平相接,使引脚处于高电平,比如下图这个按键的引脚就是使用了上拉电阻
于是代码为(MDK环境下的)
AREA beep_test, CODE, READONLY
ENTRY
pGPBCON EQU 0x56000010 ;Port B control
pGPBDAT EQU 0x56000014 ;Port B data
pGPBUP EQU 0x56000018 ;Pull-up control B
start
LDR R0, =pGPBCON ;LDR伪指令,将GPBCON的地址赋给R0
LDR R1, [R0] ;LDR指令,将R0所指向的地址的值赋给R1
ORR R1, R1, #0x01 ;或指令,让最低位为1
STR R1, [R0] ;STR指令,与LDR作用相反
LDR R0, =pGPBUP ;GPB1UP使其DISABLE
LDR R1, [R0]
ORR R1, R1, #0x01
STR R1, [R0]
;Beep on
beep_on
LDR R0, =pGPBDAT
LDR R1, [R0]
ORR R1, R1, #0x01
STR R1, [R0]
MOV R2, #0x10000
BL delay ;跳转到delay
; b .
;Beep off
beep_off
LDR R0, =pGPBDAT
LDR R1, [R0]
BIC R1, R1,#0x1
STR R1, [R0]
MOV R2, #0x100000
BL delay
b beep_on
delay
SUB R2, R2, #0x1
CMP R2, #0x0
BNE delay
MOV PC, LR ;文章下面对MOV指令有个小提示
NOP
END
关于MOV指令:
也就是说当传送的值是立即数时必须是可通过右循环得到的8位立即数,但如果是寄存器则没有这个限制