This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR4133:从16 MHz的LPM3退出时检测到FRAM不可纠正位错误

Guru**** 657930 points
Other Parts Discussed in Thread: MSP430FR4133, MSP-TS430PM64D, MSP-FET
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/663705/msp430fr4133-fram-uncorrectable-bit-error-detected-when-exiting-from-lpm3-with-16-mhz

部件号:MSP430FR4133
主题中讨论的其他部件: MSP-TS430PM64DMSP-FET

我接管了中提到的项目

https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/61.9768万

现在,我看到了类似的效果,让我假设一些MSP430FR4133
CPU的行为方式"不同"。 我现在不想说“硅虫”,但我很接近它
(特别是我不久前发现CPU46 ;-))。

在线程中换用有问题的CPU后,出现的坏效果消失了。 我们决定了
因为这是一个糟糕的芯片而关闭...

现在已构建了140台设备。 133运行良好。 其他7台设备由于不可纠正而执行PUC
FRAM错误。 只有在以下情况下才会发生此情况

-使用16 MHz MCLK IST
-使用LPM3

它似乎出现在CPU第一次从LPM3唤醒时以及之前
执行第一个命令。 如果使用LPM0或CPU以8 MHz运行,则不会发生任何错误。


我已将固件(12 KB汇编器)最小化为几个字节,以显示错误。 这个
代码(附在下面)执行以下操作:

1.启动并保存SYSUNIV,SYSSNIV,SYSRSTIV和SP的值

2.配置端口,使其不会消耗电流并离开连接的硬件(一个LCD,一个24C512
EEPROM,某些I/O端口)处于某种非干扰状态

3.初始化时钟(在msp430fr413x_CS_02.asm和msp430fr413x_CS_05.asm中完成)

4.启用FRAM错误报告

5.初始化UART

6.通过UART将SYSRSTIV,SYSSNIV,SYSUNIV和SP的保存值发送到PC

7.初始化RTC,使其每隔1秒中断一次。

8.启用中断并在无限循环中旋转。 在上启用LPM3之前,循环一直处于AM状态
RTC ISR结束。

RTC ISR只需通过UART发出'.',即可显示它已被调用。  然后激活LPM3
在返修和返修时。

按下RESET后,我们会在终端上看到:

0004 0000 0000 2100            (第1行)
(暂停1秒)
。                                                    (第2行)
(暂停1秒)
001C 0000 0000 2800            (第3行)
(暂停1秒)
。                                                    (第4行)
(暂停1秒)
001C 0000 0000 2800            (第5行)


第1行是SYSRSTIV,SYSSNIV,SYSUNIV和SP的输出。 这是正常的,因为0x0004是的值
"RSTIFG (BOR)",其他为0。 0x2100是BOR中众所周知的SP值。
现在程序在主循环中旋转,但仍在AM中旋转。 目前尚未涉及LPM3。

1秒后,RTC ISR点击并输出'.' (第2行)。 现在它进入LPM3并休眠。

再过1秒后,RTC ISR再次命中。 它从LPM3唤醒,这是当不可纠正时
FRAM错误命中次数。 它执行信件PUC (第3行),我们看到0x001c,代表
"不可纠正的FRAM位错误检测"。 SP仍为0x2800这一事实表明这是临时市政局
由于ISR条目,在任何PC或SR保存到堆栈之前发生。

现在,我们在主循环(am)中再次旋转,ISR点击1秒(第4行)后,我们再转至LPM3,再转1次
第二次,它又是PUP (第5行)。


我检查了电流消耗,只是为了确保这里没有时髦的东西--一切看起来都很好:1毫安
在AM中,LPM3中的2.5 uA (包括TPS7.8233万,24LC512和一些其它空闲部件)。

使用NWAITS_x解决问题毫无帮助。 与FRPWR和FRLPMPWR相同。 加热或冻结切屑
也不会改变任何内容。

有趣的部分是:当我不在GCCTL0中设置UBDRSTEN时,不再生成任何POC (当然)
但该方案继续正常进行。  这适用于小测试代码和设备的正常操作系统。

