用汇编和c编写了两个点亮程序,在程序的初始阶段判断了程序的执行状态。 如果影响代表点亮,则可能会修正寄存器的其他位,引起无法预测的错误。 在这里写两个版本的程序是为了相互比较。
我自己用过,保证能用。
反汇编指令:/home/opt/FriendlyARM/toolsch
ain/4.4.3/自信便当/arm-Linux-objdump-dtu-boot temp.txt
组件没有影响
loop:
ldr r0,=0x56000050//GPFCON地址为0x56000050
mov r1,#0xffff00ff
ldr r2,[r0]
and r2、r2、r1//清除GPFCON的8-15位,其他位保持不变
mov r1,#0x00005500
orr r2、r2、r1
str r2、[r0]//GPFCON写入0x00005500、即GFP4-7被设定为输出功能
ldr r0,=0x56000054//GPFDAT地址为0x56000054
mov r1,#0x000000d0//点亮指示灯
ldr r2,[r0]
orr r2、r2、r1
str r2,[r0]
b loop
组件的影响
loop1:
ldr r0,=0x56000050
mov r1,#0x00005500
str r1,[r0]
ldr r0,=0x56000054
mov r1,#0x000000e0
str r1,[r0]
b loop1
c语言的影响
#defineGPFcon(* ) volatileunsignedlong ) )0x56000050 )//GPFCON地址为0x56000050
# definegpfdat (* (volatile unsigned long * )0x 5600054 )//GPFDAT地址为0x56000054
GPFCON=0x00005500; //GPFcon0x00005500,即GFP4-7被设定为输出功能
while(1)。
{
GPFDAT=0x000000e0; //GPFDAT写入0x000000e0,即GPFDAT[7:4]=1110,LED4点亮
}
c语言不影响
#defineGPFcon(* ) volatileunsignedlong ) )0x56000050 )//GPFCON地址为0x56000050
# definegpfdat (* (volatile unsigned long * )0x 5600054 )//GPFDAT地址为0x56000054
GPFCON=0xffff00ff;
GPFCON|=0x00005500; //GPFcon0x00005500,即GFP4-7被设定为输出功能
while(1)。
{
GPFDAT|=0x000000e0; //GPFDAT写入0x000000e0,即GPFDAT[7:4]=1110,LED4点亮
}