Accedere all'ETM di una Nucleo F 401RE tramite codice
-
- Messaggi: 23
- Iscritto il: gio 22 mar 2018, 18:15
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Ciao!
guarda mi son spiegato in maniera cervellotica io, Mea culpa, ... Devi sostituire alla Putchar la funzione che utilizzi tu per mandare fuori un carattere sulla seriale del micro, ed ogni volta che la chiami gli passi un carattere .
That's All!
guarda mi son spiegato in maniera cervellotica io, Mea culpa, ... Devi sostituire alla Putchar la funzione che utilizzi tu per mandare fuori un carattere sulla seriale del micro, ed ogni volta che la chiami gli passi un carattere .
That's All!
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Antennato81 ha scritto: ↑mar 25 set 2018, 9:32 Ciao!
guarda mi son spiegato in maniera cervellotica io, Mea culpa, ... Devi sostituire alla Putchar la funzione che utilizzi tu per mandare fuori un carattere sulla seriale del micro, ed ogni volta che la chiami gli passi un carattere .
That's All!
Io in realtà avevo scritto questo:
unsigned int *pointer = (unsigned int *) 0x0042000 // Faccio puntare pointer all'indirizzo di memoria seguente
poi dichiaro:
unsigned int var ;
var = *pointer; // Quindi associo a var il contenuto di quello a cui punta pointer
ed infine volevo fare:
printf("var"); // Per farmi restituire i 32 bit contenuti dall'indirizzo di memoria puntato da pointer
Grazie
-
- Messaggi: 23
- Iscritto il: gio 22 mar 2018, 18:15
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Ciao,
guarda per scrivere il contenuto puntato dovresti usare questo formalismo che ti riproto in un esempio:
unsigned long a = 1;
unsigned long *t = &a;
printf("%lu\n", *t);
Cosi' stampi il valore puntato di a.
Antennato81
guarda per scrivere il contenuto puntato dovresti usare questo formalismo che ti riproto in un esempio:
unsigned long a = 1;
unsigned long *t = &a;
printf("%lu\n", *t);
Cosi' stampi il valore puntato di a.
Antennato81
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Si va bene ma così facendo non posso scegliere io a quale indirizzo di memoria della ETM puntare.Antennato81 ha scritto: ↑mar 25 set 2018, 10:04 Ciao,
guarda per scrivere il contenuto puntato dovresti usare questo formalismo che ti riproto in un esempio:
unsigned long a = 1;
unsigned long *t = &a;
printf("%lu\n", *t);
Cosi' stampi il valore puntato di a.
Antennato81
Poichè cosi, correggimi se sbaglio, la variabile 'a' verrà allocata in una locazione di memoria in cui verrà salvato il valore di uno.
Con la seconda riga invece assegni a 't' l'indirizzo di a.
Invece io ho già l'indirizzo e devo vedere il contenuto di questo indirizzo.
Quindi ho fatto in quel modo poichè ho bisogno di vedere come sono settati inizialmente i bit di alcuni registri dell'ETM e poi successivamente cambiarli in modo da poter attivare l'ETM.
Grazie
-
- Messaggi: 23
- Iscritto il: gio 22 mar 2018, 18:15
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Guarda se hai un indirizzo specifico puoi inizializzare direttamente la variabile puntatore con un indirizzo di tuo interesse:
ne precedente esempio potresti fare
unsigned long *t = (unsigned long *)0xE0042000;
printf("%lu\n", &t);
questo solo per leggere l'indirizzo ...
per scriverci dentro le cose cambiano un attimo ...
Dimmi se era questo che volevi sapere altrimenti cerco di puntate dritto a quello che ti serve.
ne precedente esempio potresti fare
unsigned long *t = (unsigned long *)0xE0042000;
printf("%lu\n", &t);
questo solo per leggere l'indirizzo ...
per scriverci dentro le cose cambiano un attimo ...
Dimmi se era questo che volevi sapere altrimenti cerco di puntate dritto a quello che ti serve.
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Si esatto che poi è la stessa cosa che ho scritto io prima nel messaggio precedente, con alcune differenze però:Antennato81 ha scritto: ↑mar 25 set 2018, 14:02 Guarda se hai un indirizzo specifico puoi inizializzare direttamente la variabile puntatore con un indirizzo di tuo interesse:
ne precedente esempio potresti fare
unsigned long *t = (unsigned long *)0xE0042000;
printf("%lu\n", &t);
questo solo per leggere l'indirizzo ...
per scriverci dentro le cose cambiano un attimo ...
Dimmi se era questo che volevi sapere altrimenti cerco di puntate dritto a quello che ti serve.
- io ho utilizzato unsigned int perchè il tipo int alloca 4byte ed i miei registri sono a 32 bit
- avevo allocato una variabile in più di nome var a cui assegnavo l'indirizzo contenuto in pointer
- la mia printf è printf("var");
Perchè tu ci metti &t nella printf , non basta metterci solo t dato che ti lo stai facendo già puntare all'indirizzo che ti serve ?
Grazie
-
- Messaggi: 23
- Iscritto il: gio 22 mar 2018, 18:15
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Ciao,
la & "e commerciale" serve per dire che tu vuoi vedere l'inidirzzo, se la togli vedi il contenuto. Scegli tu cosa guardare. Per il long o l'int ti cambia poco e niente:
unsigned long 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
unsigned int 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
Lo puoi vedere tu stesso da questo link:
http://www.keil.com/support/man/docs/ar ... 009502.htm
Bye
la & "e commerciale" serve per dire che tu vuoi vedere l'inidirzzo, se la togli vedi il contenuto. Scegli tu cosa guardare. Per il long o l'int ti cambia poco e niente:
unsigned long 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
unsigned int 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
Lo puoi vedere tu stesso da questo link:
http://www.keil.com/support/man/docs/ar ... 009502.htm
Bye
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Antennato81 ha scritto: ↑mar 25 set 2018, 15:00 Ciao,
la & "e commerciale" serve per dire che tu vuoi vedere l'inidirzzo, se la togli vedi il contenuto. Scegli tu cosa guardare. Per il long o l'int ti cambia poco e niente:
unsigned long 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
unsigned int 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF
Lo puoi vedere tu stesso da questo link:
http://www.keil.com/support/man/docs/ar ... 009502.htm
Bye
Ok perfetto. Ti ringrazio molto per la tua disponibilità.
Detto ciò quindi, per usare la printf nella funzione putchar del link che mi hai inviato precedentemente, cosa devo metterci dentro ?
Grazie
-
- Messaggi: 23
- Iscritto il: gio 22 mar 2018, 18:15
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Allora la tua funzione da modificare e':
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
_putchar(character);
}
}
al posto della Putchar dovresti mettere la chiamata del HAL che usi per scrivere sulla seriale, ad esempio se utilizzi le API fornite da ST dovresti modificarla con:
USART_SendData(USART1, character);
quindi la tua funzione diventera':
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
USART_SendData(USART1, character);
}
}
Ovviamente io ho usato USART1 e soprattutto io ho questa chiata ma le cose cambiano da versione di API a micro, l'ST si e' divertita motlo a cambiare le carte in tavola ...
Ovviamente se la seriale funziona o no fai prima delle prove, altrimenti nn fai altro che aggiungere layer di ipotetici problemi.
Antennato81
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
_putchar(character);
}
}
al posto della Putchar dovresti mettere la chiamata del HAL che usi per scrivere sulla seriale, ad esempio se utilizzi le API fornite da ST dovresti modificarla con:
USART_SendData(USART1, character);
quindi la tua funzione diventera':
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
USART_SendData(USART1, character);
}
}
Ovviamente io ho usato USART1 e soprattutto io ho questa chiata ma le cose cambiano da versione di API a micro, l'ST si e' divertita motlo a cambiare le carte in tavola ...
Ovviamente se la seriale funziona o no fai prima delle prove, altrimenti nn fai altro che aggiungere layer di ipotetici problemi.
Antennato81
Re: Accedere all'ETM di una Nucleo F 401RE tramite codice
Ok perfetto ho capito, quindi io poi nel mio main posso richiamare direttamente printf(....), giusto ?Antennato81 ha scritto: ↑mar 25 set 2018, 15:59 Allora la tua funzione da modificare e':
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
_putchar(character);
}
}
al posto della Putchar dovresti mettere la chiamata del HAL che usi per scrivere sulla seriale, ad esempio se utilizzi le API fornite da ST dovresti modificarla con:
USART_SendData(USART1, character);
quindi la tua funzione diventera':
static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
USART_SendData(USART1, character);
}
}
Ovviamente io ho usato USART1 e soprattutto io ho questa chiata ma le cose cambiano da versione di API a micro, l'ST si e' divertita motlo a cambiare le carte in tavola ...
Ovviamente se la seriale funziona o no fai prima delle prove, altrimenti nn fai altro che aggiungere layer di ipotetici problemi.
Antennato81
Grazie ancora per la tua disponibilità