Skocz do zawartości

STM32L452 Low Layer USART, jak przesłać po TX


Protektor28

Pomocna odpowiedź

Cześć, mam problem z komunikacją USART na stm32L452RE, poniżej zamieszczam kody, które napisałem przy pomocy znalezionych przykładów. 

Nie mam pojęcia czego tu jeszcze brakuje.

Kod inicjalizacji USART:

static void MX_USART2_UART_Init(void)
{

  LL_USART_InitTypeDef USART_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
  
  /**USART2 GPIO Configuration  
  PA2   ------> USART2_TX
  PA3   ------> USART2_RX 
  */
  GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USART2 interrupt Init */
  NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(USART2_IRQn);

  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART2, &USART_InitStruct);

  LL_USART_ConfigAsyncMode(USART2);

  LL_USART_Enable(USART2);

}

Kod ciała przerwania USARTA:

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
	 if(LL_USART_IsEnabledIT_TXE(USARTx_INSTANCE) && LL_USART_IsActiveFlag_TXE(USARTx_INSTANCE))
	  {
	    /* TXE flag will be automatically cleared when writing new data in TDR register */

	    /* Call function in charge of handling empty DR => will lead to transmission of next character */
	    USART_TXEmpty_Callback();
	  }

	  if(LL_USART_IsEnabledIT_TC(USARTx_INSTANCE) && LL_USART_IsActiveFlag_TC(USARTx_INSTANCE))
	  {
	    /* Clear TC flag */
	    LL_USART_ClearFlag_TC(USARTx_INSTANCE);
	    /* Call function in charge of handling end of transmission of sent character
	       and prepare next charcater transmission */
	    USART_CharTransmitComplete_Callback();
	  }

	  if(LL_USART_IsEnabledIT_ERROR(USARTx_INSTANCE) && LL_USART_IsActiveFlag_NE(USARTx_INSTANCE))
	  {
	    /* Call Error function */
	    Error_Callback();
	  }
  /* USER CODE END USART2_IRQn 0 */
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

Funkcje wykorzystane w powyższym przerwaniu:

void USART_TXEmpty_Callback(void)
{
  if(ubSend == (ubSizeToSend - 1))
  {
    /* Disable TXE interrupt */
    LL_USART_DisableIT_TXE(USARTx_INSTANCE);

    /* Enable TC interrupt */
    LL_USART_EnableIT_TC(USARTx_INSTANCE);
  }

  /* Fill TDR with a new char */
  LL_USART_TransmitData8(USARTx_INSTANCE, aStringToSend[ubSend++]);
}




void USART_CharTransmitComplete_Callback(void)
{
  if(ubSend == sizeof(aStringToSend))
  {
    ubSend = 0;

    /* Disable TC interrupt */
    LL_USART_DisableIT_TC(USARTx_INSTANCE);

    /* Turn LED1 On at end of transfer : Tx sequence completed successfully */
    //LED_On();
  }
}





void Error_Callback(void)
{
  __IO uint32_t isr_reg;

  /* Disable USARTx_IRQn */
  NVIC_DisableIRQ(USARTx_IRQn);


  /* Error handling example :
    - Read USART ISR register to identify flag that leads to IT raising
    - Perform corresponding error handling treatment according to flag
  */
  isr_reg = LL_USART_ReadReg(USARTx_INSTANCE, ISR);
  if (isr_reg & LL_USART_ISR_NE)
  {
    /* case Noise Error flag is raised : ... */
    //LED_Blinking(LED_BLINK_FAST);
  }
  else
  {
    /* Unexpected IT source : Set LED to Blinking mode to indicate error occurs */
    //LED_Blinking(LED_BLINK_ERROR);
  }
}

Na koniec użycie funkcji do wysłania danych w przerwaniu o low power LPTIM:

void LPTIM1_IRQHandler(void)
{
  /* USER CODE BEGIN LPTIM1_IRQn 0 */

	  /* Start USART transmission : Will initiate TXE interrupt after TDR register is empty */
	LL_USART_TransmitData8(USARTx_INSTANCE, aStringToSend[ubSend++]);

				    /* Enable TXE interrupt */
	LL_USART_EnableIT_TXE(USARTx_INSTANCE);
	
	LL_LPTIM_ClearFLAG_ARRM(LPTIM1);
	LL_LPTIM_ClearFLAG_CMPM(LPTIM1);
	LL_LPTIM_ClearFlag_ARROK(LPTIM1);
  /* USER CODE END LPTIM1_IRQn 0 */
  /* USER CODE BEGIN LPTIM1_IRQn 1 */

  /* USER CODE END LPTIM1_IRQn 1 */
}

Uprzejmie proszę o pomoc, bo nie mam pojęcia co tu jest nie tak. Za wszystkie odpowiedzi serdeczne dzięki.

Link do komentarza
Share on other sites

Dnia 21.12.2018 o 14:01, Protektor28 napisał:

Nie mam pojęcia czego tu jeszcze brakuje.

A jaki jest dokładnie Twój problem? Układ zupełnie nie działa, czy "tylko" występują jakieś drobne problemu? Jak opiszesz dokładniej aktualną sytuację to na pewno łatwiej będzie komuś udzielić sensowną odpowiedź (bez samodzielnego odpalania układu) 😉

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Serdecznie dziękuję za odpowiedź Treker. USART nie przesyła żadnych danych do komputera. Dane są zbierane po stronie PC przez Realterm, ale program nie wychwytuje kompletnie nic. Postanowiłem sprawdzić co się dzieje na pinie TX. Jedyne co widać na oscyloskopie to to, że  pin TX jest w stanie wysokim, nic poza tym. 

Edytowano przez Protektor28
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.