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

STM32F411 DMA2 keil调试时,能够使用,不调试,就没有反应

[复制链接]
nbh520 提问时间:2017-11-7 09:30 /
悬赏10ST金币未解决
本帖最后由 nbh520 于 2017-11-7 16:58 编辑

STM32F411芯片
在使用USART6 RX DMA2时,发现DMA2不能正常工作,经测试发现,在keil调试状态下,DMA2可以正常接收数据,否则不能接收数据。
使用环境:其他外设均以关闭,没有进入低功耗,只有USART6处于工作状态,且已验证,在不使用DMA2时,USART6能够正常接收。   
USART6的软件配置如下,项目很急,请各路大神,帮帮看看,指点一下。

  1. /******************************UART 6*****************************************/
  2. #define GPS_COMM_USART_6                         USART6
  3. #define GPS_COMM_USART_CLK_ENABLE()              __HAL_RCC_USART6_CLK_ENABLE()
  4. #define DMA2_CLK_ENABLE()                        __HAL_RCC_DMA2_CLK_ENABLE()
  5. #define GPS_COMM_USART_RX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOC_CLK_ENABLE()
  6. #define GPS_COMM_USART_TX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOC_CLK_ENABLE()

  7. #define GPS_COMM_USART_FORCE_RESET()             __HAL_RCC_USART6_FORCE_RESET()
  8. #define GPS_COMM_USART_RELEASE_RESET()           __HAL_RCC_USART6_RELEASE_RESET()

  9. /* Definition for USARTx Pins */
  10. #define GPS_COMM_USART_TX_PIN                    GPIO_PIN_6
  11. #define GPS_COMM_USART_TX_GPIO_PORT              GPIOC
  12. #define GPS_COMM_USART_TX_AF                     GPIO_AF8_USART6
  13. #define GPS_COMM_USART_RX_PIN                    GPIO_PIN_7
  14. #define GPS_COMM_USART_RX_GPIO_PORT              GPIOC
  15. #define GPS_COMM_USART_RX_AF                     GPIO_AF8_USART6

  16. /* Definition for USARTx's DMA */
  17. #define GPS_COMM_USART_TX_DMA_CHANNEL            DMA_CHANNEL_5
  18. #define GPS_COMM_USART_RX_DMA_CHANNEL            DMA_CHANNEL_5

  19. /* Definition for USARTx's DMA Request */
  20. #define GPS_COMM_USART_TX_DMA_STREAM             DMA2_Stream6
  21. #define GPS_COMM_USART_RX_DMA_STREAM             DMA2_Stream2

  22. /* Definition for USARTx's NVIC */
  23. #define GPS_COMM_USART_DMA_TX_IRQn               DMA2_Stream6_IRQn
  24. #define GPS_COMM_USART_DMA_RX_IRQn               DMA2_Stream2_IRQn


  25. /**
  26.   * @brief UART MSP Initialization
  27.   *        This function configures the hardware resources used in this example:
  28.   *           - Peripheral's clock enable
  29.   *           - Peripheral's GPIO Configuration
  30.   * @param huart: UART handle pointer
  31.   * @retval None
  32.   */
  33. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  34. {
  35.     GPIO_InitTypeDef  GPIO_InitStruct;      

  36.     if(huart->Instance == GPS_COMM_USART_6)
  37.     {
  38.         /*##-1- Enable peripherals and GPIO Clocks #################################*/
  39.        GPS_COMM_USART_TX_GPIO_CLK_ENABLE();
  40.        GPS_COMM_USART_RX_GPIO_CLK_ENABLE();
  41.                
  42.        GPS_COMM_USART_CLK_ENABLE();
  43.         
  44.        DMA2_CLK_ENABLE();
  45.         
  46.        /*##-2- Configure peripheral GPIO ##########################################*/  
  47.       GPIO_InitStruct.Pin       = GPS_COMM_USART_TX_PIN;
  48.       GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  49.       GPIO_InitStruct.Pull      = GPIO_PULLUP;
  50.       GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  51.       GPIO_InitStruct.Alternate = GPS_COMM_USART_TX_AF;
  52.         
  53.       HAL_GPIO_Init(GPS_COMM_USART_TX_GPIO_PORT, &GPIO_InitStruct);
  54.         
  55.       GPIO_InitStruct.Pin = GPS_COMM_USART_RX_PIN;
  56.       GPIO_InitStruct.Alternate = GPS_COMM_USART_RX_AF;
  57.         
  58.       HAL_GPIO_Init(GPS_COMM_USART_RX_GPIO_PORT, &GPIO_InitStruct);
  59.         
  60.       /*##-3- Configure the DMA ##################################################*/
  61.      gps_comm_hdma_rx.Instance                 = GPS_COMM_USART_RX_DMA_STREAM;
  62.      gps_comm_hdma_rx.Init.Channel             = GPS_COMM_USART_RX_DMA_CHANNEL;        
  63.      gps_comm_hdma_rx.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  64.      gps_comm_hdma_rx.Init.PeriphInc           = DMA_PINC_DISABLE;
  65.      gps_comm_hdma_rx.Init.MemInc              = DMA_MINC_ENABLE;
  66.      gps_comm_hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  67.      gps_comm_hdma_rx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
  68.      gps_comm_hdma_rx.Init.Mode                = DMA_NORMAL;
  69.      gps_comm_hdma_rx.Init.Priority            = DMA_PRIORITY_HIGH;
  70.      gps_comm_hdma_rx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;         
  71.      gps_comm_hdma_rx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  72.      gps_comm_hdma_rx.Init.MemBurst            = DMA_MBURST_INC4;
  73.      gps_comm_hdma_rx.Init.PeriphBurst         = DMA_PBURST_INC4;
  74.         
  75.      HAL_DMA_Init(&gps_comm_hdma_rx);
  76.         
  77.      /* Associate the initialized DMA handle to the the UART handle */
  78.      __HAL_LINKDMA(huart, hdmarx, gps_comm_hdma_rx);
  79.         
  80.      /*##-4- Configure the NVIC for DMA #########################################*/
  81.      //HAL_NVIC_SetPriority(USART5_DMA_TX_IRQn, 2, 1);
  82.      //HAL_NVIC_EnableIRQ(USART5_DMA_TX_IRQn);
  83.         
  84.       HAL_NVIC_SetPriority(GPS_COMM_USART_DMA_RX_IRQn, GPS_COMM_USART_DMA_RX_IRQn_PRE_PRIORITY,               DEFAULT_IRQ_SUB_PRIORITY);
  85.      HAL_NVIC_EnableIRQ(GPS_COMM_USART_DMA_RX_IRQn);      

  86.      /*##-3- Configure the NVIC for UART ########################################*/
  87.      //HAL_NVIC_SetPriority(GPS_COMM_USART_IRQn, GPS_COMM_USART_DMA_RX_IRQn_PRE_PRIORITY, DEFAULT_IRQ_SUB_PRIORITY);
  88.     //HAL_NVIC_EnableIRQ(GPS_COMM_USART_IRQn);              
  89.     }
  90. }

  91. /*************************************************************************   
  92. **        function name:        gps_comm_init
  93. **        description:                          
  94. **        input para:                 
  95. **                          
  96. **        return:                                                               
  97. **************************************************************************/
  98. void gps_comm_init(void)
  99. {
  100.     UartHandle.Instance        = GPS_COMM_USART_6;
  101.    
  102.     UartHandle.Init.BaudRate   = 9600;
  103.     UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  104.     UartHandle.Init.StopBits   = UART_STOPBITS_1;
  105.     UartHandle.Init.Parity     = UART_PARITY_NONE;
  106.     UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  107.     UartHandle.Init.Mode       = UART_MODE_TX_RX;
  108.     UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  109.    
  110.     if (HAL_UART_Init(&UartHandle) != HAL_OK)
  111.     {
  112.         /* Initialization Error */
  113.         GPS_COMM_DRIVER_DEBUG("** MY DEBUG INTERFACE FAILED. ** \r\n");
  114.     }
  115.     else
  116.     {
  117.         //MY_DEBUG("** MY DEBUG INTERFACE successfully. ** \r\n");
  118.     }
  119. }
