ARM Cortex M0 Artykuły na programistamag 73 74 75 Rafała Kozika

Odpowiedz Nowy wątek
2019-07-08 12:06
1

Cześć.

Nie wiem czy wątek Embedded to dobre miejsce na to, z góry przepraszam jeśli nie. Chociaż piszę tutaj teraz z konkretnym problemem, dałem ogólną nazwę tematu, ponieważ może być tutaj kontynuowana dyskusja o tym, o tych artykułach, coretx m0 itd. Ok, do rzeczy.

Zainteresowały mnie artykuły Rafała Kozika na temat CortexM0. Począwszy od artykułu "Małe jest piękne" z numeru 73 programisty do numeru 75 w którym jest opisane jak kodować w C. Kupiłem 2 miesiące temu tę płytkę Nucleo-F031K6, do tej pory próbowałem klepać kod w assemblerze, a teraz chciałem w C. Z pierwszym kodem który miga diodą nie ma problemu, wklejam do terminala ten kod który jest tam podany w tym artykule, dodaję / Vector table / asm(".long 0x20001000"); asm(".long main+1"); bo bez tego nie będzie migać, program się kompiluje, wgrywam go i wszystko działa jak należy. Dioda miga.

arm-none-eabi-gcc -Wall -g -mcpu=cortex-m0 -mthumb -O0 -Ttext 0x8000000 -e main -nostartfiles -o main.elf main.c

Jednak z tym przykładem jak wysyłać i odbierać informacje przez port szeregowy mam problem przy kompilacji. Tak samo, kopiuję te listingi z artykułu i wklejam do terminala.

arm-none-eabi-gcc -c -Wall -g -mcpu=cortex-m0 -mthumb -O0 –specs=nano.specs -o uart.o uart.c
 arm-none-eabi-gcc -g -o uart.elf -T linker.ld --specs=nano.specs -nostartfiles -mcpu=cortex-m0 -mthumb startup.o uart.oarm-none-eabi-size uart.elf

I dostaję m.in błędy arm-none-eabi-gcc: error: pecs=nano.specs: No such file or directory oraz arm-none-eabi-gcc: error: uart.oarm-none-eabi-size: No such file or directory arm-none-eabi-gcc: fatal error: input file 'uart.elf' is the same as output file które widać na rysunku poniżej.

Ze skopliowaniem kodu startowego czyli komendą nie ma problemu. Jednak z tym wyżej wywala jakieś błędy i nie bardzo wiem jak ten problem rozwiązać.

arm-none-eabi-gcc -g -o uart.elf -T linker.ld --specs=nano.specs -nostartfiles -mcpu=cortex-m0 -mthumb -I CMSIS startup.S uart.c

Dodam że pobrałem instalki GCC gcc-arm-none-eabi-8-2018-q4-major-win32 z https://developer.arm.com/too[...]nu-toolchain/gnu-rm/downloads
OpenOCD serwer GDB z github.com/gnu-mcu-eclipse/openocd/releases
Niby wszystko powinno być ok, skoro pierwszy program w C do migania diodą działa, a jednak nie jest i nie wiem skąd te błędy. Albo coś przeoczyłem, nie wiem...

Może ktoś miał taki sam problem albo wie jak to rozwiązać.
Pozdrawiam.

title

Pozostało 580 znaków

2019-10-10 13:15
0

Wgranie tego kończy się failem. Wywala mnie z gdb i nie może połączyć się ponownie przez openocd. Ale dioda miga. Tylko już nie mogę połączyć się przez openocd, dopiero wgranie czyste programu przez System Workbench for STM32 resetuje coś i mogę znowu się połączyć przez openocd i gdb...

#include "stm32f0xx.h"

int main() {}

program fail.png

edytowany 1x, ostatnio: goose_, 2019-10-10 13:18

Pozostało 580 znaków

2019-10-10 13:17
0

Spróbuj podłączyć się z wciśniętym resetem.

