久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > msp430單片機之串口通信模塊

msp430單片機之串口通信模塊

作者: 時間:2016-11-19 來源:網絡 收藏
串口通信

單片機串口通信模塊在單片機中起到重要作用,通過串口它可以與PC機或者其他模塊進行通信,傳輸數據或者控制命令,當然在傳輸數據的時候我們必須有一定的協議,讓通信雙方能夠知道得到的數據是什么,所以我們必須設置一種格式,讓通信雙方能夠得到正確的數據信息,首先我們從整體上來看看這個模塊的結構,下圖是msp430單片機中的串口模塊:

本文引用地址:http://cqxgywz.com/article/201611/318293.htm

從上圖中我們可以看出串口模塊可以分為4部分:控制模塊,接收模塊,發送模塊,波特率控制模塊

這些模塊有相應的寄存器,我們的主要任務就是對這些寄存器進行相關的配置,接下來就詳細介紹這些寄存器的作用

1.控制寄存器UXCTL (X為數字,不同型號的產品包含的串口模塊也不同,有些只有一個,有些可能包含多個)

我們來看看每一位的作用吧

PENA:校驗允許位(0禁止,1允許)

PEV :奇偶校驗位,該位在校驗允許時有效(0奇校驗,1偶校驗)

SPB :停止位選擇,決定發送的停止位,但接收時接收器只檢測1位停止位(0 1位停止位,1 2位停止位)

CHAR:發送數據長度(0 7位,1 8位)

LISTEN:反饋信號

SYNC:模塊的模式選擇(0UART模式(異步),1 SPI模式(同步)

MM :多機模式選擇(0線路空閑多機協議,1 地址為多機協議)

SWRST:控制位,上電時改位置位,一次正確的模塊初始化過程應該是:先在SWRST = 1時設置,設置完串口后再設置SWRST = 0,最后如需中斷,再設置中斷使能。

2.發送和接收控制寄存器

發送控制寄存器主要是控制時鐘源的選擇等其他控制,而接受控制寄存器主要是一些標志位,判斷時候出錯,溢出,中斷標志等,具體內容見相關數據手冊

3.波特率發生器控制模塊

這個模塊有3個寄存器,兩個寄存器用作波特率選擇,一個用于調整(UxBR0和UxBR1用于選擇波特率,UxMCTL用于調整)

4接收和發送數據緩存

URXBUF和UTXBUF這兩個寄存器用于存放接收和發送的數據。

整個模塊大概就是這些內容了,那么怎么編寫發送和接收的程序呢?

一般地,接收過程使用中斷方式(因為不知道什么時候會接收到數據,這樣效率高),發送采用查詢方式。

串口通信模塊的設置步驟如下:

1.設置系統時鐘源

2.設置串口模塊

3.處理接收發送過程

下面是一個簡單的程序,該程序實現的功能是從PC機接收數據,然后單片機又將接收的數據原封不動的發送給PC機。

#include


#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


/*當BRCLK=CPU_F時用下面的公式可以計算,否則要根據設置加入分頻系數*/
#define baud 9600 //設置波特率的大小
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率計算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位


//*
// 系統時鐘初始化
//*
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打開XT振蕩器
BCSCTL2|=SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ
do{
IFG1&=~OFIFG; //清除震蕩標志
for(i=0;i<100;i++)
_NOP(); //延時等待
}
while((IFG1&OFIFG)!=0); //如果標志為1,則繼續循環等待
IFG1&=~OFIFG;
}
//*
// MSP430內部看門狗初始化
//*
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
}


//*
// MSP430串口初始化
//*
void UART_Init()
{
U0CTL|=SWRST; //復位SWRST
U0CTL|=CHAR; //8位數據模式
U0TCTL|=SSEL1; //SMCLK為串口時鐘
U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l; //N=UBR+(UxMCTL)/8
U0MCTL=0x00; //微調寄存器為0,波特率9600bps
ME1|=UTXE0; //UART1發送使能
ME1|=URXE0; //UART1接收使能
U0CTL&=~SWRST;
IE1|=URXIE0; //接收中斷使能位

P3SEL|= BIT4; //設置IO口為普通I/O模式
P3DIR|= BIT4; //設置IO口方向為輸出
P3SEL|= BIT5;
}


//*
// 串口0發送數據函數
//*


void Send_Byte(uchar data)
{
while((IFG1&UTXIFG0)==0); //發送寄存器空的時候發送數據
U0TXBUF=data;
}


//*
// 處理來自串口 0 的接收中斷
//*


#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
uchar data=0;
data=U0RXBUF; //接收到的數據存起來
Send_Byte(data); //將接收到的數據再發送出去
}


//*
// 處理來自串口 0 的發送中斷,預留
//*


#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
{


}


//*
// 主函數
//*
void main(void)
{
WDT_Init(); //看門狗設置
Clock_Init(); //系統時鐘設置
UART_Init(); //串口設置初始化
_EINT(); //開中斷
while(1) //無限循環
{
}
}

得到的結果如下:

串口部分到此為止,這只是簡單的設置,在后續的學習中必然會用到串口傳輸復雜的數據進行處理,這里先打個基礎。



評論


技術專區

關閉