下午好…
我想知道是否有人在那里的最佳论坛上提供意见、这些意见可以帮助解决与 MSP430平台相关的代码问题? 我是一名从事某些固件工作的硬件工程师、目前我正在进行有关 eUSCI ISR 处理和内部 strcmp 的砖墙设计。
感谢你们的回应
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.
下午好…
我想知道是否有人在那里的最佳论坛上提供意见、这些意见可以帮助解决与 MSP430平台相关的代码问题? 我是一名从事某些固件工作的硬件工程师、目前我正在进行有关 eUSCI ISR 处理和内部 strcmp 的砖墙设计。
感谢你们的回应
基思...
谢谢你们!...我是一个有特点的硬件人员,但最近一直在做固件...我正在努力解决一个问题...我想通过 eUSCI 发送命令, 接收回声,然后发送 ACK……这是我要与之通信的无线电所必需的……我更喜欢不使用软件轮询(bcz 我想使其具有极低的功耗) TI 在所有示例程序中都采用的方法,但不使用硬件 IRQ。。。。。我成功发出命令,我看到结果(回波)返回 MSP,但在我的生命周期内,我无法正确捕获。 我正在使用 strcmp。 我之所以选择这种方法、是因为最终我将改进代码以处理并非总是相同长度的消息。 我已经附上了我的代码,并且正在使用 MSP430FR2355。。。。我不知怎么说,我在路上丢失了一个空字符,这会导致 strcmp 不起作用。。。。。任何帮助都将得到极大的感谢。。。。这是我的源文件。。。GPIO。 时钟和 UART 都正常工作。问题在这个工作中。。。。我只需要帮助就能通过接收器件、因为我完全知道 ACK 和状态3可能会有一些问题。。。我希望在我禁用 TXIE 后可以让 RX 来 通过前门保持睡眠状态、直到 Rx 和 TX 消息匹配、然后唤醒以在状态机中继续。 我真的很期待您向我展示我在这方面遇到的错误、因为我已经为此付出了好几天的努力!!
非常感谢您的回复
Steve
/* d_sandbox.c * *创建时间:2020年3月29日 * 作者:Ridge */ #include #include #include "rc.h" #include "LPRSnot.h" volatile char * prx;// incoming[20]; const char * ptx、incoming[20]={0}; unsigned int SM = 0; const char * configCmdAck[3]={r_RSSIon、conr_USAFCC、r_BandSet}; void int char *={int stack};"inteACK = " WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 IOconfig; initClockTo16MHz(); inituart(); prx =(volatile char*)传入; PTX = configCmdAck[0]; while (1){ _bis_SR_register (LPM3_bits + GIE);//go to sleep:LPM3 交换机(SM) { 情况0://command TX SM = 2; 中断; 案例1://ACK TX PTX = configCmdAck[1]; SM = 3; 中断; 案例2://echo RX PTX = teback; prx =(volatile char*)传入; UCA1IE |= UCTXIE; SM = 1; 中断; 案例3:// SM = 0; UCA1IE |= UCTXIE; 默认值: 中断; } } #pragma vector=USCI_A1_vector __interrupt void Payload_RF (void) { switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG)) { USCI_NONE 案例:中断; USCI_UART_UCRXIFG 案例: * prx = UCA1RXBUF; prx++; if (strncmp (ptx、prx、10)==0){ _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); } 中断; USCI_UART_UCTXIFG 案例: 如果(* PTX ='1'){ UCA1IE &=~UCTXIE; _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); } UCA1TXBUF =* PTX; PTX++; 中断; 案例 USCI_UART_UCSTTIFG:中断; 案例 USCI_UART_UCTXCPTIFG:break; } }
R_RSSIon 是 #define "ER_CMD#A01"...我认为使用双引号时隐含的\0是否正确? 它至少会出现,因为发送总线显示字符 ER_CMD#A010,其中最后0为0x00...... 无线电在 Rx 总线上重复同样的操作,但 strcmp 不会标记为 true……
在侧注中、我还注意到、我认为在 TXIFG ISR 中要做的正确操作不是 PTX++、而是*(PTX++)、您是否同意?
谢谢
> if(strncmp(pTx, pRx, 10) == 0) {
pTx and pRx are moving targets. I suggest something more like:
> if(strncmp(testack, incoming, 10) == 0) { Since you're not sending the NUL ('\0') byte, you still need to supply it on Rx if you want to use strcmp.
彼得······
谢谢。。。
我有一个更新版本的代码,它使我能够更深入地工作...以下代码实际上现在接收到传入字符,并成功地将其与以前的传出字符进行比较。 我最后处理了案例2,但后来进入 LPM3,不会唤醒以处理状态机的案例1来发送 ACK ....我曾尝试人为地设置各种 TXIFG 和 TXTCPIFG/TXTCPIE 标志,但似乎无法得到..... 有什么想法吗? 我可以看到前一条命令"ER_CMD#A01"的最后一个字符(即"1") 仍然停留在 TXBUFFER 中,TXIFG 标志未被置位....我的代码需要*PTX =空字符才能从 TXIFG 唤醒,所以尝试清除缓冲区似乎没有意义,所以我认为 TXTCP 可能是答案...... 对于该记录、我还发现 ISR 的 TX 部分中没有其他内容会造成麻烦。
最后、我想补充 一点、我会定期(具体取决于我尝试的构建)在我第一次运行后被凸点进入 boot.c 至函数 CSTART_DECL。 如果我尝试使用 CCS 调试器进行复位、EVM 会锁定并希望我升级到最新的闪存固件??? 我发现、如果我在升级时保持 EVM 复位、它将重新刷写、然后再次加载我的应用程序代码。 一旦处于此状态、电路板就不会断电、从而解决了这个问题...这是一个非常令人不安的问题
/* d_sandbox.c * *创建时间:2020年3月29日 * 作者:Ridge */ #include #include #include #include "rc.h" #include "LPRSnot.h" volatile char * prx、incoming[20]; const char * PTX; unsigned int SM = 0; const char * configCmdAck[]={r_RSSIon、r_USAFCC、r_BandSet}; const char * teback ="ACK"; int t = 0;int test = 0 (int) WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 IOconfig; initClockTo16MHz(); inituart(); PRx =传入; PTX = configCmdAck[0]; k = strlen (configCmdAck[0]); while (1){ _bis_SR_register (LPM3_bits + GIE);//go to sleep:LPM3 交换机(SM) { 情况0://command TX:在传输第一个字符串后处理 PTX = configCmdAck[i]; SM = 2; 中断; 案例1://ACK TX PTX = teback; UCA1IFG |= UCTXIFG; SM = 3; 中断; 案例2://echo RX PRx =传入; i++; SM = 1; UCA1IE |= UCTXCPTIE; 中断; 案例3:// SM = 0; UCA1IE |= UCTXIE; 中断; 默认值: 中断; } } #pragma vector=USCI_A1_vector __interrupt void Payload_RF (void) { switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG)) { USCI_NONE 案例:中断; USCI_UART_UCRXIFG 案例: * prx = UCA1RXBUF; prx++; TEST =!(strncmp (ptx、Incoming、k)); 如果(测试){ _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); } 中断; USCI_UART_UCTXIFG 案例: 如果(* PTX ='\0'){ _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); } 否则{ UCA1TXBUF =* PTX; *(PTX++); } 中断; 案例 USCI_UART_UCSTTIFG:中断; USCI_UART_UCTXCPTIFG 案例: _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); 中断; } }
您好、Steve、
非常感谢您的更新。 固件升级请求等问题。 我不确定、但我们不时看到这些较小的 FRAM 器件、这些器件仅限于硬件断点、软件断点会导致问题、例如复位和跳转到杂草。 现在、请不要假设仅由您设置软件断点。 例如、在复位或下载后、在主代码行停止 CPU、或者由于硬件断点限制、CCS 可以将其他断点设置为 SW 断点。 您可以尝试禁用 SW 断点的使用。 您可以在项目属性和中找到它。。 请参阅下面的屏幕截图。
另一点可能是对设备进行超频。 请记住等待周期规格、以防您以高于8MHz 的速度运行器件。
我需要更详细地思考您的代码。 不幸的是、我住在德国、我们即将结束业务、由于复活节公共假期、下周周二我才会回来。 很抱歉。
如果能够在我的身边重现这个、我会觉得比较好、但我没有对应的、您正在使用、所以如果您有机会、使用另一个 MSP430在您的身边重新创建这个、将会更容易。
此致
Peter