微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 串口DMA方式接收

STM32 串口DMA方式接收

时间:11-19 来源:互联网 点击:

* Configure USART1 *
USART_Init(USART1, &USART_InitStructure);
/* Enable USART1 DMA Rxrequest */
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
/* Enable DMA1 Channel5 */
DMA_Cmd(DMA1_Channel5, ENABLE);
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}

// 向串口发送数据
void USART_send(const int8u *pBuf, int8u len)
{
int i;
if(pBuf == NULL)
{
return;
}
// 将数据压入到发送队列
dbgprt("USART_PushBack:");
for(i=0;i{
PushBack(*pBuf);
dbgprt("0x%02x ",*pBuf);
pBuf++;
}
dbgprt("/n");
}

// 向发送队列尾部插入一个字节
void PushBack(int8u byte)
{
USART_SndBuf[Tail++]= byte;
if(Tail >= ARRAYSIZE(USART_SndBuf))
Tail = 0;
if(Tail == Head)
Head = Tail+1;
}

// 从发送队列头部取出一个字节
bool PopFront(int8u *byte)
{
if(Head >= ARRAYSIZE(USART_SndBuf))
Head = 0;
if(Head == Tail)
return FALSE;
*byte = USART_SndBuf[Head++];
return TRUE;
}

// 处理接收到的串口数据
void USART_receive(int8u byte)
{
// Treate received data
// Place Code here
// ...
}

// CRC校验
bool CheckCRC(const int8u *str, int8u len, const int8u *crcstr)
{
int8u checkSum;
if(str == NULL || crcstr== NULL)
return FALSE;
GetCRC(str,len,&checkSum);
if(checkSum != *crcstr)
return FALSE;
else
return TRUE;
}

// 获取CRC
bool GetCRC(const int8u *str, int8u len, int8u *crcstr)
{
int8u i;
int8u checkSum;
if(str == NULL || crcstr== NULL)
return FALSE;
checkSum = *str;
for(i=1; i{
checkSum ^= *(str+i);
}
*crcstr = checkSum;
return TRUE;
}


    Copyright © 2017-2020 微波EDA网 版权所有

    网站地图

    Top