[elektro] Nuvoton Cortex-M0
Bali Zoltan
eltexto at freemail.hu
Thu Oct 27 19:47:29 CEST 2011
Szia Gábor !
Köszönöm a részletes válaszod.
> Hasonló a probléma DEBUG üzemmódban, a DAP egységnek is van saját
regisztere ezt kell megfelelően beállítani.
Erről semmit nem találtam, az ARM infós oldalán sem. Vagyis keveset.
>Szerencsés vagy, mert a DEBUG interface SLEEP üzemmódban a gyári
(RSET) utáni állapotban nem müködik :-) ( ...
Közben rájöttem, nálam azért működik, mert debug alatt nem engedi
SLEEP-be (pontosabban DEEP SLEEP-be).
>A bemenetnek állított port lebegése miatt akármilyen állapotot vehet
fel és ez fogyasztással járhat,
Igen, ez volt a probléma. Felhúzókkal már jó. Pedig a nem használt
kapuk bemenetét mindig GND-re szoktam
kötni, pont ezek miatt.
>A M0-ban állítható a WIC érzékenysége, fel-le futó élre ezt kéne
megkeresni...
Hát elvileg be van állítva, itt a forrás:
void main (void)
{
/* Unlock protected registers */
UNLOCKREG();
/* Default HCLK source is from 22MHz ... */
/* can not disable 22MHZ before change HCLK Source */
DrvSYS_SetOscCtrl(E_SYS_OSC22M, 1);
DrvSYS_SetOscCtrl(E_SYS_OSC10K, 1);
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
DrvSYS_SetOscCtrl(E_SYS_XTL32K, 1);
/* Waiting for 12M Xtal stalble */
DrvSYS_Delay(5000);
/* Set target HCLK from 12MHz and it's between 25MHz~50MHz. */
DrvSYS_Open(50000*1000);
/* Set HCKL to HCKL/(n+1) */
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);
DrvSYS_Delay(5000);
/* Enable debounce on PB15 */
// DrvGPIO_EnableDebounce(E_GPB,15);
/* 2^13 DBCLKSRC_10K cycle interrupt window approx 0.8sec */
// GPIO_DBNCECON->DBNCECON.DBCLKSEL = 13 ;
/* RC 10kHz osc. source */
// GPIO_DBNCECON->DBNCECON.DBCLKSRC = 1 ;
/* 1k pullup on PB15 and button+220R puldown */
/* Make PB15 /INT1 input mode */
DrvGPIO_Open(E_GPB,15,E_IO_INPUT);
/* Enable interrupt on /INT1 pin */
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_EDGE,NULL);
/* Pull down LED */
DrvGPIO_ClrBit(E_GPB,0);
while(1)
{
/* Shut off LED */
DrvGPIO_Open(E_GPB,0,E_IO_INPUT);
/* Wait any time */
DrvSYS_Delay(50000);
/* Unlock protected registers */
UNLOCKREG();
/* SLEEPDEEP enable */
SCB->SCR = 4;
/* PD.WeakUp interrupt disbaled */
SYSCLK->PWRCON.PD_WU_INT_EN = 0;
/* SleepDeep wait for cpu _WFI() */
SYSCLK->PWRCON.PD_WAIT_CPU = 1;
/* Enable PowerDown mode */
SYSCLK->PWRCON.PWR_DOWN_EN = 1;
/* Lock protected registers */
LOCKREG();
/* Wait any time */
DrvSYS_Delay(5000);
/* Now deep sleep */
__WFI();
/* Make PB0 (LED) output */
DrvGPIO_Open(E_GPB,0,E_IO_OUTPUT);
/* Wait any time */
DrvSYS_Delay(2000000);
}
}
Már áttettem az INT1-re, hátha, de ugyanaz. Ha a gombot
lenyomva tartom, felvillan a led rövid időre és elalszik,
ekkor megy el deep sleep-be. Ha még ekkor is lenyomva
volt a gomb, többet nem éled fel. Ha a led kialvás előtt
elengedem akkor a következő nyomásra feléled.
Próbáltam a GPIO Debounce-t is, ICE alatt jól működik,
érthetően, mert akkor nem megy deep sleep-be és a _WFI()
miatt működik jól. Viszont ICE nélkül újraindítva, a gombra azonnal
felébred, nem várja ki a debounce "window" végét ~0.8sec.
Szóval ez sem igazán úgy működik ahogy elvárnám.
Átgondoltam, végül is így is tudom használni.
Köszi
Üdv. Zoli
2011. 10. 26. 22:07 keltezéssel, hg12345 írta:
> Szia
>
> A M0-ban állítható a WIC érzékenysége, fel-le futó élre ezt kéne megkeresni...
> Hasonló a probléma DEBUG üzemmódban, a DAP egységnek is van saját regisztere ezt kell megfelelően beállítani.
> nagyobb probléma erről nem írnak a NU .pdf, ezek a ARM, honlapjáról letölthetőek, ill CMSIS header és .C file-k ezeket a definiciókat és ezt kezelő függvényeket tartalmazzák.
>
> Szerencsés vagy, mert a DEBUG interface SLEEP üzemmódban a gyári (RSET) utáni állapotban nem müködik :-) (kondugurálni, kell mert SLEEP állapotban is órajelet kell kapnia a DAP-nak.)
>
>
> Amit irsz a perifériákról az igaz, de nem csak itt hanem minden uC-ben!
>
> A bemenetnek állított port lebegése miatt akármilyen állapotot vehet fel és ez fogyasztással járhat, ez tetszöleges értéket vehet fel, attól függően milyen környezeti hatások érik... pl közelisd meg az ujjaddal!
> Ha fel és lehúzó ellenállásokat bekacspolva hagyod, ez egyértelmű fogyasztás.
>
> Ha kimenetnek állítod a portot akkor az fixen kiadja jelet, és ha másik oldalon nincs fogyasztás akkor nem is folyik áram, mert ezek mind CMOS kapcsolókkal épülnek fel.... Ha megoldható még a bemeneteket is kimenet kell állítani mikor alszik a rendszer, ha megoldható, ha nem akkor célszerű áttervezni.
>
> A modern uC (mint pl.: ARM CORTEX Mxxx) a perifériák egyenként kikapcsolhatóak és elvehető tülük az órajel. Ezzel további uA lehet megspórolni.
>
> Bali Zoltan<eltexto at freemail.hu> írta:
>
>> Hali!>
>>
>>
> PowerDown módot még sohasem használtam>
> procikon. Normális, hogy a GPIO interrupt>
> csak akkor ébreszti a procit, ha lefekvés>
> előtti IO szint, (lefutó élre beállításnál) magas.>
> Ha lefekvés előtt alacsonyat érzékelt, akkor>
> a lefutó élre nem kel fel.>
> Ez normális vagy elkeféltem valamit ?>
> ICE alatt viszont jól működik. Viszont>
> akkor nem megy el mélyen aludni, mérés>
> szerint fogyaszt.>
>
>>
> Apropó, fogyasztás. A mélyen alvó módban, csak>
> ha a portbitek módját, a reset szerint hagyom,>
> akkor hajlandó ~20uA körül fogyasztani.>
> Viszont ebben a port módban ( Quasi Bidir)>
> ~50uA felhúzók vannak, amit szívnak a külső>
> táplálás nélkül levő perifériák -> már le is merült>
> az elemem :). Viszont, ha a nagy impedanciás>
> input módba teszem a bemeneteket, akkor>
> felmegy a fogyasztás alváskor. Attól függően,>
> mennyi portbitet konfigolok inputra, úgy nő a>
> fogyasztás. Már másik módokat is próbáltam,>
> de mindig nő a fogyasztás. Nem értem. Valamit>
> biztos nem jól csinálok. Ölteletek ?>
>
>>
> Köszi>
>
>>
More information about the Elektro
mailing list