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/MSP430F6435:代码卡在中断标志 UCRXIFG 中

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/613889/ccs-msp430f6435-code-stuck-in-interrupt-flag-ucrxifg

器件型号:MSP430F6435

工具/软件:Code Composer Studio

我当前一直处于 UCRXIFG 轮询条件。 该代码为 XBee 提供了++、并等待器件的 OK 响应。 我正在为我的系统使用不同的时钟结构、XT1 = 32K、XT2 = 32M。 时钟配置中的一些设置错误、因为根据我的知识、UART 计算结果是正确的。 附加我的代码以供参考

#include 
#include 

void vGpio_Init (void)
{

//将所有 GPIO 配置为输出低电平
//确保电路原理图没有引脚冲突
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
P9OUT = 0xFF;

P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
P9DIR = 0xFF;

}

void vMspclock_init (void)
{
//----
//常规设置
P7SEL |= BIT2+BIT3; //端口选择 XT2

UCSCTL6 &=~XT1OFF; //为 RTC_B 启用 XT1
UCSCTL6 |= XCAP_3 | XT1BYPASS; //内部负载电容12pF 配置
UCSCTL6 &=~XT2OFF; //为 MCLK、SMCLK、ACLK 启用 XT2
UCSCTL3 |= SELREF_2; //对 FLL 的引用由 XT2给出
UCSCTL6 |= XT2DRIVE_3; //为32MHz 晶振选择高电流驱动容量和电流消耗
//UCSCTL7 //该寄存器用于检查振荡器故障标志,即如果由于电源条件而导致 osc 出现某些错误

//Init MCLK
UCSCTL4 |= SELM_5; //使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIVM_3; //将时钟源除以32,例如32/1 = 32kHz

//Init SMCLK
UCSCTL4 |= SELS _5; //////使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIVS_0; //将时钟源除以1,即32/1 = 32kHz

//Init ACLK
UCSCTL4 |= SE拉美 经济体系5; //////使用 XT2 (32MHz)晶体振荡器源
UCSCTL5 |= DIV_3; //将时钟源除以8,即32/8 = 4kHz
//UCSCTL5 |= DIVPA_3; //这可以将外部引脚上可用的 ACLK 源除以与前一行类似的任何值

操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}

void vUART_init (void)
{
P8SEL |= 0x04; //对于 TX 引脚
P8DIR |= 0x04;

P8SEL |= 0x08; //用于 RX 引脚

UCA1CTL1 |= UCSWRST; //必须将该位置位、因为只有当 UCSWRST = 1时、所有寄存器才可配置

UCA1CTL1 |= UCSSEL_SMCLK; //也可被写为 UCA0CTL1 |= UCSSEL_1;//选择 UART 通信的时钟源
//供计算参考- processors.wiki.ti.com/.../USCI_UART_Baud_Rate_Gen_Mode_Selection
UCA1BR0 = 0x52; //这2个寄存器代表根据时钟频率计算波特率
UCA1BR1 = 0x00; //32000000/16*(1/38400)=52、因此 lsb = 52且 msb = 0
UCA1MCTL = UCOS16 | UCBRF_1; //第一个设置设置过采样模式,第二个位是 UCBRF 的计算
//UCA1MCTL = UCBRS_2;
UCA1CTLW0 &=~UCSWRST; //清除寄存器以启动 UART 配置
}


//
* hello.c
*/
int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
char send_init[3]={'+'、'+'、'+'};
int i;char rxbit;

vGpio_Init();
vMspclock_init();
vUART_init();

for (i=0;i<3;i++)
{
while (!(UCA1IFG & UCTXIFG)); //轮询发送中断标志
UCA1TXBUF = SEND_INIT[i]; //发送数据
UCA1IFG &=~(UCTXIFG);
}

for (i=0;i<10000;i++); //等待 ok 响应

for (i=0;i<3;i++)
{
while (!(UCA1IFG & UCRXIFG)); //轮询发送中断标志--代码卡在这里
rxbit = UCA1RXBUF;
UCA1IFG &=~(UCRXIFG);
printf ("%d "、rxbit);
}

printf ("Hello World!\n");

返回0;
}

我是一个新手、任何帮助都是可以获得的

Onkar

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

    你好,Onkar!

    对于(i=0;i<3;i++)
    {
    while (!(UCA1IFG & UCTXIFG)); //轮询发送中断标志
    UCA1TXBUF = SEND_INIT[i]; //发送数据
    UCA1IFG &=~(UCTXIFG);
    }
    
    for (i=0;i<10000;i++); //等待
    
    (i=0;i<3;i++)
    {的 ok 响应
    while (!(UCA1IFG & UCRXIFG)); //轮询发送中断标志--代码卡在这里
    rxbit = UCA1RXBUF;
    UCA1IFG &=~(UCRXIFG);
    printf ("%d "、rxbit);
    } 

    您正在向从设备发送三个字节、然后您在循环中等待响应、然后您希望接收三个聊天器-这将不起作用。 RX 缓冲器保存一个字节。 我想、当您在第二个循环等待时、从器件已经发送了三个字节、第二个字节会覆盖第一个字节、第三个字节会覆盖第二个字节。 我可以想象、您的 printf 输出一个字符、之后、您的最后一个 for 循环将永远运行。 (假设您的通信设置正确)

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Dennis
    注释了第二个 for loop、但仍然没有变化。 现在代码卡在行中

    while (!(UCA1IFG & UCRXIFG));
    因此、代码永远不会到达 printf 语句

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

    因此、RXIFG 不会被置位。 如果您连接 TX 和 RX、您是否尝试设置它? 如果是这样、UART 似乎一般工作、但您的配置可能是错误的。 这可能意味着从器件不接收任何有用的内容、因此根本不发回任何内容。

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

    我的分析如下。 。 。

    当使用专用软件进行检查时、从器件工作正常。 UART 设置很简单、很小、只有计算部分(由计算发生器在线交叉检查)。 硬件与几个月前使用的硬件相同。 时钟功能是可疑的、因为我是第一次使用此类配置。

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

    > UCA1IFG &=~(UCTXIFG);

    > UCA1IFG &=~(UCRXIFG);
    删除这些行。 读取/写入 RXBUF/TXBUF 已经清除相关的 IFG。 执行该操作(再次)会明确引入可能导致数据挂起或丢失的争用。 如果您尚未看到这些内容、您将最终看到。

    也就是说、我预期的症状与您所说的症状不匹配。 是否确定 printf()从未调用? (尝试断点。) printf()输出在哪里?

    我有这种模糊的回忆、即"++"需要字符之间的保护带(延迟)才能被识别。 您可能需要检查 XBee 的书籍以了解任何类似的要求。

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

    谢谢 Bruce

    是的、printf 永远不会被调用、代码永远不会到达该行。 此外、还尝试了++中的整流器之间的延迟。 仍然不好 :/

    Onkar