久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
MSP430單片機UART_FIFO 發送 接受
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 19:03
標題:
MSP430單片機UART_FIFO 發送 接受
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例2.9.10)))完整例程下載:
http://www.zg4o1577.cn/bbs/dpj-46245-1.html
‘
關于本程序的詳細解說大家可以下載電子書點擊上圖即可
原書一共有2個程序
程序1發送:
#include <msp430x42x.h>
#define TXBUF_SIZE 32 /*發送FIFO的最大容量*/
unsigned char TX_BUFF[TXBUF_SIZE]; /*發送FIFO緩沖區數組*/
unsigned int UART_OutLen=0; /*發送FIFO內待發出的字節數*/
unsigned int TX_IndexR=0; /*發送FIFO內的讀指針*/
unsigned int TX_IndexW=0; /*發送FIFO內的寫指針*/
/*****************************************************************
* 名 稱:UART0_PutChar()
* 功 能:從串口發送1字節數據(向緩沖隊列內填入1字節待發送數據)
* 入口參數:Chr:待發送的字節
* 出口參數:返回1表示發送成功,
返回0表示發送失敗。
* 說 明: 發送過程中,不阻塞CPU運行
*****************************************************************/
char UART0_PutChar(unsigned char Chr)
{
if(UART_OutLen == TXBUF_SIZE) //如果FIFO已滿
{
return (0); // 不發送數據,返回發送失敗標志
}
if(UART_OutLen==0) // 如果是第一個字節
{
IFG1|=UTXIFG0; // 人為制造第一次中斷條件
}
_DINT(); // 涉及FIFO操作時不允許中斷,以免數據錯亂
UART_OutLen++; // 待發送字節數加1
TX_BUFF[TX_IndexW] = Chr; // 待發送數據通過寫指針寫入FIFO
if (++TX_IndexW >= TXBUF_SIZE)// 寫指針遞增,且判斷是否下標越界
{
TX_IndexW = 0; // 如果越界則寫指針歸零(循環隊列)
}
IE1 |= UTXIE0; // 允許UART0的發送中斷,在中斷內依次發送數據
_EINT(); // FIFO操作完畢,恢復中斷允許
return (1); // 返回發送成功標志
}
#pragma vector=UART0TX_VECTOR
__interrupt void UART_TX (void) // 串口發送中斷
{
if(UART_OutLen>0) // FIFO內是否有待發送的數據?
{
UART_OutLen--; // 待發送數據字節數減1
U0TXBUF=TX_BUFF[TX_IndexR]; // 從尾指針讀取一個字節并發送
if (++TX_IndexR >= TXBUF_SIZE)// 讀指針遞增,且判斷是否下標越界
{
TX_IndexR = 0; // 如果越界則寫指針歸零(循環隊列)
}
}
else IE1 &=~ UTXIE0; // 如果數據已發完,則關閉UART0的發送中斷,停止發送
}
/*****************************************************************
* 名 稱:UART0_PutChar_Legacy()
* 功 能:傳統的從串口發送1字節數據程序,供對比用
* 入口參數:Chr:待發送的字節
* 說 明: 發送過程中,會阻塞CPU運行
*****************************************************************/
void UART0_PutChar_Legacy(char Chr)
{
TXBUF0=Chr;
while ((IFG1 & UTXIFG0)==0); // 等待該字節發完
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
FLL_CTL0 |= XCAP18PF; // 配置晶振負載電容
U0CTL = CHAR; // 異步通訊模式,8位數據,無校驗,1位停止位。
ME1 |= UTXE0 + URXE0; // 開啟串口0收發模塊
U0TCTL |= SSEL0; // 選擇ACLK作為串口波特率時鐘源。
U0BR1 = 0; //
U0BR0 = 13; // 分頻系數整數部分=13
U0MCTL = 0x6B; // 分頻系數小數部分調制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
_EINT(); // 總中斷允許
while(1)
{
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA測量傳統發送程序所需時間
UART0_PutChar_Legacy(0x01);
UART0_PutChar_Legacy(0x02);
UART0_PutChar_Legacy(0x03);
UART0_PutChar_Legacy(0x04);
UART0_PutChar_Legacy(0x05); //測試,發送8字節數據
UART0_PutChar_Legacy(0x06);
UART0_PutChar_Legacy(0x07);
UART0_PutChar_Legacy(0x08);
TACTL = TASSEL_2 + MC_0; // TA停止計時
_NOP(); // 在這一句設斷點查看TAR值(29652個周期)
__delay_cycles(1000000);
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA測量帶FIFO的發送程序所需時間
UART0_PutChar(0x01);
UART0_PutChar(0x02);
UART0_PutChar(0x03);
UART0_PutChar(0x04);
UART0_PutChar(0x05); //測試,發送8字節數據
UART0_PutChar(0x06);
UART0_PutChar(0x07);
UART0_PutChar(0x08);
TACTL = TASSEL_2 + MC_0; // TA停止計時
_NOP(); // 在這一句設斷點查看TAR值 (440個周期)
__delay_cycles(1000000); //約一秒發送一次
}
}
復制代碼
程序2接受:
#include <msp430x42x.h>
#define RXBUF_SIZE 32 /*接收FIFO的最大容量*/
unsigned char RX_BUFF[RXBUF_SIZE]; /*接收FIFO緩沖區數組*/
unsigned int UART_InpLen=0; /*接收FIFO內待讀取的字節數*/
unsigned int RX_IndexR=0; /*接收FIFO的讀指針*/
unsigned int RX_IndexW=0; /*接收FIFO的寫指針*/
/*****************************************************************
* 名 稱:UART0_GetChar()
* 功 能:從串口讀取1字節數據(從緩沖隊列內讀取1字節已接收的數據)
* 入口參數:*Chr:讀取數據所存放的地址指針
* 出口參數:返回1表示讀取成功,返回0表示讀取失敗。
* 說 明: 讀取過程中,不阻塞CPU運行
*****************************************************************/
char UART0_GetChar(unsigned char *Chr)
{
if(UART_InpLen==0) return(0); // 如果FIFO內無數據,返回0
_DINT(); // 涉及FIFO操作時不允許中斷,以免指針錯亂
UART_InpLen--; // 待讀取數據字節數減1
*Chr=RX_BUFF[RX_IndexR]; // 從尾指針讀取一個字節作為返回值
if (++RX_IndexR >= RXBUF_SIZE) // 讀指針遞增,且判斷是否下標越界
{
RX_IndexR = 0; // 如果越界則寫指針歸零(循環隊列)
}
_EINT(); // FIFO操作完畢,恢復中斷允許
return (1); // 返回發送成功標志
}
/*****************************************************************
* 名 稱:UART0_GetCharsInRxBuf()
* 功 能:獲取FIFO內已接收的數據字節數
* 入口參數:無
* 出口參數:待讀取的字節數
*****************************************************************/
unsigned int UART0_GetCharsInRxBuf()
{
return (UART_InpLen); // 返回FIFO內數據的字節數
}
/*****************************************************************
* 名 稱:UART0_ClrRxBuf()
* 功 能:清除接收FIFO區
* 入口參數:無
* 出口參數:無
*****************************************************************/
void UART0_ClrRxBuf()
{
_DINT(); // 涉及FIFO操作時不允許中斷,以免指針錯亂
UART_InpLen=0; // 接收的數據清空
RX_IndexR=0;
RX_IndexW=0; // 頭尾指針復位
_EINT();
}
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中斷
{
UART_InpLen++; // 接收字節計數加1
RX_BUFF[RX_IndexW] =U0RXBUF; // 串口接收數據通過寫指針寫入FIFO
if (++RX_IndexW >= RXBUF_SIZE) // 寫指針遞增,且判斷是否下標越界
{
RX_IndexW = 0; // 如果越界則寫指針歸零(循環隊列)
}
}
void main( void )
{
unsigned char RxDataBuff[8];
unsigned char Addr;
unsigned char Func;
int i;
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
FLL_CTL0 |= XCAP18PF; // 配置晶振負載電容
U0CTL = CHAR; // 異步通訊模式,8位數據,無校驗,1位停止位。
ME1 |= UTXE0 + URXE0; // 開啟串口0收發模塊
U0TCTL |= SSEL0; // 選擇ACLK作為串口波特率時鐘源。
U0BR1 = 0; //
U0BR0 = 13; // 分頻系數整數部分=13
U0MCTL = 0x6B; // 分頻系數小數部分調制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
IE1 |= URXIE0; // 開啟UART0的接收中斷,在中斷內接收數據
_EINT(); // 總中斷允許
while(1)
{
__delay_cycles(1000000);//模擬一個長耗時的程序,使CPU暫時不能讀取串口
if(UART0_GetCharsInRxBuf()>=10) //每收到10字節數據
{
UART0_GetChar(&Addr); //讀取第1字節
UART0_GetChar(&Func); //讀取第2字節
for(i=0;i<8;i++) UART0_GetChar(RxDataBuff+i); //依次讀取后8字節
}
}
}
復制代碼
作者:
1342853999
時間:
2017-3-14 22:58
if(UART_OutLen==0) // 如果是第一個字節 { IFG1|=UTXIFG0; // 人為制造第一次中斷條件 }是什么意思
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
超黄毛片
|
久久久一区二区三区四区
|
黄色av观看
|
亚洲狠狠爱
|
亚洲精品一区二区另类图片
|
免费一区
|
婷婷中文字幕
|
japanhd成人
|
久久精品免费一区二区三
|
亚洲人的av
|
av手机免费在线观看
|
色综合视频
|
能看的av网站
|
国产日产欧产精品精品推荐蛮挑
|
亚洲欧美一区二区三区视频
|
亚洲一页
|
久久新
|
在线观看你懂的网站
|
一区二区三区精品视频
|
亚洲永久精品国产
|
粉嫩粉嫩芽的虎白女18在线视频
|
日韩欧美一区二区三区四区
|
狠狠涩
|
久久久久久国产精品
|
九色91视频
|
男女又爽又黄视频
|
黄色毛片免费
|
午夜视频免费在线观看
|
韩国精品一区二区三区
|
欧美成人a
|
狠狠亚洲
|
理论片87福利理论电影
|
色爱区综合
|
日本精品裸体写真集在线观看
|
日韩精品一区二区三区老鸭窝
|
久久综合伊人
|
国产最好的av国产大片
|
国产1区2区3区
|
中文日韩在线
|
五月综合激情网
|
在线三级网址
|