STM32C0x1 com UART1 falhando

Software e Hardware para uC STM

Moderadores: andre_luis, 51

STM32C0x1 com UART1 falhando

Mensagempor hernani.galindo » 16 Jun 2023 15:34

Estou usando o STM32C031C6 configurado com USART1 em 115200. Ao abrir comunicação com o terminal serial YAT os bytes são enviados e recebidos erradamente. (Usei o STMCubeMX para geração de código).

Ex: (YAT configurado corretamente, pois funciona em um projeto mais antigo)
- enviando do YAT para o uC 55h eu recebo b5h
- enviando do uC para o YAT 55h eu recebo valores variados (95h, D5h, B5h juntamente com a mensagem XXh [Warning: RX FRAMING ERROR]). Quando, com auxílio de uma pinça, eu coloco RX e TX em loop, no YAT eu recebo sempre D5h. Parece que o uC sempre coloca 0x80 nos 4 bits mais significativos do byte recebido 55h + 80h = D5h (isto vale para alguns outros valores também) ou o TX manda dados antes do RX estar pronto ou algo do tipo...

Testes realizados:
- BaudRate de 115200 para 9600 em ambos os lados (uC e YAT);
- WordLength de 8 e 9 bits;
- StopBits 1 e 2 em ambos os lados (uC e YAT);
- Parity nenhum e Odd;
- ClockPrescaler para vários valores; e
- Uso oscilador interno, então usei PCLK de 3MHz até 12MHz e o erro persiste.
- Como comentado acima, colocando RX e TX em loop na placa, o sinal transmitido e recebido em modo debug é perfeito (envio 55h e recebo 55h).

O sinal elétrico está perfeito, muito bem definido e com ausência de rings e/ou ruídos.

Alguém já viu algo do tipo ou pode ajudar na solução do problema?

Configuração do uC:

Código: Selecionar todos
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 = 115200;
  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;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}


Config. MspInit:
Código: Selecionar todos
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler();
    }

    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA0     ------> USART1_TX
    PA1     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = uC_USART1_TX_Pin|uC_USART1_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }

}
hernani.galindo
 
Mensagens: 1
Registrado em: 16 Jun 2023 14:37

Re: STM32C0x1 com UART1 falhando

Mensagempor eletroinf » 21 Jun 2023 10:19

Olá
Você relatou um problema e postou um monte de funções, que não significam nada.
Você sabe o que estas funções fazem?

A minha abordagem inicial seria, iniciar o depurador e verificar se os registradores estão sendo configurados corretamente.
Já experimentou isso?
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: STM32C0x1 com UART1 falhando

Mensagempor andre_luis » 21 Jun 2023 19:38

- enviando do uC para o YAT 55h eu recebo valores variados (95h, D5h, B5h

Meu palpite é frequencia do clock ligeiramente diferente do esperado, partiria investigando por aí.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para STMicroelectronics

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x