Skocz do zawartości

Nucleo f103rb - nie działa bluetooth


kamdz

Pomocna odpowiedź

Witam

W ostatnim czasie podczas robienia kursu Forbota dot. STM32F1 HAL napotkałem pewien problem. Gdy podłączam płytkę pod USB do komputera i korzystam z UART przez kabel na RealTermie to wszystko działa ładnie. Natomiast gdy pod UART2 podpinam bluetooth, to nic nie działa. Na wyjściu dostaję krzaki, a sterowanie nie działa. Nie mam pojęcia dlaczego. To samo na UART3. Załączam kod, oraz zdjęcia układu i SS z wyjścia na BT

Dodam, że to nie jest moje pierwsze podejście do tematu. Kiedyś uruchomiłem już BT na STM32, jednak wtedy używałem BluePill. Nie Było żadnych tego typu problemów.

Ktoś ma może pomysł co mogę robić źle?

Pozdrawiam

Kamil

#include "stm32f1xx.h"
#include "stm32f1xx_nucleo.h"

TIM_HandleTypeDef tim1;
UART_HandleTypeDef uart;

uint8_t value;
int vel;
void send_string(char* s)
{
 HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}
int __io_putchar(int ch)
{
 send_char(ch);
 return ch;
}
void send_char(char c)
{
 HAL_UART_Transmit(&uart, (uint8_t*)&c, 1, 1000);
}
void drive(int left, int right){

	if(right>=0){
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
		__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_2, right);
		send_string("1\r\n");
	}
	else if(right<0){
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
		__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_2, -right);
		send_string("2\r\n");
	}

	if(left>=0){
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
		__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, left);
		send_string("3\r\n");
	}
	else if(left<0){
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
		__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, -left);
		send_string("4\r\n");
	}


}
int main(void)
{
	SystemCoreClock = 8000000; // taktowanie 8Mhz
	HAL_Init();


	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_GPIOD_CLK_ENABLE();
	__HAL_RCC_TIM1_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();
	GPIO_InitTypeDef gpio;

	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_8|GPIO_PIN_9;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &gpio);
	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_2;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &gpio);
	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_3;
	HAL_GPIO_Init(GPIOA, &gpio);

	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_10;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOC, &gpio);
	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_11;
	HAL_GPIO_Init(GPIOC, &gpio);


	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_10;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOB, &gpio);
	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_11;
	HAL_GPIO_Init(GPIOB, &gpio);



	gpio.Pin = GPIO_PIN_5|GPIO_PIN_6;
	gpio.Mode = GPIO_MODE_OUTPUT_PP; // jako wyjście
	gpio.Pull = GPIO_NOPULL; // rezystory podciągające są wyłączone
	gpio.Speed = GPIO_SPEED_FREQ_LOW; // wystarczą nieskie częstotliwości przełączania
	HAL_GPIO_Init(GPIOC, &gpio); // inicjalizacja modułu GPIOC
	gpio.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_5;
	HAL_GPIO_Init(GPIOA, &gpio);
	gpio.Pin = GPIO_PIN_2|GPIO_PIN_1;
	HAL_GPIO_Init(GPIOB, &gpio);

	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_10;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOC, &gpio);

	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_11;
	HAL_GPIO_Init(GPIOC, &gpio);


	tim1.Instance = TIM1;
	tim1.Init.Period = 1000 - 1;
	tim1.Init.Prescaler = 1;
	tim1.Init.ClockDivision = 0;
	tim1.Init.CounterMode = TIM_COUNTERMODE_UP;
	tim1.Init.RepetitionCounter = 0;
	tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
	HAL_TIM_PWM_Init(&tim1);

	TIM_OC_InitTypeDef oc;
	oc.OCMode = TIM_OCMODE_PWM1;
	oc.Pulse = 0;
	oc.OCPolarity = TIM_OCPOLARITY_HIGH;
	oc.OCNPolarity = TIM_OCNPOLARITY_LOW;
	oc.OCFastMode = TIM_OCFAST_ENABLE;
	oc.OCIdleState = TIM_OCIDLESTATE_SET;
	oc.OCNIdleState = TIM_OCNIDLESTATE_RESET;
	HAL_TIM_PWM_ConfigChannel(&tim1, &oc, TIM_CHANNEL_1);
	HAL_TIM_PWM_ConfigChannel(&tim1, &oc, TIM_CHANNEL_2);

	HAL_TIM_PWM_Start(&tim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&tim1, TIM_CHANNEL_2);



	 uart.Instance = USART2;
	 uart.Init.BaudRate = 115200;
	 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) {
		HAL_UART_Receive(&uart, &value, 1, 100);

		 switch (value)
		 {
		 case '0':
			 vel = 0;
		 break;
		 case '1':
			 vel = 100;
		 break;
		 case '2':
			 vel = 200;
		 break;
		 case '3':
			 vel = 300;
		 break;
		 case '4':
			 vel = 400;
		 break;
		 case '5':
			 vel = 500;
		 break;
		 case '6':
			 vel = 600;
		 break;
		 case '7':
			 vel = 700;
		 break;
		 case '8':
			 vel = 800;
		 break;
		 case '9':
			 vel = 900;
		 break;
		 case '10':
			 vel = 1000;
		 break;
		 case 'F':
			 drive(vel, vel);
		 break;

		 case 'B':
			 drive(-vel, -vel);
		 break;
		 case 'R':
			 drive(vel,-vel);
		 break;
		 case 'L':
			 drive(-vel,vel);
		 break;

		 case 'G':
			 drive(0, vel);
		 break;

		 case 'I':
			 drive(vel, 0);
		 break;

		 case 'H':
			 drive(-vel, 0);
		 break;

		 case 'J':
			 drive(0, -vel);
		 break;

		 case 'S':
			 drive(0,0);
		 break;
		 case 'D':
			 drive(0,0);
		 break;
		 case 'W':
			 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
		break;
		 case 'w':
			 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
		break;

		 }
		 //send_string("Hello world!\r\n");
		 HAL_Delay(100);



	 }
}

 

IMG_20190609_174708.jpg

IMG_20190609_174725.jpg

Screenshot_20190609-174628.png

Link do komentarza
Share on other sites

@kamdz krzaki w terminalu najczęściej oznaczają problemy z prędkościami komunikacji. Masz pewność, że dane do BT wysyłasz z odpowiednią prędkością i takie same ustawienia komunikacji masz w telefonie? Prędkości muszą się zgadzać w obu miejscach.

Link do komentarza
Share on other sites

Witam. Zapomniałem dodać dwóch rzeczy. Zarówno bt, jak i sam kod jest przetestowany, wzięty z mojej poprzedniej konstrukcji: 

Tak naprawdę jedyna zmiana to płytka nucleo zamiast bluepill.

Poza tym krzaki lecą nawet wtedy, kiedy w programie nie ma nic o wysyłaniu przez uart...

Odpowiadając na Twoje pytanie, @Treker to w programie nie ma żadnych opcji ustawiania prędkości. Ale jak już mówiłem, na dokładnie takich samych ustawieniach wszystko działa w poprzednim robocie.

 

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.