Skocz do zawartości

[Kurs] Kurs programowania STM32 część 1 - narzędzia


lukpep

Pomocna odpowiedź

Udało mi się skompilować kawałek kodu do mojego procka, ale jest kolejny problem z uzyskaniem hexa. Mam wersje Attolic TrueStudio 2.1.0 Lite i podmieniłem niby tego arm-none-eabi-objcopy.exe w bin na arm-attolic-eabi-objcopy.exe z tolchain yagarto, ale dalej nie dostaje plikow wynikowych .hex ... jakieś podpowiedzi ?

Link do komentarza
Share on other sites

Chcę użyć biblioteki fatfs do współpracy z kartą SD. Mam problem ze skompilowaniem dwóch funkcji, przy których dostaję dziwny błąd:

...\src\fatfs\sd_stm32.c:181:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rcvr_datablock'

Dodam jeszcze, że podczas pracy w uVision owe funkcje kompilowały się prawidłowo i bez zastrzeżeń, a urządzenie działało sprawnie. TS nie chce ich przetrawić. Jedna z funkcji wygląda następująco:

static

BOOL rcvr_datablock (

BYTE *buff, // Data buffer to store received data

UINT btr) // Byte count (must be even number)

{

BYTE token;

Timer1 = 10;

do { // Wait for data packet in timeout of 100ms

token = rcvr_spi();

} while ((token == 0xFF) && Timer1);

if(token != 0xFE) return FALSE; // If not valid data token, retutn with error

do { // Receive the data block into buffer

rcvr_spi_m(buff++);

rcvr_spi_m(buff++);

} while (btr -= 2);

rcvr_spi(); // Discard CRC

rcvr_spi();

return TRUE; // Return with success

}

Dodatkowo funkcja ta jest używana tylko w tym pliku źródłowym, a każde jej wywołanie jest zwracane jako ostrzeżenie:

...\src\fatfs\sd_stm32.c:388:13: warning: implicit declaration of function 'rcvr_datablock'

Macie pomysł w czym rzecz ?

Co do uzyskania hex udało mi się po podmianie pliku odpowiedzialnego za zamianę .elf na .hex ze środowiska codesourcery i wpisaniu komendy zamiany w:

Properties for (projekt)->c/c++build->settings->building steps->Post-building-steps:

"arm-atollic-eabi-objcopy -O ihex nazwa_projektu.elf nazwa_projektu.hex"

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

Hmm. Ten kawałek

static
BOOL rcvr_datablock (
BYTE *buff, // Data buffer to store received data
UINT btr) // Byte count (must be even number)
{ 

można zapisać tak (usuwając jedynie "entery")

static BOOL rcvr_datablock (BYTE *buff, // Data buffer to store received dataUINT btr) // Byte count (must be even number)
{ 

Więc wychodzi że masz zakomentowany kawałek deklaracji funcji.

Link do komentarza
Share on other sites

Mam problem 😐 . Od pewnego czasu męczę się z zewnętrznym przerwaniem w stm32. Jest to przycisk podpięty pod PB.0. Problem polega na tym że procesor ciągle (około 20-30razy na sekundę) wchodzi do obsługi tego przerwania. Przypadkiem odkryłem że gdy nie wykorzystuję wyświetlacza który wykorzystuje nóżkę PA.0 problem nie występuje.

Oto kod

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//konfiguracja NVIC dla przerwania EXTI0_IRQn
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

//ustwienie dzialania GPIO jako linii EXTI
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);

//ustawienie sposobu generowania przerwania
 	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
 	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
 	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 	EXTI_Init(&EXTI_InitStructure);
 	EXTI_GenerateSWInterrupt(EXTI_Line0);

Przerwanie

void EXTI0_IRQHandler(void)
{

extern uint8_t zmienna;

//przerwanie wywolane przez joystick w pozycji - up
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
 	{
	zmienna++;
	EXTI_ClearITPendingBit(EXTI_Line0);

 	}
}
Link do komentarza
Share on other sites

dwie sprawy - ja uzywam

GPIO_Conf.GPIO_Mode = GPIO_Mode_IN_FLOATING;

zamiast IPU

a druga - drgania zestykow przez ~15-60ms po nacisnieciu przycisku wystepuja na nim przelaczenia miedzy stanem niskim a wysokim - stad to wchodzenie w obsluge kolejnych przerwan.

Jest sporo metod tego eliminacji - np puszczanie timera po wykryciu nacisniecia przycisku i np. po 60 ms sprawdzenie czy jest on nadal wcisniety. Albo mozna dac te delaya jakiegos tracac tym samym czas procka bezuzytecznie - co jest prostsze.

Ja mam tak:

void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)  // JOY UP
	{
		Delay(2000);
		if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5))
		{
			ind--;
			klawisz=1;
			if (ind<1)
			ind=6;
		}
		EXTI_ClearITPendingBit(EXTI_Line5); // Czyszczenie flagi przerwania
	}

if(EXTI_GetITStatus(EXTI_Line6) != RESET) // JOY DOWN
{
	Delay(2000);
	if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
	{
		ind++;
		klawisz=1;
		if(ind>6)
		ind=1;
	}
	EXTI_ClearITPendingBit(EXTI_Line6); // Czyszczenie flagi przerwania
}

i dalej podobnie...

po wykryciu przerwania sprawdzane jest jego zrodlo (bo mam wiecej przerywan na jednym kanale kontrolera)

if(EXTI_GetITStatus(EXTI_Line5) != RESET)

nastepnie chwile czekam i sprawdzam czy klawisz nadal wcisniety i dopiero wykonuje kod:

Delay(2000);
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5))
		{
			ind--;
			klawisz=1;
			if (ind<1)
				ind=6;
		}

dziala bez zarzutu w nawigacji po menu np.

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

GPIO_Conf.GPIO_Mode = GPIO_Mode_IN_FLOATING;

Skoro mam zwykłego switcha to gdy nie będzie wciśnięty to będą stany nieustalone, lecz próbowałem takiego ustawienia.

Drgania na pewno nie są przyczyną gdyż, ciągłe wchodzenie jest niezależnie czy wciskam czy nie. Chyba spróbuje ominąć funkcje z bibliotek stm i wszystko zrobię na ręcznym ustawianiu rejestrów.

Błąd aż wstyd się przyznać 😳 . Przeglądałem manuala i przeczytałem notkę że, nim zacznie się zmieniać rejestry AFIO (w nich konfiguruje się EXTI), należy włączyć jego taktowanie. Pamiętam że coś takiego robiłem i jeszcze raz sprawdziłem, i co?

RCC_APB2Periph_AFIO

Znajdowało się w w funkcji do włączania układów na lini APB1 😳

Już teraz działa. 🙂

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.