Skocz do zawartości

STM 32 F401 Nucleo i HC-06


fryta

Pomocna odpowiedź

Witam serdecznie!

Jest to mój pierwszy temat, wiernie śledziłem kurs odnośnie kontrolerów STM32 F1 i w momencie kiedy doszedłem do przesyłania danych poprzez USART postanowiłem zrobić coś własnego i chciałem nawiązać łączność z uC poprzez Bluetooth. Tutaj pojawił się problem ponieważ nie wiem dlaczego ale nie mogę tego uczynić. Kod wydaje mi się, OK. Próbowałem zrobić to samo poprzez komunikacje z moim PC i wszystko było ok.

#include "stm32f4xx.h"
#include <stdio.h>

void delay(int czas)
{
   int i=0;
   for(i=0; i<czas*2000; i++);
}

//Ustawienie dla diody LED na płytce Nucleo
void GPIOA_LED_init(void)
{
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   GPIO_InitTypeDef gpio;
   gpio.GPIO_Pin = GPIO_Pin_5;
   gpio.GPIO_Mode = GPIO_Mode_OUT;
   gpio.GPIO_OType = GPIO_OType_PP;
   gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
   gpio.GPIO_Speed = GPIO_Speed_100MHz;
   GPIO_Init(GPIOA, &gpio);

}



//Ustawienie USART1
void USART2_init(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);

   GPIO_InitTypeDef gpio;
   //PIN2 to TX
       gpio.GPIO_Pin = GPIO_Pin_6;
       gpio.GPIO_Mode = GPIO_Mode_AF;
       gpio.GPIO_OType = GPIO_OType_PP;
       gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
       //gpio.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_Init(GPIOB, &gpio);
       GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
   //PIN3 to RX
       gpio.GPIO_Pin = GPIO_Pin_10;
       gpio.GPIO_Mode = GPIO_Mode_AF;
       gpio.GPIO_OType = GPIO_OType_OD;
       gpio.GPIO_PuPd = GPIO_PuPd_UP;
      // gpio.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_Init(GPIOA, &gpio);
       GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
   USART_InitTypeDef usart;
   //Konfiguracja usarta
       usart.USART_BaudRate = 9600;
       usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
       usart.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
       usart.USART_Parity = USART_Parity_No;
       usart.USART_StopBits = USART_StopBits_1;
       usart.USART_WordLength = USART_WordLength_8b;
       USART_Init(USART1, &usart);
   USART_Cmd(USART1, ENABLE);

}

//Wysyłanie znaku przez UART2
void USART2_send_char( uint8_t znak)
{
   while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET ); //jesli bufor pusty
       USART_SendData(USART1, znak);
}

int __io_putchar(int c)
{
USART2_send_char(c);
return c;
}

int main(void)
{
   GPIOA_LED_init();
  // GPIOC_BUTTON_init();
   USART2_init();
   for(;;)
   {
   	if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) {
   	     char c = USART_ReceiveData(USART2);
   	     switch (c)
   	     {
   	         case 'a':
   	        	 GPIO_SetBits(GPIOA, GPIO_Pin_5); // zapalenie diody
   	        	 printf("connection");
   	        	      //  delay(100);
   	             break;
   	         case 'b':
   	        	 GPIO_ResetBits(GPIOA, GPIO_Pin_5); // zgaszenie diody
   	        	        // delay(400);
   	             break;
   	         default:
   	        	 //GPIO_SetBits(GPIOA, GPIO_Pin_5);
   	             break;
   	     }
   	 }
   }//for
}//main

Tutaj widać, że próbuję to zrobić poprzez USART1, ale wcześniej próbowałem poprzez USART2 i tak nie było rezultatu. Proszę serdecznie o pomoc i z góry dziękuję

Link do komentarza
Share on other sites

Mam tak samo: bardzo podobny kod mi nie działa i nie mogę się skomunikować. Czy wie ktoś, co tutaj może być źle? Co należałoby poprawić? Będę bardzo wdzięczny za wszelkie rady 🙂

[ Dodano: 14-09-2016, 04:32 ]

Tutaj znalazłem przykładowy kod dla Nucleo F401RE: KLIK

Mi to pomogło - gotowy przykład wkleiłem do nowego projektu, a do HC05 zmieniłem piny z GPIOA na GPIOB (PB6 i PB7 przez co używałem USART1, a nie 2) 🙂 później niepotrzebnie bawiłem się kilka godzin z BT, bo w każdej konfiguracji baud rate wysyłane były złe dane, a wystarczyło tylko przywrócić ustawienia domyślę HC05...

Mam nadzieję, że to pomoże 🙂

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
char c = USART_ReceiveData(USART2); 

Używasz USART1 a masz wpisane USART2.

Nie wiem czy dla tego typu procka to jest poprawnie.

usart.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

Powinno być coś takiego jak USART_Mode_Duplex ale mogę się mylić, dawno miałem styczność z tymi prockami.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

OK! Po długim czasie udało mi się to uruchomić generalnie trzeba zmienić bounda 🙂 i na uart 1 przejść. tutaj wysyłam kod programu 🙂

