Strona główna Artykuły ARM Przykłady dla STM32 + STM32F10x Standard Peripherals Library
Przykłady dla STM32 + STM32F10x Standard Peripherals Library
Ocena użytkowników: / 43
SłabyŚwietny 
Wpisany przez Freddie Chopin   
Środa, 11 Styczeń 2012 21:35
Spis treści
Przykłady dla STM32 + STM32F10x Standard Peripherals Library
Wspólny początek
Sposób 1
Sposób 2
Sprawdzenie konfiguracji
Outro
Wszystkie strony

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



Zmieniony: Poniedziałek, 15 Październik 2012 22:24