所以我的代码要么是错误的(如果你找到一些东西我会很乐意测试它),要么是CPU。 如果是后者
如果是,要么确实存在不可纠正的FRAM错误,要么这种情况的检测逻辑错误
(这可能是正确的,因为代码似乎在禁用UBDRSTEN时正常运行)。

;选择8或16 MHz
#定义快速

#包括<MSP40.0.h>

.section .text,"ax",@probits

Word 0x1234

启动: 色调
MOV #WDTPW|WDTHOLD,&WDTTL ; stop wd.

MOV &SYSUNIV,R6 ;保存SYSUNIV
MOV &SYSSNIV,R5 ;保存SYSSNIV
MOV &SYSRSTIV,R4 ;保存SYSRSTIV
MOV SP,R7 ;保存SP

MOV ##_stack,SP ; init stackpointer

;---端口---

之二 #ADCPCTL5|ADCPCTL6|ADCPCTL7,&SYSCFG2;设置模拟端口

MOV #0xFFFF,Paren (&P) ;ALLE Pull-Rs ON
MOV #0xFFFF,&PBREN
MOV #0xFFFF,&PCREN
MOV #0xFFFF,&PDREN

CLR PAOUT (&P)
CLR &PBOUT
MOV #BIT3 | BIT2,&PCOUT;I2C材料的上拉菜单
CLR PDOUT (&P)

之二 #BIT0,&PADIR ;进行TxD输出

BIC.b #LOCKLPM2,&PM5CTL0 ;全局IO启用

;---初始时钟(从TI网站被盗)---

#ifdef fast
;根据MCLK设备数据表的要求配置一个FRAM等待状态
;在配置时钟系统之前运行超过8MHz。
MOV.w #FRCTLPW+NWITS_1,&FRCTL0
#endif

XT1on: BIS.b #BIT1+BIT2,&P4SEL0 ;将XT1引脚设置为第二个函数
XT1chk: BIC.w #XT1OFFG+DCOFFG,&CSCTL7;清除XT1,DCO故障标志
BIC.w #OFIFG,&SFRIFG1 ;清除故障标志
bit.w #OFIFG,&SFRIFG1 ;测试示波器故障标志
jnz XT1chk ;如果设置了,请再次尝试清除

BIS.w #SCG0,SR ;禁用FLL
BIS.w #SELREF__XT1CLK,&CSCTL3;将XT1设置为FLL参考源
MOV.w #0,&CSCTL0 ;清除DCO和MOD寄存器
BIC.w #DCORSEL_7,&CSCTL1 ;清除DCO频率选择位优先
#ifdef fast
BIS.w #DCORSEL_5,&CSCTL1. ;设置DCO = 16MHz,FR413x中的最大值
MOV.w #FLLD_0+487,&CSCTL2 ;DCODIV = 16MHz
#其它
BIS.w #DCORSEL_3,&CSCTL1 ;设置DCO =8MHz
MOV.w #FLLD_0+243,&CSCTL2 ; DCODIV = 8MHz
#endif
无操作
无操作
无操作
BIC.w #SCG0,SR ;启用FLL
解锁: MOV.w &CSCTL7,R13
和.w #FLLUNLOCK0|FLLUNLOCK1,R13
jnz 解锁 ;检查FLL是否锁定

MOV.w #SELMS__DCOCLKDIV+LAST__XT1CLK,&CSCTL4

#ifdef FAST
之二 #DIVS0,&CSCTL5 ; SMCLK = MCLK/2
#endif

;---初始化FRAM错误报告---

BIS.b #UBDRSTEN | CBDIE,&GCCTL0 ; UncorrErr=pus, CorrErr=NMI

;--初始化UART ---

MOV #UCSSEL__SMCLK | UCSSWRST,&UCA0CTLW0;Clock=SMCLCK,重置

MOV 13号,&UCA0BRW ;UCBR
MOV #(0x21 << 8)| UCOS16,&UCA0MCTLW ;3.84万波特

BIS.b #BIT0 | BIT1,&P1SEL0;端口引脚是UART

BIC.b #UCSWRST,&UCA0CTLW0;UART重设状态关闭

;---显示保存的引导程序---

呼叫#putnl

MOV R4,R14
调用#putword

MOV R5,R14
调用#put词

MOV R6,R14
调用#put词

MOV R7,R14
调用#put词

