上周、我们的代码测试失败(停止处理睡眠定时器中断)。
我们现在已经生成了一个150行汇编器代码示例、其中没有显示问题。
代码设置一个睡眠定时器的时间为 ca 2秒、并在处理时翻转一个 prot 位。
无论它是否起作用、都取决于某些代码对齐和端口寄存器写入。 (请参阅代码中的注释)
该代码在 TI 的 CC2510EM 3.0模块上进行测试
;按预期运行时,它将每秒切换一次 p1.0引脚
;和 p1.3将始终保持低电平
;失败时,P1停止切换
;要查看问题,需要更改的内容:
;第80-81行:注释掉这些行中的一个或两个,如果它们运行或失败,则会发生变化
;第98行:0xa6可以写入 P0,但不能写入0xa8
;第131行:对齐睡眠代码的“睡眠”部分似乎有所帮助
$NOMOD51;禁用 IDE 预定义的8051寄存器
SFR P1DIR = 0xFE
SFR P1 = 0x90
SFR WORTIME0 = 0xA5
SFR WOREVT1 = 0xA4
SFR WOREVT0 = 0xA3
SFR CLKCON=0xC6
SFR WORIRQ = 0xA1
SBIT STIE = 0xAD
SBIT EA = 0xAF
SFR P2 = 0xA0
SFR P0 = 0x80
SFR PSW = 0xD0
SBIT STIF = 0xC7
SFR DMA0CFGH = 0xD5
SFR DMA0CFGL = 0xD4
SFR DMAARM = 0xD6
SFR MEMCTR = 0xC7
SFR 睡眠= 0xBE
SFR DMAREQ = 0xD7
SFR PCON=0x87
使用0
ISEG at 80h;在间接可寻址 RAM 中声明一个段
stack:ds 20h;保留32字节 mem 空间(80h 至9Fh)。
;设置中断矢量
CSEG 位于0x00
LJMP 启动
CSEG 位于0x23
LJMP ISR_NOT _已实现
;5. ST (睡眠定时器比较):
CSRG 位于0x2B
LJMP ISR_st;3字节。 0x2E 0x30
CSRG 位于0x100
未实现的 ISR_ISR_:
SETB p1.3
JMP ISR_NOT _已实现
START:MOV SP、#STACK-1
;将系统时钟设置为 RC,13MHz,保留所有其它设置:
MOV P1DIR,#0x09;P1.0闪烁1秒,P1.3指示是否发生其他中断
;等待执行计时器 eedge
MOV A、WORTIME0
LOOP_2:CJNE A、WORTIME0、EDGE_2
JMP LOOP_2
EDGE_2:;设置2秒(大约)睡眠超时
MOV WOREVT1、#HIGH 33333d
MOV WOREVT0、#LOW 33333d
ORL WORIRQ,#00010000b;启用睡眠定时器模块-内部(EVENT0_MASK)
SETB STIE;启用睡眠定时器 CPU 内部。 (IEN0.STIE)
SETB EA
-------------------------------------------------------
MOV P2、#00000011b;注释掉这一行、它将不断失败
MOV P1、#01000011b;注释掉此行、它始终有效、也可以注释掉上行
SLEEP_LOOP:调用 ENTER_SLEEP;睡眠测试循环
JMP SLEEP_LOOP
可重置
;'********* ISR_ST
ISR_st:
按 PSW
CLR STIF
ANL WORIRQ、#111110b
cpl P1.0;切换 p1.0,每扇区一端
MOV P0、#0xA6;正在移动0xA6、如果将0xA8移动到 p0则失败(P1停止切换)
弹出 PSW
RETI
ENTER_SLEEP:
;我们不会测试是否有足够的时间,因为在此测试中,它始终有足够的时间来休眠
MOV DMA0CFGH、#high hiber_dma_conf;(定义如下)
MOV DMA0CFGL、#low hiber_dma_conf
MOV DMAARM、#0000$0001b;读取配置和 ARM 通道0
MOV A、WORTIME0
循环:CJNE A、WORTIME0、EDGE
JMP 环路
EDGE:ORL MEMTR,#00000010b;禁用闪存
MOV 睡眠、#00000110b;设置 PM2
NOP;NOP 是必需的
NOP;必需
NOP;必需
;定时关键代码:
立即调用 SLEEP_NOW
可重置
;----- ------- ------- ------- ------- ------- ------- ------- ------- -
_DMA_DATA_PM2:dB 0x06、0x06、0x06、0x06、0x06、 0x06、0x04
Hiber_DMA_conf:DW _DMA_DATA_PM2
DB 0xDF、0xBE、0x00、0x07、0x20、 0x42
CSEG 位于0x6246;发生故障的 somtimes
;CSEG 位于0x624A;在所有示例中工作
;对齐关键,0x624A 似乎始终工作
;定时关键代码:
立即睡眠:
MOV DMAREQ、#0000$0001b;触发通道0 (仅限 PM2)
nop;所有 DMA 传输精确<<<<< ===================================================================================
ORL PCON、#0000$0001b;进入睡眠模式
NOP;在此 NOP 之后,ISR 是向量的
可重置
结束