能力值:
( LV4,RANK:40 )
|
-
-
2 楼
今天又重写了一下,这次解码非常正确。
程序里有时钟的代码不过没去执行,只测试菜单和遥控部分,程序在zhucaidian里面死循环,写了个小菜单框架,29个按键可以打开不同的29个菜单,不过里面还没加东西,只显示数字。
小弟初学ARM汇编, 现在每天坚持练习一下
.thumb
.syntax unified
.section .data
.align 4
shumaguanmabiao: .byte 0x88,0xbe,0xc4,0x94,0xb2,0x91,0x81,0xbc,0x80,0x90
hongwaimabiao: .int 0xbc43e708,0xb847e708,0xbd42e708,0xbe41e708,0xbf40e708,0xb946e708,0xba45e708,0xbb44e708,0xb54ae708,0xb649e708,0xb748e708,0xb14ee708,0xb24de708,0xb34ce708,0xb44be708,0xeb14e708,0xe31ce708,0xee11e708,0xea15e708,0xe21de708,0xe916e708,0xe01fe708,0xe11ee708,0xed12e708,0xa35ce708,0xe718e708,0xe619e708,0xe51ae708,0xef10e708
shuaxinbiao: .byte 0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00
caidian: .word zhucaidian +1,dd1 +1,dd2 +1,dd3 +1,dd4 +1,dd5 +1,dd6 +1,dd7 +1,dd8 +1,dd9 +1,dd10 +1,dd11 +1,dd12 +1,dd13 +1,dd14 +1,dd15 +1,dd16 +1,dd17 +1,dd18 +1,dd19 +1,dd20 +1,dd21 +1,dd22 +1,dd23 +1,dd24 +1,dd25 +1,dd26 +1,dd27 +1,dd28 +1,dd29 +1
.equ STACKINIT, 0x20005000
.equ systickbiaozhi, 0x20000300
.section .text
xiangliangbiao:
.word STACKINIT
.word _start + 1
.word _nmi_handler + 1
.word _hard_fault + 1
.word _memory_fault + 1
.word _bus_fault + 1
.word _usage_fault + 1
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word systickdingshiqi +1
.word 0 @WWDG 0
.word 0 @PVD 1
.word 0 @TAMPER 2
.word 0 @RTC 3
.word 0 @FLASH 4
.word 0 @RCC 5
.word 0 @EXTI0 6
.word 0 @EXTI1 7
.word 0 @EXTI2 8
.word 0 @EXTI3 9
.word 0 @EXTI4 10
.word 0 @DMA11 11
.word 0 @DMA12 12
.word 0 @DMA13 13
.word 0 @DMA14 14
.word 0 @DMA15 15
.word 0 @DMA16 16
.word 0 @DMA17 17
.word 0 @ADC1_2 18
.word 0 @USB_HP_CAN1_TX 19
.word 0 @USB_LP_CAN1_RX0 20
.word 0 @CAN1_RX1 21
.word 0 @CAN1_SCE 22
.word 0 @EXTI9_5 23
.word 0 @TIM1_BRK 24
.word 0 @TIM1_UP 25
.word 0 @TIM1_TRG_COM 26
.word 0 @TIM1_CC 27
.word tim2dingshiqi +1 @TIM2 28
.word 0 @TIM3 29
.word 0 @TIM4 30
.word 0 @I2C1_EV 31
.word 0 @I2C1_ER 32
.word 0 @I2C2_EV 33
.word 0 @I2C2_ER 34
.word 0 @SPI1 35
.word 0 @SPI2 36
.word 0 @USART1 37
.word 0 @USART2 38
.word 0 @USART3 39
.word 0 @EXTI15_10 40
.word 0 @RTCAlarm_IRQ 41
.word 0 @USBWakeUp 42
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0 @BootRAM
_start:
ldr r0, = 0x40010004
ldr r1, = 0x02000000
str r1, [r0]
str r1, [r0, # 0x04]
ldr r0, = 0x40021000
ldr r1, = 0x14D83
str r1, [r0]
gsszbz:
ldr r2, [r0]
ldr r1, = 0x20000
tst r1, r2 @HSE高速时钟标志位
bne rccchushihua
b gsszbz
rccchushihua:
ldr r0, = 0x40022000
mov r1, # 0x00000032
str r1, [r0] @FLASH缓冲 缓冲开启
ldr r0, = 0x40021004
ldr r1, = 0x1D8400
str r1, [r0]
ldr r0, = 0x40021000
ldr r1, = 0x1033D03
str r1, [r0]
chaxun:
ldr r2, [r0]
ldr r1, = 0x2000000
tst r1, r2
bne rccgg @等待PLL稳定
b chaxun
rccgg:
ldr r0, = 0x40021004
ldr r1, = 0x1D8402
str r1, [r0] @ PLL作为系统时钟
ldr r0, = 0x40010004
ldr r1, = 0x02000000
str r1, [r0]
neicunqingling: @ 无聊把内存清0
ldr r0, = 0x20000000
ldr r2, = 0x4fff @ 区域是0X4FFF大的地方
mov r1, # 0 @ 写0
qingling_xunhuan:
str r1, [r0], 4
subs r2, # 1
bne qingling_xunhuan @ 循环清0
chushihuayixieshuju: @初始化一些数据
ldr r0, = 0x200004fc
ldr r1, = 0x2200a000
str r1, [r0]
mov r0, # 0
mov r1, r0
mov r2, r0
mov r3, r0
mov r4, r0
mov r5, r0
mov r6, r0
mov r7, r0
mov r8, r0
mov r9, r0
mov r10, r0
mov r11, r0
mov r12, r0
systick:
@0xe000e010 SYSTICK控制状态寄存器
@0=定时器使能
@1=(1倒数到0发出异常请,0无动作)
@2=(0外部始终1内核时钟)
@16= 如果赏赐读取本寄存器后SYSTICK已经数到0则该位为1如果读取该位则清0
@0xe000e014 重载值寄存器 数到0将要被重载的值
@0xe000e018 当前值,写清0
@0e000e01c
@0-23 10MS的时间内倒计数的格数
@ 30=(1教准不是准确的10MS)(0教准是准确的10MS)
ldr r0, = 0xe000e010
mov r1, # 0
str r1, [r0] @ 关掉SYSTICK
ldr r1, = 9000 @ 重载数
str r1, [r0, # 4] @ 写进重载数
str r1, [r0, # 8] @ 清0当前数
ldr r3, = 0xe000ed23 @systick优先级
mov r1, # 240
str r1, [r3]
mov r1, # 3
str r1, [r0] @ 开定时器
waisheshizhong:
@APB2_ENR=0X40021018 0(AFIO)1(保留)2(PA)3(PB)4(PC)5(PD)6(PE)78(保留)
@9(ADC1)10(ADC2)11(TIM1)12(SPI1)13(保留)14(USART1)15(保留)
ldr r0, = 0x40021018 @ APB2_ENR
ldr r1, = 0x3c
str r1, [r0]
@APB1_ENR=0X4002101C
@0=TIM2,1=TIM3,2=TIM4,3=TIM5,4=TIM6,5=TIM7,11=WWDG
@14=SP12,15=SP13,17=UART3,19=UART4,20=UART5
@21=I2C,22=I2C2,23=USB,25=CAN,27=BKPT,28=PWR,29=DACEN
ldr r0, = 0X4002101C @ APB1_ENR
ldr r1, = 0x01
str r1, [r0]
zhongduankongzhi:
@SETENA0=0XE000E100,SETENA1=0XE000E104 @中断使能
@CLRENA0=0XE000E180,CLRENA1=0XE000E184 @中断除能
@SETPEND0=0XE000E200,SETPPEND1=0XE000E204 @中断悬起
@CLRPEND0=0XE000E280,CLRPEND1=0XE000E284 @中断解悬
@ACTIVE0=0XE000E300,ACTIVE1=0XE000E304 @ 中断活动状态
@0XE000E400-0XE000E43C 中断优先级阵列每个占8位
@0XE000ED00=CPUID,0XE000ED04=中断控制及状态寄存器
@0xe000ed08=向量表偏移,0xe000ed0c=应用程序中断及复位
@0xe000ed10=系统控制,0XE000ED14=配置与控制
@0xe000ed18-0xe000ed23=系统异常优先级阵列
ldr r0, = 0xe000ed0c
ldr r1, = 0x5fa0500
str r1, [r0]
ldr r0, = 0xe000e400
mov r1, # 0xc0
str r1, [r0, # 28]
ldr r0, = 0xe000e100 @ 中断使能
ldr r1, = 0x10000000
str r1, [r0]
timdingshiqi:
@tim1=0x40012c00
@+0=CR1 控制寄存器
@+4=CR2 控制寄存器2
@+8=SMCR 从模式控制寄存器
@+c=DIER 中断使能寄存器
@+10=SR 状态寄存器
@+14=EGR 事件产生寄存器
@+18=CCMR1 捕获/比较模式寄存器1
@+1C=CCMR2 捕获/比较模式寄存器2
@+20=CCER 捕获/比较使能寄存器
@+24=CNT 计数器
@+28=PSC 预分频器
@+2C=ARR 重载寄存器
@+30=RCR 重复计数寄存器
@+34=CCR1 捕获/比较寄存器1
@+38=CCR2 捕获/比较寄存器2
@+3C=CCR3 捕获/比较寄存器3
@+40=CCR4 捕获/比较寄存器4
@+44=BDTR 刹车/死区寄存器
@+48=DCR DMA控制器
@+4C=DMAR 连续模式的DMA地址
@TIM2=0x40000000
@18=CCMR1,18=OCMR1,1C=CCMR2,1C=OCMR2
@CNT与CCR比较占空,ARR与PSC决定频率。主频除以PSC=计数频率
ldr r0, = 0x40000000 @ tim2
ldr r1, = 720
str r1, [r0, # 0x28] @ 分频
ldr r1, = 0xffffff
str r1, [r0, # 0x2c] @ 重载
mov r1, # 2
str r1, [r0, # 0x0c] @开中断
mov r1, # 0xf1
str r1, [r0, # 0x18] @ 捕获/比较模式
mov r1, # 3
str r1, [r0, # 0x20] @ 下降沿捕获
ldr r1, = 0x81
str r1, [r0]
IOshezhi:
ldr r0, = 0x40010c00
@PA=0x40010800 PB=0x40010c00 PC=0x40011000
@PD=0x40011400 PE=0x40011800 PF=0x40011c00
@ IO 1(通用推挽10M)2(通用推挽2M)3(通用推挽50M)
@4(浮空输入)5(通用开漏输出10M)6(通用开漏输出2M)
@7(通用开漏输出50M)8(上拉下拉输入)9(复用功能推挽输出10M)
@A(复用功能推挽输出2M)B(复用功能推挽输出50M)C(保留)
@D(复用功能开溜输出10M)E(复用功能开漏输出2M)F(复用功能开漏输出50M)
@ 偏移0X8=IDR 输入数据寄存器
@偏移0XC=ODR 输出数据寄存器
@偏移0X10=BSRR IO开
@偏移0X14=BRR IO关
ldr r1, = 0x45554444
str r1, [r0, # 0x04]
zhucaidian:
bl anjian
mov r0, r11
mov r1, # 8
ldr r2, = 0x20000100
bl zhuan_ascii
mov r0, # 8
bl xieshumaguan
ldr r3, = 0x200004f8
ldr r0, [r3]
ldr r1, = caidian
ldr lr, [r1]
lsl r0, # 2
ldr r2, [r1, r0]
mov pc, r2
dd1:
ldr r11, = 0x100
bx lr
dd2:
ldr r11, = 0x101
bx lr
dd3:
ldr r11, = 0x102
bx lr
dd4:
ldr r11, = 0x103
bx lr
dd5:
ldr r11, = 0x104
bx lr
dd6:
ldr r11, = 0x105
bx lr
dd7:
ldr r11, = 0x106
bx lr
dd8:
ldr r11, = 0x107
bx lr
dd9:
ldr r11, = 0x108
bx lr
dd10:
ldr r11, = 0x109
bx lr
dd11:
ldr r11, = 0x110
bx lr
dd12:
ldr r11, = 0x111
bx lr
dd13:
ldr r11, = 0x112
bx lr
dd14:
ldr r11, = 0x113
bx lr
dd15:
ldr r11, = 0x114
bx lr
dd16:
ldr r11, = 0x115
bx lr
dd17:
ldr r11, = 0x116
bx lr
dd18:
ldr r11, = 0x117
bx lr
dd19:
ldr r11, = 0x118
bx lr
dd20:
ldr r11, = 0x119
bx lr
dd21:
ldr r11, = 0x120
bx lr
dd22:
ldr r11, = 0x121
bx lr
dd23:
ldr r11, = 0x122
bx lr
dd24:
ldr r11, = 0x123
bx lr
dd25:
ldr r11, = 0x124
bx lr
dd26:
ldr r11, = 0x125
bx lr
dd27:
ldr r11, = 0x126
bx lr
dd28:
ldr r11, = 0x127
bx lr
dd29:
ldr r11, = 0x128
bx lr
zhuchengxu:
bl anjian
ldr r2, = 0x200004f8
ldrb r2, [r2]
ldr r1, = 0x20000014
ldrb r8, [r1]
ldrb r2, [r1, # 1]
ldrb r3, [r1, # 2]
ldrb r4, [r1, # 3]
mov r5, # 100
mul r9, r8, r5
movw r5, # 10000
mul r7, r3, r5
ldr r5, = 1000000
mul r6, r4, r5
add r8, r8, r9
add r2, r7, r8
add r0, r2, r6
mov r1, # 8
ldr r2, = 0x20000100
bl zhuan_ascii
ldr r0, = 20160101
mov r1, # 8
ldr r2, = 0x20000110
bl zhuan_ascii
mov r0, # 8
bl xieshumaguan
b zhuchengxu
zhuan_ascii: @ 入口R0=数据 R1= 长度 R2=出口
push {r0-r7,lr}
ldr r7, = shumaguanmabiao
mov r5, # 10
xunhuanqiuma:
udiv r4, r0, r5
mul r6, r4, r5
sub r3, r0, r6
ldrb r6, [r7, r3]
strb r6, [r2], # 1
mov r0, r4
subs r1, # 1
bne xunhuanqiuma
pop {r0-r7,pc}
xie595: @ 入口0X20000000
@74HC595 11=输入锁存 12=输出锁存 14=数据
push {r0-r5,lr}
ldr r0, = 0x422181b0 @ 位带地址
mov r1, # 1 @ 1
mov r2, # 0 @ 0
ldr r3, = 0x22000000 @ 0x20000000的位带
mov r4, # 24 @ 写两个8位
xunhuan595:
str r2, [r0, # 0x08] @ 595_11 输入锁存
ldr r5, [r3], # 4 @ 取出一位的数据
str r5, [r0] @14脚输出数据
str r1, [r0, # 0x08] @ 锁存
subs r4, # 1
bne xunhuan595 @循环16次
str r2, [r0, # 0x04] @ 12输出锁存
str r1, [r0, # 0x04]
pop {r0-r5,pc} @ 弹出各寄存器返回
anjian:
push {r0-r12,lr}
ldr r3, = 0x20000500
ldr r5, = hongwaimabiao
mov r6, # 29
panduananjian:
ldr r4, [r5], # 4
ldr r2, [r3]
cmp r2, r4
beq anjianzhengque
subs r6, # 1
bne panduananjian
b anjianfanhui
anjianzhengque:
ldr r2, = 0x200004f8
str r6, [r2]
anjianfanhui:
pop {r0-r12,pc}
xieshumaguan: @ r0位数
push {r0-r12,lr}
ldr r9, = 0x20000110
ldr r7, = 0x20000100
ldr r8, = shuaxinbiao
ldr r6, = 0x20000000
xianshi:
ldrb r5, [r8], # 1
ldrb r2, [r7], # 1
ldrb r4, [r9], # 1
strb r2, [r6, # 1]
strb r4, [r6, # 2]
strb r5, [r6]
bl xie595
subs r0, # 1
bne xianshi
pop {r0-r12,pc}
_nmi_handler:
bx lr
_hard_fault:
bx lr
_memory_fault:
bx lr
_bus_fault:
bx lr
_usage_fault:
bx lr
systickdingshiqi: @ SYSTICK定时期中断服务函数
push {r0-r12,lr}
ldr r0, = 0xe00ed04
ldr r1, = 0x2000000
str r1, [r0] @ 挂起SYSTICK
ldr r2, = 0x20000010
ldr r4, = 0x20000014
ldrb r3, [r4, # 1]
ldrb r5, [r4, # 2]
ldrb r6, [r4, # 3]
ldrb r7, [r4]
ldr r1, [r2]
add r1, # 1
cmp.w r1, # 1
itt eq
moveq r1, # 0
addeq r3, # 1
cmp r3 ,# 60
itt eq
moveq r3, # 0
addeq r5, # 1
cmp r5, # 60
itt eq
moveq r5, # 0
addeq r6, # 1
cmp r6, # 24
itt eq
moveq r6, # 0
addeq r7, # 1
cmp r7, # 7
it eq
moveq r7, # 0
strb r3, [r4, # 1]
strb r5, [r4, # 2]
strb r6, [r4, # 3]
strb r7, [r4]
str r1, [r2]
pop {r0-r12,pc}
tim2dingshiqi:
push {r0-r7,lr}
ldr r2, = 0x200004fc
ldr r0, = 0x40000034
ldr r3, [r2]
ldr r1, [r0] @ 读取时间
cmp.w r1, # 0xe000
bhi tim2fanhui
cmp.w r1, # 0x1000
ittt hi
ldrhi r4, = 0x2200a000
strhi r4, [r2]
bhi tim2fanhui
cmp r1, # 0xff
itttt hi
ldrhi r5, [r2, # -0x0c]
addhi r5, # 1
strhi r5, [r2, # - 0x0c]
bhi tim2fanhui
cmp r1, # 0xa0
itttt hi
movhi r6, # 1
strhi r6, [r3], # 4
strhi r3, [r2]
bhi tim2fanhui
cmp r1, # 0x60
ittt hi
movhi r6, # 0
strhi r6, [r3], # 4
strhi r3, [r2]
tim2fanhui:
ldr r0, = 0x40000024
mov r1, # 0
str r1, [r0]
pop {r0-r7,pc}
|
能力值:
( LV4,RANK:40 )
|
-
-
3 楼
我以前最早学51的时候也做过数码管时钟,那时候是学的C语言,记得那时候随便从网上复制了点代码就搞定了。 我是菜鸟别笑话我,我不太会说话,生活中是没有朋友的家里蹲。 由于是菜鸟我写的都是简单的小程序, 硬件是16个数码管三个595驱动,用三线连接单片机,PA0上还有个红vs1838B的接收头。 显示公历、时间、星期,用的SYSTICK定时期, 红外解码用的TIM2定时期捕获,29个按键只用了4个,dd1开始按不同的键进入不同的函数,不用重复判断根据第一次判断的按键号进入不同的函数。
.thumb
.syntax unified
.section .data
.align 4
shumaguanmabiao: .byte 0x88,0xbe,0xc4,0x94,0xb2,0x91,0x81,0xbc,0x80,0x90
hongwaimabiao: .int 0xbc43e708,0xb847e708,0xbd42e708,0xbe41e708,0xbf40e708,0xb946e708,0xba45e708,0xbb44e708,0xb54ae708,0xb649e708,0xb748e708,0xb14ee708,0xb24de708,0xb34ce708,0xb44be708,0xeb14e708,0xe31ce708,0xee11e708,0xea15e708,0xe21de708,0xe916e708,0xe01fe708,0xe11ee708,0xed12e708,0xa35ce708,0xe718e708,0xe619e708,0xe51ae708,0xef10e708
shuaxinbiao: .byte 0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00
caidian: .word zhucaidan +1,dd1 +1,dd2 +1,dd3 +1,dd4 +1,dd5 +1,dd6 +1,dd7 +1,dd8 +1,dd9 +1,dd10 +1,dd11 +1,dd12 +1,dd13 +1,dd14 +1,dd15 +1,dd16 +1,dd17 +1,dd18 +1,dd19 +1,dd20 +1,dd21 +1,dd22 +1,dd23 +1,dd24 +1,dd25 +1,dd26 +1,dd27 +1,dd28 +1,dd29 +1
yuefenbiao: .byte 0x00,0x20,0x1d,0x20,0x1f,0x20,0x1f,0x20,0x1f,0x20,0x1f,0x20,0x1f,0x20
.equ STACKINIT, 0x20005000
.equ systickbiaozhi, 0x20000300
.section .text
xiangliangbiao:
.word STACKINIT
.word _start + 1
.word _nmi_handler + 1
.word _hard_fault + 1
.word _memory_fault + 1
.word _bus_fault + 1
.word _usage_fault + 1
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word systickdingshiqi +1
.word 0 @WWDG 0
.word 0 @PVD 1
.word 0 @TAMPER 2
.word 0 @RTC 3
.word 0 @FLASH 4
.word 0 @RCC 5
.word 0 @EXTI0 6
.word 0 @EXTI1 7
.word 0 @EXTI2 8
.word 0 @EXTI3 9
.word 0 @EXTI4 10
.word 0 @DMA11 11
.word 0 @DMA12 12
.word 0 @DMA13 13
.word 0 @DMA14 14
.word 0 @DMA15 15
.word 0 @DMA16 16
.word 0 @DMA17 17
.word 0 @ADC1_2 18
.word 0 @USB_HP_CAN1_TX 19
.word 0 @USB_LP_CAN1_RX0 20
.word 0 @CAN1_RX1 21
.word 0 @CAN1_SCE 22
.word 0 @EXTI9_5 23
.word 0 @TIM1_BRK 24
.word 0 @TIM1_UP 25
.word 0 @TIM1_TRG_COM 26
.word 0 @TIM1_CC 27
.word tim2dingshiqi +1 @TIM2 28
.word 0 @TIM3 29
.word 0 @TIM4 30
.word 0 @I2C1_EV 31
.word 0 @I2C1_ER 32
.word 0 @I2C2_EV 33
.word 0 @I2C2_ER 34
.word 0 @SPI1 35
.word 0 @SPI2 36
.word 0 @USART1 37
.word 0 @USART2 38
.word 0 @USART3 39
.word 0 @EXTI15_10 40
.word 0 @RTCAlarm_IRQ 41
.word 0 @USBWakeUp 42
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0 @BootRAM
_start:
ldr r0, = 0x40010004
ldr r1, = 0x02000000
str r1, [r0]
str r1, [r0, # 0x04]
ldr r0, = 0x40021000
ldr r1, = 0x14D83
str r1, [r0]
gsszbz:
ldr r2, [r0]
ldr r1, = 0x20000
tst r1, r2 @HSE高速时钟标志位
bne rccchushihua
b gsszbz
rccchushihua:
ldr r0, = 0x40022000
mov r1, # 0x00000032
str r1, [r0] @FLASH缓冲 缓冲开启
ldr r0, = 0x40021004
ldr r1, = 0x1D8400
str r1, [r0]
ldr r0, = 0x40021000
ldr r1, = 0x1033D03
str r1, [r0]
chaxun:
ldr r2, [r0]
ldr r1, = 0x2000000
tst r1, r2
bne rccgg @等待PLL稳定
b chaxun
rccgg:
ldr r0, = 0x40021004
ldr r1, = 0x1D8402
str r1, [r0] @ PLL作为系统时钟
ldr r0, = 0x40010004
ldr r1, = 0x02000000
str r1, [r0]
neicunqingling: @ 无聊把内存清0
ldr r0, = 0x20000000
ldr r2, = 0x4fff @ 区域是0X4FFF大的地方
mov r1, # 0 @ 写0
qingling_xunhuan:
str r1, [r0], 4
subs r2, # 1
bne qingling_xunhuan @ 循环清0
chushihuayixieshuju: @初始化一些数据
ldr r0, = 0x200004fc
ldr r1, = 0x2200a000
str r1, [r0]
ldr r0, = 0x2000001c
ldr r1, = 0xffffff
str r1, [r0]
ldr r5, = 0x20000024 @ 22000480
ldr r1, = 0x00110001
ldr r2, = 0x00010001
ldr r3, = 0x00010101
str r1, [r5]
str r2, [r5, # 4]
str r3, [r5, # 8]
systick:
@0xe000e010 SYSTICK控制状态寄存器
@0=定时器使能
@1=(1倒数到0发出异常请,0无动作)
@2=(0外部始终1内核时钟)
@16= 如果赏赐读取本寄存器后SYSTICK已经数到0则该位为1如果读取该位则清0
@0xe000e014 重载值寄存器 数到0将要被重载的值
@0xe000e018 当前值,写清0
@0e000e01c
@0-23 10MS的时间内倒计数的格数
@ 30=(1教准不是准确的10MS)(0教准是准确的10MS)
ldr r0, = 0xe000e010
mov r1, # 0
str r1, [r0] @ 关掉SYSTICK
ldr r1, = 9000 @ 重载数
str r1, [r0, # 4] @ 写进重载数
str r1, [r0, # 8] @ 清0当前数
ldr r3, = 0xe000ed23 @systick优先级
mov r1, # 240
str r1, [r3]
mov r1, # 3
str r1, [r0] @ 开定时器
waisheshizhong:
@APB2_ENR=0X40021018 0(AFIO)1(保留)2(PA)3(PB)4(PC)5(PD)6(PE)78(保留)
@9(ADC1)10(ADC2)11(TIM1)12(SPI1)13(保留)14(USART1)15(保留)
ldr r0, = 0x40021018 @ APB2_ENR
ldr r1, = 0x3c
str r1, [r0]
@APB1_ENR=0X4002101C
@0=TIM2,1=TIM3,2=TIM4,3=TIM5,4=TIM6,5=TIM7,11=WWDG
@14=SP12,15=SP13,17=UART3,19=UART4,20=UART5
@21=I2C,22=I2C2,23=USB,25=CAN,27=BKPT,28=PWR,29=DACEN
ldr r0, = 0X4002101C @ APB1_ENR
ldr r1, = 0x01
str r1, [r0]
zhongduankongzhi:
@SETENA0=0XE000E100,SETENA1=0XE000E104 @中断使能
@CLRENA0=0XE000E180,CLRENA1=0XE000E184 @中断除能
@SETPEND0=0XE000E200,SETPPEND1=0XE000E204 @中断悬起
@CLRPEND0=0XE000E280,CLRPEND1=0XE000E284 @中断解悬
@ACTIVE0=0XE000E300,ACTIVE1=0XE000E304 @ 中断活动状态
@0XE000E400-0XE000E43C 中断优先级阵列每个占8位
@0XE000ED00=CPUID,0XE000ED04=中断控制及状态寄存器
@0xe000ed08=向量表偏移,0xe000ed0c=应用程序中断及复位
@0xe000ed10=系统控制,0XE000ED14=配置与控制
@0xe000ed18-0xe000ed23=系统异常优先级阵列
ldr r0, = 0xe000ed0c
ldr r1, = 0x5fa0500
str r1, [r0]
ldr r0, = 0xe000e400
mov r1, # 0xc0
str r1, [r0, # 28]
ldr r0, = 0xe000e100 @ 中断使能
ldr r1, = 0x10000000
str r1, [r0]
timdingshiqi:
@tim1=0x40012c00
@+0=CR1 控制寄存器
@+4=CR2 控制寄存器2
@+8=SMCR 从模式控制寄存器
@+c=DIER 中断使能寄存器
@+10=SR 状态寄存器
@+14=EGR 事件产生寄存器
@+18=CCMR1 捕获/比较模式寄存器1
@+1C=CCMR2 捕获/比较模式寄存器2
@+20=CCER 捕获/比较使能寄存器
@+24=CNT 计数器
@+28=PSC 预分频器
@+2C=ARR 重载寄存器
@+30=RCR 重复计数寄存器
@+34=CCR1 捕获/比较寄存器1
@+38=CCR2 捕获/比较寄存器2
@+3C=CCR3 捕获/比较寄存器3
@+40=CCR4 捕获/比较寄存器4
@+44=BDTR 刹车/死区寄存器
@+48=DCR DMA控制器
@+4C=DMAR 连续模式的DMA地址
@TIM2=0x40000000
@18=CCMR1,18=OCMR1,1C=CCMR2,1C=OCMR2
@CNT与CCR比较占空,ARR与PSC决定频率。主频除以PSC=计数频率
ldr r0, = 0x40000000 @ tim2
ldr r1, = 720
str r1, [r0, # 0x28] @ 分频
ldr r1, = 0xffffff
str r1, [r0, # 0x2c] @ 重载
mov r1, # 2
str r1, [r0, # 0x0c] @开中断
mov r1, # 0xf1
str r1, [r0, # 0x18] @ 捕获/比较模式
mov r1, # 3
str r1, [r0, # 0x20] @ 下降沿捕获
ldr r1, = 0x81
str r1, [r0]
IOshezhi:
ldr r0, = 0x40010c00
@PA=0x40010800 PB=0x40010c00 PC=0x40011000
@PD=0x40011400 PE=0x40011800 PF=0x40011c00
@ IO 1(通用推挽10M)2(通用推挽2M)3(通用推挽50M)
@4(浮空输入)5(通用开漏输出10M)6(通用开漏输出2M)
@7(通用开漏输出50M)8(上拉下拉输入)9(复用功能推挽输出10M)
@A(复用功能推挽输出2M)B(复用功能推挽输出50M)C(保留)
@D(复用功能开溜输出10M)E(复用功能开漏输出2M)F(复用功能开漏输出50M)
@ 偏移0X8=IDR 输入数据寄存器
@偏移0XC=ODR 输出数据寄存器
@偏移0X10=BSRR IO开
@偏移0X14=BRR IO关
ldr r1, = 0x45554444
str r1, [r0, # 0x04]
kammengou:
ldr r0, = 0x40003000
ldr r1, = 0x5555
str r1, [r0]
mov r1, # 4
str r1, [r0, # 4]
ldr r1, = 0x28c
str r1, [r0, # 8]
ldr r1, = 0xaaaa
str r1, [r0]
ldr r1, = 0xcccc
str r1, [r0]
zhucaidan:
ldr r0, = 0x40003000
ldr r1, = 0xaaaa
str r1, [r0] @ 看门狗
ldr r0, = 0xe000e010
mov r1, # 0
str r1, [r0]
bl systickdingshiqi
bl anjian
ldr r0, = 0x20000014
bl zhuan_shijinzhi
ldr r0, [r12, # -4]
mov r1, # 8
ldr r2, = 0x20000100
bl zhuan_ascii
ldr r0, = 0x20000018
bl zhuan_shijinzhi
ldr r0, [r12, # -4]
mov r1, # 8
ldr r2, = 0x20000110
bl zhuan_ascii
mov r0, # 8
bl xieshumaguan
ldr r3, = 0x200004f8
ldr r0, [r3]
ldr r1, = caidian
ldr lr, [r1]
lsl r0, # 2
ldr r2, [r1, r0]
mov pc, r2
dd2:
ldr r11, = 0x101
bx lr
dd3:
push {r0-r10,lr}
ldr r3, = 0x20000020
ldr r3, [r3]
ldr r0, = 0x20000014
ldrb r1, [r0, r3]
add r1, # 1
strb r1, [r0, r3]
bl qingchuanjian
pop {r0-r10,pc}
dd4:
push {r0-r10,lr}
ldr r5, = 0x20000020
ldr r4, [r5]
add r4, # 1
cmp r4, # 8
it eq
moveq r4, # 0
str r4, [r5]
bl qingchuanjian
ldr r11, = 0x103
pop {r0-r10,pc}
dd5:
ldr r11, = 0x104
bx lr
dd6:
ldr r11, = 0x105
bx lr
dd7:
ldr r11, = 0x106
bx lr
dd8:
ldr r11, = 0x107
bx lr
dd9:
ldr r11, = 0x108
bx lr
dd10:
ldr r11, = 0x109
bx lr
dd11:
ldr r11, = 0x110
bx lr
dd12:
ldr r11, = 0x111
bx lr
dd13:
ldr r11, = 0x112
bx lr
dd14:
ldr r11, = 0x113
bx lr
dd15:
ldr r11, = 0x114
bx lr
dd16:
ldr r11, = 0x115
bx lr
dd17:
ldr r11, = 0x116
bx lr
dd18:
ldr r11, = 0x117
bx lr
dd19:
ldr r11, = 0x118
bx lr
dd20:
ldr r11, = 0x119
bx lr
dd21:
ldr r11, = 0x120
bx lr
dd22:
ldr r11, = 0x121
bx lr
dd23:
ldr r11, = 0x122
bx lr
dd24:
ldr r11, = 0x123
bx lr
dd25:
ldr r11, = 0x124
bx lr
dd26:
ldr r11, = 0x125
bx lr
dd27:
ldr r11, = 0x126
bx lr
dd28:
ldr r11, = 0x127
bx lr
dd29:
ldr r11, = 0x128
bx lr
dd1:
ldr r0, = 0xe000e010
mov r1, # 3
str r1, [r0]
zhuye:
ldr r0, = 0x40003000
ldr r1, = 0xaaaa
str r1, [r0] @看门狗
bl anjian
ldr r2, = 0x200004f8
ldrb r2, [r2]
cmp r2, # 2
it eq
beq zhucaidan
ldr r0, = 0x20000014
bl zhuan_shijinzhi
ldr r0, [r12, # -4]
mov r1, # 8
ldr r2, = 0x20000100
bl zhuan_ascii
ldr r0, = 0x20000018
bl zhuan_shijinzhi
ldr r0, [r12, # -4]
mov r1, # 8
ldr r2, = 0x20000110
bl zhuan_ascii
mov r0, # 8
bl xieshumaguan
b zhuye
zhuan_shijinzhi: @ R0=要转换的数的地址
push {r0-r9,lr}
mov r12, sp
sub sp, # 0x04
ldrb r8, [r0]
ldrb r2, [r0, # 1]
ldrb r3, [r0, # 2]
ldrb r4, [r0, # 3]
mov r5, # 100
mul r9, r2, r5
movw r5, # 10000
mul r7, r3, r5
ldr r5, = 1000000
mul r6, r4, r5
add r8, r8, r9
add r2, r7, r8
add r1, r2, r6
str r1, [sp]
mov sp, r12
pop {r0-r9,pc}
zhuan_ascii: @ 入口R0=数据 R1= 长度 R2=出口
push {r0-r7,lr}
ldr r7, = shumaguanmabiao
mov r5, # 10
xunhuanqiuma:
udiv r4, r0, r5
mul r6, r4, r5
sub r3, r0, r6
ldrb r6, [r7, r3]
strb r6, [r2], # 1
mov r0, r4
subs r1, # 1
bne xunhuanqiuma
pop {r0-r7,pc}
xie595: @ 入口0X20000000
@74HC595 11=输入锁存 12=输出锁存 14=数据
push {r0-r5,lr}
ldr r0, = 0x422181b0 @ 位带地址
mov r1, # 1 @ 1
mov r2, # 0 @ 0
ldr r3, = 0x22000000 @ 0x20000000的位带
mov r4, # 24 @ 写两个8位
xunhuan595:
str r2, [r0, # 0x08] @ 595_11 输入锁存
ldr r5, [r3], # 4 @ 取出一位的数据
str r5, [r0] @14脚输出数据
str r1, [r0, # 0x08] @ 锁存
subs r4, # 1
bne xunhuan595 @循环16次
str r2, [r0, # 0x04] @ 12输出锁存
str r1, [r0, # 0x04]
pop {r0-r5,pc} @ 弹出各寄存器返回
qingchuanjian:
push {r0-r1,lr}
ldr r0, = 0x200004f8
mov r1, # 0
str r1, [r0]
ldr r0, = 0x20000500
str r1, [r0]
pop {r0-r1,pc}
anjian:
push {r0-r12,lr}
ldr r3, = 0x20000500
ldr r5, = hongwaimabiao
mov r6, # 29
panduananjian:
ldr r4, [r5], # 4
ldr r2, [r3]
cmp r2, r4
beq anjianzhengque
subs r6, # 1
bne panduananjian
b anjianfanhui
anjianzhengque:
ldr r2, = 0x200004f8
str r6, [r2]
anjianfanhui:
pop {r0-r12,pc}
xieshumaguan: @ r0位数
push {r0-r12,lr}
ldr r9, = 0x20000110
ldr r7, = 0x20000100
ldr r8, = shuaxinbiao
ldr r6, = 0x20000000
xianshi:
ldrb r5, [r8], # 1
ldrb r2, [r7], # 1
ldrb r4, [r9], # 1
strb r2, [r6, # 1]
strb r4, [r6, # 2]
strb r5, [r6]
bl xie595
subs r0, # 1
bne xianshi
pop {r0-r12,pc}
_nmi_handler:
bx lr
_hard_fault:
bx lr
_memory_fault:
bx lr
_bus_fault:
bx lr
_usage_fault:
bx lr
systickdingshiqi: @ SYSTICK定时期中断服务函数
push {r0-r12,lr}
ldr r0, = 0xe00ed04
ldr r1, = 0x2000000
str r1, [r0] @ 挂起SYSTICK
ldr r2, = 0x20000010
ldr r4, = 0x20000014
ldrb r3, [r4, # 1]
ldrb r5, [r4, # 2]
ldrb r6, [r4, # 3]
ldrb r8, [r4, # 4]
ldrb r9, [r4, # 5]
ldrb r10, [r4, # 6]
ldrb r11, [r4, # 7]
ldrb r7, [r4]
ldr r1, [r2]
ldr r0, = 0xe000e010
ldr r0, [r0]
cmp r0, # 0
beq tiaoguojiajia
add r1, # 1
tiaoguojiajia:
cmp.w r1, # 1000
itt cs
movcs r1, # 0
addcs r3, # 1
cmp r3 ,# 60
itt cs
movcs r3, # 0
addcs r5, # 1
cmp r5, # 60
itt cs
movcs r5, # 0
addcs r6, # 1
cmp r6, # 24
ittt cs
movcs r6, # 0
addcs r7, # 1
addcs r8, # 1
cmp r7, # 8
it cs
movcs r7, # 1
ldr r0, = 0x20000038
ldr r12, = yuefenbiao
ldrb r0, [r12, r9]
cmp r0, # 0x1d
bne runnianbuchang
ldr r12, = 0x22000480
push {r1, r9}
lsl r9, # 2
ldr r1, [r12, r10]
cmp r1, # 1
it eq
addeq r0, # 1
pop {r1, r9}
runnianbuchang:
cmp r8, r0
itt cs
movcs r8, # 1
addcs r9, # 1
cmp r9, # 13
itt cs
movcs r9, # 1
addcs r10, # 1
cmp r10, # 99
itt cs
movcs r10, # 0
addcs r11, # 1
cmp r11, # 99
it cs
movcs r11, # 0
strb r7, [r4]
strb r3, [r4, # 1]
strb r5, [r4, # 2]
strb r6, [r4, # 3]
strb r8, [r4, # 4]
strb r9, [r4, # 5]
strb r10, [r4, # 6]
strb r11, [r4, # 7]
str r1, [r2]
pop {r0-r12,pc}
tim2dingshiqi:
push {r0-r12,lr}
ldr r2, = 0x200004fc
ldr r0, = 0x40000034
ldr r3, [r2]
ldr r1, [r0] @ 读取时间
cmp.w r1, # 0xe000
bhi tim2fanhui
cmp.w r1, # 0x1000
ittt hi
ldrhi r4, = 0x2200a000
strhi r4, [r2]
bhi tim2fanhui
cmp r1, # 0xff
itttt hi
ldrbhi r5, [r2, # - 0x0c]
addhi r5, # 1
strbhi r5, [r2, # - 0x0c]
bhi tim2fanhui
cmp r1, # 0xa0
itttt hi
movhi r6, # 1
strhi r6, [r3], # 4
strhi r3, [r2]
bhi tim2fanhui
cmp r1, # 0x60
ittt hi
movhi r6, # 0
strhi r6, [r3], # 4
strhi r3, [r2]
tim2fanhui:
ldr r0, = 0x40000024
mov r1, # 0
str r1, [r0]
pop {r0-r12,pc}
shizhong3.zip
|