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.

[参考译文] CCS/MSP430FR2311:MSP430FR2311:UART RX 中断未触发

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/604698/ccs-msp430fr2311-msp430fr2311-uart-rx-interrupt-not-triggering

器件型号:MSP430FR2311

工具/软件:Code Composer Studio

Howdy、我尝试在 MSP430FR2311上使用 UART、但在 RX 中断方面遇到了一些困难。 因为它不工作。 将 UART RX (P1.6)和 TX (P1.7)绑定在一起、在 Launchpad 上测试此情况。 
UART RX ISR 内的 LED 有一个切换、该切换应显示 ISR 何时关闭、但 LED 永远不会切换。 任何建议都是有益的。


//includes
#include 

//设置全局变量
unsigned char RXData = 0;//对于 UART 测试
unsigned char TXData = 1;//对于 UART 测试

//列出函数
void ConfigUART (void);


//主
int main (void){

WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式

//设置 LED 引脚
P1OUT &=~BIT0; //清除已定义加电状态的 P1.0输出锁存器
P1DIR |= BIT0; //将 P1.0设置为输出方向

//调用配置函数
ConfigUART();

_EINT(); //启用全局中断

while (1)
{
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = TXData; //将数据加载到缓冲

区}

void ConfigUART (void){

//配置 UART 引脚
P1SEL0 |= BIT6; //设置 UART 引脚
P1SEL0 |= BIT7;
P1SEL1 |= BIT6;
P1SEL1 |= BIT7;

P1DIR |= BIT7;
P1DIR &=~BIT6;

//配置 UART
UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位状态
UCA0CTLW0 |= UCSSEL_SMCLK; //选择时钟

UCA0CTLW0 &=~UCPEN + UC7BIT + UCSYNC + UCMSB;
UCA0CTLW0 |= UCSPB;

//波特率计算
UCA0BR0 = 8; // 1000000/115200 = 8.68
UCA0MCTLW = 0xD600; // 1000000/115200 - INT (1000000/115200)=0.68
// UCBRSx 值= 0xD6 (请参阅 UG)
UCA0BR1=0;
UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI,摆脱复位
UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
}


// UART ISR
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
{
switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
P1OUT ^= BIT0; //切换 LED 以查看中断是否正常工作
UCA0IFG &=~ UCRXIFG; //清除中断
RXData = UCA0RXBUF; //清除缓冲区
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//在 TI 上退出 LPM0
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}

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

    您好!

    我将对此进行研究。 LED 是保持高电平还是低电平?

    我建议您尝试单步执行程序或使用 断点 来查看代码的行为。 除了在中断期间切换 LED 外,这可能还很有用。 此外 、这 是一个涵盖常见通信问题的文档。 第5页介绍了 UART。

    此致、

    Matthew

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

    您好!

    您的引脚定义不正确。 当前您有:

    P1SEL0 |= BIT6; //设置 UART 引脚
    P1SEL0 |= BIT7;
    P1SEL1 |= BIT6;
    P1SEL1 |= BIT7; 

    这告诉引脚1.6和1.7执行它们的第三级功能(P1SEL6和 P1SEL7 = 11)。 您希望将引脚设置为其主要功能、 因此您的代码应显示:

    P1SEL0 |= BIT6; //设置 UART 引脚
    P1SEL0 |= BIT7;
    P1SEL1 &=~BIT6;
    P1SEL1 &=~BIT7; 

    请注意、波特率足够高、LED 的切换速度将比您看到的快。 它不会看到 LED 关闭和打开、而只是看起来比始终打开时更暗。 如果您希望能够看到代码进入和退出中断、最好的选择是逻辑分析器或在代码中使用断点。

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

    非常感谢您再次光临! 我进行了您建议的更改、并将 LED 切换(P1OUT ^= BIT0;)更改为硬 LED 打开(P1OUT |= BIT0)、其理念是如果 RX 中断消失、LED 将亮起并保持亮起。 但是,仍然没有成功。 LED 没有亮起、也没有变暗。 请注意、我还将一个 O 示波器连接到 Tx 线路、并确认它在程序运行时输出。

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

    您好!

    您是否在程序中实现了断点?

    此致、

    Matthew

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

    是的、我尝试添加断点以及逐行分步。 除了从未运行 UART RX 中断外、在这两种情况下、一切似乎都正常运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > UCA0CTLW0 &&~UCPEN + UC7BIT + UCSYNC + UCMSB;

    这与您的想法不一致。 根据我的算术运算、它将关闭您的 UART 时钟。 尝试:

    > UCA0CTLW0 &=~(UCPEN + UC7BIT + UCSYNC + UCMSB);

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

    感谢您的建议! 它最初的格式是您发布的~(...);但我继续尝试了它。 不幸的是,仍然不幸运。 从不希望 UART 成为此项目中最困难的部分、哈哈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此代码(修改后)在我的 Launchpad 上工作正常。

    是否已从 J101上移除 TXD/RXD 跳线?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    布鲁斯,你是我的一个真正的爱。 谢谢! 不知道需要将其删除。 现在完美工作。