开发板一共有两个串口,分别为P4.4,P4.5和P3.3,P3.4
其中P4的串口是开发板上面用短接套套起来的那个,套上短接套进行相关以后就可以和电脑进行串口通信,也可以拆下短接套和其他外设或芯片进行串口通信。
不同频率第四步的配置的数据不同,其他配置应该没什么差别。
对于串口0的配置顺序也是这样的,只要把UCA后面的1改成0就行了。
注:截取的送药车代码,没测试过。
配置过程为:
1.特殊功能相关引脚
2.串口1功能配置寄存器(UCA1CTL1)中置位 UCSWRST 以进行接下来的配置,不置位不能正常配置串口。
3.功能配置寄存器选择时钟源。
4.根据用户手册配置UCA1BR0和UCA1BR1,以及UCA1MCTL寄存器中的相关位。
参考https://www.ti.com.cn/cn/lit/ug/slau208q/slau208q.pdf?ts=1636704386650&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fproduct%252Fcn%252FMSP430F5529%253FkeyMatch%253DMSP430F5529%2BLAUNCHPAD
第1041页,选择对应的配置信息
5.选择校验位
6.选择数据位
7.选择停止位
8.复位UCA1CTL1中的UCSWRST位,以完成串口
9.打开中断,打开中断以后就可以触发接收或者发送中断。接收到数据的时候就会触发接收中断,这个时候可以在接收中断里处理接收到的数据。发送则需要先打开发送中断,然后写入相关数据,随后会触发发送中断把数据发送出去。
中断收发标志位应该会自动清零,所以无需关注
串口接收到的数据都放在UCA1RXBUF中
串口发送的数据都写入UCA1TXBUF中
在读取或者写入数据后,都会触发相应的中断以便将数据接收/发送出去。
例程.简易串口收发
#include void initClockTo16MHz() { UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO UCSCTL4 |= SELA_2; // Set ACLK = REFO __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation UCSCTL2 = FLLD_0 + 487; // Set DCO Multiplier for 16MHz // (N + 1) * FLLRef = Fdco // (487 + 1) * 32768 = 16MHz // Set FLL Div = fDCOCLK __bic_SR_register(SCG0); // Enable the FLL control loop // Worst-case settling time for the DCO when the DCO range bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx // UG for optimization. // 32 x 32 x 16 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle __delay_cycles(500000);// // Loop until XT1,XT2 & DCO fault flag is cleared do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag } void UART_Init( char Parity, char DataBits, char StopBits) { P4SEL = BIT4 + BIT5; // P4.4,5 = USCI_A0 TXD/RXD UCA1CTL1 |= UCSWRST; // **Put state machine in reset** UCA1CTL1 |= UCSSEL_2; // SMCLK 25mhz UCA1BR0 = 8; // 16MHz 115200 (see User's Guide) UCA1BR1 = 0; // 16MHz 115200 UCA1MCTL = UCBRS_0 + UCBRF_11 + UCOS16; // Modln UCBRSx=0, UCBRFx=0, //------------------------------设置校验位------------------------------ switch (Parity) { case 'n': case 'N': UCA1CTL0 &= ~UCPEN; break; //无校验 case 'p': case 'P': UCA1CTL0 |= UCPEN + UCPAR; break; //偶校验 case 'o': case 'O': UCA1CTL0 |= UCPEN; break; //奇校验 //default: return (0); //参数错误 } //------------------------------设置数据位------------------------------ switch (DataBits) { case 7: case '7': UCA1CTL0 |= UC7BIT; break; //7位数据位 case 8: case '8': UCA1CTL0 &= ~UC7BIT; break; //8位数据位 //default: return (0); //参数错误 } //------------------------------设置停止位------------------------------ switch (StopBits) { case 1: case '1': UCA1CTL0 &= ~UCSPB; break; //1位停止位 case 2: case '2': UCA1CTL0 |= UCSPB; break; //2位停止位 //default: return (0); //参数错误 } // over sampling UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA1IE |= UCRXIE; //接收中断 } int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer initClockTo16MHz(); //配置系统时钟为16Mhz,不配置串口不能正确收发 UART_Init('n',8,1); _EINT();//开启总中断 while(1){ } } #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) { switch (__even_in_range(UCA1IV, 4)) { case 0: break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG if (UCA1RXBUF == 'a'){ UCA1IE |= UCTXIE; //开启发送中断 UCA1TXBUF='a'; //如果收到一个a,就发回去一个a } break; case 4: // Vector 4 - TXIFG break; default: break; } }
上一篇:MSP430F5529-MPU6050陀螺仪
下一篇:MSP430F5529-定时器介绍
推荐阅读最新更新时间:2024-11-12 11:37