Pozostało 580 znaków

2019-10-10 13:21
0
alagner napisał(a):

Spróbuj podłączyć się z wciśniętym resetem.

Połączyło :) ale jak puszę reset to znowu ...

Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 100ms
Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 300ms
Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 700ms
Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 1500ms
Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure

Ale jak mam wciśnięty reset to się łączy przez openocd

Pozostało 580 znaków

2019-10-10 13:23
0

Jak wgrałeś soft pod ten zły adres nie zmieniłeś na trwałe ustawień pinów swd/jtag?
EDIT: i spróbuj spod linuxa. Ale jak musisz spod Win...
openocd
arm-none-eabi-gdb plik.elf
Podłączasz się z wciśniętym resetem.
W gdb coś w tym stylu potem:
monitor reset halt
load

EDIT2:
mogłem kolejność pomylić, piszę z pamięci.
Ale ogólnie idea jest taka, że puszczasz knefel reset po tym jak load zakończy się sukcesem.

edytowany 2x, ostatnio: alagner, 2019-10-10 13:28

Pozostało 580 znaków

2019-10-10 13:52
0
alagner napisał(a):

ok. A co się dzieje w gdb jak odepniesz diodę i puścisz ten kod bez podpięcia do niczego?

Najpierw poprzedni post. Wyjęcie diody nic nie zmienia.

alagner napisał(a):

Jak wgrałeś soft pod ten zły adres nie zmieniłeś na trwałe ustawień pinów swd/jtag?
EDIT: i spróbuj spod linuxa. Ale jak musisz spod Win...
openocd
arm-none-eabi-gdb plik.elf
Podłączasz się z wciśniętym resetem.
W gdb coś w tym stylu potem:
monitor reset halt
load

EDIT2:
mogłem kolejność pomylić, piszę z pamięci.
Ale ogólnie idea jest taka, że puszczasz knefel reset po tym jak load zakończy się sukcesem.

Trzymam reset, łącze się z opencocd, jest połączenie, ale jak wchodzę w arm-none-eabi-gdb i próbuję się połączyć wpisując w gdb target remote :3333 to wywala że komputer docelowy aktywnie go odmawia. A w openocd to co zaznaczylem w czerwonej ramce, potem puszczam reset i dalej leci listing z błędem jtag.

sad214125125125125125.png

monitor reset halt coś tam ładuje ale potem dalej to samo... bo nie połączy się z wciśniętym resetem przez target remote :3333 w gdb

h2ih12o5h12oh51o25125.png

Będę musiał się jeszcze temu lepiej przyjrzeć na spokojnie.

Jeśli host aktywie odmawia połączenia a nie masz firewalla to oznacza, że na tym porcie nic nie nasłuchuje, czyli openocd nie "wisi" na tym porcie. - vtx 2019-10-11 06:11

Pozostało 580 znaków

2019-10-10 13:59
0

Jak go aktywnie odmawia to możesz równie dobrze mieć coś pomotlane z firewallem.
Spróbuj w OOCD inny port ustawić? Podłącz się putty do localhost:4444 i patrz co samo openocd tam pluje?
Spróbuj target remote localhost:3333 zamiast pustego hostname'a?

Pozostało 580 znaków

2019-10-11 12:02
0

Ok, chyba do czegoś doszedłem... Jeszcze raz pomierzyłem napięcia przed i za diodą itd. Potem spojrzałem jeszcze raz do datasheet RM0091Reference manual https://www.st.com/content/cc[...]ranslations/en.DM00031936.pdf . Okazuje się że port A ma jeszcze dodatkowy adres resetu, reszta portów tego nie ma. Więc ustawiłem znowu na port B, tylko inny pin, akurat dałem 6 pin jako wyjście do leda (ten sam kod co Rafała tylko pin 6 zamiast 3, reszta bez zmian). I jest :) Nie wywala mi z gdb, mogę się potem połączyć do openocd.

