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

STM32F103 UART2通过DMA方式发送和接收 发不出去数据 求帮忙

[复制链接]
益达zZ 提问时间:2017-11-8 12:22 /
新手,最近在学习DMA方式通信,但是过程中发现不知道什么问题,发送不出数据帮忙看下哪里的配置出了问题





  1. void Init_NVIC(void)
  2. {        
  3.         NVIC_InitTypeDef NVIC_InitStructure;                        //定义一个NVIC向量表结构体变量

  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置中断组 为2
  5.   
  6.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                //配置串口1为中断源
  7.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级
  8.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级
  9.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断
  10.         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器
  11.        
  12.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;                                //配置串口1为中断源
  13.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级
  14.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级
  15.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断
  16.         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器
  17.        
  18.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;                                //配置串口1为中断源
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断
  22.         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器
  23.        
  24.        
  25. }



  26. void Init_Usart2(void)
  27. {
  28.         GPIO_InitTypeDef GPIO_InitStructure;                                        //定义一个GPIO结构体变量

  29.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);               
  31.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);          //DMA1时钟
  32.        

  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //配置串口发送端口挂接到9端口
  34.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           //复用功能输出开漏
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //配置端口速度为50M
  36.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //根据参数初始化GPIOA寄存器       

  37.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //接收
  38.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空输入(复位状态);                                          
  39.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //根据参数初始化GPIOA寄存器       
  40. }




  41. void Usart2_Configuration(uint32_t BaudRate)
  42. {
  43.         USART_InitTypeDef USART_InitStructure;                                                                    //定义一个串口结构体

  44.         USART_InitStructure.USART_BaudRate            = BaudRate ;                                  //波特率115200
  45.         USART_InitStructure.USART_WordLength          = USART_WordLength_8b;         //传输过程中使用8位数据
  46.         USART_InitStructure.USART_StopBits            = USART_StopBits_1;                 //在帧结尾传输1位停止位
  47.         USART_InitStructure.USART_Parity              = USART_Parity_No ;                 //奇偶失能
  48.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流失能
  49.         USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx; //接收和发送模式
  50.         USART_Init(USART2, &USART_InitStructure);                                                                //根据参数初始化串口寄存器
  51.   USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);                          // 开启 串口空闲IDEL 中断
  52.         USART_Cmd(USART2, ENABLE);                                                                                             //使能串口外设
  53.   USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);  // 开启串口DMA发送
  54.   USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); // 开启串口DMA接收
  55. }


  56. void DMA_Uart_Init(void)
  57. {
  58.        
  59. extern u32 UART2_Tx_Buf[UART2_Tx_Buf_number];
  60. extern u32 UART2_Rx_Buf[UART2_Rx_Buf_number];

  61.     DMA_InitTypeDef DMA_InitStructure;
  62.    
  63.     /* DMA clock enable */
  64.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 开启DMA1时钟
  65.    
  66.    
  67. //=DMA_Configuration==============================================================================//

  68. /*--- LUMMOD_UART_Tx_DMA_Channel DMA Config ---*/

  69.     DMA_Cmd(DMA1_Channel7, DISABLE);                           // 关DMA通道
  70.     DMA_DeInit(DMA1_Channel7);                                 // 恢复缺省值
  71.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);// 设置串口发送数据寄存器
  72.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART2_Tx_Buf;         // 设置发送缓冲区首地址
  73.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      // 设置外设位目标,内存缓冲区 -> 外设寄存器
  74.     DMA_InitStructure.DMA_BufferSize = 1;                     // 需要发送的字节数,这里其实可以设置为0,因为在实际要发送的时候,会重新设置次值
  75.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        // 外设地址不做增加调整,调整不调整是DMA自动实现的
  76.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // 内存缓冲区地址增加调整
  77.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度8位,1个字节
  78.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 内存数据宽度8位,1个字节
  79.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // 单次传输模式
  80.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                 // 优先级设置
  81.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            // 关闭内存到内存的DMA模式
  82.     DMA_Init(DMA1_Channel7, &DMA_InitStructure);               // 写入配置
  83.                 DMA_DeInit(DMA1_Channel7);                                                                                        //UART2的TX为DMA1通道7
  84.     DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);            // 开启发送DMA通道中断
  85.     DMA_ClearFlag(DMA1_FLAG_GL7);                                 // 清除DMA所有标志
  86.     DMA_Cmd(DMA1_Channel7, ENABLE);                            // 开启接收DMA通道,等待接收数据
  87.    
  88. /*--- LUMMOD_UART_Rx_DMA_Channel DMA Config ---*/

  89.     DMA_Cmd(DMA1_Channel6, DISABLE);                           // 关DMA通道
  90.     DMA_DeInit(DMA1_Channel6);                                 // 恢复缺省值
  91.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);// 设置串口接收数据寄存器
  92.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART2_Rx_Buf;         // 设置接收缓冲区首地址
  93.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                      // 设置外设为数据源,外设寄存器 -> 内存缓冲区
  94.     DMA_InitStructure.DMA_BufferSize = UART2_most_Rx_Buf;                     // 需要最大可能接收到的字节数
  95.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        // 外设地址不做增加调整,调整不调整是DMA自动实现的
  96.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // 内存缓冲区地址增加调整
  97.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度8位,1个字节
  98.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 内存数据宽度8位,1个字节
  99.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // 单次传输模式
  100.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                 // 优先级设置
  101.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            // 关闭内存到内存的DMA模式
  102.     DMA_Init(DMA1_Channel6, &DMA_InitStructure);               // 写入配置
  103.                 DMA_DeInit(DMA1_Channel6);//UART2的RX为DMA1通道6
  104.     DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);            // 开启发送DMA通道中断
  105.     DMA_ClearFlag(DMA1_FLAG_GL6);                                 // 清除DMA所有标志
  106.     DMA_Cmd(DMA1_Channel6, ENABLE);                            // 开启接收DMA通道,等待接收数据
  107.    
  108. }

  109. void DMA1_Channel7_IRQHandler(void)
  110. {
  111.     if(DMA_GetITStatus(DMA1_FLAG_TC7))
  112.     {
  113.                         DMA_ClearFlag(DMA1_FLAG_GL7);         // 清除标志
  114.                         DMA_Cmd(DMA1_Channel7, DISABLE);   // 关闭DMA通道
  115.     }
  116. }




  117. void DMA_UART2_Send_Data(u32 size)
  118. {
  119.   DMA1_Channel7->CNDTR =size; // 设置要发送的字节数目
  120.   DMA_Cmd(DMA1_Channel7, ENABLE);        //开始DMA发送
  121. }


  122. void USART2_IRQHandler(void)
  123. {
  124.     if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)  // 空闲中断
  125.     {
  126.                         DMA_Cmd(DMA1_Channel6, DISABLE);       // 关闭DMA ,防止干扰
  127.                         DMA_ClearFlag( DMA1_FLAG_GL6 );           // 清DMA标志位
  128.         //    LumMod_Rx_Data.index = LUMMOD_RX_BSIZE - DMA_GetCurrDataCounter(DMA1_Channel7); //获得接收到的字节数
  129.         //    DMA1_Channel7->CNDTR = LUMMOD_RX_BSIZE;    //  重新赋值计数值,必须大于等于最大可能接收到的数据帧数目
  130.                         DMA_Cmd(DMA1_Channel6, ENABLE);        
  131.       USART_ReceiveData( USART2 ); // Clear IDLE interrupt flag bit  
  132.     }
  133. }



  134. int main(void)
  135. {
  136. /********************************系统时钟配置***********************************************/       
  137.         SystemInit();
  138.         Delay_Ms(200);

  139. /****************************初始化中断向量表配置*******************************************/       
  140.         Init_NVIC();               

  141. /***************************UART1串口IO口初始化配置*****************************************/       
  142.         Init_Usart1();                                                  //用于调试串口打印数据
  143.         Usart1_Configuration(115200);         
  144.        
  145. /***************************UART2串口IO口初始化配置*****************************************/       
  146.         Init_Usart2();                                                  //用于调试串口打印数据
  147.         Usart2_Configuration(115200);         
  148.         DMA_Uart_Init();

  149. /*==============================================================================================================================*/       
  150.         LED1=0;
  151.        
  152.         while(1)
  153.         {
  154.                 UART2_Tx_Buf[0]=0x1;
  155.                 UART2_Tx_Buf[1]=0x1;
  156.                 UART2_Tx_Buf[2]=0x1;
  157.                 UART2_Tx_Buf[3]=0x1;
  158.                 DMA_UART2_Send_Data(4);
  159.                 Delay_Ms(2000);
  160.         }        //while(1)
  161. }         //main       

复制代码


收藏 评论0 发布时间:2017-11-8 12:22

举报

0个回答

所属标签

相似问题

官网相关资源

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