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的 C 代码论坛

Guru**** 2561710 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/895098/c-code-forums-for-msp430

主题中讨论的其他器件:MSP430FR2355

下午好…

我想知道是否有人在那里的最佳论坛上提供意见、这些意见可以帮助解决与 MSP430平台相关的代码问题?  我是一名从事某些固件工作的硬件工程师、目前我正在进行有关 eUSCI ISR 处理和内部 strcmp 的砖墙设计。

感谢你们的回应

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

    我认为您找到了合适的位置。 虽然我们不是 C 教程论坛、但我们很高兴能帮助解决软件问题。  

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

    基思...

    谢谢你们!...我是一个有特点的硬件人员,但最近一直在做固件...我正在努力解决一个问题...我想通过 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;
    }
    }
    

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

    顺便说一下,strncmp 是一次尝试,我真的想使用 strcmp!

    再次感谢

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

    ……还有一个糟糕……就像我说过的那样,我一直在尝试这种东西,看看我是否能理解…

    (* PTX ='\0')而不是'1'字符

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

    strcmp()函数需要正确格式的 C 字符串,该字符串以'\0'字符结尾,除非您的对讲机正在发送该字符,否则您需要负责添加该字符。 如果只是比较单个字符,则只能使用(*PTX='1')

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

    R_RSSIon 是 #define "ER_CMD#A01"...我认为使用双引号时隐含的\0是否正确?  它至少会出现,因为发送总线显示字符 ER_CMD#A010,其中最后0为0x00...... 无线电在 Rx 总线上重复同样的操作,但 strcmp 不会标记为 true……

    在侧注中、我还注意到、我认为在 TXIFG ISR 中要做的正确操作不是 PTX++、而是*(PTX++)、您是否同意?

    谢谢

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

    您好、Steve、

    在我提出更具体的建议之前、一个可能有用的文档是关于调试与 MSP430的串行通信的应用报告。

    很抱歉,使用非最佳代码示例会给您带来不便,而是显示了非低功耗非真实的轮询方法.....

    我将更深入地研究这个问题、并向您提出其他建议。

    此致

    Peter

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

    >          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.

     

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

    尝试通过硬件 IRQ 运行 UART 非常困难.....

    今天早上我发现了两个小问题...但仍然没有走出树林...

    我发现以下 strncmp 适用:

    k = strlen (configCmdAck[0]);
    TEST =!(strncmp (ptx、Incoming、k));
    如果(测试){ 

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

    彼得······

    谢谢。。。

    我有一个更新版本的代码,它使我能够更深入地工作...以下代码实际上现在接收到传入字符,并成功地将其与以前的传出字符进行比较。  我最后处理了案例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

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

    您好、Steve、

    请告诉我们、您是否仍需要此支持。 非常感谢。

    此致

    Peter