首页 > 解决方案 > 带地址标记检测的 STM32 UART 多处理器模式。预期的数据字节被解释为地址字节

问题描述

我已将 UART 配置为通过 RS485 进行多处理器通信。我可以正确接收和传输数据。唤醒后(RWU=0)当接收到正确的地址后,后续字节应该正常接收,而不是解释为另一个地址是我的理解。但是,如果预期的数据字节包含一个“1”作为 MSB,则它被解释为一个地址。现在从文档中可以清楚地看出这是正确的行为,但是在接收到正确的地址后(RWU 设置为 0,RXNE 设置为 1,通过调试确认)我只能接收值小于定义地址的数据。例如,如果我将字长设置为 9 位,地址设置为 4,则正确的地址将是预期的 132(10000100)(我认为在这种情况下地址长度为 8 位,因为设置了 ADDM7)。但后续字节仍被解释为地址。发送 132,55,45,150(通过 RealTerm)只会收到 132,55,45,因为 132 是正确的地址,而 44,55 的 MSB 为“0”。150 被解释为新地址,因为 MSB 中的“1”和 RWU 再次设置为 1,因为它是不正确的地址,我无法再接收数据。

我的问题是,在我再次回去监听地址之前,如何将正确地址之后的后续字节解释为纯数据字节?如果我理解正确,RWU 和 RXNE 是由硬件在这种模式下设置的?或者我应该在 FW 中做些什么具体的事情?我的实现目前是基于中断的。我使用的MCU是F303K8。

我将附上一些图片、代码和文档以获取详细信息和清晰度。

谢谢!

参考手册: 参考手册1

参考手册2

代码和调试:

int main(void)
{
  /* USER CODE BEGIN 1 */
  testvar = testvar + 1;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  HAL_UART_Transmit(&huart1, (uint8_t*)test, strlen(test), 100);

  HAL_MultiProcessor_EnableMuteMode(&huart1);
  HAL_MultiProcessor_EnterMuteMode(&huart1);

  /* Listen for address */
  if(HAL_UART_Receive_IT(&huart1, (uint8_t*)rx_buffer, BUFSIZE) != HAL_OK){
      Error_Handler();
  }
  //HAL_MultiProcessor_EnterMuteMode(&huart1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

      //HAL_Delay(500);
      //testvar = testvar + 1;

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //testvar = 64;

    /* ADDRESS received! Begin listening for data(COMMANDS)
     * When CMDs handled, enter mute mode again in order to listen for address byte again */

    if(HAL_UART_Receive_IT(&huart1, (uint8_t*)rx_buffer, BUFSIZE) != HAL_OK){
      Error_Handler();
    }

}

代码和调试

示波器: 示波器

标签: stm32microcontrolleruartstm32f3

解决方案


推荐阅读