Skocz do zawartości

Debugowanie Blue Pill za pomocą st-link v2 w środowisku SW4STM32


Anonim

Pomocna odpowiedź

Mikroporadnik dla początkujących.

Przeglądając internet często trafiałem na posty dotyczące problemu z debugowaniem popularnych tanich płytek Blue Pill a szczególnie tych zawierających chińskie klony mikrokontrolerów z kuźni STM oznaczonych CKS32. Sposoby tu przedstawione działają w środowisku Ac6 SW4STM32 i zapewne w podstawowym eclipse z dołączonymi pluginami dla STM32 za pomocą taniego klona programatora st-link v2.
-------------
STM32F103C8T6
---
    Problem z błędem dot. resetu podczas debugowania w SW4 przez SWD można obejść edytując plik konfiguracyjny, który jest tworzony w katalogu projektu po dodaniu nowej konfiguracji:

RUN -> Debug Configurations...

Trzeba kliknąć 2 razy na "Ac6 STM32 Debugging", pojawi się nowa konfiguracja. Trzeba teraz dodać plik .elf w polu "C/C++ Application"
Następnie w zakładce "Debugger" po drodze można dodać opcję w polu
    "OpenOCD Command" na końcu za ścieżką do ocd -d3 lub -d2
dzięki czemu w konsoli debugera wyświetli się więcej informacji. Poniżej w Configuration Script należy zaznaczyć opcję "User Defined", kliknąć przycisk Browse... i otworzyć do edycji plik .cfg w pliku tym na samym dole trzeba pozbyć się wpisu
    
    "srst_only"

Od tej pory procek będzie resetowany prawidłowo i możliwe będzie debugowanie po kliknięciu w robala w pasku narzędzi a połączenie z st-linkiem nie wymaga linii reset. W moim przypadku to jedyny sposób na uruchomienie debugera bo nie pomagało nawet fizyczne podłączenie resetu.

W trueSTUDIO natomiast konieczne jest podłączenie linii resetu do płytki.

W zakładce "Startup" na dole można też odznaczyć opcję "set breakpoint at: main " która w niektórych wersjach gdb powodowała błędy. Najlepiej dodać własne breakpinty.

Tyle wystarczy aby debugować oryginalne procesory STM32 ostatnio jednak bardzo często spotykane są płytki z klonami STM.

-------------
CKS32F103C8T6 (odpowiednik STM32F103CBT6 128kB Flash)
---
    Chiński klon ma wbity inny nr. urządzenia niż STM przez co debuger wywala błąd stlinka o niewłaściwym nr. urządzenia. Pierwsze co trzeba zrobić na początku, to w folderze instalacyjnym SW4STM32 włączyć wyszukiwarkę plików i wyszukać pliki " stm32f1x.cfg " (powinny być 2) i w każdym z nich zmienić instrukcję

    set _CPUTAPID 0x1ba01477

na

    set _CPUTAPID 0x2ba01477

Dzięki temu uC będzie poprawnie identyfikowany i debuger się uruchomi. Nie znalazłem niestety sposobu aby przekonać trueSTUDIO do debugowania tego klona tak więc w CubeIDE pewnie też będzie problem.

Trzeba pamiętać aby przywrócić oryginalne pliki stm32f1x.cfg po zmianie płytki na oryginalny STM32.

Czasami zdarza się, że debuger się zatnie, tj. nie zamknie sesji prawidłowo przez co jej wątek wisi w systemie i nie da się uruchomić debugowania ponownie. Pomaga wyłączenie wątku eabi-... przez w systemie operacyjnym alt+ctrl+del lub konsolę czy monitor systemu w linuxie.

Oprócz ilości pamięci jest jeszcze jedna ważna różnica pomiędzy oryginalnym STM32F103C8T6 a CKS, tym razem na korzyść STM a mianowicie możliwość przetaktowania. STM32 będzie działał poprawnie przy taktowaniu ponad 120MHz chiński klon natomiast przetaktować się już nie da powyżej 72MHz.

