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

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

Rejestracja: 1 rok temu

Ostatnio: 4 miesiące temu

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-07-15 11:24

Rejestracja: 6 lat temu

Ostatnio: 6 godzin temu

0

Weź Ty sobie człowieku klasykę polskiego internetu którą każdy zna i wie jak z nią sobie radzić a nie wymyślasz :P
http://www.freddiechopin.info/

Pozostało 580 znaków

2019-07-16 13:47

Rejestracja: 1 rok temu

Ostatnio: 4 miesiące temu

0
alagner napisał(a):

Weź Ty sobie człowieku klasykę polskiego internetu którą każdy zna i wie jak z nią sobie radzić a nie wymyślasz :P
http://www.freddiechopin.info/

Dzięki za link. Jest przygotowany kod pod NUCLEO-F042K6 które parametrami jest prawie identyczne z F031K6 ale ma 6 kb ramu, a to co ja mam ma 4 kb ramu. Ale może aż tyle nie jest potrzebne żeby to uruchomić. I jest jakiś system plików a takiego czegoś szukałem. Więc ciekawe ;) Dzięki.


edytowany 1x, ostatnio: goose_, 2019-07-16 13:48

Pozostało 580 znaków

2019-07-16 14:55

Rejestracja: 6 lat temu

Ostatnio: 6 godzin temu

0

Jak liczysz, że bez skryptu linkera gdzieś daleko zajedziesz to źle liczysz ;)

Pozostało 580 znaków

2019-10-10 01:24

Rejestracja: 1 rok temu

Ostatnio: 4 miesiące temu

0

Co jest nie tak w tym kodzie że GDB zamiast skoczyć do linii

SUBS    R2, #1 

zatrzymuje się na

Program received signal SIGINT, Interrupt.
_start () at demo2.S:30
30      LDR             R0, =RCC

Moja modyfikacja wygląda tak. Ogólnie chodzi o to że mam podpiętą diodę led na płytce stykowej. Z pinu GND na nucleo mam podpięte do minus na płytce stykowej, a zasilanie idzie z PA6, i program ma migać diodą tylko zamiast tą wbudowaną na płytce pod PB3 która jest opisana przez Rafała Kozika to sobie zacząłem eksperymentować na płytce stykowej. Tylko co jest tutaj nie tak. Jakieś przerwania mam jeszcze obsługiwać? Nie bardzo wiem dlaczego po wgraniu tego programu potem nie mogę już nic na nią wgrać bo ją po prostu odcina i openOCD nie mogę się połączyć z nią. A st-info na ubuntu w ogóle nie wykrywa sram, chipid, itd. Po prostu ją odcina, bo widać po debugerze że coś jest nie tak. Normalnie ten kod Rafała skacze do linii 41 do instrukcji SUBS R2, #1 i mogę to zatrzymać, potem kontynuować a tutaj w mojej modyfikacji jest halt płytki i koniec. Dopiero wgranie czystego programu przez System Workbench for STM32 która ma tylko bliblioteke .h dla tej płytki i pustą funkcje main resetuje coś, że mogę znowu połączyć się openOCD albo st-flash write wgrać program. Ale coś jest chyba nie tak w tym moim kodzie. Mimo wszystko działa, dioda miga tak jak zaprogramowałem, tylko potem już nie mogę przeprogramować tą samą drogą, tylko dopiero czyszczenie przez Sstem Workbench for STM32... ech.

/*-
 * SPDX-License-Identifier: BSD-3-Clause
 *
 * Copyright (c) 2018 Rafal Kozik
 * All rights reserved.
 */

.syntax unified
.thumb
.cpu cortex-m0

/* Vector table */
.long   0
.long   _start + 1

.set    RCC, 0x40021000
.set    RCC_AHBENR, 0x14
.set    IOPAEN, (1<<17)

.set    PORTA, 0x48000000
.set    GPIOx_MODER, 0x00
.set    GPIOx_ODR, 0x14
.set    GPIOx_MODER_OUT, 0x01

.set    LED, 0x06
.set    WAIT, 500000

