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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版