打印
[STM32F1]

USART3不起作用

[复制链接]
414|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2020-6-26 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F103ZET6 MCU并且遇到一个奇怪的问题,如果我编程和调试或编程和复位我的MCU,用于与从设备通信的USART3不起作用。

使用特权

评论回复
沙发
chuxh| | 2020-6-26 16:27 | 只看该作者
STM32F103ZET6 MCU并且遇到一个奇怪的问题,如果我编程和调试或编程和复位我的MCU,用于与从设备通信的USART3不起作用。

使用特权

评论回复
板凳
zwll|  楼主 | 2020-6-26 16:30 | 只看该作者
在调试中,没有USART数据从DMA进入内存,我在从属设备不断发送数据的范围内得到它。

使用特权

评论回复
地板
gongche| | 2020-6-26 16:36 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
zwll|  楼主 | 2020-6-26 16:40 | 只看该作者
我检查过:
时钟以适当的速度配置。
USART仍在使用USART3_getchar(0)
重新启动我的USART3。
BOOT0引脚在调试时为低电平。
其他任何东西都没有使用DMA通道。
我已经检查了参考手册和设备数据表,但我正在努力调试/检查代码中的设置,以查看调试/重置运行之间的区别。
// Local Variables
GPIO_InitTypeDef    GPIO_InitStructure;
NVIC_InitTypeDef    NVIC_InitStructure;
USART_InitTypeDef   USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;

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

// Configure Pins
GPIO_InitStructure.GPIO_Pin                     =  UART3_RX_PIN;
GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_IPD;
GPIO_Init(UART3_PORT, &GPIO_InitStructure);

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

#if(UART3_TX_FLOW_CTS_EN    == 1)                                                      
// Enable USART3 CTS pin
GPIO_InitStructure.GPIO_Pin                     =  UART3_CTS_PIN;
GPIO_InitStructure.GPIO_Speed                   =  GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode                    =  GPIO_Mode_IN_FLOATING;
GPIO_Init(UART3_PORT, &GPIO_InitStructure);
#endif

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

mCSP_USART3_RTS_PIN_GO;                                                            
// initialise the RTS pin as go
#endif

st_uart3_tx_glb.timeout_timer_u16               =  UART3_TX_TIMEOUT;
while(  (uart3_tx_**                           == 0)   &&
#if(UART3_TX_FLOW_CTS_EN    == 1)

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

//Set USART3 Clock
USART_ClockStructInit(&USART_ClockInitStructure);
USART_ClockInit(USART3, &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate                  =  baud_rate_u32;
USART_InitStructure.USART_WordLength                =  USART_WordLength_8b;
USART_InitStructure.USART_StopBits                  =  USART_StopBits_1;
USART_InitStructure.USART_Parity                    =  USART_Parity_No;
#if(UART3_TX_FLOW_CTS_EN    == 1)
USART_InitStructure.USART_HardwareFlowControl       =  
USART_HardwareFlowControl_CTS;  // Enable USART3 CTS pin
#else
USART_InitStructure.USART_HardwareFlowControl       =  
USART_HardwareFlowControl_None;
#endif
USART_InitStructure.USART_Mode                      =  USART_Mode_Rx |
USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);

// Enable interrupts
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);

// Enable modules
USART_Cmd(USART3, ENABLE);
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);

// Enable the UART3 Interupt
//  NVIC_InitStructure.NVIC_IRQChannel                      =  USART3_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART3_IRQ_PREM_PRI;
//  NVIC_InitStructure.NVIC_IRQChannelSubPriority   = USART3_IRQ_SUB_PRI;
//  NVIC_InitStructure.NVIC_IRQChannelCmd                   =  ENABLE;
//  NVIC_Init(&NVIC_InitStructure);

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

st_uart3_tx_glb.cnt_u8                              =  st_uart3_tx_glb.wr_index_u8;

DMA_DeInit(DMA1_Channel2);
DMA_StructInit(&DMA_UART3_InitStructure);
DMA_UART3_InitStructure.DMA_PeripheralBaseAddr      =  (uint32_t)&USART3->DR;
DMA_UART3_InitStructure.DMA_MemoryBaseAddr          =  (uint32_t)uart3_rx_buffer_a_u8_glb;
DMA_UART3_InitStructure.DMA_DIR                     =  DMA_DIR_PeripheralSRC;
DMA_UART3_InitStructure.DMA_BufferSize              =  st_uart3_tx_glb.cnt_u8;
DMA_UART3_InitStructure.DMA_PeripheralInc           =  DMA_PeripheralInc_Disable;
DMA_UART3_InitStructure.DMA_MemoryInc               =  DMA_MemoryInc_Enable;
DMA_UART3_InitStructure.DMA_PeripheralDataSize      =  DMA_PeripheralDataSize_Byte;
DMA_UART3_InitStructure.DMA_MemoryDataSize          =  DMA_MemoryDataSize_Byte;
DMA_UART3_InitStructure.DMA_Mode                    =  DMA_Mode_Circular;
DMA_UART3_InitStructure.DMA_Priority                =  DMA_Priority_VeryHigh;
DMA_UART3_InitStructure.DMA_M2M                     =  DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_UART3_InitStructure);

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

DMA_Cmd(DMA1_Channel2, ENABLE);

使用特权

评论回复
6
chenho| | 2020-6-26 16:44 | 只看该作者

在调试期间无法暂停DMA和USART,如果以这种方式错过中断,则可能会失去同步

使用特权

评论回复
7
dingy| | 2020-6-26 16:47 | 只看该作者
可以在stm32f10x.h中看到位定义,但我不确定,我是否需要为USART和DMA定义speicifc DBGMCU_CR位才能在调试中工作?

使用特权

评论回复
8
renyaq| | 2020-6-26 16:52 | 只看该作者
应初始化本地结构,否则某些字段可能会产生不可预测的值:

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_**                           == 0)   &&
#if(UART3_TX_FLOW_CTS_EN    == 1)
    (mCSP_USART3_CTS_READ                   == 0)   &&
#endif
    (st_uart3_tx_glb.timeout_timer_u16      >  0)   );

使用特权

评论回复
9
pangb| | 2020-6-26 16:56 | 只看该作者
原因是USART3在APB1而不是APB2时钟,因此没有被启用,但在引导加载程序中启用了APB1 USART3时钟。

使用特权

评论回复
10
zyf部长| | 2020-6-26 17:00 | 只看该作者
注意时序的问题

使用特权

评论回复
11
lium| | 2020-6-26 17:04 | 只看该作者
初始化之后你看看寄存器的状态

使用特权

评论回复
12
zhaoxqi| | 2020-6-26 17:07 | 只看该作者

要求不高的话别用dma

使用特权

评论回复
13
zwll|  楼主 | 2020-6-26 19:11 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

885

主题

11314

帖子

5

粉丝