你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stmf103串口DMA接收常定数组问题!!

[复制链接]
请输入口令 提问时间:2016-1-20 09:21 /
各位大大好,打扰了,最近在写一个串口接收程序,但配置了好久也没配制出来,也参考一些前辈写的配置,然后自己配置了个串口DMA接收数据,但发现配置都设置好了,DMA却始终收不到发送的数据,显示的全部为0,哪位前辈有这方面经验的希望指导下,万分感谢!下面是的串口DMA配置程序:
  1. #include "usart_led.h"
  2. //int USART1_DATA;
  3. unsigned int buffer[64]={0};
  4. unsigned char XY_led_num;
  5. unsigned char XX=0,YY=0;        
  6. unsigned char flag_IR=0;
  7. extern unsigned char tabl_R[8][8];
  8. u8 data[64];
  9. uint32_t temp = 0;
  10.         
  11. void USART1_Configuration(void)
  12. {
  13.     USART_InitTypeDef      USART_InitStructure;
  14.     GPIO_InitTypeDef       GPIO_InitStructure;
  15.    DMA_InitTypeDef        DMA_InitStructure;
  16.   
  17.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);   
  18.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  19.         
  20.                 GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_9;   
  21.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.                 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  23.                 GPIO_Init(GPIOA , &GPIO_InitStructure);
  24.         
  25.                 GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_10;       //Rx
  26.                 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
  27.                 GPIO_Init(GPIOA , &GPIO_InitStructure);
  28.         
  29.           DMA_DeInit(DMA1_Channel1);                                               
  30.          DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)(&USART1->DR);  
  31.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buffer;                     
  32.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        
  33.                 DMA_InitStructure.DMA_BufferSize = 64;                                   
  34.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;      
  35.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;               
  36.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;   
  37.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  38.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           
  39.                 DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     
  40.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  
  41.                 DMA_Init(DMA1_Channel1, &DMA_InitStructure);                          
  42.    
  43.                 DMA_Cmd(DMA1_Channel1, ENABLE);                                               
  44.                                 
  45.     USART_InitStructure.USART_BaudRate   =9600;                           
  46.                 USART_InitStructure.USART_WordLength = USART_WordLength_8b;            
  47.                 USART_InitStructure.USART_StopBits   = USART_StopBits_1;              
  48.                 USART_InitStructure.USART_Parity     = USART_Parity_No;               
  49.                 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  50.                 USART_InitStructure.USART_Mode                = USART_Mode_Tx | USART_Mode_Rx;  
  51.     USART_Init(USART1, &USART_InitStructure);     

  52.     USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);     // Enable USART1 DMA TX request
  53.     USART_Cmd(USART1, ENABLE);                    
  54.                
  55.                 USART_ITConfig(USART1,USART_IT_TC,DISABLE);  
  56.     USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);  
  57.     USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);  
  58.                
  59.                 USART_ClearFlag( USART1,USART_FLAG_IDLE );                        
  60. }

  61. void NVIC_Configuration(void)
  62. {
  63.     NVIC_InitTypeDef NVIC_InitStructure;
  64.         

  65. #ifdef VECT_TAB_RAM
  66. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  67. #else //VECT_TAB_FLASH
  68. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  69. #endif

  70.         
  71.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  72.          
  73.         
  74.                 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  75.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  76.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;
  77.                 NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
  78.         
  79.                 NVIC_Init(&NVIC_InitStructure);
  80. }

  81. void USART_INIT()  
  82. {
  83.     USART1_Configuration();
  84.           NVIC_Configuration();
  85. }

  86. void USART1_SendData(uint16_t Data)
  87. {
  88.         USART_SendData(USART1,(uint16_t)Data);
  89.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
  90. }

  91. void USART1_IRQHandler(void)  
  92. {
  93.   if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
  94.   {
  95.                 flag_IR=1;
  96.                 temp = USART1->SR;
  97.                 temp = USART1->DR;
  98.   }
  99.         __nop();
  100. }
复制代码


收藏 评论8 发布时间:2016-1-20 09:21

举报

8个回答
回答时间:2016-1-20 10:22:31
楼主,应该是先测试不用DMA下接收数据。楼主计划用查询还是中断的方式接收?
请输入口令 回答时间:2016-1-20 11:37:12
安 发表于 2016-1-20 10:22
楼主,应该是先测试不用DMA下接收数据。楼主计划用查询还是中断的方式接收? ...

我是用中断的方式接收啊!
刚才注意到串口1的DMA接收通道是通道5,然后改了过来现在能接收数据了,但接收的数据都是乱的啊,哭晕在厕所:'
回答时间:2016-1-20 14:08:02
看一下串口通讯的波特率是否正确。
请输入口令 回答时间:2016-1-20 16:18:46
安 发表于 2016-1-20 14:08
看一下串口通讯的波特率是否正确。

我刚才又配了个不用DMA串口传输的程序,能用了,但DMA的还是没解决。。。
Paderboy 回答时间:2016-1-20 22:57:44
本帖最后由 Paderboy 于 2016-1-20 22:59 编辑

楼主是想用DMA IDLE 空闲中断接收串口数据吧!!

void USART1_IRQHandler(void)  
{
  if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
  {
                flag_IR=1;
                temp = USART1->SR;
                temp = USART1->DR;  }
        __nop();
}


你参考下吧。。。你上面中断处理程序还缺进中断关闭DMA通道和获取CNDTR里数据长度。以上都处理好了。需要再给DMA CNDTR重新赋值,然后重新开启DMA接收数据。。

void USART1_IRQHandler(void)                                
{   
    uint32_t Length = 0;//数据长度   
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
        DMA_Cmd(DMA1_Channel5,DISABLE);
        Length = USART1->SR;
        Length = USART1->DR; //清USART_IT_IDLE标志
        Length = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5); //设置传输数据长度

        DMA1_Channel5->CNDTR = UART_RX_LEN;//重装填,并让接收地址偏址从0开始
        DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA  
    }  
    __nop();  
}




请输入口令 回答时间:2016-1-21 17:16:03
Paderboy 发表于 2016-1-20 22:57
楼主是想用DMA IDLE 空闲中断接收串口数据吧!!

void USART1_IRQHandler(void)  

这个我也配了,但也是接收错误!
Paderboy 回答时间:2016-1-22 09:04:55
可否发个你的完整的工程看看问题在哪?
请输入口令 回答时间:2016-1-22 09:38:02
本帖最后由 请输入口令 于 2016-1-22 09:50 编辑
Paderboy 发表于 2016-1-22 09:04
可否发个你的完整的工程看看问题在哪?

嗯好的,等下发给你!

test program.rar

下载

5.32 MB, 下载次数: 59, 下载积分: ST金币 -1

Usart DMA

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版