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

stm32g070 芯片的usart3和usart4问题?

[复制链接]
黑猫 提问时间:2022-3-22 13:38 / 已解决

usart3:没有开启DMA模式,开启此功能必须使能timer1,而且中断发送数据时,总是产生idle故障标志。且总是接收到自己发出的数据。请问,1.怎样可以让idle故障标志不再产生?2.怎么可以让usart3串口可以自动接收自己发出的数据(即可全双工工作)?

usart4:目前仅可以正常接收数据,发送数据总是不完整。开启timer15仍无效果。

希望大家帮助解决一下,在此先行谢过!

收藏 评论8 发布时间:2022-3-22 13:38

举报

8个回答
废鱼 最优答案 回答时间:2022-3-23 14:41:00

我们先一个一个的来解决。

1、如何不自发自收,只要外部不短接到一块是不会发生自发自收的。如果方便最好还是上传一下工程。

2、发送不完整,发送的过程时什么样的?尽量不要在中断中进行数据发送。

黑猫 回答时间:2022-3-22 13:39:34

static void MX_USART3_UART_Init(void)

{

/ USER CODE BEGIN USART3_Init 0 /

/ USER CODE END USART3_Init 0 /

/ USER CODE BEGIN USART3_Init 1 /

/ USER CODE END USART3_Init 1 /

huart3.Instance = USART3;

huart3.Init.BaudRate = 115200;

huart3.Init.WordLength = UART_WORDLENGTH_8B;

huart3.Init.StopBits = UART_STOPBITS_1;

huart3.Init.Parity = UART_PARITY_NONE;

huart3.Init.Mode = UART_MODE_TX_RX;

huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart3.Init.OverSampling = UART_OVERSAMPLING_16;

huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;

huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

if (HAL_UART_Init(&huart3) != HAL_OK)

{

Error_Handler(); }

/ USER CODE BEGIN USART3_Init 2 /

// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_FE);

// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);

__HAL_UART_ENABLE(&huart3);

HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);

/ USER CODE END USART3_Init 2 /

}

static void MX_USART4_UART_Init(void)

{

/ USER CODE BEGIN USART4_Init 0 /

/ USER CODE END USART4_Init 0 /

/ USER CODE BEGIN USART4_Init 1 /

/ USER CODE END USART4_Init 1 /

huart4.Instance = USART4;

huart4.Init.BaudRate = 9600;

huart4.Init.WordLength = UART_WORDLENGTH_8B;

huart4.Init.StopBits = UART_STOPBITS_1;

huart4.Init.Parity = UART_PARITY_NONE;

huart4.Init.Mode = UART_MODE_TX_RX;

huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart4.Init.OverSampling = UART_OVERSAMPLING_16;

huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

huart4.Init.ClockPrescaler = UART_PRESCALER_DIV4;

huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

if (HAL_UART_Init(&huart4) != HAL_OK)

{

Error_Handler(); }

/ USER CODE BEGIN USART4_Init 2 /

__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);

__HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);

__HAL_UART_ENABLE(&huart4);

U4_Rx_Enable();      

HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);

/ USER CODE END USART4_Init 2 /

}

黑猫 回答时间:2022-3-22 13:40:20

void USART3_4_IRQHandler(void)

{

/ USER CODE BEGIN USART3_4_IRQn 0 /

/ USER CODE END USART3_4_IRQn 0 /

HAL_UART_IRQHandler(&huart3);

HAL_UART_IRQHandler(&huart4);

/ USER CODE BEGIN USART3_4_IRQn 1 /

/ USER CODE END USART3_4_IRQn 1 /

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance == USART3)

{

        HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);

        if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) == SET)

        {

                __HAL_UART_CLEAR_IDLEFLAG(&huart3);

        }

        if(U3_Rx_Index >= U3_RXBUFFER_SIZE)

                U3_Rx_Index = U3_RXBUFFER_SIZE - 1;

        U3_RxBuf[U3_Rx_Index] = U3_RxDat_Tmp;

        U3_Rx_Index++;

        U3_Rx_Delay = 5;

}

else if(huart->Instance == USART4)//RS485

{

        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);

        if(U4_Rx_Index >= U4_RXBUFFER_SIZE)

                U4_Rx_Index = U4_RXBUFFER_SIZE - 1;

        U4_RxBuf[U4_Rx_Index] = U4_RxDat_Tmp;

        U4_Rx_Index++;

        U4_Rx_Delay = 5;

}

}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance == USART3)

{

        __HAL_UART_CLEAR_IT(&huart3, UART_CLEAR_TCF);

        __HAL_UART_DISABLE_IT(&huart3,  UART_IT_TC);

}

else if(huart->Instance == USART4)

{

        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF);

        __HAL_UART_DISABLE_IT(&huart4,  UART_IT_TC);

        U4_Rx_Enable();

        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);

}

}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

{

 if(huart->Instance == USART3)

{

        HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);

        __HAL_UART_CLEAR_IDLEFLAG(&huart3);

// __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);

        __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);

}

else if(huart->Instance == USART4)

{

        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_NEF);

        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_FEF);

        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_OREF);

        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF);

        __HAL_UART_DISABLE_IT(&huart4,  UART_IT_TC);

        U4_Rx_Enable();

        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);

}

}

废鱼 回答时间:2022-3-22 17:22:25

如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数。发送数据不完整的情况,先用查询方式发送,确认正常,切换到中断。我怀疑是中断处理的问题。我看你的中断时串口3和串口4一块处理,是系统生成的,还是自己改的?

黑猫 回答时间:2022-3-23 09:54:04

废鱼 发表于 2022-3-22 17:22
如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数 ...

[md]1。程序大部分自动生成的。

2。我就是不想发生自发自收的情况,才请教大佬的。

目前,就是不知道是什么原因导致的。

谢谢您。如果发现什么不对地方,还请不吝赐教。再次感谢!!

xmshao 回答时间:2022-3-24 11:26:48

那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。

想使用UART的自发自收的话,硬件上TXRX短接即可,不过你就不能收发都使用查询方式,这样实现不了。你可以发送使用DMA,接收采用轮训方式 或者都使用DMA方式。

至于UART4的发送问题,估计你哪里误判了,你现在是非DMA方式,发送无非发完一个发送下一个,直到发送完毕为止。你说接收,倒还有接收不及时产生溢出方面的问题。你再检查下代码。

黑猫 回答时间:2022-4-28 16:02:22

黑猫 发表于 2022-3-23 09:54
1。程序大部分自动生成的。</p>
<p>2。我就是不想发生自发自收的情况,才请教大佬的。

[md]感谢您的支持!

问题已经解决,初始化部分程序的问题。

已经修改。

黑猫 回答时间:2022-4-28 16:03:25

xmshao 发表于 2022-3-24 11:26
那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。</p>
<p>

[md]感谢您的支持!

问题已经解决,初始化的问题!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版