[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