ST意法半导体
直播中

刘洋

10年用户 1169经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

为什么无法在STM32F407 UART设置中查询RS485时传输我的数据呢?

我无法在查询 rs485 时传输我的数据。因此也没有接收到数据。我在能量计和我的 uart 中也选择了波特率 9600。我选择了 USART1,PA9 tx,PA10 rx 和 GPIO PD11,使用的模块是 Max485 模块。因此,在检查表达式时,无法收到任何内容,到处都是 0。Modbus_Rtu[0]=1;
Modbus_Rtu[1]=3;
Modbus_Rtu[2]=0;
Modbus_Rtu[3]=0;
Modbus_Rtu[4]=1;
Modbus_Rtu[5]=5;
如果 Slave ID 错误,那么传输时至少应该有值.....这是我的代码和 scrrenshot

  • /* USER CODE BEGIN Header */
  • /**
  •   ******************************************************************************
  •   * @file           : main.c
  •   * @brief          : Main program body
  •   ******************************************************************************
  •   * @attention
  •   *
  •   *

    © Copyright (c) 2021 STMicroelectronics.
  •   * All rights reserved.
  •   *
  •   * This software component is licensed by ST under Ultimate Liberty license
  •   * SLA0044, the "License"; You may not use this file except in compliance with
  •   * the License. You may obtain a copy of the License at:
  •   *
  •   *
  •   ******************************************************************************
  •   */
  • /* USER CODE END Header */
  • /* Includes ------------------------------------------------------------------*/
  • #include "main.h"
  • /* Private includes ----------------------------------------------------------*/
  • /* USER CODE BEGIN Includes */
  • uint8_t Modbus_Rtu[8];
  • uint8_t Modbus_Rtucevap[9];
  • uint16_t CRC_Control;
  • /* USER CODE END Includes */
  • /* Private typedef -----------------------------------------------------------*/
  • /* USER CODE BEGIN PTD */
  • /* USER CODE END PTD */
  • /* Private define ------------------------------------------------------------*/
  • /* USER CODE BEGIN PD */
  • /* USER CODE END PD */
  • /* Private macro -------------------------------------------------------------*/
  • /* USER CODE BEGIN PM */
  • /* USER CODE END PM */
  • /* Private variables ---------------------------------------------------------*/
  • UART_HandleTypeDef huart1;
  • DMA_HandleTypeDef hdma_usart1_rx;
  • /* USER CODE BEGIN PV */
  • /* USER CODE END PV */
  • /* Private function prototypes -----------------------------------------------*/
  • void SystemClock_Config(void);
  • static void MX_GPIO_Init(void);
  • static void MX_DMA_Init(void);
  • static void MX_USART1_UART_Init(void);
  • /* USER CODE BEGIN PFP */
  • uint16_t ModRtu_CRC(uint8_t buf[8], int len)
  • {
  •   uint16_t crc = 0xFFFF;
  •   for (int pos = 0; pos < len; pos++) {
  •     crc ^= (uint16_t)buf[pos];          // XOR byte into least sig. byte of crc
  •     for (int i = 8; i != 0; i--) {    // Loop over each bit
  •       if ((crc & 0x0001) != 0) {      // If the LSB is set
  •         crc >>= 1;                    // Shift right and XOR 0xA001
  •         crc ^= 0xA001;
  •       }
  •       else                            // Else LSB is not set
  •         crc >>= 1;                    // Just shift right
  •     }
  •   }
  •   // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
  •   return crc;
  • }
  • /* USER CODE END PFP */
  • /* Private user code ---------------------------------------------------------*/
  • /* USER CODE BEGIN 0 */
  • /* USER CODE END 0 */
  • /**
  •   * @brief  The application entry point.
  •   * @retval int
  •   */
  • int main(void)
  • {
  •   /* USER CODE BEGIN 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_DMA_Init();
  •   MX_USART1_UART_Init();
  •   /* USER CODE BEGIN 2 */
  •   HAL_UART_Receive_DMA(&huart1, Modbus_Rtucevap, 9);
  •   Modbus_Rtu[0]=1;
  •   Modbus_Rtu[1]=3;
  •   Modbus_Rtu[2]=0;
  •   Modbus_Rtu[3]=0;
  •   Modbus_Rtu[4]=1;
  •   Modbus_Rtu[5]=5;     //for voltage query
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •           HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_SET);
  •           CRC_Control= ModRtu_CRC(Modbus_Rtu,6);
  •           Modbus_Rtu[6]= CRC_Control & 0xff;
  •           Modbus_Rtu[7]= (CRC_Control>>8) & 0xff;
  •           HAL_UART_Transmit(&huart1, Modbus_Rtu, 8, 100);
  •           HAL_Delay(1000);
  •           HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_RESET);
  •           HAL_Delay(1000);
  •   }
  •   /* USER CODE END 3 */
  • }
  • /**
  •   * @brief System Clock Configuration
  •   * @retval None
  •   */
  • void SystemClock_Config(void)
  • {
  •   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  •   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  •   /** Configure the main internal regulator output voltage
  •   */
  •   __HAL_RCC_PWR_CLK_ENABLE();
  •   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  •   /** Initializes the RCC Oscillators according to the specified parameters
  •   * in the RCC_OscInitTypeDef structure.
  •   */
  •   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  •   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  •   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  •   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  •   RCC_OscInitStruct.PLL.PLLM = 4;
  •   RCC_OscInitStruct.PLL.PLLN = 84;
  •   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  •   RCC_OscInitStruct.PLL.PLLQ = 7;
  •   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Initializes the CPU, AHB and APB buses clocks
  •   */
  •   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  •                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  •   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  •   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  •   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  •   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  •   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • /**
  •   * @brief USART1 Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_USART1_UART_Init(void)
  • {
  •   /* USER CODE BEGIN USART1_Init 0 */
  •   /* USER CODE END USART1_Init 0 */
  •   /* USER CODE BEGIN USART1_Init 1 */
  •   /* USER CODE END USART1_Init 1 */
  •   huart1.Instance = USART1;
  •   huart1.Init.BaudRate = 9200;
  •   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  •   huart1.Init.StopBits = UART_STOPBITS_1;
  •   huart1.Init.Parity = UART_PARITY_NONE;
  •   huart1.Init.Mode = UART_MODE_TX_RX;
  •   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  •   if (HAL_UART_Init(&huart1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN USART1_Init 2 */
  •   /* USER CODE END USART1_Init 2 */
  • }
  • /**
  •   * Enable DMA controller clock
  •   */
  • static void MX_DMA_Init(void)
  • {
  •   /* DMA controller clock enable */
  •   __HAL_RCC_DMA2_CLK_ENABLE();
  •   /* DMA interrupt init */
  •   /* DMA2_Stream2_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
  •   HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
  • }
  • /**
  •   * @brief GPIO Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_GPIO_Init(void)
  • {
  •   GPIO_InitTypeDef GPIO_InitStruct = {0};
  •   /* GPIO Ports Clock Enable */
  •   __HAL_RCC_GPIOH_CLK_ENABLE();
  •   __HAL_RCC_GPIOD_CLK_ENABLE();
  •   __HAL_RCC_GPIOA_CLK_ENABLE();
  •   /*Configure GPIO pin Output Level */
  •   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_RESET);
  •   /*Configure GPIO pin : PD11 */
  •   GPIO_InitStruct.Pin = GPIO_PIN_11;
  •   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  •   GPIO_InitStruct.Pull = GPIO_NOPULL;
  •   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  • }
  • /* USER CODE BEGIN 4 */
  • /* USER CODE END 4 */
  • /**
  •   * @brief  This function is executed in case of error occurrence.
  •   * @retval None
  •   */
  • void Error_Handler(void)
  • {
  •   /* USER CODE BEGIN Error_Handler_Debug */
  •   /* User can add his own implementation to report the HAL error return state */
  •   __disable_irq();
  •   while (1)
  •   {
  •   }
  •   /* USER CODE END Error_Handler_Debug */
  • }
  • #ifdef  USE_FULL_ASSERT
  • /**
  •   * @brief  Reports the name of the source file and the source line number
  •   *         where the assert_param error has occurred.
  •   * @param  file: pointer to the source file name
  •   * @param  line: assert_param error line source number
  •   * @retval None
  •   */
  • void assert_failed(uint8_t *file, uint32_t line)
  • {
  •   /* USER CODE BEGIN 6 */
  •   /* User can add his own implementation to report the file name and line number,
  •      ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
  •   /* USER CODE END 6 */
  • }
  • #endif /* USE_FULL_ASSERT */
  • /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

回帖(1)

程家文

2023-1-6 13:45:09
再检查一遍。我在 MX STM32F407 UART 设置中没有看到任何 RS485 DE 选项。它有RS232 RTS,但没有RS485 DE,它们有很大的不同!
我们尝试了 STM32F413,它和您的 STM32F407 一样是 F4 系列,但它没有真正的 RS485,导致痛苦。
我们现在使用的是具有真正 RS485 DE 的 L4 系列,特别是 STM32L496(如果使用 JTAG,请注意不要使用 NJTRST 引脚)。
如果您打算继续使用 STM32F407 Discovery,则必须找到实现软件 RS485 DE 信号的代码。由于 UART 发送中断的延迟导致 DE 时序不佳,我们遇到了问题。祝你好运,我不会浪费太多时间,最好是通过正确的 RS485 实现来获得 IC。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分