发表于 2016-10-14 11:04:03

仿真暂停,用软件看。或者串口输出寄存器的值。

tianyukobe 发表于 2016-10-14 11:29:20

安 发表于 2016-10-14 11:04
仿真暂停,用软件看。或者串口输出寄存器的值。

CbueHal下   是用HAL_UART_GetState(UART_HandleTypeDef *huart);这函数调吗?程序卡死 在什么地方调? 是在卡死的地方调吗?

奏奏奏 发表于 2016-10-14 12:31:27

tianyukobe 发表于 2016-10-14 11:29
CbueHal下   是用HAL_UART_GetState(UART_HandleTypeDef *huart);这函数调吗?程序卡死 在什么地方调? ...
设全局变量,例如Debug_FLAG,
在你觉得可能出错的地方给Debug_FLAG赋值,
打开Keil的DEBUG,在Watch窗口添加变量Debug_FLAG,
然后看卡死的时候Debug_FLAG的值是多少,最后反过来查。
我是这样子查错的

zbber 发表于 2016-10-14 14:13:07

好帖,必须支持一下!

发表于 2016-10-14 14:44:31

难道不能在线仿真吗?通过仿真,查看各个寄存器的值,变量的值

tianyukobe 发表于 2016-10-14 23:04:18

本帖最后由 tianyukobe 于 2016-10-14 23:09 编辑

安 发表于 2016-10-14 14:44
难道不能在线仿真吗?通过仿真,查看各个寄存器的值,变量的值<div class="blockcode"><blockquote>//DMA发送
void Usart2SendData_DMA(uint8_t *pdata, uint16_t Length)
{
    while(Uart2_Config.DmaSend_Flag == USART_DMA_SENDING);
    Uart2_Config.DmaSend_Flag = USART_DMA_SENDING;
    HAL_UART_Transmit_DMA(&huart2, pdata, Length);
}

void Usart3SendData_DMA(uint8_t *pdata, uint16_t Length)
{
    while(Uart3_Config.DmaSend_Flag == USART_DMA_SENDING);
    Uart3_Config.DmaSend_Flag = USART_DMA_SENDING;
    HAL_UART_Transmit_DMA(&huart3, pdata, Length);
}

//DMA发送完成回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
                __HAL_DMA_DISABLE(huart->hdmatx);
                Uart2_Config.DmaSend_Flag = USART_DMA_SENDOVER;
}
else if(huart->Instance==USART3)
{
                __HAL_DMA_DISABLE(huart->hdmatx);
                Uart3_Config.DmaSend_Flag = USART_DMA_SENDOVER;
}
}程序会卡在这while(Uart2_Config.DmaSend_Flag == USART_DMA_SENDING);   也就是回调函数不是百分百的能清除标志,我以为10ms双向发太快了,改成20ms,效果会好一点 但是还是会卡死

asssdz-382474 发表于 2016-10-15 00:08:34

:):):):):):):):):):)

发表于 2016-10-15 09:27:40

计算一下波特率发送一组数据需要的时间。

原田夜舞love 发表于 2016-10-15 22:03:51

帮顶了!
页: 1 [2]
查看完整版本: STM32 2个串口互发数据卡死,丢字节!