OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2699|回复: 3

为什么我的串口2用不了DMA方式接收

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2015-12-4
在线时间
1 小时
发表于 2015-12-23 11:16:47 | 显示全部楼层 |阅读模式
5金钱


void uart2_init(u32 bound,u8 DMA) //?®??2??????????
{
//GPIO?????è??
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// DMA_InitTypeDef DMA_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //????USART2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //??????????????GPIOA?±??
 
  USART_DeInit(USART2);  //?????®??2

//USART2_TX   PA.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); //??????PA2

//USART2_RX  A.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????????
GPIO_Init(GPIOA, &GPIO_InitStructure);  //??????PA3

  //Usart2 NVIC ????
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×???????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
  
  //USART ???????è??
USART_InitStructure.USART_BaudRate = bound;         //??°??è????9600;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;           //×??¤??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
if (DMA){
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);   //??±?·???????
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);    //??±?????????
USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);     //????????????????
  USART_Cmd(USART2, ENABLE);                       //?????®??2
    USART2_DMA_RX();

else
{
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);    //????????????
        USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);     //??±????????????? 
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE);   //????·???????
USART_Cmd(USART2, ENABLE);                      //?????®??2
}

void USART2_DMA_RX(void)
{
//?®????DMA????
DMA_InitTypeDef DMA_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;


 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure);  

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//????DMA?±??
   DMA_Cmd(DMA1_Channel6,DISABLE);  //?????¨??
DMA_DeInit(DMA1_Channel6);   //DMA1?¨??????
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR);   //???è???·
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RXDData;   //???????·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        //dma????·??ò???ò
DMA_InitStructure.DMA_BufferSize = 3;     
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_MemoryDataSize_Byte;     //????????×??¤
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;               //?è??DMA??????????
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //?è??DMA????????±?
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;             //?è??DMA??2??memory????±??????à·???
DMA_Init(DMA1_Channel6,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel6,ENABLE);  //?????¨??
      USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);        //????DMA·???????
}

void USART2_IRQHandler(void)                              
{  
  // uint32_t temp = 0;
    if(USART_GetITStatus(USART2, USART_IT_IDLE)==SET)  //???????????
{
//temp = USART2->SR;   //??SR,???DR????
// temp = USART2->DR; //?USART_IT_IDLE??
LED1=~LED1;
DMA_Cmd(DMA1_Channel6,DISABLE);   //??DMA??,??????????


DMA_Cmd(DMA1_Channel6,ENABLE);  //??DMA??
    }


用DMA方式不行,用中断方式就可以,是不是哪里不对,菜鸟求助

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-24 22:25:04 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2015-12-4
在线时间
1 小时
 楼主| 发表于 2015-12-25 10:10:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有只要开启这句
     USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);        //开启空闲中断
一接收数据系统就挂掉了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-26 20:43:10 | 显示全部楼层
songquicken 发表于 2015-12-25 10:10
回复【2楼】正点原子:
---------------------------------
还有只要开启这句
    &nbs ...

仿真一下了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 16:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表