|
#include "msp430.h"
#define CPU ((double)4000000)
#define delay_ms(x) __delay_cycles((long)(CPU*(double)x/1000.0))
#define delay_us(x) __delay_cycles((long)(CPU*(double)x/1000000.0))
#define TX_Num 10 //發送數組大小
#define RX_Num 10 //接收數組大小
#define Frame_Header 0xEE //接收幀頭
#define Frame_End 0xFF //接收幀尾
void XT_init(void); //晶振初始化函數
void Receive_Handle(void); //接收處理函數
void DMA_init(void); //DMA初始化理函數
unsigned char TxString[TX_Num]; //發送數組
unsigned char RxString[RX_Num]; //接收數組
unsigned char RX_Succeed; //接收正確標志
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
XT_init(); //晶振初始化
//初始化串口
P4SEL |= BIT4+BIT5; //選擇P4.4、P4.5 為串口1
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL__ACLK; //串口時鐘源為ACLK ,在初始化為32.768kHz
UCA1BR0 = 3; // 32768 9600 (see User's Guide)
UCA1BR1 = 0; // 32768 9600
UCA1MCTL |= UCBRS_3 + UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
DMA_init(); //DMA初始化
_EINT();
while(1)
{
if (RX_Succeed==1) //正確接收
{
RX_Succeed=0; //清除接收標志
DMA1CTL|=DMAEN; //啟動DMA通道1發送數據
}
}
}
void DMA_init(void)
{
int i=0;
DMACTL0 = DMA0TSEL_20|DMA1TSEL_21; // 通道0接收數據,通道1發送數據
DMA0CTL&=~DMAIFG; //先清除通道0中斷標志位
DMA1CTL&=~DMAIFG; //先清除通道1中斷標志位
//配置通道0接收
DMACTL4=DMARMWDIS; //禁止任何發生在CPU 讀寫操作時候的DMA傳輸
//重復單次傳輸+開啟使能+目標地址增加+字節傳輸 +開啟中斷
DMA0CTL = DMADT_4 + DMAEN + DMADSTINCR_3+DMADSTBYTE+ DMAIE;
DMA0SZ = RX_Num; // 接收字節大小
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &UCA1RXBUF);//源地址為串口1接收地址
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &RxString);//目的地址是接收數組
//配置通道1發送
//單次傳輸+源地址增加+字節傳輸 +電平觸發+ 開啟中斷
DMA1CTL = DMADT_0 + DMASRCINCR_3 + DMASRCBYTE + DMALEVEL + DMAIE;
DMA1SZ = TX_Num; // 發送字節大小
__data16_write_addr((unsigned short) &DMA1SA,(unsigned long) &TxString);//源地址為發收數組
__data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &UCA1TXBUF);//目的地址是串口1發送地址
//初始化發送數組
for(i=0;i<10;i++)
{
TxString[i]=0x0a+i;
}
}
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV,4))
{
case 0x00:
break;
case 0x02: //通道0 接收到數組
Receive_Handle();
break;
}
}
void Receive_Handle(void)
{
if(RxString[0]==Frame_Header&&RxString[RX_Num-1]==Frame_End)//數據接收正確
{
//對數據進行處理
RX_Succeed=1; //接收正確標志
}
}
void XT_init(void)
{
P5SEL |= BIT4|BIT5|BIT2|BIT3; // Select XT1、XT2
UCSCTL6 &= ~(XT1OFF|XT2OFF); // XT1、XT2 On
UCSCTL6 |= XCAP_3; // Internal load cap
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~(XT1DRIVE_3+XT2DRIVE0); // Xtal is now stable, reduce drive strength
UCSCTL4 =SELA_0+SELS__XT2CLK+SELM__XT2CLK;
UCSCTL5|=DIVS__4; //ACLK 32768,SMCLK 1M ,MCLK 4
}
|
-
下載.png
(111.83 KB, 下載次數: 206)
下載附件
2021-9-18 23:02 上傳
DMA 成功接收數據并作出回應
評分
-
查看全部評分
|