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.

MSP430FR2433: 在我设置好串口初始化后放在while一直发送我的接收端,但是接收端接收不到任何的值。

Part Number: MSP430FR2433
Other Parts Discussed in Thread: MSP430F149

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "msp430.h"
#define MAX_STRBUF_SIZE 32 /* */
unsigned char g_u32RevCnt = 0; /* */
unsigned char gAr32_u8xString[MAX_STRBUF_SIZE]; /* */
/*********************************************************************
*void Init_GPIO( void )
*IO
*
*
*
*********************************************************************/
void Init_GPIO( void )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

在我改过UCAxCTLW0 寄存器的UCMODEx为0x01及空闲线多处理器模式后突出过正确的接收寄存器的值,但是中断始终没用工作,今天即使该了UCMODEX后也不起作用了。

  • 请问这个UCA0IE |= UCRXIE;打开接收中断后中断就会运行了吗?还是需要对其他什么设置比如对低功耗模式的设置等?

  • 一般配置好时钟和串口IO以及串口参数后,用

    UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

    来使能接收中断就可以在有数据到来的时候进入接收中断了。

    您现在是想使用开发板和PC的串口助手通信?

    是否有参考下面的代码?

    https://dev.ti.com/tirex/explore/node?node=AI9..X0EukhFuJAwALofbA__IOGqZri__LATEST 

  • 是的我用的是msp430fr243x_eusci_uart_standard_transceiver这个历程在调试,用的原历程发现中断没有起作用

  • 您需要在中断服务程序内打断点,而后打开串口调试助手或者CCS内置的terminal

    115200/8/N/1

    在键盘上按下某一按键,而后在CCS内运行程序,即可停在断点

    此时再继续运行程序,即可在terminal内显示刚才按下的按键值

  • 好的,如果我现在是内部频率16MHZ,我的串口要跑到2MHZ因为要除以16所以最高1MHZ,可以调节跑到2MHZ或者2.5MHZ吗?

  • 我的串口要跑到2MHZ因为要除以16所以最高1MHZ,

    抱歉,我不是很理解您的说法。能否详细描述一下?

  • 我们得到了波特率的分频因子是时钟频率/(波特率*16),我不太明白为什么会除以16就像我再MSP430F149板子的波特率的分频因子的获取上就是时钟频率除以波特率,就是我们配置寄存器UCA0BRW_L和_H上其实是16分频了的,就像我这里配置了16MHZ时钟,要得到115200的话就是16000000/(115200*16),这样我们的波特率设置不可能超过1MHZ,我想去掉这16分频让波特率高一点。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Uart_init(void)
    {
    UCA0CTLW0 |= UCSWRST; // Put eUSCI in reset
    UCA0CTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK
    // Baud Rate Setting
    // Use Table 21-5
    UCA0BRW_L=baud_l;
    UCA0BRW_H=baud_h;
    UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700; //0xF700 is UCBRSx = 0xF7
    UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
    UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void initClockTo16MHz()
    {
    // Configure one FRAM waitstate as required by the device datasheet for MCLK
    // operation beyond 8MHz _before_ configuring the clock system.
    FRCTL0 = FRCTLPW | NWAITS_1;
    __bis_SR_register(SCG0); // disable FLL
    CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
    CSCTL0 = 0; // clear DCO and MOD registers
    CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
    CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz
    CSCTL2 = FLLD_0 + 487; // set to fDCOCLKDIV = (FLLN + 1)*(fFLLREFCLK/n)
    // = (487 + 1)*(32.768 kHz/1)
    // = 16 MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0); // enable FLL
    while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked
    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 感觉你提供的工具,我看到二阶数值有点不对,因为今天台风没有出门,所以明天再提问,但大概看到二阶大概是0X52的样子。现在还未确定是否是串口硬件到不了2.5MHZ,排除之后会再次给你回复。

  • 期待您的反馈

    因为今天台风没有出门

    台风天,请注意安全

  • 好像是因为电脑端插入的串口模块最高2MHZ所以2.5MHZ收不到数据谢谢了

  • 感谢您的反馈,很高兴您能解决问题