TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:MSP430FR2433Other Parts Discussed in Thread:MSP430F149

#include "msp430.h"

#define MAX_STRBUF_SIZE32 /* 串口接收的最大数据 */


unsigned char g_u32RevCnt = 0;  /* 接收字符串自加变量 */
unsigned char gAr32_u8xString[MAX_STRBUF_SIZE]; /* 串口接收字符串数组 */


/**********************************************************************函数名称:void Init_GPIO( void )*函数功能:串口IO初始化*入口参数:无*出口参数:无*备注:无
*********************************************************************/
void Init_GPIO( void )
{P1DIR = 0xFF;P1REN = 0xFF;P1OUT = 0x00;
}

/**********************************************************************函数名称:void Transform_Str(unsigned char l_u8Data)*函数功能:串口发送单字节函数*入口参数:要发送的数据(l_u8Data)*出口参数:无*备注:无
*********************************************************************/
void Transform_Str(unsigned char l_u8Data)
{while(!(UCA1IFG&UCTXIFG));UCA1TXBUF = l_u8Data;
}

/**********************************************************************函数名称:int putchar(int ch)*函数功能:putchar重定义函数*入口参数:无*出口参数:无*备注:无
*********************************************************************/
int putchar(int ch)
{UCA1TXBUF = ch;while(!(UCA1IFG & UCTXIFG));return ch;
}

/**********************************************************************函数名称:void Usart_Init( void )*函数功能:串口初始化*入口参数:无*出口参数:无*备注:无
*********************************************************************/
void Usart_Init( void )
{Init_GPIO();PM5CTL0 &= ~LOCKLPM5;FRCTL0 = FRCTLPW | NWAITS_1;__bis_SR_register(SCG0);// disable FLLCSCTL3 |= SELREF__REFOCLK;// Set REFO as FLL reference sourceCSCTL0 = 0;// clear DCO and MOD registersCSCTL1 &= ~(DCORSEL_7);// Clear DCO frequency select bits firstCSCTL1 |= DCORSEL_5;// Set DCO = 16MHzCSCTL2 = FLLD_0 + 487;// DCOCLKDIV = 16MHz__delay_cycles(3);__bic_SR_register(SCG0);// enable FLLwhile(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));// FLL lockedCSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;// set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz// default DCOCLKDIV as MCLK and SMCLK sourceP1SEL0 |= BIT5 | BIT4;UCA0CTLW0 |= UCSWRST;UCA0CTLW0 |= UCSSEL__SMCLK;// Baud Rate calculation// 16000000/(16*9600) = 8.681// Fractional portion = 0.681// User's Guide Table 14-4: UCBRSx = 0xD6// UCBRFx = int ( (8.681-8)*16) = 11UCA0BR0 = 8;// 16000000/16/115200UCA0BR1 = 0x00;UCA0MCTLW = 0xD600 | UCOS16 | UCBRF_11;UCA0CTLW0 &= ~UCSWRST;// Initialize eUSCIUCA0IE |= UCRXIE;// Enable USCI_A0 RX interrupt__bis_SR_register(GIE);//  interrupts enabled

}



/**********************************************************************函数名称:void USCI_A1_ISR(void)*函数功能:串口接收中断*入口参数:无*出口参数:无*备注:无
*********************************************************************/
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{switch(__even_in_range(UCA0IV,USCI_UART_UCTXCPTIFG)){case USCI_NONE: break;case USCI_UART_UCRXIFG://接收中断while(!(UCA0IFG & UCTXIFG));UCA0TXBUF = UCA0RXBUF;__no_operation();break;case USCI_UART_UCTXIFG: break;case USCI_UART_UCSTTIFG: break;case USCI_UART_UCTXCPTIFG: break;default: break;}
}

void main (void)
{Usart_Init();while(1){while(!(UCA0IFG & UCTXIFG));UCA0TXBUF = UCA0RXBUF;}
}

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

yang zhang:

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

,

Susan Yang:

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

UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

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

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

是否有参考下面的代码?

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

,

yang zhang:

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

,

Susan Yang:

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

115200/8/N/1

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

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

,

yang zhang:

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

,

Susan Yang:

yang zhang 说:我的串口要跑到2MHZ因为要除以16所以最高1MHZ,

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

,

yang zhang:

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

void Uart_init(void)
{UCA0CTLW0 |= UCSWRST;// Put eUSCI in resetUCA0CTLW0 |= UCSSEL__SMCLK;// CLK = SMCLK// Baud Rate Setting// Use Table 21-5UCA0BRW_L=baud_l;UCA0BRW_H=baud_h;UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700 is UCBRSx = 0xF7UCA0CTLW0 &= ~UCSWRST;// Initialize eUSCIUCA0IE |= UCRXIE;// Enable USCI_A0 RX interrupt
}
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 FLLCSCTL3 |= SELREF__REFOCLK;// Set REFO as FLL reference sourceCSCTL0 = 0;// clear DCO and MOD registersCSCTL1 &= ~(DCORSEL_7);// Clear DCO frequency select bits firstCSCTL1 |= DCORSEL_5;// Set DCO = 16MHzCSCTL2 = 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 FLLwhile(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));// FLL lockedCSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
}

,

Susan Yang:

http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html 

,

yang zhang:

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

,

Susan Yang:

期待您的反馈

yang zhang 说:因为今天台风没有出门

台风天,请注意安全

,

yang zhang:

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

,

Susan Yang:

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR2433: 在我设置好串口初始化后放在while一直发送我的接收端,但是接收端接收不到任何的值。
分享到: 更多 (0)

© 2025 TI中文支持网   网站地图 鲁ICP备2022002796号-1