带有DMA的STM32F103ZET6 USART在调试与复位运行方面表现不同

2019-07-14 17:23发布

我正在使用STM32F103ZET6 MCU并且遇到一个奇怪的问题,如果我编程和调试或编程和复位我的MCU,用于与从设备通信的USART3不起作用。在调试中,没有USART数据从DMA进入内存,我在从属设备不断发送数据的范围内得到它。我检查过:
  • 时钟以适当的速度配置。
  • USART仍在使用USART3_getchar(0)
  • 重新启动我的USART3。
  • BOOT0引脚在调试时为低电平。
  • 其他任何东西都没有使用DMA通道。
我已经检查了参考手册和设备数据表,但我正在努力调试/检查代码中的设置,以查看调试/重置运行之间的区别。
  1. // Local Variables
  2. GPIO_InitTypeDef    GPIO_InitStructure;
  3. NVIC_InitTypeDef    NVIC_InitStructure;
  4. USART_InitTypeDef   USART_InitStructure;
  5. USART_ClockInitTypeDef USART_ClockInitStructure;

  6. // Code
  7. // Configure UART
  8. RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);     // USART3 Periph clock enable

  9. // Configure Pins
  10. GPIO_InitStructure.GPIO_Pin                     =  UART3_RX_PIN;
  11. GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
  12. GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_IPD;
  13. GPIO_Init(UART3_PORT, &GPIO_InitStructure);

  14. GPIO_InitStructure.GPIO_Pin                     =  UART3_TX_PIN;
  15. GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
  16. GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_AF_PP;
  17. GPIO_Init(UART3_PORT, &GPIO_InitStructure);

  18. #if(UART3_TX_FLOW_CTS_EN    == 1)                                                      
  19. // Enable USART3 CTS pin
  20. GPIO_InitStructure.GPIO_Pin                     =  UART3_CTS_PIN;
  21. GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
  22. GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_IN_FLOAtiNG;
  23. GPIO_Init(UART3_PORT, &GPIO_InitStructure);
  24. #endif

  25. #if(UART3_RX_FLOW_RTS_EN    == 1)                                                      
  26. // Enable USART3 RTS pin
  27. GPIO_InitStructure.GPIO_Pin                     =  UART3_RTS_PIN;
  28. GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
  29. GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_Out_PP;
  30. GPIO_Init(UART3_PORT, &GPIO_InitStructure);

  31. mCSP_USART3_RTS_PIN_GO;                                                            
  32. // initialise the RTS pin as go
  33. #endif

  34. st_uart3_tx_glb.timeout_timer_u16               =  UART3_TX_TIMEOUT;
  35. while(  (uart3_tx_flg                           == 0)   &&
  36. #if(UART3_TX_FLOW_CTS_EN    == 1)

  37.         (mCSP_USART3_CTS_READ                   == 0)   &&
  38. #endif
  39.         (st_uart3_tx_glb.timeout_timer_u16      >  0)   );

  40. //Set USART3 Clock
  41. USART_ClockStructInit(&USART_ClockInitStructure);
  42. USART_ClockInit(USART3, &USART_ClockInitStructure);

  43. USART_InitStructure.USART_BaudRate                  =  baud_rate_u32;
  44. USART_InitStructure.USART_WordLength                =  USART_WordLength_8b;
  45. USART_InitStructure.USART_StopBits                  =  USART_StopBits_1;
  46. USART_InitStructure.USART_Parity                    =  USART_Parity_No;
  47. #if(UART3_TX_FLOW_CTS_EN    == 1)
  48. USART_InitStructure.USART_HardwareFlowControl       =  
  49. USART_HardwareFlowControl_CTS;  // Enable USART3 CTS pin
  50. #else
  51. USART_InitStructure.USART_HardwareFlowControl       =  
  52. USART_HardwareFlowControl_None;
  53. #endif
  54. USART_InitStructure.USART_Mode                      =  USART_Mode_Rx |
  55. USART_Mode_Tx;
  56. USART_Init(USART3, &USART_InitStructure);

  57. // Enable interrupts
  58. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  59. DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);

  60. // Enable modules
  61. USART_Cmd(USART3, ENABLE);
  62. USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);

  63. // Enable the UART3 Interupt
  64. //  NVIC_InitStructure.NVIC_IRQChannel                      =  USART3_IRQn;
  65. // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART3_IRQ_PREM_PRI;
  66. //  NVIC_InitStructure.NVIC_IRQChannelSubPriority   = USART3_IRQ_SUB_PRI;
  67. //  NVIC_InitStructure.NVIC_IRQChannelCmd                   =  ENABLE;
  68. //  NVIC_Init(&NVIC_InitStructure);

  69. // Configure DMA
  70. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                                  // DMA1 Periph clock enable

  71. st_uart3_tx_glb.cnt_u8                              =  st_uart3_tx_glb.wr_index_u8;

  72. DMA_DeInit(DMA1_Channel2);
  73. DMA_StructInit(&DMA_UART3_InitStructure);
  74. DMA_UART3_InitStructure.DMA_PeripheralBaseAddr      =  (uint32_t)&USART3->DR;
  75. DMA_UART3_InitStructure.DMA_MemoryBaseAddr          =  (uint32_t)uart3_rx_buffer_a_u8_glb;
  76. DMA_UART3_InitStructure.DMA_DIR                     =  DMA_DIR_PeripheralSRC;
  77. DMA_UART3_InitStructure.DMA_BufferSize              =  st_uart3_tx_glb.cnt_u8;
  78. DMA_UART3_InitStructure.DMA_PeripheralInc           =  DMA_PeripheralInc_Disable;
  79. DMA_UART3_InitStructure.DMA_MemoryInc               =  DMA_MemoryInc_Enable;
  80. DMA_UART3_InitStructure.DMA_PeripheralDataSize      =  DMA_PeripheralDataSize_Byte;
  81. DMA_UART3_InitStructure.DMA_MemoryDataSize          =  DMA_MemoryDataSize_Byte;
  82. DMA_UART3_InitStructure.DMA_Mode                    =  DMA_Mode_Circular;
  83. DMA_UART3_InitStructure.DMA_Priority                =  DMA_Priority_VeryHigh;
  84. DMA_UART3_InitStructure.DMA_M2M                     =  DMA_M2M_Disable;
  85. DMA_Init(DMA1_Channel2, &DMA_UART3_InitStructure);

  86. // Enable the DMA complete Interupt
  87. NVIC_InitStructure.NVIC_IRQChannel                      =  DMA1_Channel2_IRQn;
  88. NVIC_Init(&NVIC_InitStructure);

  89. DMA_Cmd(DMA1_Channel2, ENABLE);
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
zhhx1985
2019-07-15 08:35

应初始化本地结构,否则某些字段可能会产生不可预测的值:

GPIO_InitTypeDef    GPIO_InitStructure={};
NVIC_InitTypeDef    NVIC_InitStructure={};
USART_InitTypeDef   USART_InitStructure={};
USART_ClockInitTypeDef USART_ClockInitStructure={};
mCSP_USART3_RTS_PIN_GO;这句话有什么作用?它是一个宏还是什么?

应声明这些标志volatile,否则您可以在不同的优化设置下获得不同的行为:

while(  (uart3_tx_flg                           == 0)   &&
#if(UART3_TX_FLOW_CTS_EN    == 1)
    (mCSP_USART3_CTS_READ                   == 0)   &&
#endif
    (st_uart3_tx_glb.timeout_timer_u16      >  0)   );

一周热门 更多>