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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.