BLHeli_S 代码分析---BLHeli.asm入口函数pgm_start分析

发布时间:2024年01月16日

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立即数传送到累加器22
MOV A,direct直接寻址字节传送到累加器22
jb bit,rel直接地址位为1则跳转33/4
jz rel累加器为零跳转22/3
inc direct直接地址单元加121
dec direct直接地址单元减121

源代码

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_1Flash_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。

附录


RSTSRC(复位源)寄存器

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_39567970/article/details/135594260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。