调用#putnl

;---初始化RTC计数器---

MOV #3.2767万,&RTCMOD ;每1秒

MOV #RTCSS__XT1CLK | RTCSR,&RTCCTL ; Clock=XT1CLK,CLR计数器

BIS.b #RTCIE,&RTCCTL ;启用RTC Int

;---主---

色调

永远: JMP Forever


;#######################################################################
;RTC ISR
;###############################################################

RTC_ISR: TST RTCIV (&R) ;取消设置ISR标志

MOV.b #'.',R15
调用#putchar

之二 #LPM3_bits,0 (SP) ;将LPM3设置为RETI
RETI

;#######################################################################
;输出子程序
;###############################################################################

推词: 呼叫#putspace

输入字: swpb R14 ;高字节
调用#putbyte
swpb R14 ;低字节

推字节: MOV R14,R15 ;复制字节

Rram #4,R15 ;高半字节

呼叫#putnib ;发送到RS232

MOV R14,R15 ;复制字节

putnib: 和 0xF,R15 ;掩膜低半字节
添加 #'0',R15 ;添加'0'
CMP ##0'+10,R15 ;>'10'?
JLO putchar ;否

添加 #'A'-'0'-10,R15 ;是的,修复
JMP putchar

putnl: MOV.b #'\r',R15
调用#putchar
MOV.b #'\n',R15
JMP putchar

putspace: MOV.b #',R15

putchar: Bit.b #UCTXIFG,&UCA0IFG ; UCA0TXBUF为空?
JZ putchar ;不,等待

MOV.b R15,&UCA0TXBUF ;发送char

putchar_ret:RET


;#########################################################################################################################################################################################################
;ISR引导程序
;#######################################################################

@章节__interrupT_vector_lcd_e,"A",n ü r probits

Word开始 ; lcd

.section __interrupt_vector_port2,“A”,@probits

Word开始 ; P2

.section __interrupT_vector_port1,"A",@probits

Word开始 ; P1

.section __interrupt_vector_adc,"A",@程序

Word开始 ; ADC

.section __interrupt_vector_USI_b0,“A”,@probits

Word开始 ; eUSSCI_B0接收或发送

.section __interrupT_vector_USI_a0,"A",@probits

Word开始 ; eUSI_A0接收或发送

.section __interrupt_vector_WDT,“A”,@probits

Word开始 ;看门狗计时器间隔

。节__interrupT_vector_rtc,“A”,@probits

Word RTC_ISR ; RTC Counter

.section __interrupT_vector_Timer1_A1,"A",@probits

Word开始 ; Timer1_A3 TA1CCR1,TA1CCR2,TA1IFG (TA1IV)

.section __interrupt_vector_Timer1_a0,"A",@probits

Word开始 ; Timer1_A3 TA1CCR0

.section __interrupt_vector_timer0_a1,“A”,@progbits

Word开始 ; Timer0_A3 TA0CCR1,TA0CCR2,TA0IFG (TA0IV)

.section __interrup_vector_timer0_a0,"A",@probits

Word开始 ; Timer0_A3 TA0CCR0

.section __interrupt_vector_unmi,“A”,@progbits

Word开始 ;用户NMI

.section __interrupT_vector_sysnmi,“a",@progbits

Word开始 ;系统NMI

.section .resetvec,“A”,@probits

