Skocz do zawartości
Komentator

Kurs STM32 F1 HAL - #4 - sterowanie GPIO w praktyce

Pomocna odpowiedź

W poprzednim kursie STM32 z biblioteką StdPeriph funkcja delay

void delay(int time)
{
   int i;
   for (i = 0; i < time * 4000; i++) {}
}

faktycznie miała tę 1 milisekundę co przekładeło się, że procesor działał z taktowaniem 64MHz.

 while (1) {
       GPIO_SetBits(GPIOA, GPIO_Pin_5); // zapalenie diody
       delay(1000);
       GPIO_ResetBits(GPIOA, GPIO_Pin_5); // zgaszenie diody
       delay(1000);
   }

dejmieno, twój kod wraz z tą samom funkcją działa 8x wolniej.

while (1){
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
	delay(1000);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	delay(1000);
}

Oby dwa testowałem przez 4-8 cykli aby być pewnym czasów.

Udostępnij ten post


Link to post
Share on other sites

Ma podstawowe pytanie: kiedy nazwa funkcji zaczyna się od  "_HAL" a kiedy od "HAL"?

Udostępnij ten post


Link to post
Share on other sites

@dydelf prawdopodobnie przyjęto zasadę, że nazwy funkcji zaczynają się od "HAL_", a nazwy makr od "_HAL" 🙂

Udostępnij ten post


Link to post
Share on other sites

image.thumb.png.4ef8d3ca5630c1303b3af870cd45e0d3.png

Co zrobić, jeśli kompilator faktycznie pomija wiersze z delay? (U mnie działo się tak już w zalecanym System Workbench)

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
#include "stm32f1xx.h"

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}

int main(void){
 SystemCoreClock = 8000000;
 HAL_Init();

 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();

 GPIO_InitTypeDef gpio;
 gpio.Pin = GPIO_PIN_5;
 gpio.Mode = GPIO_MODE_OUTPUT_PP;
 gpio.Pull = GPIO_NOPULL;
 gpio.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOA, &gpio);
 gpio.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
 gpio.Mode = GPIO_MODE_OUTPUT_PP;
 gpio.Pull = GPIO_NOPULL;
 gpio.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOC, &gpio);

 gpio.Pin = GPIO_PIN_13;
 gpio.Mode = GPIO_MODE_IT_RISING;
 gpio.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(GPIOC, &gpio);

 HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

 uint32_t led = 0;
 while(1){
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET){
           HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_SET);
           HAL_Delay(150);
           HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_RESET);
           if(++led >= 4) led = 0;
       } else{
           HAL_GPIO_WritePin(GPIOC, 8 >> led, GPIO_PIN_SET);
           HAL_Delay(150);
           HAL_GPIO_WritePin(GPIOC, 8 >> led, GPIO_PIN_RESET);
           if(++led >= 4) led = 0;
       }
 }
}

Moje rozwiązanie zadanie 4.1. Stan diody PA5 zmieniany jest poprzez interwencję. Czy da się w jakiś sposób utworzyć zmienną w funkcji HAL_GPIO_EXTI_Callback() i przesłać ją do funkcji main()? 

Edytowano przez Emerid

Udostępnij ten post


Link to post
Share on other sites

@Emerid możesz do typu zmiennej będącej licznikiem pętli dodać volatile, wtedy optymalizator nie będzie mógł całkiem wyrzucić tej pętli.

Natomiast co do drugiego pytania, to chyba chodzi Ci po prostu o zmienną globalną, wtedy zarówno callback, jak i funkcja main będą miały do niej dostęp. Tutaj podobnie jak w przypadku pętli użycie volatile może być potrzebne.

  • Lubię! 2

Udostępnij ten post


Link to post
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...