本帖最后由 ianhom 于 2017-1-20 08:32 编辑
我正好有这个板子,以下是我的试验结果
未定义的部分值为0,所以最后的数据是0x0000FF7F
因为未定义的部分是0,所以R3被清零
使用的是PB3
0x02是为了使能GPIOB,这里可以复用0x0000FF7F,GPIOB也能使能,省4个字节
前4个字节放SP初值,但用不到SP,可以将0x4002102C(RCC_IOPENR)放到这里,MOVS R0,SP ,再省4个字节
地址 值 指令/地址 汇编 说明
0x00 09 00 00 00 00000009 设置SP值为00000009
0x04 09 00 00 00 00000009 设置PC值为00000009,即跳转到0x08这条指令
0x08 06 48 4806 LDR.N R0, [PC, #0x18] 把RCC_IOPENR的地址读到RO中
0x0A 07 49 4907 LDR.N R1, [PC, #0x1C] 把0x00000002读到R1中
0x0C 01 60 6001 STR R1, [R0] 把0x00000002写入到RCC_IOPENR(使能GPIOB)
0x0E 07 48 4807 LDR.N R0, [PC, #0x1C] 把GPIOB基地址(GPIOB_MODER)放到R0中
0x10 07 49 4907 LDR.N R1, [PC, #0x1C] 把0x0000FF7F的值放到R1中
0x12 01 60 6001 STR R1, [R0] 把0x0000FF7F的值放到GPIOB_MODER(配置PB3为输出)
0x14 42 69 6942 LDR R2, [R0, #0x14] 读出GPIOB_ODR的值放到R2中
0x16 4A 40 404A EORS R2, R2, R1 R2和R1异或后放到R2中 (实现PB3管脚位的反转)
0x18 42 61 6142 STR R2, [RO, #0x14] 把R2的值写到GPIOB_ODR中(ON/OFF LED)
0x1A 06 4B 4B06 LDR.N R3, [PC, #Ox18] R3中写0
0x1C 5B 1C 1C5B ADDS R3, R3, #1 R3 += 1
0x1E 93 42 4293 CMP R3, R2 比较R2和R3
0x20 FC D1 D1FC BNE.N 0x1C 如果R3比R2小,跳转到0x1C(继续累加延时)
0x22 F7 E7 E7F7 B.N 0x14 如果R3不比R3小,跳转到0x14(累加结束,反转LED)
0x24 2C 10 02 40 4002102C RCC_IOPENR的地址
0x28 02 00 00 00 00000002 赋值给RCC_IOPENR的值
0x2C 00 04 00 50 50004000 GPIOB基地址
0x30 7F FF 00 00 0000FF7F 赋值给GPIOB_MODER的值
0x34 00 00 00 00 00000000 赋值给R3(清零)
亮灭的时间比例是0xFF7C : 0xFC00