Hur får man en korrekt och proper Input Capture funktion i STM32?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

Dessutom beror det ju på vilken processor man använder, och om man kör RTOS eller inte.
Normalt set, utan RTOS så är ett interrupt snabbare än ett funktionsanrop.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av ToPNoTCH »

Även jag kör en frekvensräknare som klarar 20Hz till 20000Hz med interrupt på input capture (Autotune till analog synth).

Skall man köra så brett spann måste man ha med hur många gånger klockan rullar, vilket den måste göra på låg frekvens om man skall ha detalj på hög.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av DanielM »

TomasL skrev: 30 mars 2022, 19:49:10 Varför skulle den inte klara det, det gäller ju att göra smarta funktioner.
Låt oss säga så här: Om man har en interrupt som anropas när ett ADC värde ändras. Ja, då lär den anropas hela tiden. :)
DMA med STM32 fungerar riktigt smidigt. Man behöver knappt skriva någon kod. Tre rader typ.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av JimmyAndersson »

Daniel:
DMA är riktigt behändigt, så jag förstår tanken.
Det är inget fel i att använda det.
Men det jag tror att många vill säga är att det inte är något fel i att använda interrupt även för sådant som händer ”ofta”.
De kan inte släppa att du ser interrupt som något som ska inträffa sällan. :)

Apropå det:
Du skrev ”Hela tiden”
Hur ofta är det? :)
För en människa så är 400 gånger i sekunden ”hela tiden”, men för en processor så är det snarare mer åt ”så trist det är.. det händer ju ingenting..”.

Tips:
Testa nångång att göra ett projekt/kod som använder massor med interrupt och som händer riktigt ofta.
Kunde ju vara ett kul experiment.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

DanielM skrev: 3 april 2022, 21:14:46
TomasL skrev: 30 mars 2022, 19:49:10 Varför skulle den inte klara det, det gäller ju att göra smarta funktioner.
Låt oss säga så här: Om man har en interrupt som anropas när ett ADC värde ändras. Ja, då lär den anropas hela tiden. :)
DMA med STM32 fungerar riktigt smidigt. Man behöver knappt skriva någon kod. Tre rader typ.
Nej den anropas inte hela tiden, på sin höjd efter varje sample, aldrig oftare, gissar att det passerar någon miljon klockcykler mellan varje sample, så ett interrupt sker inte speciellt ofta.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av ToPNoTCH »

DanielM skrev: 3 april 2022, 21:14:46
TomasL skrev: 30 mars 2022, 19:49:10 Varför skulle den inte klara det, det gäller ju att göra smarta funktioner.
Låt oss säga så här: Om man har en interrupt som anropas när ett ADC värde ändras. Ja, då lär den anropas hela tiden. :)
DMA med STM32 fungerar riktigt smidigt. Man behöver knappt skriva någon kod. Tre rader typ.
DMA är till för att skyffla data, interrupt för att behandla data...Två olika saker till två olika syften.

Du kan inte ersätta dom med varandra.
Om du vill agera på varje sample från en ADC är DMA meningslöst (du tvingas interrupta på DMA complete eller conversion complete lika mycket interrupt i båda fallen), om du vill skyffla en buffer på 4000 half-word till ett periferi chip etc. så är DMA perfekt.

Sen finns det ju typ blandad användning (average över 100 saples från ADC) där det kan vara vettigt att sampla en ringbuffer på 100 och göra beräkningen på transfer complete callback.

Men som sagt DMA och interrupt ersätter inte varandra.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av DanielM »

JimmyAndersson skrev: 3 april 2022, 21:35:07 Daniel:
DMA är riktigt behändigt, så jag förstår tanken.
Det är inget fel i att använda det.
Men det jag tror att många vill säga är att det inte är något fel i att använda interrupt även för sådant som händer ”ofta”.
De kan inte släppa att du ser interrupt som något som ska inträffa sällan. :)

Apropå det:
Du skrev ”Hela tiden”
Hur ofta är det? :)
För en människa så är 400 gånger i sekunden ”hela tiden”, men för en processor så är det snarare mer åt ”så trist det är.. det händer ju ingenting..”.

Tips:
Testa nångång att göra ett projekt/kod som använder massor med interrupt och som händer riktigt ofta.
Kunde ju vara ett kul experiment.
Om du kopplar så att när du får ett förändrat analogt ADC värde, så anropas din interrupt. Detta är inte så smart. För analogt ändras hela tiden.

Jag brukar använda interrupt när det handlar om t.ex. USB data-funktioner. Skickar jag USB data till min USB port på min STM32 (till skillnad från övriga uC-tillverkare som lyser med sin frånvaro när det kommer att ha lika många enheter (peripherials) i en enda uC som ST har ) så anropas en __weak funktion som jag har skrivit. Fungerar klockrent.
ToPNoTCH skrev: 3 april 2022, 22:41:17 DMA är till för att skyffla data, interrupt för att behandla data...Två olika saker till två olika syften.

Du kan inte ersätta dom med varandra.
Om du vill agera på varje sample från en ADC är DMA meningslöst (du tvingas interrupta på DMA complete eller conversion complete lika mycket interrupt i båda fallen), om du vill skyffla en buffer på 4000 half-word till ett periferi chip etc. så är DMA perfekt.

Sen finns det ju typ blandad användning (average över 100 saples från ADC) där det kan vara vettigt att sampla en ringbuffer på 100 och göra beräkningen på transfer complete callback.

