BLHeli_S 代码分析—BLHeli.asm入口函数pgm_start
分析
pgm_start 代码
代码中数据变量定义
Bit_Access: DS 1
Flash_Key_1: DS 1 ; Flash key one
Flash_Key_2: DS 1 ; Flash key two
AIKON_Boltlite_30A.inc
文件中定义的变量
LOCK_BYTE_ADDRESS_16K EQU 3FFFh ; Address of lock byte if 16k flash size
LOCK_BYTE_ADDRESS_8K EQU 1FFFh ; Address of lock byte if 8k flash size
SiLab汇编指令
助记符 | 指令说明 | 字节 | 时钟 |
---|---|---|---|
MOV A,#data | 立即数传送到累加器 | 2 | 2 |
MOV A,direct | 直接寻址字节传送到累加器 | 2 | 2 |
jb bit,rel | 直接地址位为1则跳转 | 3 | 3/4 |
jz rel | 累加器为零跳转 | 2 | 2/3 |
inc direct | 直接地址单元加1 | 2 | 1 |
dec direct | 直接地址单元减1 | 2 | 1 |
源代码
pgm_start:
; 将flash键初始化为无效值
mov Flash_Key_1, #0
mov Flash_Key_2, #0
; 检查flash锁字节
mov A, RSTSRC
jb ACC.6, ($+6) ; 检查flash访问错误是否复位 如果寄存器RSTSRC.6为1 表示flash错误 跳转到下下下行代码
mov Bit_Access, #0 ; 这不是第一次尝试
inc Bit_Access ; Bit_Access 变量+1
mov DPTR, #LOCK_BYTE_ADDRESS_16K ; 第一次尝试是16k闪存大小
mov A, Bit_Access
dec A
jz lock_byte_test
mov DPTR, #LOCK_BYTE_ADDRESS_8K ; 第二次尝试是8k闪存大小
dec A
jz lock_byte_test
代码理解
- 初始化变量
Flash_Key_1
和Flash_Key_2
为0 - 检查Flash读写错误标志位是否为1,为1则跳过六条指令到
mov DPTR, #LOCK_BYTE_ADDRESS_8K
否则继续执行 - 初始化变量
Bit_Access
为0 — 理解为 - 将16K大小的Flash地址装载到 DPTR
- 将变量
Bit_Access
装载到累加器,累加器A进行 dec 减 1 操作,判断其为0则跳转到lock_byte_test
函数 - 将8K大小的Flash地址装载到 DPTR
- 累加器A进行 dec 减 1 操作,判断其为0则跳转到
lock_byte_test
函数
lock_byte_test代码
lock_byte_test:
movc A, @A+DPTR ; 读锁字节
inc A
jz lock_byte_ok ; 如果锁字节为0xFF,则开始执行代码
IF ONE_S_CAPABLE == 0
mov RSTSRC, #16h ; 生成硬件复位和设置丢失的时钟和VDD监视器
ELSE
mov RSTSRC, #14h ; 生成硬件复位并禁用VDD监视器
ENDIF
上文中 DPTR 寄存器已将装载相应地址,将地址送到累加器A ,然后进行地址+1 操作,判断是否超出Flash。