1.前言
最近需要利用msp430連接藍牙模塊傳遞數據,于是死磕了一段時間串口,在這里記錄一下
2.msp430串口模塊
msp430的串口模塊可以有USCI模塊提供
在異步模式中, USCI_Ax 模塊通過兩個外部引腳, UCAxRXD 和 UCAxTXD, 把 MSP430 和一個外部系統連接起來。當 UCSYNC 位被清零時就選擇了 UART 模式。
UART 模式的特性包括:
? 7 或 8 位奇, 偶, 或無奇偶校驗的數據
? 獨立的發送和接收移位寄存器
? 獨立的發送和接收緩沖寄存器
? 最低有效位 (LSB) 優先或最高有效位 (MSB) 優先的數據發送和接收
? 多處理器系統中內置空閑線和地址位通信協議
? 接收器開始邊沿檢測以從 LMPx 模式中自動喚醒
? 支持分數波特率的可編程調制波特率
? 狀態標志的錯誤檢測和抑制
? 地址檢測的狀態標志
? 獨立接收和發送中斷的能力
3.寄存器介紹
1.UCAxCTL0
該寄存器主要是對UART的工作模式進行配置,包括校驗位,停止位,數據位等,但是我們在實際使用中我們不用管這個寄存器,里面設定的默認值為我們常用的設置(8為數據位,1位停止位,無校驗位)
2.UCAxCTL1
該寄存器在常規狀態下只需關注UCSSELx和UCSWRST兩個字段,前者的作用是選擇合適的時鐘源,后者是用于進行串口模塊的設置,具體可見下圖
3.UCAxBR0 &UCAxBR1
這兩個寄存器用于對之前選擇的時鐘源進行分頻,進而控制我們串口模塊的波特率其中寄存器0為低位,1為高位
計算舉例:時鐘源設置為1MHZ,選擇波特率為9600,則分屏值為104,則低位設置為104,高位設置為0
同時在官網的用戶指南(中文)中也有常用波特率的設置,對照時鐘源的配置選擇相應的系數即可
注意:不推薦在1MHZ下使用115200波特率,由于頻率相近容易出問題
4.IE2
此處寄存器是用作中斷的使能,就不多做介紹了
4.模塊配置以及數據收發
1.模塊配置
在模塊配置中,我們的主要任務是時鐘源的選擇以及波特率的設置,中斷的使能
//此處時鐘源為SMCLK 1MHZ
void UART_Init()
{P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2; //IO選擇第三功能UCA0CTL1|=UCSWRST; //復位模塊,進行初始化UCA0CTL1|=(UCSSEL_2); //選擇時鐘UCA0BR0 =104; //波特率選擇為9600UCA0BR1 =0;UCA0CTL1&=~UCSWRST; //關閉復位IE2 |= UCA0RXIE; //打開接收中斷_EINT(); //初始化中斷
}
2.數據收發
數據發送較為簡單,只需在串口發送寄存器中寫入數據即可,之后模塊會自動將寄存器內的數據發送出去,同時置為相應的中斷位
void SendByte(unsigned char dat)
{UCA0TXBUF=dat;while((IFG2&UCA0TXIFG)==0);
}
如果要發送一段字符串,只需使用循環對字符串數組進行連續寫入即可,直到字符串最后(\0)
void SendString(unsigned char *string)
{unsigned char i=0;while(string[i]!='\0'){SendByte(string[i++]);}
}
數據接收我們在這里使用中斷接收,我們之前對模塊的接收中斷以及使能過了,所以我們在這里主要針對中斷函數
#pragma vector=USCIAB0RX_VECTOR
__interrupt void UART_Service()
{unsigned char RX=UCA0RXBUF;//相應的業務
}
5.完整代碼
實現的功能是將接收到的數據加1然后發送
#include <msp430.h> unsigned receive[20];
unsigned char count=0;
/*** main.c*/
void UART_Init()
{//P1OUT&=~(BIT1+BIT2);P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;UCA0CTL1|=UCSWRST;UCA0CTL1|=(UCSSEL_2);UCA0BR0 =104;UCA0BR1 =0;UCA0CTL1&=~UCSWRST;IE2 |= UCA0RXIE;_EINT();
}
void SendByte(unsigned char dat)
{UCA0TXBUF=dat;while((IFG2&UCA0TXIFG)==0);
}
void SendString(unsigned char *string)
{unsigned char i=0;while(string[i]!='\0'){SendByte(string[i++]);}
}
int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerBCSCTL1 = CALBC1_1MHZ; // 設置 DCO 范圍為 1MHz(需從芯片信息段加載校準值)DCOCTL = CALDCO_1MHZ; // 設置 DCO 頻率為 1MHzUART_Init();SendString("hello world");while(1);return 0;
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void UART_Service()
{unsigned char RX=UCA0RXBUF;SendByte(RX+1);
}
需要注意的是,如果不使用usb轉ttl模塊連接引腳,而是用板子上的USB與電腦進行通信的話,需要將板子上的TXD,RXD由豎著連接改為橫著連接
現象:(藍色為電腦發送。綠色為電腦接收)
電腦發送1,接收到2
完整代碼地址:
Hans/msp430G2553串口通信