Fórum témák
» Több friss téma |
Az interrupt handler:
Ez pedig a TIMER-hez a header file
Helló!
Van egy 429I Discovery board-om. A rajta lévő F103 két átforrasztható jumperrel tud csatlakozni a 429 PA9,10 lábaira USART céljából. Tehát a 429-re megírt USART az STLINK-en keresztül ki tudna dumálni a PC-nek putty-nak, hyperterm-nek. Nagyon kevés infó van erről. És ez nem ugyan az mint az SWO ami a PB3 lábra menne. Az egész abból indult ki, hogy szeretném használni a Keil printf(Debug) screen-jét egy kis kényelem gyanánt. Szóval van itt olyan aki már STLINK-V2-t rá tudta bírni hogy Debug mellett ugyan azon a szingli USB kábelen virtuális soros port legyen?
Az UART csatlakozás ott van a többi Discovery kártyán is, de nem jó semmire, mert az STLINK V2 firmware nem biztosít virtuális soros portot hozzá.
Amit te keresel, az valószínűleg a semihosting, amihez nem kell külön drót, hanem a debuggeren keresztül (SWDIO) kommunikál.
Végülis mindegy melyikkel foglalkozom. SWDIO talán annyiból jobb lenne, ahogy láttam core szinten van implementálva, és a Cortex mag része. Ilyen formán a core-cm4.h file-ban találtam is hozzá rutinokat. Jó kérdés, hogy hogy fog működni.
Akárhogy is, azt szeretném elérni, és ebben kérném a segítséget hogy: Egy db USB kábel az ST-Link-en PC képernyőre írja ki amit szeretnék debug jelleggel. pl a Printf ablakba. Jah és a watch windows nem ér!
Erre gondoltál? STM32F4 Discovery and printf() redirection to debug viewer in Keil MDK-ARM Bővebben: Link
Pontosan erre. És végig is csináltam, csak éppen nem jelenik meg semmi a Printf ablakban.
Nem értek a dologhoz de itt egy cikk, hogyan lehet az ST-LINK V2-t SWO pinnel kiegészíteni:
https://lujji.github.io/blog/stlink-clone-trace/ Én rendeltem olyan st-link v2-t, amin van SWO: https://www.aliexpress.com/item/Best-Quality-ST-Link-stlink-V2-for-...6.html
DMA-ról kérdeznék, ADC-t mintavételezek:
- circular módban folyamatosan jár - normal módban feltölti a puffert és leáll A kérdés normal módra vonatkozik. 32 mintavételes puffereket szeretnék, először az elsőt töltöm fel, utána a következőt,... viszont néha leállítom, amikor befejeztem a mintavételezést. Olyankor nem töltök fel több puffert. Normal módot csak úgy tudtam újraindítani, hogy DMA disable -> DMA enable. Bármilyen flag-et töröltem (GL1, TC1, HT1, TE1), semmi sem történt, nem indult újra. Ez a helyes újraindítás, vagy van egyéb szebb módja is, hogy a lejárt DMA-t újraindítsam? A hozzászólás módosítva: Jan 10, 2017
Jól csináltad. Idézet a kézikönyvből:
Idézet: „If the channel is configured in noncircular mode, no DMA request is served after the last transfer (that is once the number of data items to be transferred has reached zero). In order to reload a new number of data items to be transferred into the DMA_CNDTRx register, the DMA channel must be disabled.” A hozzászólás módosítva: Jan 10, 2017
Idézet: „...végig is csináltam, csak éppen nem jelenik meg semmi a Printf ablakban.” Ezen az oldalon azt írják, hogy az STM32F429 Discovery kártyán az SB9 átkötést össze kell forrasztani. Gondolom, ez viszi el az SWO jelet az STlink-re.
Igen. Az is megtörtént. Ma majd jobban nekiugrom kialudtam magam. Igazság szerint (mellesleg, jelen helyzetben) nem sok értelme van a szenvedésemnek, a vége úgyis egy valós debug port valódi usart csatival (RJ11). Csak a kíváncsiság hajt(ott), ennél több időt viszont nem vagyok hajlandó egy zsákutcára àlldozni.
Egy vicces bug az STM32 API-ban. A problémám az, hogy 2 eszköz DMA-zik interrupttal, az egyik LCD-re és az interrupt sok számítást igényelt, a másik ADC-t mintavételez DMA-val, gyors reakcióra van szükség, viszont gyorsan véget is ér a rutin.
Azt vártam, hogy az ADC DMA interrupt preemptíven belehív az LCD interruptjába, amikor az éppen szüttyög, viszont API doksi ide, vagy oda, nem hívott az semmit. Megvárta, míg az LCD szépen lassan kiszámolja a végeredményt, utána pedig már sajnos késő volt. A hibás kód:
Az élet szép és jó, csakhogy a fenti kód nem működik. Pár sort hozzá kellett raknom:
Szóval miután ügyesen még kézzel is beállítottuk a jó prioritást, valóban bele fog hívni az ADC csatorna DMA interruptja az LCD DMA interruptjába. Hurrá. A hozzászólás módosítva: Jan 12, 2017
Ennyi elég és nem is fog bajt okozni később:
Az eredeti kóddal az a baj, hogy rossz regiszterbe ír, így jobb mellőzni a hívását, ha nem akarunk meglepetést később magunknak. A hozzászólás módosítva: Jan 12, 2017
Azok a "másként gondolkodók" azért nem teljesen hülyék.
Az általad most használt funkciók a CMSIS részei, amit az összes hasonló ARM procihoz terveztek, legyen az M0, M3, M4, stb. és gyártsa az ST, NXP, Atmel, stb. . A specifikáció szerint max. 256 szint lehetséges, amiből az IC tervezője dönti el, hogy hány szintet implementál (min. 8, azaz 3bit). Mivel mindig az alsó nem használt bitek 0-ák, ezért a forráskódok elméletileg kompatibilisek maradnak akkor is ha egy több prioritásszintű uC-ről egy kevesebb szintet használó uC-re viszik át, lévén csak a legfinomabb prioritást hangoló bit(ek) vesznek el. Mivel a te általad használt uC 4 bitet használ a lehetséges 7-ből, ezért hát a 2+2bit konfiguráció teljesen jól kijön a 7-2 = 5 egyenlet megoldásaként . Bónusz infó: Bár a subprioritás szintek első ránézésre (és második, harmadik stb. ránézésre is ) eléggé haszontalannak tűnnek, azért van némi hasznuk. Ezek a szintek ugyanis nem játszanak szerepet a megszakítások megszakításánál (nested interrupt ugye) csak a sorban álló ugyanolyan főprioritású megszakítások végrehajtási sorrendjénél számít az értékük. A hozzászólás módosítva: Jan 12, 2017
Egyébként menet közben rájöttem, hogy nem bugos a kód.
Statikus konstruktor hívta meg az NVIC_Init-et és félreszámolt. Miután átraktam, hogy a main után állítsa be az interruptokat, működött. Nem hasznontalan a szubprioritás. Nem mindig akarom, hogy egymást megszakítsák a rutinok, néha elég, ha sorrendben végrehajtódnak. Valljuk be, nehezebb preemption-ös interrupt handlert írni, mint ha nem lenne. Szórakozásból eszembe nem jutna saját magamat szívatni. Csak akkor szakítsák meg egymást, ha indokolt, egyébként egyik lefuthat a másik után. A hozzászólás módosítva: Jan 13, 2017
printf átirányítás SWO kimenentre Keil MDK alatt
Idézet: „Végig is csináltam, csak éppen nem jelenik meg semmi a Printf ablakban.” Nem csodálom, mert úgy látom, hogy az ebben a cikkben leírt printf átirányítás nem működik. Leírom, hogy nekem hogy sikerült: 0. Keil MDK Lite 5.20 van telepítve nálam. STM32F103C8T8-cal kísérleteztem, de ennek nincs jelentősége. A PB3 kivezetés az SWO kimenet. 1. Trace engedélyezés (úgy, ahogy a fenti cikkben írják): Trace enable pipa, CPU frekvencia a ténylegesen beállított legyen, s az ITM Stimulus Port 0-nál legyen pipa (lehet a többinél is, de ez kell) 2. Első körben csak ITM_SendChar(ch); hívásokkal próbálkoztam, ehhez nem kellett semmilyen bűvészkedés (ch helyére valamilyen karakterkódot vár a függvény). Fordítás, debug módban programfuttatás esetén szépen pötyögtek a karakterek a debug printf ablakba. 3. Printf átirányítás: egy UART átirányítási mintapélda alapján az alábbi kódot szúrtam be a programba, s így működött a printf() debugolás is.
A hozzászólás módosítva: Jan 15, 2017
Sziasztok, sajnos az STM32F103-ban nincs EEPROM. Lehetséges a FLASH egy adott szabad területét, pl. a végét EEPROM-ként használni? Hogyan?
A hozzászólás módosítva: Jan 22, 2017
Innen kezdve olvass időben visszafelé.
ADC kérdésem lenne. Két csatornán mintavételezek, néha szükségem lenne injected ADC-re, hogy beolvassam a joystick állását.
Beállítás:
A probléma az, hogy kizárólag az ADC1 dolgozik, ADC2 nem. Párhuzamosan egyszerre kellene master/slave ADC-nek olvasni a joysticket, ez pedig nem történik meg. Mi lehet a hiba? ADC_Mode_RegInjecSimult-ot használok... A hozzászólás módosítva: Jan 23, 2017
Így működik, csak nem szeretném külön-külön kézzel indítgatni a 2 ADC-t: Jó lenne, ha tényleg párhuzamosan mennének.
- Az ADC DUALMODE biteket mire állítottad?
- Sorrend: van egy olyan megjegyzés, hogy a fenti biteket a konfigurálás elején célszerű nullázni (independent mód), és csak a konfigurálás végén beállítani.
ADC_Mode_RegInjecSimult (00001)
A duális mód működik, szépen mintavételezem mindkét csatornát, az érkező ADC 32 bites, alsó 16 ADC1, a felső 16 ADC2. Az injected mód gondolom nem így működik. A JDR1..4 regiszterek 16 bitesek, szóval nincs értelme 32 bites értéket kiolvasni belőle. Egyszerre kellene indítani a 2 ADC-t, de csak az egyik indul el, vagy nem tudom, hogy a másik hol tárolódik el. A hozzászólás módosítva: Jan 23, 2017
Injektált csatornák szimultán konverziójánál az adatlap szerint mindegyik ADC saját JDRx regiszterében lesz az adat (tehát ADC1_JDR1, ADC2_JDR1 stb).
Reguláris csatornák szimultán konverziójánál az ADC2 eredménye valóban átkerülhet az ADC1 adatregiszterének felső felébe, de ehhez a DMA bitet engedélyezni kell: Idézet: „In dual ADC mode, to read the slave converted data on the master data register, the DMA bit must be enabled even if it is not used to transfer converted regular channel data.”
Regisztráltattam magamat az st.com-on, így hozzá tudtam férni a példa adatbázisukhoz. Ott en.stsw-stm32028.zip néven (AN3116) hozzáférhetőek az ADC példaprogramok. Nem tudtam, hogy ingyenesek, de szerencsére elég volt szimplán a regisztráció.
A példákból 5 perc alatt kiderült a hiba, 2 sor hiányzott:
Magyarul engedélyezni kellett az injected triggert, onnantól ment minden flottul. Mindig tanul az ember.
Sőt, ha céges emailre regisztráltál, akár még ingyen uC-ket is kérhetsz tőlük mintaként. Csak ne élj vissza vele, mert másokkal is kiszúrhatsz.
Egy videó a készülő oszcilloszkópról:
Link itt Kapcsolási rajz csatolva. A fenti sorban 4 érték van 2 csatornához: - átlag, min, max, effektív érték - lent az időosztás, min-max alapján számított frekvencia A trigger láthatóan még nem megy, a PGA-val (programozható erősítéssel) sem járok sehol. A mintavételezést a TIM1 timer indítja. 5 kHz-es PWM teszt jelet raktam ki egyik pinre, rá egy ellenállás és egy kapacitás. Érdekességként: amikor LCD-vel kommunikálok, akkor nem mintavételezek. 0.5% körüli ADC zajszintet produkált a 9 MHz-es SPI átvitel az LCD felé. Ez eléggé durva. A kód képes zajszintet is mérni (azt méri, hogy a 0 jel mennyire stabil). Amikor a teszt PWM-et felkapcsolom, láthatóan romlik a zajszint. Magyarul ha mintavételezésnél se teszt PWM, se LCD nincs, akkor pontos. Ekkor 0.1% hibahatár alá kerül a mintavételezés. A hozzászólás módosítva: Jan 26, 2017
Jelenleg egy próbapanelen dugdostál össze egy kezdetleges áramkört mindenféle szűrés és analóg leválasztás nélkül. Ez van. Majd ha megtervezed nyákra, akkor figyelj oda ezekre.
Azt a nagyértékű kondit a referenciafeszültségen majd gondold át. Az semmit sem szűr a nagyfrekvenciás zajokból, ráadásul potenciálisan stabilitási problémák lehetnek vele. A trimmerre semmi szükség. Használj két nagy értékű ellenállást ellenállásosztóban egy 100nF-os kondival szűrve. A referenciafeszt (virtuális föld) úgyis a tápfesz közepén lesz a legjobb elhelyezned. A másik lehetőség, hogy egy "charge pump" IC-vel csinálsz magadnak negatív tápfeszt, ekkor azonban gond lehet a használt műveleti erősítőiddel (túl nagy lesz a tápfesz).
Szerintem érdemes körbenézni az ARM-es digit szkóp projectek között (van egy pár darab), onnan lehet ötleteket meríteni. Nekem van is egy DSO138-asom, a régebbi verziós szoftverének elérhető a forráskódja. Ugyanezzel a 48 lábú stm32f103-al van az is megcsinálva, igaz az csak egy csatornás. Az stm32f429-et tartalmazó discovery panelemhez is van szkóp project forrásostul, az már több csatornás.
Amúgy nem túl lassú az SPI kijelző ehhez? A DSO138-ban 8bites párhuzamos a kijelző, a discovery-n meg 18bites párhuzamos, ott nincs is sebesség probléma.
Amikor a feleségemnek azt javasolgatom, hogy nem kell főzni, rendeljünk ebédet, finoman szólva is elhajt a csudába. Hagyni kell a gyermeket önállóan játszani, nem kell készen mindent a kezébe adni.
A DSO138 egy csatornás, nincs benne PGA és egy rahedli pénzért adják. Annyiba kerül, amennyit szerintem nem ér. A hozzászólás módosítva: Jan 27, 2017
|
Bejelentkezés
Hirdetés |