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/MSP430F5529:在使用具有中断功能的计时器时与 UART 进行通信时出现问题

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP430F5529, MSP430F5329

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/820213/ccs-msp430f5529-problem-in-communication-with-uart-while-using-timer-with-interrupt

器件型号:MSP430F5529
主题中讨论的其他器件: MSP430F5329

工具/软件:Code Composer Studio

尊敬的先生/我、

我有两个 TI 控制器、一个是 MSP430f5529、另一个是 MSP430f5329。

我设置 UART 中断通信协议、以实现相互通信(全双工通信)。

现在、5529代码部分还具有带有中断的计时器设置  

问题是我的计时器在后台运行、而在 while 部分、我会在特定条件下向其他 msp5329发送一些数据。

当我的程序到达发送部分 UART 时、它会自动进入 UART 中断部分。 然后返回到发送函数

因为定时器的中断和 UART 的中断不同、所以我不知道如何解决这个奇怪的问题。

这是我的 MSP430F5529代码。   

void main()
{
Timer();
uartInit();
__enable_interrupt ();
while (1)
{//
特定条件
send_uart ("abcdef");
}


void Timer()
{
TA0CCTL0=CCIE; // CCR0中断使能
TA0CCR0 = 1850;
TA0CTL = tassel_2 + MC_1 + TACLR;
}
////////////////////////////// 定时器中断部分//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_A0_Vector
__interrupt void TIMER0_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__((interrupt (TIMER1_ISR_A0

) TIMER1 vector (void)#ifor_A0!#defineer1)#defineer1!
#endif
{
count++;
P2OUT |= 0x07;
P1OUT |= 0xf8;
AllCondition();
_bis_SR_register_ON_EXIT (GIE);
}

void uartInit()
{
P4SEL |=(BIT4+BIT4);

P4DIR |= BIT6; //发送数据时钟
P4REN |= BIT6;
P4OUT &=~ BIT6;

UCA1CTL1|=UCSWRST;
UCA1CTL1|=UCSSEL_2;
UCA1BR0=9;
UCA1BR1 = 0;
UCA1CTL1 &=~UCSWRST;
UCA1IE |=UCRXIE;
//_ bis_SR_register (GIE);
__NO_OPERATION();
}

void SEND_UART (char *addr)
{ P4OUT|=BIT6;
unsigned int i;
unsigned int size =strlen (addr);
for (i=0;i 

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

    >      while(!(UCA0IFG & UCTXIFG));

    >      UCA0TXBUF = addr[i];

    这是使用 UCA0的、但我只看到 UCA1的初始化。 您是否打算同时使用两个 UART?

    ----------------------------------

    >      AllCondition();

    此函数的作用是什么? 运行是否需要超过90微秒?

    ----------------------------------

    >      __bis_SR_register_on_exit(GIE);

    这将在 main()中启用中断,该中断是多余的(因为 main()已经执行了__enable_interrupt ()),并且可能很危险。 我建议您删除这一行。

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

    在 SEND_UART()中,P4OUT&=~BIT6的用途是什么?

    这将在数据传输时复位该输出引脚。 如果它必须保持高电平直到数据发送完成、例如启用 RS485发送器、则需要等待所有数据计时结束。 目前有两个字节正在处理中。 发送移位寄存器中的字节和发送保持寄存器中的字节。

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

    1.很抱歉我犯了愚蠢的错误  

    >      while(!(UCA1IFG & UCTXIFG));

    >      UCA1TXBUF = addr[i];

    我在文章中也进行了更正、我只使用单个 UART 模块 UCA1。

    2. >      AllCondition();

    在该函数中,我 使用计数器切换8个端口引脚(即计数=1 pin1,计数==2 PIN2,..... 直到 COUNT=8 PIN8)在每个中断计数上逐个增加到1个备用中断。 它不需要超过90微秒。

    3.>      __bis_SR_register_on_exit(GIE);

    我使用此行是因为每当一个中断出现时、八个引脚中的一个会发生切换、并且我会读取引脚的状态以供将来使用、当该语句执行其返回 main while (1)时。

    如果我没有使用此行、则我的程序会在计时器 ISR 中陷阱、而不会进入 main while (1)  

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

    修复 UCA0参考后、您的症状现在是什么?

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

    您好、Mohit、

    我已经七天没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、

    Johnson