stm32 - Rs485 DE信号,置位时间和置位时间
问题描述
我想通过 rs485 发送和接收数据。我有一个 stm32 发现,我通过 rs485 连接到设备。因此,对于发送和接收,我必须激活和停用 DE,方向控制线,
我不明白断言时间的事情,它说我应该根据过采样时间选择一个断言时间和解除断言时间,我有过采样16。
相反,我所做的不是将 mcu 上的 Pin 用于 rs485 功能,而是使用一个应该(根据我 :))工作的随机输出引脚,但它确实如此,是我这样做了:
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
当我执行 SET 时,WritePin 函数起作用,它发送数据,之后它应该转到下面的函数并重置 PIN 以便我可以接收,但它不会重置。也许我必须使用延迟,我会测试一下。
/* USER CODE BEGIN 4 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_RESET);
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
}
/* USER CODE END 4 */
但这是一种好方法吗,有人可以解释一下我应该如何使用断言时间吗?在发送数据之前,我所做的是否足够快以使 DE 线变低?
HAL_StatusTypeDef HAL_RS485Ex_Init
(UART_HandleTypeDef * huart, uint32_t Polarity, uint32_t
AssertionTime, uint32_t DeassertionTime
这就是 hal 库的用户手册所说的应该使用的内容,我应该像在回调函数中那样使用它吗?
谢谢
解决方案
首先要记住RS485是半双工接口,不能同时发送和接收数据。您正在使用畅通无阻的功能(由 IT 传输),因此此代码不正确:
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
}
您应该在接收之前检查 TX 状态或使用阻塞功能,例如HAL_UART_Transmit
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
g_is_tx_complete = false;
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
while(!g_is_tx_complete)
{
}
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
}
其次,我不明白你没有收到 TX Complete 中断。我没有看到所有代码,但您应该通过 NVIC 启用中断并控制寄存器,如下所示:
/* Enable RXNE interrupt */
USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_TXC, ENABLE);
/* Enable USART1 global interrupt */
NVIC_EnableIRQ(USART1_IRQn);
如果您使用HAL_UART_TxCpltCallback
HAL 处理程序,则应确保USART1_IRQHandler
调用该HAL_USART_IRQHandler
函数
void USART1_IRQHandler(void)
{
HAL_USART_IRQHandler(&huart1);
}
推荐阅读
- r - 数值的 %in% 返回错误的结果
- elasticsearch - 将新文档添加到生产 Elasticsearch 集群
- amazon-web-services - 当父字段不在视觉对象中时,AWS QuickSight 计算字段不显示数据
- bash - 在 shell 脚本中打印字符串的确切值作为输出
- drake - 刷新输出到 drake::log()
- r - 错误:找不到对象“skim_without_charts”
- python - 神经网络中的特征重要性(分类问题)
- html - 更新 HTML/CSS 以使内容显示在右侧而不是下方
- c - 不明白管道是如何工作的。(UNIX 进程之间的共享内存)
- c++ - 优化之间的 C++ 程序行为不同