Page 5 of 6
Sprawdzenie konfiguracji
W ramach sprawdzenia można sobie stworzyć prosty programik testowy - nieśmiertelne miganie diodą LED, w którym skorzystamy z funkcji udostępnianych przez Standard Peripheral Library. Całą zawartość pliku z funkcją main() zastępujemy więc przedstawionym poniżej kodem, dostosowując definicje portów i pinów do posiadanej przez nas konfiguracji.
#include "stm32f10x.h"
#define LED_GPIO GPIOB #define LED_GPIO_RCC RCC_APB2Periph_GPIOB #define LED_Pin GPIO_Pin_1
int main(void) { volatile uint32_t count, count_max = 3000000; GPIO_InitTypeDef GPIO_InitStructure;
/* LED_GPIO Periph clock enable */ RCC_APB2PeriphClockCmd(LED_GPIO_RCC, ENABLE);
/* Configure LED pin in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = LED_Pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(LED_GPIO, &GPIO_InitStructure);
while (1) { /* Set */ GPIO_SetBits(LED_GPIO, LED_Pin); /* Delay */ for (count = 0; count < count_max; count++); /* Reset */ GPIO_ResetBits(LED_GPIO, LED_Pin); /* Delay */ for (count = 0; count < count_max; count++); } }
Po skompilowaniu całości można ją wgrać do układu i debuggować - uruchamiając dostępne w projekcie predefiniowane skróty do OpenOCD (menu Run > External Tools > External Tool Configurations...) i GDB (menu Run > Degug Configurations... - należy wybrać skrót do GDB Hardware Debugging z końcówką "+ load").
Niekiedy może być konieczne dostosowanie konfiguracji do dostępnej wersji OpenOCD, konfiguracji sprzętowej lub innych szczegółów.
Po wgraniu i uruchomieniu program powinien migać wybraną diodą z częstotliwością około 1Hz (jeśli rdzeń pracuje na 72MHz, co jest domyślnym ustawieniem biblioteki).
Jeśli podczas kompilacji pliku core_cm3.c (szczególnie z włączoną optymalizacją) kompilator zasygnalizuje błąd assemblera: Error: registers may not be the same -- `strexb r0,r0,[r1]', Error: registers may not be the same -- `strexh r0,r0,[r1]', należy w pliku tym (po wyłączeniu atrybutu read-only) zmienić "=r" na "=&r" w następujących funkcjach: uint32_t __STREXB(uint8_t value, uint8_t *addr), uint32_t __STREXH(uint16_t value, uint16_t *addr), uint32_t __STREXW(uint32_t value, uint32_t *addr). Ciekawostką jest to, że ARM w stworzonym przez siebie pliku nie trzyma się swojej własnej dokumentacji... No cóż...
Jeśli pomimo poprawnej kompilacji projektu w konsoli Eclipse zasypuje nas błędami typu Semantic Error o treści "... could not be resolved" (gdy otwarty jest problematyczny plik źródłowy) należy wykonać następujące kroki: 1. skompilować projekt tak aby powstał plik wynikowy z rozszerzeniem .elf, 2. zamknąć wszystkie zakładki edytora, 3. zamknąć i otworzyć projekt, 4. odświeżyć zawartość folderu projektu (menu File > Refresh) - powinien pojawić się "folder" Binaries, 5. odbudować indeks projektu (menu kontekstowe projektu > Index > Rebuild).
|