O tym resecie portu A jest w seckcji 8.4.1 GPIO port mode register (GPIOx_MODER) (x =A..F)
Reset values: • 0x2800 0000 for port A • 0x0000 0000 for other ports

Więc pewnie tutaj jakiś bubel zrobiłem że nie dałem tego resetu tylko jeszcze nie ogarniam o co chodzi z tym resetem. Ale na porcie B nie mam takich problemów.
Już jest OK :]

edytowany 2x, ostatnio: goose_, 2019-10-11 12:04

Pozostało 580 znaków

2019-10-12 13:35
0

To by wiele tłumaczyło. Na porcie A masz chyba SWD/JTAG. Spróuj moder inicjować tak, żeby zostawić najstarsze bity nieruszone; możliwe że po prostu piny debugowe wyłączasz.

edytowany 1x, ostatnio: alagner, 2019-10-12 13:36

Pozostało 580 znaków

2019-10-12 14:44
0
alagner napisał(a):

To by wiele tłumaczyło. Na porcie A masz chyba SWD/JTAG. Spróuj moder inicjować tak, żeby zostawić najstarsze bity nieruszone; możliwe że po prostu piny debugowe wyłączasz.

Ok, ale na razie... to tylko trochę GPIO i UART rozkminiłem. Dopiero przede mną jest ADC, DCA, I2C, SPI, DMA, NVIC i różne konfiguracje tego. Akurat chyba ten port A i te 8 pinów PA0 - PA7 to właśnie dla ADC jest. Dałem schemat na poprzedniej stronie. Pewnie za niedługo jak będę próbował robić coś bardziej konkretnego niż miganie diodą to dojdę do tego.

btw. Kupiłem sobie jeszcze mały zestawik z Arduino Uno z tym wszystkimi przyciskami, wyświetlaczem itd za 60 zeta. Na razie to muszę ogarnąć podstawowe tutoriale o tym np kurs stm32 na forbot. Żeby to wszystko co tam jest uruchomić na tej płytce Nucleo. Poza tym mam ciekawe moduły 4 x ublox TOBY L210 (LTE/HSPA+/GSM module for Europe/Asia; Cat 4; B1, B3, B5, B7, B8, B20) i kilka mikrokontrolerów TMS320F28033PAGO, 1 x STM32f446 (Cortex-M4) i jakieś inne małe chipy ST, SMSC np do USB2.0, jeszcze jakieś cFeon itp . Więc w planie jest też zabawa z tym. Póki co ledwo ogarniam jak sterować GPIO na tym nucleo... Może za jakiś czas uda się osiągnąć ten cel czyli zrobić jakiś mały RTOS i ciekawy projekt z tego ;p I jeszcze raspberry pi chce się pobawić. Na początek wystarczy ten raspberry pi zero za 30 zeta, ta najtańsza wersja. Więc za kilka miesięcy powinienem lepiej ogarniać temat.

edytowany 6x, ostatnio: goose_, 2019-10-12 15:14

Pozostało 580 znaków

2019-10-12 16:09
0

Tu nie ma co "rozkminiać". PA13 i PA14 to porty sprzętowego debugera, rys. 10 tutaj.
https://www.st.com/content/cc[...]ranslations/en.DM00231744.pdf
Nie chce mi się szukać teraz w RM dokładnych ustawień, ale na z dużym prawdopodobieństwem wpisując do rejestru konfiguracyjnego 0 pod odpowiedzialne za nie bity odpinasz sobie debuger. Przy resecie te rejestry ustawiają się do wartości domyślnej. Patrz RM 32.3.1 i 32.3.2.

Ok, więc chyba problem jest wyjaśniony. Będę musiał to i tak przejrzeć na spokojnie na dniach, poczytać o tym debugerze. Jakoś nie zainteresowałem sie tym, tylko najpierw tak jak wyżej napisałem na pierwszy ogień ADC itd. Ok, dzięki za "research" i pomoc. - goose_ 2019-10-12 17:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0