复制代码


赞 收藏 评论4 发布时间:2017-11-7 09:30

举报

4个回答
nbh520 最优答案 回答时间:2017-11-7 16:57:49
使用DMA做串口接收时,在启动DMA后需要将串口溢出标志清除(有些应用场景,串口接收端是一直有数据存在的),才能正常接收。
这个问题之前在使用STM32L072时,就已经发现解决了,但由于F4平台和L0平台在清除溢出标志方式略有不同。
为了避免有人出现同样的问题,下面给大家描述一下,两者的不同之处:STM32L0清除USART标志直接调用__HAL_USART_CLEAR_IT()即可
STM32F4 __HAL_UART_CLEAR_FLAG()能够清除的标志只有UART_FLAG_CTS、UART_FLAG_LBD、UART_FLAG_TC、UART_FLAG_RXNE,而PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun error) and IDLE (Idle line detected) flags 等标志的清除需要读取USART_SR register才行。
  1. STM32L0
  2. /** @brief  Clears the specified USART ISR flag, in setting the proper ICR register flag.
  3.   * @param  __HANDLE__: specifies the USART Handle which can be USART1 or USART2.
  4.   * @param  __IT_CLEAR__: specifies the interrupt clear register flag that needs to be set
  5.   *                       to clear the corresponding interrupt
  6.   *          This parameter can be one of the following values:
  7.   *            @arg USART_CLEAR_PEF: Parity Error Clear Flag
  8.   *            @arg USART_CLEAR_FEF: Framing Error Clear Flag
  9.   *            @arg USART_CLEAR_NEF: Noise detected Clear Flag
  10.   *            @arg USART_CLEAR_OREF: OverRun Error Clear Flag
  11.   *            @arg USART_CLEAR_IDLEF: IDLE line detected Clear Flag
  12.   *            @arg USART_CLEAR_TCF: Transmission Complete Clear Flag
  13.   *            @arg USART_CLEAR_CTSF: CTS Interrupt Clear Flag
  14.   * @retval None
  15.   */
  16. #define __HAL_USART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__))

  17. STM32F4
  18. /** @brief  Clears the specified UART pending flag.
  19.   * @param  __HANDLE__: specifies the UART Handle.
  20.   *         This parameter can be UARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or
  21.   *         UART peripheral.
  22.   * @param  __FLAG__: specifies the flag to check.
  23.   *          This parameter can be any combination of the following values:
  24.   *            @arg UART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5).
  25.   *            @arg UART_FLAG_LBD:  LIN Break detection flag.
  26.   *            @arg UART_FLAG_TC:   Transmission Complete flag.
  27.   *            @arg UART_FLAG_RXNE: Receive data register not empty flag.
  28.   *   
  29.   * @note   PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun
  30.   *          error) and IDLE (Idle line detected) flags are cleared by software
  31.   *          sequence: a read operation to USART_SR register followed by a read
  32.   *          operation to USART_DR register.
  33.   * @note   RXNE flag can be also cleared by a read to the USART_DR register.
  34.   * @note   TC flag can be also cleared by software sequence: a read operation to
  35.   *          USART_SR register followed by a write operation to USART_DR register.
  36.   * @note   TXE flag is cleared only by a write to the USART_DR register.
  37.   *   
  38.   * @retval None
  39.   */
  40. #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__))


