|
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例2.9.x)))完整例程下載:http://m.zg4o1577.cn/bbs/dpj-46245-1.html
‘
關于本程序的詳細解說大家可以下載電子書點擊上圖即可
UART發幀程序:
- #include <msp430x42x.h>
- unsigned char TX_BUFF[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};/*待發送數組*/
- /*****************************************************************
- * 名 稱:UART0_ PutFrame ()
- * 功 能:從串口發送1幀數據
- * 入口參數:Ptr:待發送數組的首地址(數組名)
- * Lenth:數據幀長度
- * 出口參數:無
- * 說 明: 發送過程中,會阻塞CPU運行
- *****************************************************************/
- void UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
- {
- int i;
- U0TCTL |= TXWAKE; // 產生一個線路空閑時間
- TXBUF0=0; // 寫入任意字節
- while ((IFG1 & UTXIFG0)==0); // 等待該字節發完(實際上并未發出)
- for(i=0;i<Lenth;i++)
- {
- TXBUF0=Ptr[i];
- while ((IFG1 & UTXIFG0)==0); // 等待該字節發完
- IFG1 &=~ UTXIFG0; // 清除發送標志位
- }
- while ((U0TCTL & TXEPT)==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 開啟第二功能,作為串口收發引腳(不同單片機有差別)
- while(1)
- {
- UART0_PutFrame(TX_BUFF,8);//發送一個數據幀
- _NOP(); //在這一句設斷點查看調試用
- }
- }
復制代碼
UART高效發幀:
- #include <msp430x42x.h>
- #define TXBUF_SIZE 32 /*一幀最多能發送的數據字節數*/
- unsigned char TX_BUFF[TXBUF_SIZE]; /*發送緩沖區*/
- unsigned char TX_NUM; /*發送字節總數變量*/
- unsigned char TX_CNT; /*發送字節計數變量*/
- /*****************************************************************
- * 名 稱:UART0_ PutFrame ()
- * 功 能:從串口發送1幀數據
- * 入口參數:Ptr:待發送數組的首地址(數組名)
- * Lenth:數據幀長度
- * 出口參數:返回1表示發送成功,
- 返回0表示發送失敗。
- * 說 明: 發送過程中,不阻塞CPU運行
- *****************************************************************/
- char UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
- {
- int i;
- if(IE1 & UTXIE0) return(0); //如果上一幀沒發送完,返回0
- if(Lenth>TXBUF_SIZE) return(0); //長度超過最大緩沖區,返回0
- for(i=0;i<Lenth;i++)
- {
- TX_BUFF[i]=Ptr[i]; // 待發送數據裝入發送緩沖區
- }
- TX_CNT=0; // 發送字節計數清零
- TX_NUM=Lenth; // 發送字節總數
- IFG1|=UTXIFG0; // 人為制造第一次發生中斷
- IE1 |= UTXIE0; // 允許UART0的發送中斷
- return (1); // 返回發送成功
- }
- #pragma vector=UART0TX_VECTOR
- __interrupt void UART_TX (void) //串口發送中斷
- {
- U0TXBUF=TX_BUFF[TX_CNT]; //將本次應該發送的數據送入TXBUF
- TX_CNT++; //下一次依次發送后續字節
- if(TX_CNT >=TX_NUM) //發送字節計數值到達發送總數
- {
- IE1 &=~ UTXIE0; // 禁止UART0的發送中斷,停止發送
- }
- }
- void main( void )
- {
- unsigned char TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
- 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)
- {
- UART0_PutFrame(TxTestBuff,8); //發送一個數據幀
- __delay_cycles(1000000); //約一秒發送一次
- }
- }
復制代碼
UART收幀(例2.9.6)
- #include <msp430x42x.h>
- #define FrameLenth 8 /*數據幀長度=8*/
- #define LocalAddr 0x01 /*本機地址=0x01*/
- unsigned char RX_BUFF[FrameLenth]; /*接收數據幀存放數組*/
- /*****************************************************************
- * 名 稱:UART0_ GetFrame ()
- * 功 能:從串口接收1幀數據
- * 入口參數:Addr:首字節地址匹配,只接受地址匹配的數據幀
- * Lenth:數據幀長度
- * 出口參數:無(接收數據存于全局變量數組內)
- * 說 明: 如果串口沒有數據,會一直等待。等待過程中,會阻塞CPU運行
- *****************************************************************/
- void UART0_GetFrame(unsigned char Addr, unsigned int Lenth)
- {
- unsigned int RcvCnt;
- while(1)
- {
- U0RCTL |= URXWIE; // 僅響應幀頭首字節
- while ((IFG1 & URXIFG0)==0); // 等待接收一字節
- IFG1 &=~ URXIFG0; // 清除接收標志位
- CHK_ADDR:
- if(U0RXBUF==LocalAddr) // 如果與首地址匹配
- {
- U0RCTL &=~ URXWIE; // 之后響應全部數據,接收數據幀其他字節
- RX_BUFF[0]=U0RXBUF; // 接收第一字節
- RcvCnt=1; // 接收字節計數
- break; // 跳出幀頭識別循環,繼續接收其他字節
- }
- }
- while(RcvCnt<Lenth) // 直到接收完8字節
- {
- while ((IFG1 & URXIFG0)==0); // 等待接收一字節
- IFG1 &=~ URXIFG0; // 清除接收標志位
- if(U0RCTL & RXWAKE) // 如果又收到的是幀首,說明數據幀中斷
- {
- goto CHK_ADDR; // 重新開始接收
- }
- RX_BUFF[RcvCnt]=U0RXBUF; // 放入接收數組的對應位置
- RcvCnt++; // 下一字節放入數組的后一單元
- }
- }
- 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 開啟第二功能,作為串口收發引腳(不同單片機有差別)
- while(1)
- {
- UART0_GetFrame(LocalAddr,FrameLenth);//接收一個數據幀
- _NOP(); //在這一句設斷點查看RX_BUFF[]數組的數據
- }
- }
復制代碼
|
|