Skocz do zawartości

STM32F303 [C] problem z konfiguracją UART2


Pomocna odpowiedź

Cześć,

Zacząłem naukę programowania STM32 na podstawie kursu dla STM32F101 tylko używam STM32F303. Niestety pojawił się problem przy konfiguracji UART2. Poniżej załączam kod programu.

/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/

#include <string.h>
#include "stm32f3xx.h"

UART_HandleTypeDef uart;

void send_string(char* s)
{
 HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}


int main(void)
{
	SystemCoreClock = 8000000;
	HAL_Init();

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();

	GPIO_InitTypeDef gpio;

	gpio.Pin = GPIO_PIN_2 | GPIO_PIN_3;
	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_HIGH;
	gpio.Alternate = GPIO_AF7_USART2;
	HAL_GPIO_Init(GPIOA, &gpio);

	UART_HandleTypeDef uart;

	uart.Instance = USART2;
	uart.Init.BaudRate = 38400;
	uart.Init.WordLength = UART_WORDLENGTH_8B;
	uart.Init.Parity = UART_PARITY_NONE;
	uart.Init.StopBits = UART_STOPBITS_1;
	uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	uart.Init.OverSampling = UART_OVERSAMPLING_16;
	uart.Init.Mode = UART_MODE_TX_RX;
	HAL_UART_Init(&uart);

	while(1)
	{
		send_string("Hello World\r\n");
		HAL_Delay(100);
	}
}

Czy ktoś mógłby wskazać gdzie zrobiłem błąd?

Pozdrawiam.

Link to post
Share on other sites

@Dragnel witam na forum 🙂 

Takie pytanko czy korzystasz z CubeMX albo najlepiej z CubeIDE? Jest to o tyle łatwiejsze że UART wyklikasz w konfiguracji, dodasz init, obsługę przerwań i gotowe 🙂 
Nie mam jak tego sprawdzić ale spróbuj porównać to z kursem dla F4, wczoraj testowałem i działa.

Napisz jeszcze na czym polega niedziałanie.

Link to post
Share on other sites
(edytowany)

Ogólnie staram się na początku unikać używania CubeMX bo wydaję mi się ze na początek "ukrywa" on za wiele rzeczy.

Chociaż już go użyłem do wygenerowania konfiguracji pinów związanych z UART'em i wtedy procek zachowywał się poprawnie.

Złe działanie polega na tym że procek nie wysyła do terminala wiadomości "Hello World", w momencie kiedy użyłem CubeMX w ramach testu i napisałem tą samą obsługę to terminal normalnie odbierał wiadomość. Chcę zrozumieć gdzie zrobiłem błąd aby w przyszłości przy innym STM'ie nie mieć tego problemu.

Edytowano przez Dragnel
Link to post
Share on other sites

Udało mi się rozwiązać problem. Brakowało konfiguracji zegarów dla UART2. Sprawiło mi to problem ponieważ STM32F103 (który jest opisany w kursie) ma już je odgórnie skonfigurowane.

Poniżej zamieszczam kod:

/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/



#include <string.h>
#include "stm32f3xx.h"


void send_string(char* s);


UART_HandleTypeDef uart;





int main(void)
{
    SystemCoreClock = 8000000;
    HAL_Init();




    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_USART2_CLK_ENABLE();
    
    //Konfiguracja zegarow
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    //
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    //
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    //
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;



    GPIO_InitTypeDef gpio;



    gpio.Pin = GPIO_PIN_2 | GPIO_PIN_3;
    gpio.Mode = GPIO_MODE_AF_PP;
    gpio.Pull = GPIO_NOPULL;
    gpio.Speed = GPIO_SPEED_FREQ_HIGH;
    gpio.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &gpio);



    UART_HandleTypeDef uart;



    uart.Instance = USART2;
    uart.Init.BaudRate = 38400;
    uart.Init.WordLength = UART_WORDLENGTH_8B;
    uart.Init.Parity = UART_PARITY_NONE;
    uart.Init.StopBits = UART_STOPBITS_1;
    uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    uart.Init.OverSampling = UART_OVERSAMPLING_16;
    uart.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&uart);



    while(1)
    {
    	//send_string("Hello World\r\n");
        HAL_UART_Transmit(&uart, "HELLO\n\r", 7, 1000);
        HAL_Delay(100);
    }
}
void send_string(char* s)
{
 HAL_UART_Transmit(&uart, (uint8_t*)s, 15, 1000);
}

Jednak mam następny problem. Chciałem użyć napisanej w kursie funkcji send_string która używa HAL_UART_Transmit jednak nie działa poprawnie, nic nie odbieram. Kiedy użyłem bezpośrednio funkcji HAL'owskiej HAL_UART_Transmit to normalnie odbieram dane.

Czy ma ktoś pomysł co mogłem zrobić źle podczas tworzenia funkcji "send_string"?

  • Lubię! 1
Link to post
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.