將數據處理移植到STM32上,採用串口的DMA接收模式,註意的是DMA_MODE採用Circular,DMA_BufferSize>(8*512+36=4132)(小包8個位元組,每秒512個,完整的大包36個位元組) 代碼如下: //////////////////////////////////// ...
將數據處理移植到STM32上,採用串口的DMA接收模式,註意的是DMA_MODE採用Circular,DMA_BufferSize>(8*512+36=4132)(小包8個位元組,每秒512個,完整的大包36個位元組)
代碼如下:
void usart_init()
{
//聲明結構體//
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//時鐘打開//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//DMA1時鐘
//GPIO配置//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART配置//
USART_InitStructure.USART_BaudRate=57600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//傳送數據長度
USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位長度
USART_InitStructure.USART_Parity=USART_Parity_No;//校檢
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬體流DMA
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//接受發送
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
//DMA接收//
void USART1_DMA_Recv(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&(USART1->DR);//外設基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&buffer;//記憶體基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//SRC作為數據傳送的來源
DMA_InitStructure.DMA_BufferSize=5000;//數據傳輸長度!!!!!!
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設地址不自增
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//記憶體地址自增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//外設數據單位位元組
DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//內出數據單位
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//傳輸模式!!!!!
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//優先順序
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//禁止記憶體到記憶體傳輸
DMA_Init(DMA1_Channel5,&DMA_InitStructure);
DMA_ClearFlag(DMA1_FLAG_TC5);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);//DMA1傳送完成產生中斷
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel5,ENABLE);
}
void DMA1_Channel5_IRQHandler(void)//中斷函數
{
if (DMA_GetITStatus(DMA1_IT_TC5)==1)
{
DMA_ClearITPendingBit(DMA1_IT_TC5);
DMA_Cmd(DMA1_Channel5, DISABLE);
flag = 1; //將下麵的程式放到main的while中,不然運行容易丟包
// for(i=0;i<5000;i++)
// {
// parseByte( buffer[i]);
// }
// DMA_Cmd(DMA1_Channel5,ENABLE);
}
}
下一節將會講述當單片機接收到原始數據後,怎樣將它處理後得到signal,attention,meditation和eeg信號的值
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////