Na koniec jeszcze przykładowy plik main.c, blink za pomocą freeRTOS. Aby móc go sobie uruchomić do debugowania trzeba utworzyć nowy projekt C/C++ typu Ac6 wybrać odpowiedni procesor na blue pillu C8T6 lub CBT6, w kolejnym oknie dodać freeRTOS i podmienić plik main.c w projekcie na przykładowy.

Miłego debugowania.

#include "stm32f1xx.h"
#include "FreeRTOS.h"
#include "task.h"
// Przedrostki funkcji np. v lub i pochodz¹ od zwracanych typów np. void lub int
// Przedrostkiem prv zaczynaj¹ siê funkcje prywatne czyli statyczne
static void prvSetupHardware(void);
void vLEDTask(void *);

//! Przydalaby sie wlasna struktura inicjalizujaca HAL

int main(void){

  prvSetupHardware();
  /// Creating tasks Start:
  // dynamiczna alokacja pamiêci
  xTaskCreate( vLEDTask, "LEDTask", 100, NULL, 1, NULL );// (adres funkcji,dowolna nazwa, wielkosc stosu dla zadania w bajtach, opcjonalny parametr, priorytet wywolywania funkcji 1 - 9, wskaznik do konkretnego adresu pamiêci lub null)
  
  // statyczna alokacja pamiêci
  //xTaskCreateStatic();

  /// End tasks creating
  // Glówna funkcja RTOS
  vTaskStartScheduler();
	for(;;); // stack overflow
  // Kod programu jest podzielony na zadania, funkcja main sluzy tylko do
  // tworzenia zadañ poczatkowych.
}
//------------------------------------------------------------
void
vLEDTask(void *pvParameters) {
   // Powinna byc w systemie funkcja umozliwiajaca zmiane
   // wartosci pvParameters z zewnatrz tutaj argument nie jest uzywany

   TickType_t xMonotonicClockState;

   // Pobiera aktualny czas systemwy
   // dziala podobnie do millis w arduino
   xMonotonicClockState = xTaskGetTickCount();

   for(;;){

       HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13);

       // Po przelaczeniu kreci sie w tym tasku
       vTaskDelayUntil(&xMonotonicClockState, pdMS_TO_TICKS(100));

   }
   vTaskDelete(NULL);
}
/*
void
vApplicationTickHook(void){
//! Ta funkcja jest wykonywana w przerwaniu od ticka systemowego
//! aby dodac tê funkcjonalnosc nale¿y w pliku FreeRTOSConfig.h
//! #define configUSE_TICK_HOOK 1
//! Dzia³anie podobne do IDLE_HOOK z ta róznica, ze IDLE jest
//! wykonywana podczas stanu bezczynnosci po oczyszczeniu pamiêci
//! z zakoñczonych tasków.
}

void
vApplicationIdleHook(void){
//! Ta funkcja jest wykonywana podczas idle state.
}
*/
static void
prvSetupHardware(void){
//inicjalizacja na podstawie kursu forbota
    SystemCoreClock = 8000000; // taktowanie 8Mhz
    HAL_Init();
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitTypeDef LedC13 = { // obiekt gpio bêd¹cy konfiguracj¹ portów GPIO
        GPIO_PIN_13, 		// konfigurujemy pin 5
        GPIO_MODE_OUTPUT_PP, 	// jako wyjscie
        GPIO_NOPULL, 		// rezystory podciagajace sa wylaczone
        GPIO_SPEED_FREQ_LOW 	// nieskie czêstotliwosci przelaczania
    };
    HAL_GPIO_Init(GPIOC, &LedC13); // inicjalizacja portu GPIOC

}

 

Link do komentarza
Share on other sites

Małe sprostowanie. Programowanie/debugowanie w trueSTUDIO jest jednak możliwe bez podłączania zewnętrznego resetu.

Niestety nadal nie wiem jak ustawić w atolicu nr. klona przez co nie jest w nim rozpoznawany. Jeśli ktoś wie jak ten nr. w trueSTUDIO przypisać to dajcie znać.

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.