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.
#include "msp430.h" #define MAX_STRBUF_SIZE 32 /* 串口接收的最大数据 */ 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 FLL CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source CSCTL0 = 0; // clear DCO and MOD registers CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz __delay_cycles(3); __bic_SR_register(SCG0); // enable FLL while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz // default DCOCLKDIV as MCLK and SMCLK source P1SEL0 |= 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) = 11 UCA0BR0 = 8; // 16000000/16/115200 UCA0BR1 = 0x00; UCA0MCTLW = 0xD600 | UCOS16 | UCBRF_11; UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI UCA0IE |= 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后也不起作用了。
一般配置好时钟和串口IO以及串口参数后,用
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
来使能接收中断就可以在有数据到来的时候进入接收中断了。
您现在是想使用开发板和PC的串口助手通信?
是否有参考下面的代码?
https://dev.ti.com/tirex/explore/node?node=AI9..X0EukhFuJAwALofbA__IOGqZri__LATEST
您需要在中断服务程序内打断点,而后打开串口调试助手或者CCS内置的terminal
115200/8/N/1
在键盘上按下某一按键,而后在CCS内运行程序,即可停在断点
此时再继续运行程序,即可在terminal内显示刚才按下的按键值
我们得到了波特率的分频因子是时钟频率/(波特率*16),我不太明白为什么会除以16就像我再MSP430F149板子的波特率的分频因子的获取上就是时钟频率除以波特率,就是我们配置寄存器UCA0BRW_L和_H上其实是16分频了的,就像我这里配置了16MHZ时钟,要得到115200的话就是16000000/(115200*16),这样我们的波特率设置不可能超过1MHZ,我想去掉这16分频让波特率高一点。
void Uart_init(void) { UCA0CTLW0 |= UCSWRST; // Put eUSCI in reset UCA0CTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK // Baud Rate Setting // Use Table 21-5 UCA0BRW_L=baud_l; UCA0BRW_H=baud_h; UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700; //0xF700 is UCBRSx = 0xF7 UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI UCA0IE |= 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 FLL CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source CSCTL0 = 0; // clear DCO and MOD registers CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz CSCTL2 = 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 FLL while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; }
感觉你提供的工具,我看到二阶数值有点不对,因为今天台风没有出门,所以明天再提问,但大概看到二阶大概是0X52的样子。现在还未确定是否是串口硬件到不了2.5MHZ,排除之后会再次给你回复。