复制代码

评分

参与人数 2ST金币 +6 蝴蝶豆 +2 收起 理由
zero99 + 2 结贴奖励
MrJiu + 6 很给力!

查看全部评分

MrJiu 回答时间:2017-11-7 11:23:45
现在都使用的Cube一键配置了。。。。。现在能够帮你看出问题来的人,估计只有cube了!!!

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

nbh520 回答时间:2017-11-7 14:45:11
MrJiu 发表于 2017-11-7 11:23
现在都使用的Cube一键配置了。。。。。现在能够帮你看出问题来的人,估计只有cube了!!! ...

cube配置的代码,我也对比看了,没什么问题。本来想用keil断点调试看看,问题出在哪,结果就发现调试的时候,DMA2能够正常接收,吐血啊。
卖男孩的小火柴 回答时间:2018-3-19 11:59:57
nbh520 发表于 2017-11-7 16:57
使用DMA做串口接收时,在启动DMA后需要将串口溢出标志清除(有些应用场景,串口接收端是一直有数据存在的), ...

你好!在论坛里看到你说用stm32L072做过DMA串口接收。我也在用DMA+串口空闲中断做任意长度数据的接收。现在遇到一个问题,如下:
假设DMA缓冲区长度为N,当数据长度≥N+1时,DMA接收中断能接收到前N个,串口空闲中断能接收到第N+1个,无论数据多长,串口空闲中断也只能接到1个。发现是串口溢出,我在串口中断中把溢出标志清除了,仍是如此。求指教。谢谢。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

官网相关资源

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