Word开始 ;系统重置
.end

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Andre:

    我正在抓住您看到的问题,并将很快提供一些反馈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!

    此处还有一个注意事项:我有一个受影响的设备使用完整的固件和运行
    UBDRSTEN已禁用30小时以上。 我不知道错误检测代码的详细工作方式
    但我假设它只检查当前使用的FRAM单元。 因为我不在中使用InfoA
    我的小测试项目从上面开始,在临市局成功进入LPM3出口后(但开始之前)
    维修ISR)据称有缺陷的单元只能是RTC ISR的代码区域。 但如果真的有的话
    是一个有缺陷的单元,程序应该在30小时内至少崩溃一次...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有一个注意事项:制造商更换了3个有缺陷的CPU
    设备。 据报告,自那时起,这三家酒店都完美无瑕...              

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Andre,

    感谢您提供额外信息。 为了将其向下推至PCB,IC或制造工艺,您能否将其中一个"坏"设备替换为"好" PCB? 如果问题出在IC,则可能是原因所在。 如果问题出在PCB,则可能是PCB或制造流程(焊接,回流等)。 请告诉我结果,我们可以继续前进。 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您的回复。 我已经向制造商发送了一份通知,询问他是否能够移除
    零件没有太大应力的坏芯片。 "压力过大"也意味着他可以不使用
    返工台或其他,引起压力的流程。 我确实见过部件(磁盘半导体)
    经过这种程序后,其行为有很大不同...

    我想在MSP-TS430PM64D评估板中尝试这些坏芯片,但我们也可以尝试推入
    到已知工作正常的PCB中。

    如果有硬件设计问题,我也会摸头脑,但问题不多
    我恐怕是有可能的。 CPU在大约2个5 mm 距离中具有1 UF C,在大约7个5 mm 中,我们找到了
    TPS7.8233万和10 UF C。要确定,我在1 UF上方焊接了另外10 UF,但没有任何改变。
    晶体及其CS与2 mm 有关,没有任何东西与之切换。 的背面
    印刷电路板几乎完全接地,CPU下方还有大约85 % 的VCC区域...

    让我们看看制造商说了什么...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    两个注释:

    1.我很快会收到两个未焊接的芯片。 我不知道他们是否工作(因为
    删除过程),但如果没有,我将尝试自己从损坏的设备中删除一个。

    2.设置UBDIE而不是UBDRSTEN不会触发NMI。 但这可能是
    由于GC1错误,与预期一样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUETE USER="Eddie LaCost"]...您可以将其中一个"坏"设备更换为"好"的PCB吗? 如果问题出在IC,则可能是原因所在。 如果问题出在PCB,则可能是PCB或制造流程(焊接,回流等)。 请告诉我结果,我们可以继续前进。 谢谢![/QUOT]

    您好Eddie,

    我现在有3个CPU,它们是从受影响的PCB上脱焊的。 其中一人被调到一个"好"的板上
    按要求。 现在,好的主板是坏的--这表明问题转移到坏的CPU上。

    其他的也曾在我的MSP-TS430PM64D评估板上使用过。 主板没有任何内容
    除MSP-FET和FTDI230X外,还与之连接。

    两个CPU都显示相同的行为:退出LPM3时出现不可纠正的FRAM错误,频率为16 MHz。

    CPU1在第一个LPM3出口(终端上仅显示一个点)上执行此操作。 CPU2可存活2或3
    有时甚至是5个。

    为了安全起见,我尝试了另一个被认为是好CPU的CPU (这是我用来开发整个CPU的CPU)
    2016年的评估板上的设备),运行正常。

    由于TS430PM64D由MSP-FET供电(并且没有LDO),因此我可以使用
    电源电压很容易。 无论我使用什么(已尝试2.5 ,2.7 ,3.0 ,3.3 ,3.6 Volts),错误仍然存在
    受影响的CPU。

    我认为这向我们展示了两件事:

    1. CPU故障。

    2.错误不是由设备的潜在错误设计引起的(否则TS430PM64D
    这里的设计也很糟糕;-))


    现在我想看看如果我们在RAM中运行会发生什么。 我修改了我的测试代码以便重新定位
    自身到RAM (@0x2200)。 我将堆栈初始化更改为0x2700,复制了中断向量
    表到RAM顶部并使用SYSRIVECT启用它。 当然,RTC ISR向量已更改为
    RAM位置。 我还在代码中添加了一些诊断程序,以确保我们在RAM中运行。

    此代码现在运行正常!

    它的特点是:

    0004 0000 0000 2100 2322
     2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344. 2344.

    0004是已知的RSTIFG,2100是从BOR中出来的已知SP,以及新的SP
    在将PC重新定位和分支到后,添加值2322是指PC在启动代码中的某个位置
    RAM。 2344是RTC ISR内的PC,'.'是"I_AM_ALANE"指示灯。 正如我们所看到的那样
    不再生成POC ...


    现在让我们稍微改变一下:我们修改ISR,使其使用的FRAM版本
    put剑(),而不是RAM中的副本。 此代码终止:

    0004 0000 0000 2100 2322
     2348.
    001C 0000 0000 26fc 2322
     2348.
    001C 0000 0000 26fc 2322
     2348.
    001C 0000 0000 26fc 2322
     2348.
    001C 0000 0000 26fc 2322
     2348.
    001C 0000 0000 26fc 2322
     2348.

    在通常的启动后,我们看到ISR成功调用了一个(因为系统尚未进入
    LPM3)。 ISR内的PC与点一起显示。 然后它在LPM3中休眠,唤醒
    第一次发生故障。 现在的新功能是26fc的SP。 这是合乎逻辑的,因为我们有
    ISR本身仍在RAM中,通过将PC和SR推入堆栈,它将开始正常执行,
    因此,将其从其初始值0x2700减少到0x26fc。 但一旦ISR调用FRAM
    代码,它消失了...

    到目前为止,我个人对所有这些的结论是:那里有一些FR4133 CPU
    从LPM3退出并使用运行时,生成指示不可纠正FRAM错误的POC
    16 MHz。 这些错误不会重新出现。 除了使用16 MHz或LPM3 (不是
    选项)唯一的解决方案是禁用UBDRSTEN。 当然,没有不可纠正的FRAM
    然后报告错误(即使是真实的),这是次优...

    新代码位于此处(如果有人感兴趣或想要查找错误):

    ;选择8或16 MHz
    #定义快速
    
    #包括<MSP40.0.h>
    
    .section .text,"ax",@probits
    
    Word 0x1234
    
    启动: 色调
    MOV #WDTPW|WDTHOLD,&WDTTL ; stop wd.
    
    MOV &SYSUNIV,R6 ;保存SYSUNIV
    MOV &SYSSNIV,R5 ;保存SYSSNIV
    MOV &SYSRSTIV,R4 ;保存SYSRSTIV
    MOV SP,R7 ;保存SP
    
    MOV ##_stack - 0x100,SP;init stackpointer to 0x2700
    
    ;---端口---
    
    之二 #ADCPCTL5|ADCPCTL6|ADCPCTL7,&SYSCFG2;设置模拟端口
    
    MOV #0xFFFF,Paren (&P) ;ALLE Pull-Rs ON
    MOV #0xFFFF,&PBREN
    MOV #0xFFFF,&PCREN
    MOV #0xFFFF,&PDREN
    
    CLR PAOUT (&P)
    CLR &PBOUT
    MOV #BIT3 | BIT2,&PCOUT;I2C材料的上拉菜单
    CLR PDOUT (&P)
    
    之二 #BIT0,&PADIR ;进行TxD输出
    
    BIC.b #LOCKLPM2,&PM5CTL0 ;全局IO启用
    
    之二 #BIIT2,&PADIR ;启用EVAL板上的LED
    BIS.b #BIIT2,&P1OUT ;将其打开
    
    ;---初始时钟(从TI网站被盗)---
    
    #ifdef fast
    ;根据MCLK设备数据表的要求配置一个FRAM等待状态
    ;在配置时钟系统之前运行超过8MHz。
    MOV.w #FRCTLPW+NWITS_1,&FRCTL0
    #endif
    
    XT1on: BIS.b #BIT1+BIT2,&P4SEL0 ;将XT1引脚设置为第二个函数
    XT1chk: BIC.w #XT1OFFG+DCOFFG,&CSCTL7;清除XT1,DCO故障标志
    BIC.w #OFIFG,&SFRIFG1 ;清除故障标志
    bit.w #OFIFG,&SFRIFG1 ;测试示波器故障标志
    jnz XT1chk ;如果设置了,请再次尝试清除
    
    BIS.w #SCG0,SR ;禁用FLL
    BIS.w #SELREF__XT1CLK,&CSCTL3;将XT1设置为FLL参考源
    MOV.w #0,&CSCTL0 ;清除DCO和MOD寄存器
    BIC.w #DCORSEL_7,&CSCTL1 ;清除DCO频率选择位优先
    #ifdef fast
    BIS.w #DCORSEL_5,&CSCTL1. ;设置DCO = 16MHz,FR413x中的最大值
    MOV.w #FLLD_0+487,&CSCTL2 ;DCODIV = 16MHz
    #其它
    BIS.w #DCORSEL_3,&CSCTL1 ;设置DCO =8MHz
    MOV.w #FLLD_0+243,&CSCTL2 ; DCODIV = 8MHz
    #endif
    无操作
    无操作
    无操作
    BIC.w #SCG0,SR ;启用FLL
    解锁: MOV.w &CSCTL7,R13
    和.w #FLLUNLOCK0|FLLUNLOCK1,R13
    jnz 解锁 ;检查FLL是否锁定
    
    MOV.w #SELMS__DCOCLKDIV+LAST__XT1CLK,&CSCTL4
    
    #ifdef FAST
    之二 #DIVS0,&CSCTL5 ; SMCLK = MCLK/2
    #endif
    
    ;---初始化FRAM错误报告---
    
    #IF 1.
    BIS.b #UBDRSTEN | CBDIE,&GCCTL0 ; UncorrErr=PUC,CorrErr=NMI
    #else
    BIS.b #UBDIE | CBDIE,&GCCTL0 ; UncorrErr=NMI (中断),CorrErr=NMI
    #endif
    
    BIC.b #PFWP,&SYSCFG0 ;使int vecs可写
    
    MOV #end - 0xC400,R15 ;将代码复制到0x2200
    CP1: MOV 0xC400 (R15),0x2200 (R15)
    Decd R15
    jnz CP1.
    
    MOV #RTC_ISR - 0xC400 + 0x2200,&0xFFV0 ;将RTC ISR重新定位到RAM
    
    MOV #32,R15
    CP2:MOV 0xFFE0 (R15),0x27E0 (R15) ;复制int vecs.
    Decd R15
    jnz CP2.
    
    bis.b #SYSRIVECT,&sysctl ;立即在RAM中生成int vecs
    
    巴西 #RAMEntry - 0xC400 + 0x2200 ;跳到RAM
    
    ;---正在RAM中运行... ---
    
    RAMEntry:
    
    ;--- INIT UART ---
    
    MOV #UCSSEL__SMCLK | UCSSWRST,&UCA0CTLW0;Clock=SMCLCK,重置
    
    MOV 13号,&UCA0BRW ;UCBR
    MOV #(0x21 << 8)| UCOS16,&UCA0MCTLW ;3.84万波特
    
    BIS.b #BIT0 | BIT1,&P1SEL0;端口引脚是UART
    
    BIC.b #UCSWRST,&UCA0CTLW0;UART重设状态关闭
    
    ;---显示一些信息---
    
    呼叫#putnl - 0xC400 + 0x2200
    
    MOV R4,R14 ;SYSRSTIV
    呼叫#putword - 0xC400 + 0x2200
    
    MOV R5,R14 ;SYSSNIV
    呼叫#putbe词- 0xC400 + 0x2200
    
    MOV R6,R14 ;SYSUNIV
    呼叫#putbe词- 0xC400 + 0x2200
    
    MOV R7,R14 ;SP
    呼叫#putbe词- 0xC400 + 0x2200
    
    MOV PC,R14 ;检查我们的运行位置
    呼叫#putbe词- 0xC400 + 0x2200
    
    调用#putnl - 0xC400 + 0x2200
    
    ;---初始化RTC计数器---
    
    MOV #3.2767万,&RTCMOD ;每1秒
    
    MOV #RTCSS__XT1CLK | RTCSR,&RTCCTL;Clock=XT1CLK,CLR计数器
    
    BIS.b #RTCIE,&RTCCTL ;启用RTC Int
    
    ;---主---
    
    
    
    永久打印: JMP Forever
    
    
    ;#######################################################################
    ;RTC ISR
    ;###############################################################
    
    RTC_ISR: TST RTCIV (&R) ;取消设置ISR标志
    
    XOR.b #BIX2,&P1OUT ;切换LED
    
    MOV PC,R14 ;检查我们的运行位置
    呼叫#putbe词- 0xC400 + 0x2200 ;调用RAM代码(工作)
    ; 调用#put词 ;调用FRAM代码(dies!)
    
    MOV.b #'.',R15 ;表示我们正在运行
    调用#putchar - 0xC400 + 0x2200 ;调用RAM代码
    
    之二 #LPM3_bits,0 (SP) ;将LPM3设置为RETI
    RETI
    
    ;#######################################################################
    ;输出子程序
    ;###############################################################################
    
    推词: 呼叫#putspace - 0xC400 + 0x2200
    
    putword: swpb R14 ;高字节
    调用#putbyte - 0xC400 + 0x2200
    swpb R14 ;低字节
    
    推字节: MOV R14,R15 ;复制字节
    
    Rram #4,R15 ;高半字节
    
    呼叫#putnib - 0xC400 + 0x2200 ;发送到RS232
    
    MOV R14,R15 ;复制字节
    
    putnib: 和 0xF,R15 ;掩膜低半字节
    添加 #'0',R15 ;添加'0'
    CMP ##0'+10,R15 ;>'10'?
    JLO putchar ;否
    
    添加 #'A'-'0'-10,R15 ;是的,修复
    JMP putchar
    
    putnl: MOV.b #'\r',R15
    调用#putchar - 0xC400 + 0x2200
    MOV.b #'\n',R15
    JMP putchar
    
    推杆空间: MOV.b #',R15
    
    putchar: Bit.b #UCTXIFG,&UCA0IFG ; UCA0TXBUF为空?
    JZ putchar ;不,等待
    
    MOV.b R15,&UCA0TXBUF ;发送字符
    
    putchar_ret:RET.
    
    
    结束:
    
    ###########################################################################
    ;ISR引导程序
    ;#######################################################################
    
    @章节__interrupT_vector_lcd_e,"A",n ü r probits
    
    Word开始 ; lcd
    
    .section __interrupt_vector_port2,“A”,@probits
    
    Word开始 ; P2
    
    .section __interrupT_vector_port1,"A",@probits
    
    Word开始 ; P1
    
    .section __interrupt_vector_adc,"A",@程序
    
    Word开始 ; ADC
    
    .section __interrupt_vector_USI_b0,“A”,@probits
    
    Word开始 ; eUSI_B0接收或发送
    
    .section __interrupt_vector_USI_a0,"A",@probits
    
    Word开始 ; eUSI_A0接收或发送
    
    .section __interrupt_vector_WDT,“A”,@probits
    
    Word开始 ;看门狗计时器间隔
    
    。节__interrupT_vector_rtc,“A”,@probits
    
    Word RTC_ISR ; RTC Counter
    
    .section __interrupT_vector_Timer1_A1,"A",@probits
    
    Word开始 ; Timer1_A3 TA1CCR1,TA1CCR2,TA1IFG (TA1IV)
    
    .section __interrupt_vector_Timer1_a0,"A",@probits
    
    Word开始 ; Timer1_A3 TA1CCR0
    
    .section __interrupt_vector_timer0_a1,“A”,@progbits
    
    Word开始 ; Timer0_A3 TA0CCR1,TA0CCR2,TA0IFG (TA0IV)
    
    .section __interrup_vector_timer0_a0,"A",@probits
    
    Word开始 ; Timer0_A3 TA0CCR0
    
    .section __interrupt_vector_unmi,“A”,@progbits
    
    Word开始 ;用户NMI
    
    .section __interrupT_vector_sysnmi,“a",@progbits
    
    Word开始 ;系统NMI
    
    .section .resetvec,“A”,@probits
    
    Word开始 ;系统重置
    .end
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Andre,

    在16MHz下运行时是否添加等待状态? 请参阅5.3 部分中数据表中的fsystem规范,该规范表示8MHz以上需要启用等待状态。 系列用户指南的5.5 部分还提供了有关等待状态的更多指导。 如果启用了此功能,请告诉我,我们可能想了解一下这些IC。 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如您在我的代码中所看到的,我从TI的示例中复制了等待状态部分。
    此外,我在第一篇文章中写道,使用NWAITS_x玩游戏没有任何改变。
    即,行为是相同的--无论0,1,2或更多WS...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的确认。 我将向您发送友谊请求,我们可以将剩余的故障排除工作脱机。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,谢谢。

    关于等待状态还有一件事要注意:如果是等待状态问题,那就会
    预期数据错误。 但是,当切换错误报告时,设备可以正常运行
    关闭,实际上没有错误。 逻辑只是假定存在错误并触发...