Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 #include "board.h"
00083
00084 #include <stdint.h>
00085 #include <stdio.h>
00086
00087
00088
00089
00090
00091
00092 #define SCR_SLEEPDEEP (0x1 << 2)
00093
00094 #define CONSOLE_EDBG
00095
00096
00097
00098
00099
00100 const uint32_t gWakeUpPinId = (1 << WKUP_IDX);
00101
00102
00103
00104
00105
00106 #if defined CONSOLE_EDBG
00107
00108
00109
00110 void USART1_Handler(void)
00111 {
00112 USART_GetChar(USART1);
00113 }
00114 #else
00115 void UART0_Handler(void)
00116 {
00117 UART_GetChar(UART0);
00118 }
00119 #endif
00120
00121
00122
00123
00124 static void _InitChip(void)
00125 {
00126 uint32_t tmp;
00127
00128
00129 PIOA -> PIO_ODR = 0xFFFFFFFF;
00130 PIOB -> PIO_ODR = 0xFFFFFFFF;
00131 PIOC -> PIO_ODR = 0xFFFFFFFF;
00132 PIOD -> PIO_ODR = 0xFFFFFFFF;
00133 PIOE -> PIO_ODR = 0xFFFFFFFF;
00134
00135 PIOA ->PIO_PPDDR = 0xFFFFFFFF;
00136 PIOA ->PIO_PUDR = 0xFFFFFFFF;
00137 PIOA ->PIO_PPDER = 0;
00138 PIOA ->PIO_PUER = 0xFFFFFFFF;
00139
00140 PIOB ->PIO_PPDDR = 0xFFFFFFFF;
00141 PIOB ->PIO_PUDR = 0xFFFFFFFF;
00142 PIOB ->PIO_PPDER = 0x0;
00143 PIOB ->PIO_PUER = 0xFFFFFFFF;
00144
00145 PIOC ->PIO_PPDDR = 0xFFFFFFFF;
00146 PIOC ->PIO_PUDR = 0xFFFFFFFF;
00147 PIOC ->PIO_PPDER = 0;
00148 PIOC ->PIO_PUER = 0xFFFFFFFF;
00149
00150 PIOD ->PIO_PPDDR = 0xFFFFFFFF;
00151 PIOD ->PIO_PUDR = 0xFFFFFFFF;
00152 PIOD ->PIO_PPDER = 0;
00153 PIOD ->PIO_PUER = 0xFFFFFFFF;
00154
00155 PIOE ->PIO_PPDDR = 0xFFFFFFFF;
00156 PIOE ->PIO_PUDR = 0xFFFFFFFF;
00157 PIOE ->PIO_PPDER = 0;
00158 PIOE ->PIO_PUER = 0xFFFFFFFF;
00159
00160 tmp = SUPC_MR_KEY_PASSWD;
00161 tmp |= ((SUPC -> SUPC_MR) &( ~(1u << 17)));
00162 SUPC->SUPC_MR |= tmp;
00163
00164
00165 PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN;
00166
00167
00168 PMC->PMC_SCDR = 0xFFFFFFFF;
00169
00170
00171 PMC_DisableAllPeripherals();
00172 }
00173
00174
00175
00176
00177
00178
00179 static void _SetFastStartupInput(uint32_t dwInputs)
00180 {
00181 PMC->PMC_FSMR &= (uint32_t)~0xFFF00000;
00182 PMC->PMC_FSMR |= dwInputs;
00183 }
00184
00185
00186
00187
00188
00189 static void enterWaitMode(void)
00190 {
00191 printf("-I- Enter in Wait Mode\n\r");
00192 printf("-I- Press WAKE UP button to wakeup\n\r");
00193
00194
00195 PMC_SetMckSelection(PMC_MCKR_CSS_SLOW_CLK, PMC_MCKR_PRES(0));
00196
00197 PMC_EnableIntRC4_8_12MHz(CKGR_MOR_MOSCRCF_4_MHz);
00198
00199 PMC_SetMckSelection(PMC_MCKR_CSS_MAIN_CLK, PMC_PCK_PRES(0));
00200
00201 PMC_SetPllaClock(0, 0);
00202
00203
00204 _SetFastStartupInput( gWakeUpPinId );
00205
00206 PMC->PMC_FSMR |= PMC_FSMR_FLPM_FLASH_DEEP_POWERDOWN | PMC_FSMR_LPM;
00207
00208 EFC->EEFC_FMR = EEFC_FMR_FWS(0);
00209
00210 SCB->SCR &= (uint32_t)~SCR_SLEEPDEEP;
00211
00212
00213 PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | CKGR_MOR_WAITMODE;
00214
00215 while (!(PMC->PMC_SR & PMC_SR_MCKRDY));
00216 __WFE();
00217
00218
00219 PMC_SetMckSelection(PMC_MCKR_CSS_SLOW_CLK, PMC_MCKR_PRES_CLK_1);
00220 LowLevelInit();
00221 DBG_Configure(115200, BOARD_MCK);
00222
00223 printf("-I- Exit Wait Mode\n\r");
00224 }
00225
00226
00227
00228
00229 static void enterSleepMode(void)
00230 {
00231 printf("-I- Enter in Sleep Mode\n\r");
00232 printf("-I- Press any key to wakeup\n\r");
00233
00234
00235
00236
00237
00238 PMC->PMC_FSMR &= (uint32_t)~PMC_FSMR_LPM;
00239 SCB->SCR &= (uint32_t)~SCR_SLEEPDEEP;
00240
00241
00242
00243 #if defined CONSOLE_EDBG
00244 NVIC_ClearPendingIRQ(USART1_IRQn);
00245 NVIC_EnableIRQ(USART1_IRQn);
00246 USART_EnableIt(USART1,UART_IER_RXRDY);
00247 #else
00248 NVIC_ClearPendingIRQ(UART0_IRQn);
00249 NVIC_EnableIRQ(UART0_IRQn);
00250 UART_EnableIt(UART0,UART_IER_RXRDY);
00251 #endif
00252
00253
00254 __WFI();
00255 printf("-I- Processor wake-up is triggered by an interrupt \n\r");
00256 printf("-I- Exit Sleep Mode\n\r" );
00257 }
00258
00259
00260
00261
00262 static void enterBackupMode(void)
00263 {
00264 printf( "-I- Enter in Backup Mode\n\r" );
00265 printf( "-I- Press WAKE UP button to wakeup\n\r");
00266
00267 SUPC->SUPC_WUIR = (gWakeUpPinId << 16) | gWakeUpPinId;
00268 PMC->PMC_FSMR = PMC_FSMR_FLPM_FLASH_DEEP_POWERDOWN | gWakeUpPinId;
00269
00270 SCB->SCR |= SCR_SLEEPDEEP;
00271
00272 SUPC->SUPC_CR = SUPC_CR_KEY_PASSWD | SUPC_CR_VROFF_STOP_VREG;
00273 SUPC->SUPC_WUMR = (1 << 12);
00274
00275
00276
00277
00278
00279
00280
00281
00282 printf("-I- Processor wake-up is triggered by WAKEUP button \n\r");
00283 printf("-I- Exit backup Mode\n\r");
00284 while (1);
00285 }
00286
00287
00288
00289
00290 static void _DisplayMenuCore( void )
00291 {
00292 printf("\n\r");
00293 printf("===========================================================\n\r");
00294 printf("Menu: press a key to select low power mode.\n\r");
00295 printf("===========================================================\n\r");
00296 printf("Configure:\n\r");
00297 printf(" S : Sleep mode\n\r");
00298 printf(" W : Wait mode\n\r");
00299 printf(" B : Backup mode\n\r");
00300 }
00301
00302
00303
00304
00305 static void lowPowerMode(void)
00306 {
00307 uint8_t ucKey;
00308
00309 while (1) {
00310 _DisplayMenuCore();
00311 ucKey = DBG_GetChar();
00312 switch (ucKey) {
00313 case 's':
00314 case 'S':
00315 enterSleepMode();
00316 break;
00317
00318 case 'w':
00319 case 'W':
00320 enterWaitMode();
00321 break;
00322
00323 case 'b':
00324 case 'B':
00325 enterBackupMode();
00326 break;
00327
00328 default:
00329 printf("This menu does not exist !\n\r");
00330 break;
00331 }
00332 }
00333 }
00334
00335
00336
00337
00338
00339
00340 int main(void)
00341 {
00342
00343 WDT_Disable(WDT);
00344
00345
00346 SCB_EnableICache();
00347 SCB_EnableDCache();
00348
00349
00350 _InitChip();
00351
00352
00353 printf("\n\r\n\r\n\r");
00354 printf("-- Low-power Example %s --\n\r", SOFTPACK_VERSION );
00355 printf("-- %s\n\r", BOARD_NAME);
00356 printf("-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__, COMPILER_NAME);
00357
00358
00359 lowPowerMode();
00360 return 0;
00361 }