Men som sagt DMA och interrupt ersätter inte varandra.
Detta vet jag. Jag använder DMA för att skyffla data. DMA är otroligt bekvämt om jag vill bara ha data när jag ska läsa det.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av ToPNoTCH »

Jaha du.. Om du har skrivit en "__weak funktion"

Så svamlar du igen.

Det finns inga sådana.
__Weak är ett compiler direktiv, och om du suttit det framför en egen funktion så tvivlar jag på att du vet vad du håller på med faktiskt.
Jag har byggt en del USB device med STM32 för class compliant drivrutiner och det är lite mer komplicerat än att "skapa en funktion" så jag är lite nyfiken på vad du egentligen gjort.

Har du någon kod att visa ?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

till skillnad från övriga uC-tillverkare som lyser med sin frånvaro när det kommer att ha lika många enheter (peripherials) i en enda uC som ST har )
Då känner du inte till många uC faktiskt.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av DanielM »

ToPNoTCH skrev: 5 april 2022, 22:24:30 Jaha du.. Om du har skrivit en "__weak funktion"

Så svamlar du igen.

Det finns inga sådana.
__Weak är ett compiler direktiv, och om du suttit det framför en egen funktion så tvivlar jag på att du vet vad du håller på med faktiskt.
Jag har byggt en del USB device med STM32 för class compliant drivrutiner och det är lite mer komplicerat än att "skapa en funktion" så jag är lite nyfiken på vad du egentligen gjort.
__weak är alltså en datatyp för en funktion där man kan skriva över. Precis som Java har @Override på sina funktioner.

USB för STM32 var nog det enklaste jag har någonsin gjort. Det var bara som att trycka på startknappen och allt bara fungerade. Jag behövde skriva 0% "USB-kod". Jag behövde bara lägga till en interrupt och sedan var allt klart. Inge mer.
Har du någon kod att visa ?
Självklart! :) Jag kan skicka hela mitt STM32 projekt om så önskas.
TomasL skrev: 5 april 2022, 22:52:22 Då känner du inte till många uC faktiskt.
Snarare så är det så att ST leder i utveckling när det kommer att "smacka in allt" som finns i en liten uC.
Så fort man tittar på AVR eller PIC så skall det alltid "snålas och tjuras" med diverse funktioner. Samma sak med övriga processor tillverkare. Då ska det vara så "tjuras och suras" med att det ska vara överdrivet komplext att få något gjort. Jag prisar verkligen CubeMX. Se och lär....

För att få till USB på en STM32 så är det bara följa detta:

Steg 1: Öppna upp STM32CubeIDE och klicka på "Middleware".
Skärmklipp.PNG
Steg 2: Bara välj denna
Skärmklipp.PNG
Steg 3: Djupt nere i mörkaste C-koden så finns det en fil som heter usbd_cdc_if.c. Skapa en funktion som heter CDC_ReceiveCallback(Buf, *Len);
Skärmklipp.PNG
Steg 4: Deklarera CDC_ReceiveCallback(Buf, *Len); som. Notera att det MÅSTE vara inom "USER BEGIN" och "USER END" kommentarerna. Notera att det är i samma fil också, usbd_cdc_if.c
Skärmklipp.PNG
Steg 5: Deklarera också __weak filen i headerfilen.
Skärmklipp.PNG
Steg 6:
För att få denna funktion att anropas så fort du får data i din USB buffer så skriver du följande:

Kod: Markera allt

#include "usbd_cdc_if.h"

/* Denna anropas så fort du får data */
void CDC_ReceiveCallback(uint8_t* receive_buf, uint32_t receive_len){
	
}
För att skicka data från STM32 till din dator. Så använd denna funktion

Kod: Markera allt

uint8_t byte_data[5];
byte_data[0] = 50;
byte_data[1] = 51;
byte_data[2] = 52;
byte_data[3] = 53;
byte_data[4] = 54;
uint8_t storlek_pa_data = 5;
CDC_Transmit_FS(byte_data, storlek_pa_data);
Klart!
Glöm inte att koppla upp en 1.5k pullupp.
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 5 april 2022, 23:48:52, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

Snarare så är det så att ST leder i utveckling när det kommer att "smacka in allt" som finns i en liten uC.
Som sagt du har inte en aning om vad du pratar om.
__weak är alltså en datatyp för en funktion där man kan skriva över.
Nej det är det inte, det är ett direktiv till länkaren att, om det finns en likadan funktion i projektet med samma namn, så skall den andra funktionen länkas in i stället.

De flesta biblioteksfunktioner kompileras med __weak
Som exempel så finns det vissa funktioner i standardbiblioteken man inte bör använda, av olika orsaker, programmeraren kan då skriva en egen funktion för att ersätta biblioteksfunktionen.
Man kan då använda samma funktionsnamn som det i biblioteket, och länkaren använder då den egenskrivna funktionen istället för biblioteksfunktionen,
Steg 1: Öppna upp STM32CubeIDE och klicka på "Middleware".
Och du gör exakt samma sak i till exempel MPLAB-X, om du har en processor med USB, vilket i stort sett alla utom de enklaste PIC8orna har
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av DanielM »

Visa då hur man gör det i MPLAB-X.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

Du öppnar configuratorn och kryssar i USB, typ.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av DanielM »

Säkert mer komplicerat än så, annars hade TomasL visat med 1 enda bild.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur får man en korrekt och proper Input Capture funktion i STM32?

Inlägg av TomasL »

Nej det är det inte, men jag orkar inte lägga upp ett projekt bara för att visa dig, speciellt inte kl 0100 på natten.
Skriv svar