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.

[参考译文] 编译器/MSP430F425A:无法进入 USART ISR

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/690954/compiler-msp430f425a-can-not-enter-usart-isr

器件型号:MSP430F425A

工具/软件:TI C/C++编译器

您好!

如今、我创建了一个包含 UART 和 MSP430F425A 的项目。

我已经完成了有关 UART 的所有寄存器设置、但是当 MSP430通过 UART 接收数据时、我无法进入 RX 的 ISR。

我不知道是否有寄存器设置错误、请给我一个手。

这些是下面的设置代码、

void SET_UART (void)

U0CTL |= char;//8位
U0TCTL |= SSEL0;//ACLK
U0BR0 = 0x03;// 32k/9600 -> 3.41 MSB=0、LSB=3
U0BR1 = 0x00;
UMCTL0 = 0x4A;//调制->请参阅 MSP430F1xx 文档
U0CTL &=~SWRST;//初始化 USART 状态机
ME1 |= UTXE0 + URXE0;//启用 USART0 TXD/RXD
IE1 |= URXIE0;//启用 USART0 RX 中断
_EINT();

这是下面的 ISR 代码、在"if (!(IFG1 & URXIFG0)"处设置断点

// UART0 RX ISR
#pragma vector=USART0RX_vector
_interrupt void usart0_Rx (void)

if (!(IFG1 & URXIFG0))

UART_DATA[(UART_Stat 和 UART_Stat_Count)]= RXBUF0;
UART_Stat++;
if ((UART_Stat 和 UART_Stat_Count)>= UART_DATA[0])
UART_Stat |= UART_Stat_Finish;

此致、

Yu-Chuan、Chen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yu-Chuan、
    您能否检查 IFG1寄存器以查看是否已设置该标志? 根据您发送字符的方式、可能需要将其清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Cameron P. LaFollowette:

    因此、我需要清除函数"SET_UART"中的寄存器"IFG1"、对吧?

    此致、
    Yu-Chuan、Chen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想 Cameron 的观点是,如果 IFG 没有被设置,MSP (显然)不会调用 ISR,但是--更重要的是--有一系列条件(接线、时钟非常错误),这会导致 USART 根本无法识别出有一个字节。 IFG 状态指示要查看的方向。

    在这种情况下:我看不到您在哪里设置 P2SEL.4/.5将引脚交给 USART、这是导致这种症状的一个可能原因。 SLAS587第35页上的表不是很清楚(UG SLAU056L 也没什么帮助)、但上面的原理图显示了 P2SEL.x 在引脚之间门控 USART 功能。 我建议:

    > P2SEL |= BIT4|BIT5;// UTXD0、URXD0到引脚 P2.4、P2.5

    未经请求:
    > if (!(IFG1 & URXIFG0))

    该测试向后看、因为 IFG=1表示数据可用性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、我已经设置 P2SEL 来执行 USART 操作。

    工作时钟为 ACLK 32kHz、因此我将 br0设置为3、将 BR1设置为0。

    我现在应该怎么做?

    顺便说一下、 我在周三之前度假。

    我将继续与该平台和大家一起检查解决方案。

    此致、

    Yu-Chuan、Chen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您看到此症状时、IFG1:URXIFG0是否已置位?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    明天我将再次检查。
    如果 MSP430接收到数据、该标志是否应该被置位、对吧?
    如果标志未设置、我应该怎么做或应该检查什么?

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

    检查后、我注意到 UTXIFG0首先被置位、URXIFG0被清零。
    接下来应该检查什么?
    BTW、这是我的上电初始化代码。

    我将在项目中使用这些变量、因此我首先将其清除。
    标志用于除 SD16CTL 之外的我的 IF 环路。
    Set_UART 函数在我的帖子中。

    空初始化(空)

    unsigned int i;
    //***Variable***
    Value_JCM2=0;
    value_WCM2=0;
    FLASH_STATE = 0;
    for (i=0;i<100;i++)
    UART_DATA[I]=0;
    //***标志***
    UART_Stat=0;
    State = State_Default;
    SD16CTL = SD16REFON + SD16SSEL_1;//+ SD16DIV_3;// 1.2V ref、SMCLK
    对于(I = 0;I < 0x3600;I++);// 1.2V 基准启动延迟
    //*** I/O ***
    P1DIR |= BZDRV+PWR_ON+SEL_A+SEL_B;
    P1OUT |=(SEL_A+SEL_B);
    P1OUT |= PWR_ON;//打开电源
    P2SEL |= RXD+TXD;
    //***操作***
    Set_UART();
    Set_Timer();
    LCD_Setup();
    get_Flash();
    if (Flash_State!=0x1234)

    DefaultValue();
    Save_Flash();



    此致、
    Yu-Chuan、Chen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    观察症状时--设备已通过 UART 接收数据,但未调用 ISR --查看 IFG1:RXIFG0是否已设置。 当您在那里时、请选中"CPU Registers>SR"以确保 GIE 已设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    感谢您的善意建议、我已经解决了这个问题。
    我注意到、当我加载初始化数据并将其保存到加电初始化中的闪存中时、我会禁用中断、并且我忘记在我完成操作后启用中断。
    非常感谢。

    此致、
    Yu-Chuan、Chen