stm32f103c8r6 串口2数据DMA的接收

#define USART_REC_LEN              16      //定义最大接收字节数  16

extern u8 USART2_RX_BUF[USART_REC_LEN];

u8 USART2_RX_BUF[USART_REC_LEN]; 

void uart2_init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    //NVIC_InitTypeDef NVIC_InitStructure;
    DMA_InitTypeDef  DMA_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART2,GPIOA时钟
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    //USART2_TX   GPIOA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

    //USART2_RX      GPIOA.3初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  

    //Usart2 NVIC 配置
//    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
//    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

    //USART 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

  USART_Init(USART2, &USART_InitStructure); //初始化串口2
 // USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  
    
    /* DMA1 channel1 configuration */
   DMA_DeInit(DMA1_Channel6);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR);//外设站点起始的地址
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RX_BUF;//存储器的地址
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向 从外设站点搬到存储器站点
   DMA_InitStructure.DMA_BufferSize = 16;//数据量(字节数小于65535)
   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_Channel6, &DMA_InitStructure);
     /* Enable DMA1 Channel6 Transfer Complete interrupt */
  // DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);//传输结束的的中断
   DMA_Cmd(DMA1_Channel6,ENABLE);
     USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
   USART_Cmd(USART2, ENABLE);                    //使能串口2
}

你可能感兴趣的:(stm32,单片机,嵌入式硬件)