fryta Napisano Wrzesień 10, 2016 Udostępnij Napisano Wrzesień 10, 2016 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 More sharing options...
Fajeczny Wrzesień 13, 2016 Udostępnij Wrzesień 13, 2016 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 🙂 1 Link do komentarza Share on other sites More sharing options...
Vroobee Wrzesień 16, 2016 Udostępnij Wrzesień 16, 2016 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 More sharing options...
fryta Wrzesień 28, 2016 Autor tematu Udostępnij Wrzesień 28, 2016 Tak, ale korzystałem z USART2 i ten sam problem był Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
fryta Październik 24, 2016 Autor tematu Udostępnij Październik 24, 2016 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 More sharing options...
Lukaszm Październik 25, 2016 Udostępnij Październik 25, 2016 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 More sharing options...
Pomocna odpowiedź
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ę »