#include "stm32f4xx.h"
#include <stdio.h>
#include <stdint.h>
/*
//mierzenie napiecia odniesienia
void delay(int czas)
{
   int i=0;
   for(i=0; i<czas*2000; i++);
}

//Ustawienie dla diody LED na płytce Nucleo
void GPIOA_LED_init(void)
{
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   GPIO_InitTypeDef gpio;
   gpio.GPIO_Pin = GPIO_Pin_5;
   gpio.GPIO_Mode = GPIO_Mode_OUT;
   gpio.GPIO_OType = GPIO_OType_PP;
   gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
   gpio.GPIO_Speed = GPIO_Speed_100MHz;
   GPIO_Init(GPIOA, &gpio);

}

//Ustawienia dla przycisku USER na płytce Nucleo
void GPIOC_BUTTON_init(void)
{
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
   GPIO_InitTypeDef gpio;
   gpio.GPIO_Pin = GPIO_Pin_13;
   gpio.GPIO_Mode = GPIO_Mode_IN;
   gpio.GPIO_OType = GPIO_OType_PP;
   gpio.GPIO_PuPd = GPIO_PuPd_UP;
   gpio.GPIO_Speed = GPIO_Speed_100MHz;
   GPIO_Init(GPIOC, &gpio);
}

//Ustawienie USART1
void USART2_init(void)
{
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

   GPIO_InitTypeDef gpio;
   //PIN2 to TX
       gpio.GPIO_Pin = GPIO_Pin_2;
       gpio.GPIO_Mode = GPIO_Mode_AF;
       gpio.GPIO_OType = GPIO_OType_PP;
       gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
       gpio.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_Init(GPIOA, &gpio);
       GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
   //PIN3 to RX
       gpio.GPIO_Pin = GPIO_Pin_3;
       gpio.GPIO_Mode = GPIO_Mode_AF;
       gpio.GPIO_OType = GPIO_OType_OD;
       gpio.GPIO_PuPd = GPIO_PuPd_UP;
       gpio.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_Init(GPIOA, &gpio);
       GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
       USART_InitTypeDef usart;
   //Konfiguracja usarta
       usart.USART_BaudRate = 115200;
       usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
       usart.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
       usart.USART_Parity = USART_Parity_No;
       usart.USART_StopBits = USART_StopBits_1;
       usart.USART_WordLength = USART_WordLength_8b;
       USART_Init(USART2, &usart);
   USART_Cmd(USART2, ENABLE);

}

void ADC_init(void)
{	ADC_InitTypeDef adc;
 //Podłączenie zegara
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

 //Zmiejszenie częstotliwości za pomocą preskalera
 //ADC_CommonStructInit(&adco);
// adco.ADC_Prescaler = ADC_Prescaler_Div2;
    //RCC_ADCCLKConfig(RCC_PCLK2_Div6);

 //KONFIGURACJA
    ADC_StructInit(&adc);
    adc.ADC_ContinuousConvMode = ENABLE;//tryb ciągły
    //adc.ADC_NbrOfChannel = 1;//kanał 1
    adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//Brak wyzwalania
    adc.ADC_DataAlign=ADC_DataAlign_Right;
    ADC_Init(ADC1, &adc);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_15Cycles);

    //Włączenie przetwornika
    ADC_Cmd(ADC1, ENABLE);

    //Autokalibracja
    //ADC_ResetCalibration(ADC1);
    //while (ADC_GetResetCalibrationStatus(ADC1));
    //RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, ENABLE);
    //ADCBits = USART_StopBits_1;
       usart.USART_WordLength = USART_WordLength_8b;
       USART_Init(USART1, &usart);
   USART_Cmd(USART1, ENABLE);

}

void ADC_init(void)
{	ADC_InitTypeDef adc;
 //Podłączenie zegara
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

 //KONFIGURACJA
    ADC_StructInit(&adc);
    adc.ADC_ContinuousConvMode = ENABLE;//tryb ciągły
    //adc.ADC_NbrOfChannel = 1;//kanał 1
    adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//Brak wyzwalania
    adc.ADC_DataAlign=ADC_DataAlign_Right;
    ADC_Init(ADC1, &adc);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);

    //Włączenie przetwornika
    ADC_Cmd(ADC1, ENABLE);



    //włączenie napięcia referyncyjnego
    //ADC_TempSensorVrefintCmd(ENABLE);
    ADC_SoftwareStartConv(ADC1);

}

//Wysyłanie znaku przez UART2
void USART1_send_char( uint8_t znak)
{
   while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET ); //jesli bufor pusty
       USART_SendData(USART1, znak);
}

int __io_putchar(int c)
{
USART1_send_char(c);
return c;
}

int main(void)
{
GPIO_init();
   USART1_init();
   ADC_init();


   for(;;)
   {uint16_t adc = ADC_GetConversionValue(ADC1);
   printf("Adc = %d (%.3fV)\n", adc, adc * 3.3f / 4096.0f);
   delay(500);
   }//for
}//main
Link do komentarza
Share on other sites

void delay(int czas) 
{ 
   int i=0; 
   for(i=0; i<czas*2000; i++); 
} 

Ten delay Ci działa? W jakich jednostkach jest 'czas'?

Ogólnie do blokującego czekania lepiej wykorzystać SysTick, opisane jest to np. na kursie STM32 + StdPeriph na Forbocie.

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.