博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于神念TGAM的脑波小车(2)
阅读量:6614 次
发布时间:2019-06-24

本文共 3309 字,大约阅读时间需要 11 分钟。

  

   将数据处理移植到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信号的值

///

转载于:https://www.cnblogs.com/fangyuanjili/p/8687860.html

你可能感兴趣的文章
c++ 注册表的设置立即生效
查看>>
sql日期转换
查看>>
linux资源限制函数getrlimit,setrlimit(转载)【转】
查看>>
linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent【转】...
查看>>
备胎的养成记KeepAlived实现热备负载
查看>>
Android -- Scroller
查看>>
[XAML学习资料] XAML 概述一
查看>>
Amazon RDS的通用型存储(SSD)
查看>>
发现并防止托管代码中出现内存泄漏
查看>>
Redis+TwemProxy(nutcracker)集群方案部署记录
查看>>
相等与全等
查看>>
VS无法设置断点的解决方案
查看>>
Android -- 再来一发Notification
查看>>
从尾到头打印链表
查看>>
android 开发之电子钢琴 源码
查看>>
Java的jar文件安装成windows 服务
查看>>
MapGuide中怎么实现“指哪儿打哪儿”?ToolTip帮你忙~
查看>>
GridView添加统计(合计)行
查看>>
第3部分。XAML标记扩展
查看>>
Linux 定时运行脚本、命令
查看>>