Skocz do zawartości

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


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 ?

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"

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.

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

dalej to samo ;/

już poszło, rzechodząc z uVision do True Studio nie skopiowałem jednej linijki kodu:

typedef enum {FALSE = 0, TRUE = !FALSE} bool;

dzieki

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);

 	}
}

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
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. 🙂

  • 2 tygodnie później...
  • 4 miesiące później...

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...