Hej,
Tak jak pisałem -- zacząłem trochę rzeźbić w STM32. Programator jeszcze nie przyszedł (zdecydowałem, że jednak nie użyję płytki Nucleo tylko od razu wrzucę MCU w projektowany układ), ale zacząłem pisać kod na sucho.
I tu pojawia się kilka pytań / problemów.
- STM32CubeMX nie umożliwia ustawienia pull-upa na wejściowym pinie. Zakładam, że to błąd. Można to obejść edytując wygenerowany main.c (co i tak zostanie nadpisane przy najbliższej zmianie w CubeMX) lub konfigurując port jeszcze raz, już po tej konfiguracji z main.c. Czy jest bardziej elegancki sposób? Może edycja pliku .ioc? Jest tekstowy i widzę w nim:
PA0-WKUP.GPIOParameters=GPIO_Label PA0-WKUP.GPIO_Label=KEY PA0-WKUP.Locked=true PA0-WKUP.Signal=GPIO_Input
Może tu coś można dopisać?
- Podobnie jest z pinami wyjściowymi -- nie widzę nigdzie możliwości ustawienia ich domyślnego stanu. HAL konfiguruje je jako wyjścia i tyle. W jakim stanie te wyjścia będą zaraz po konfiguracji i czy można to zmienić? Znów, fragment pliku .ioc:
PC13-ANTI_TAMP.GPIOParameters=GPIO_Label PC13-ANTI_TAMP.GPIO_Label=LED PC13-ANTI_TAMP.Locked=true PC13-ANTI_TAMP.Signal=GPIO_Output
- Czy ja dobrze widzę, że HAL nie udostępnia możliwości szybkiego przełączania pinu między wejściem i wyjściem? Tak się składa, że w pierwszym projekcie, do którego chcę użyć STM32, potrzebuję trzech stanów (niski, wysoki i wysokiej impedancji). Akurat tutaj nie potrzebuję tego szybko (co 4 ms), więc sztuczka z wywoływaniem (stosunkowo ciężkiej) funkcji HAL_GPIO_Init() się uda, ale nie wyobrażam sobie tego w bardziej krytycznych czasowo sytuacjach.
A może w ogóle obsługa GPIO przez HAL to zabawka dla początkujących i nikt, kto programuje na serio, nie korzysta z tego, tylko pisze bezpośrednio do portów?
- Czy ja dobrze widzę, że HAL nie umożliwia agregowania pinów? Chciałbym jednocześnie zmienić stan konkretnych pinów w porcie -- czy da się to zrobić przez HAL, czy trzeba pisać bezpośrednio do portu?
- Mamy piękny enum GPIO_PinState, a w nim wartości GPIO_PIN_SET oraz GPIO_PIN_RESET. Czy HAL umożliwia takie skonfigurowanie portu, żeby port był zanegowany (czyli np. pisząc PIN_SET chcemy tak naprawdę ustawić tam stan niski, i tak samo odczytując)? Nie widzę nic takiego, a skoro już wprowadzili HAL, to wydaje mi się to rozsądne i logiczne.
- Szablon generowany przez CubeMX jest wyindentowany dwiema spacjami. Ja mam inny styl pisania. Czy jest możliwość zmiany indentacji wygenerowanego kodu w taki sposób, żeby kolejna generacja kodu mi tego nie przywróciła? Na razie poradziłem sobie tak, że po prostu przeniosłem swój kod do osobnego pliku i wołam go z wygenerowanego main.c, ale burzy mi to poczucie estetyki.
- Pytanie bardziej o sam mikrokontroler. W jakim stanie będą piny, gdy procesor wejdzie w stan resetu (bo np. będę wrzucał nowy program przez programator)? Piny zostaną tak, jak są, czy przejdą w stan wysokiej impedancji? Może można jakoś wymusić ich konkretny stan przed samym programowaniem? Mam do pinów podłączony LCD, więc z oczywistych powodów nie chcę na nich DC.
Chyba na razie tyle z pytań...
Pozdr.