主题中讨论的其他部件: MSP-TS430PM64D, MSP-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