lock_byte_ok
分析lock_byte_ok
代码该函数主要配置看门狗、堆栈空间、复位源、时钟频率
Bit_Access: DS 1
AIKON_Boltlite_30A.inc
文件中的宏定义ONE_S_CAPABLE EQU 0 ; Set to 1 if ESC can operate at 1S
SIGNATURE_001 EQU 0f3h ; Device signature MCU的型号
助记符 | 指令说明 | 字节 | 时钟 |
---|---|---|---|
MOV direct,#data | 立即数传送到累加器 | 2 | 2 |
MOV A,direct | 直接寻址字节传送到累加器 | 2 | 2 |
anl direct,#data | 直接地址单元与立即数相与 | 3 | 3 |
orl direct,#data | 直接地址单元与立即数相或 | 3 | 3 |
add A,#data | 立即数加到累加器 | 2 | 2 |
jb bit,rel | 若直接寻址位为 1 则跳转 | 3 | 3/4 |
lock_byte_ok:
; 禁用 WDT.
IF SIGNATURE_001 == 0f3h
anl PCA0MD, #NOT(40h) ; 清除窗口看门狗使能位
ENDIF
IF SIGNATURE_001 == 0f8h
mov WDTCN, #0DEh ; 禁用窗口看门狗
mov WDTCN, #0ADh
ENDIF
; 初始化堆栈
mov SP, #0c0h ; 堆栈= 64字节的内存上限
; 初始化VDD监视器
orl VDM0CN, #080h ; 开启VDD监视器
call wait1ms ; 至少等100us
IF ONE_S_CAPABLE == 0
mov RSTSRC, #06h ; 如果不具备1S功能,则将缺失的时钟和VDD监视器设置为复位源
ELSE
mov RSTSRC, #04h ; 不要将VDD监视器设置为1S esc的复位源,以避免由于它而复位
ENDIF
; 设置时钟频率
IF SIGNATURE_001 == 0f3h
orl OSCICN, #03h ; 将时钟分压器设置为1 (f850上不支持)
ENDIF
IF SIGNATURE_001 == 0f8h
mov CLKSEL, #00h ; 将时钟分压器设置为1 (f3xx上不支持)
ENDIF
mov A, OSCICL
add A, #02h ; 24.5MHz ~ 24MHz(每步~0.5-1%)
jb ACC.7, reset_cal_done ;是否设置进位(7位)?--分支
mov Bit_Access_Int, A
IF SIGNATURE_002 <> 010h
mov A, OSCLCN
ELSE
mov A, OSCXCN
ENDIF
jb ACC.0, reset_cal_done ; 设置如果调用已经完成
mov OSCICL, Bit_Access_Int
IF SIGNATURE_002 <> 010h
orl OSCLCN, #01h ; 标记调用结束了
ELSE
orl OSCXCN, #01h ; 标记调用结束了
ENDIF
该部分代码主要是对看门狗寄存器、堆栈分配、复位源、时钟分频的一些配置
WDTCN、CLKSEL寄存器为C8051F8x
系列芯片的寄存器,我们以C8051F3x
系列MCU为主,暂不详细解释C8051F8x
的MCU
reset_cal_done
函数分析由于本人汇编语言能力有限,阅读代码期间虽然询问了懂汇编的老工程师及查询资料,难免文中出现错误,还请诸位汇编大神指出,万分感谢