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

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