/* Main program */
_start:
LDR     R0, =RCC
LDR     R1, =IOPAEN
STR     R1, [R0, #RCC_AHBENR]

LDR     R0, =PORTA
LDR     R1, =(GPIOx_MODER_OUT << (LED * 2))
STR     R1, [R0, #GPIOx_MODER]

init_loop:
LDR     R2, =WAIT
loop:
SUBS    R2, #1
BNE     loop
MVNS    R3, R3
STR     R3, [R0, #GPIOx_ODR]
B       init_loop

.global _start

Tutaj jest oryginalny kod i to co wywala mi w GDB

nulsadlasjfkajfklajsflkasf.png


edytowany 3x, ostatnio: goose_, 2019-10-10 02:32

Pozostało 580 znaków

vtx
2019-10-10 06:22
vtx

Rejestracja: 10 miesięcy temu

Ostatnio: 16 sekund temu

0
goose_ napisał(a):

Co jest nie tak w tym kodzie że GDB zamiast skoczyć do linii

SUBS  R2, #1 

zatrzymuje się na

Program received signal SIGINT, Interrupt.
_start () at demo2.S:30
30      LDR             R0, =RCC

Wygląda na to, że masz gdzieś breakpointa wstawionego na _start w gdb. Może masz go w pliku ~/.gdbinit czy jak go tam nazwali w nomenklaturze Windows.
Polecenie "i break" w gdb prawdę ci powie w tej materii.

Moja modyfikacja wygląda tak. Ogólnie chodzi o to że mam podpiętą diodę led na płytce stykowej. Z pinu GND na nucleo mam podpięte do minus na płytce stykowej, a zasilanie idzie z PA6, i program ma migać diodą tylko zamiast tą wbudowaną na płytce pod PB3 która jest opisana przez Rafała Kozika to sobie zacząłem eksperymentować na płytce stykowej. Tylko co jest tutaj nie tak. Jakieś przerwania mam jeszcze obsługiwać? Nie bardzo wiem dlaczego po wgraniu tego programu potem nie mogę już nic na nią wgrać bo ją po prostu odcina i openOCD nie mogę się połączyć z nią. A st-info na ubuntu w ogóle nie wykrywa sram, chipid, itd. Po prostu ją odcina, bo widać po debugerze że coś jest nie tak. Normalnie ten kod Rafała skacze do linii 41 do instrukcji SUBS R2, #1 i mogę to zatrzymać, potem kontynuować a tutaj w mojej modyfikacji jest halt płytki i koniec. Dopiero wgranie czystego programu przez System Workbench for STM32 która ma tylko bliblioteke .h dla tej płytki i pustą funkcje main resetuje coś, że mogę znowu połączyć się openOCD albo st-flash write wgrać program. Ale coś jest chyba nie tak w tym moim kodzie. Mimo wszystko działa, dioda miga tak jak zaprogramowałem, tylko potem już nie mogę przeprogramować tą samą drogą, tylko dopiero czyszczenie przez Sstem Workbench for STM32... ech.

Ogólnie to jeśli zmieniasz pin GPIO, do którego podpinasz diodkę to musisz przekonfigurować to GPIO na wyjście, wybrać pullup/pulldown albo push-pull, czasami trzeba enablować zegar dla tego portu GPIO (zależnie od MCU), wyprowadzić go z resetu, etc. Trochę elektroniki trzeba znać tutaj w embedded.

Dodatkowo chciałbym ostrzec, żeby uważać z eksperymentowaniem, szczególnie ze skryptem linkera - bo jeśli wpiszesz sobie jakieś śmieci w nieodpowiedni obszar flasha to może to byc ostatni zapis jakikolwiek, bo zablokujesz MCU. Ale to tylko tak piszę ku przestrodze, nie żeby cię zniechęcać. Po prostu trzeba znać mapę pamięci zanim cokolwiek będziesz eksperymentować.

Pozostało 580 znaków

2019-10-10 11:41

Rejestracja: 1 rok temu

Ostatnio: 4 miesiące temu

0
vtx napisał(a):

Dodatkowo chciałbym ostrzec, żeby uważać z eksperymentowaniem, szczególnie ze skryptem linkera - bo jeśli wpiszesz sobie jakieś śmieci w nieodpowiedni obszar flasha to może to byc ostatni zapis jakikolwiek, bo zablokujesz MCU. Ale to tylko tak piszę ku przestrodze, nie żeby cię zniechęcać. Po prostu trzeba znać mapę pamięci zanim cokolwiek będziesz eksperymentować.

Właśnie nie wiem czy czegoś nie spartoliłem, bo przeszedłem na st-link pod Ubuntu i wgrywałem pliki bin, wcześniej z używałem openOCD i listingów z programistymag do wgrywania plików elf. st-flash tylko ładuje pliki binarne i jak wpisałem coś takiego to zaczęły się problemy. Ale taki adres pokazywało mi w st-info --flash.

st-flash write led.bin 0x8000 // dałem chyba zły adres do pamięci bo powinno być 0x8000000

Ten kod jest praktycznie taki sam jak z przykładów Rafała, tyle że dałem inne porty ale dioda miga na płytce stykowej. Jak wgrywam jego kod to wszystko jest ok, potem wgrywam swój to mi wywala właśnie w tym miejscu. Nie wiem...


edytowany 2x, ostatnio: goose_, 2019-10-10 11:42

Pozostało 580 znaków

vtx
2019-10-10 11:50
vtx

Rejestracja: 10 miesięcy temu

Ostatnio: 16 sekund temu

0
goose_ napisał(a):
vtx napisał(a):

Dodatkowo chciałbym ostrzec, żeby uważać z eksperymentowaniem, szczególnie ze skryptem linkera - bo jeśli wpiszesz sobie jakieś śmieci w nieodpowiedni obszar flasha to może to byc ostatni zapis jakikolwiek, bo zablokujesz MCU. Ale to tylko tak piszę ku przestrodze, nie żeby cię zniechęcać. Po prostu trzeba znać mapę pamięci zanim cokolwiek będziesz eksperymentować.

Właśnie nie wiem czy czegoś nie spartoliłem, bo przeszedłem na st-link pod Ubuntu i wgrywałem pliki bin, wcześniej z używałem openOCD i listingów z programistymag do wgrywania plików elf. st-flash tylko ładuje pliki binarne i jak wpisałem coś takiego to zaczęły się problemy. Ale taki adres pokazywało mi w st-info --flash.

st-flash write led.bin 0x8000 // dałem chyba zły adres do pamięci bo powinno być 0x8000000

Ten kod jest praktycznie taki sam jak z przykładów Rafała, tyle że dałem inne porty ale dioda miga na płytce stykowej. Jak wgrywam jego kod to wszystko jest ok, potem wgrywam swój to mi wywala właśnie w tym miejscu. Nie wiem...

Ja używam openocd+gdb do flashowania STM-a i nie podaję adresu wpalania - dzięki temu trudniej zrobić coś nie tak. Wszystkie odpowiednie adresy są w pliku .elf a gdb robi resztę. Co do adresu - to faktycznie 0x8000 jest złym adresem.

Pozostało 580 znaków

2019-10-10 12:19

Rejestracja: 6 lat temu

Ostatnio: 6 godzin temu

0

To jeszcze narysuj schemat jak tę diodkę wpinasz, bo może puszczasz tam jakiś za duży prąd i coś fizycznie nawala (wątpię, ale też tak bywa).
Prosto to sprawdzić: odepnij zewnętrzną diodę.

edytowany 2x, ostatnio: alagner, 2019-10-10 12:23

Pozostało 580 znaków

2019-10-10 12:59

Rejestracja: 1 rok temu

Ostatnio: 4 miesiące temu

0
alagner napisał(a):

To jeszcze narysuj schemat jak tę diodkę wpinasz, bo może puszczasz tam jakiś za duży prąd i coś fizycznie nawala (wątpię, ale też tak bywa).
Prosto to sprawdzić: odepnij zewnętrzną diodę.

Nie mam dobrego aparatu teraz, tak to wygląda . Sprawdzałem miernikiem napięcia, jest przed rezystorem 3,3v, za rezystorem na diodzie 1,8v. Raczej prąd jest ok. Tylko wcześniej miałem jeszcze ten zielony kabel wpięty do + na płytce stykowej z pinu 3v3, ale to tylko daje napięcie do płytki, nie robi żadnego problemu raczej.

Bez tyssssstułu.png


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

Pozostało 580 znaków

2019-10-10 13:15

Rejestracja: 6 lat temu

Ostatnio: 6 godzin temu

0

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

Pozostało 580 znaków

Odpowiedz

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