Contiki 2.6
|
00001 /** @file micro-common.c 00002 * @brief STM32W108 micro specific HAL functions common to 00003 * full and minimal hal 00004 * 00005 * 00006 * <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. --> 00007 */ 00008 00009 00010 00011 #include PLATFORM_HEADER 00012 #include BOARD_HEADER 00013 #include "error.h" 00014 #include "hal/micro/micro-common.h" 00015 #include "hal/micro/cortexm3/micro-common.h" 00016 00017 void halInternalEnableWatchDog(void) 00018 { 00019 //Just to be on the safe side, restart the watchdog before enabling it 00020 WDOG_RESET = 1; 00021 WDOG_KEY = 0xEABE; 00022 WDOG_CFG = WDOG_ENABLE; 00023 } 00024 00025 void halInternalResetWatchDog(void) 00026 { 00027 //Writing any value will restart the watchdog 00028 WDOG_RESET = 1; 00029 } 00030 00031 void halInternalDisableWatchDog(int8u magicKey) 00032 { 00033 if (magicKey == MICRO_DISABLE_WATCH_DOG_KEY) { 00034 WDOG_KEY = 0xDEAD; 00035 WDOG_CFG = WDOG_DISABLE; 00036 } 00037 } 00038 00039 boolean halInternalWatchDogEnabled(void) 00040 { 00041 if(WDOG_CFG&WDOG_ENABLE) { 00042 return TRUE; 00043 } else { 00044 return FALSE; 00045 } 00046 } 00047 00048 void halGpioConfig(int32u io, int32u config) 00049 { 00050 static volatile int32u *const configRegs[] = 00051 { (volatile int32u *)GPIO_PACFGL_ADDR, 00052 (volatile int32u *)GPIO_PACFGH_ADDR, 00053 (volatile int32u *)GPIO_PBCFGL_ADDR, 00054 (volatile int32u *)GPIO_PBCFGH_ADDR, 00055 (volatile int32u *)GPIO_PCCFGL_ADDR, 00056 (volatile int32u *)GPIO_PCCFGH_ADDR }; 00057 int32u portcfg; 00058 portcfg = *configRegs[io/4]; // get current config 00059 portcfg = portcfg & ~((0xF)<<((io&3)*4)); // mask out config of this pin 00060 *configRegs[io/4] = portcfg | (config <<((io&3)*4)); 00061 } 00062 00063 void halGpioSet(int32u gpio, boolean value) 00064 { 00065 if(gpio/8 < 3) { 00066 if (value) { 00067 *((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7); 00068 } else { 00069 *((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7); 00070 } 00071 } 00072 } 00073 00074 int16u halInternalStartSystemTimer(void) 00075 { 00076 //Since the SleepTMR is the only timer maintained during deep sleep, it is 00077 //used as the System Timer (RTC). We maintain a 32 bit hardware timer 00078 //configured for a tick value time of 1024 ticks/second (0.9765625 ms/tick) 00079 //using either the 10 kHz internal SlowRC clock divided and calibrated to 00080 //1024 Hz or the external 32.768 kHz crystal divided to 1024 Hz. 00081 //With a tick time of ~1ms, this 32bit timer will wrap after ~48.5 days. 00082 00083 //disable top-level interrupt while configuring 00084 INT_CFGCLR = INT_SLEEPTMR; 00085 00086 #ifdef ENABLE_OSC32K 00087 #ifdef DIGITAL_OSC32_EXT 00088 //Disable both OSC32K and SLOWRC if using external digital clock input 00089 SLEEPTMR_CLKEN = 0; 00090 #else//!DIGITAL_OSC32_EXT 00091 //Enable the 32kHz XTAL (and disable SlowRC since it is not needed) 00092 SLEEPTMR_CLKEN = SLEEPTMR_CLK32KEN; 00093 #endif 00094 //Sleep timer configuration is the same for crystal and external clock 00095 SLEEPTMR_CFG = (SLEEPTMR_ENABLE | //enable TMR 00096 (0 << SLEEPTMR_DBGPAUSE_BIT)| //TMR paused when halted 00097 (5 << SLEEPTMR_CLKDIV_BIT) | //divide down to 1024Hz 00098 (1 << SLEEPTMR_CLKSEL_BIT)) ; //select XTAL 00099 #else //!ENABLE_OSC32K 00100 //Enable the SlowRC (and disable 32kHz XTAL since it is not needed) 00101 SLEEPTMR_CLKEN = SLEEPTMR_CLK10KEN; 00102 SLEEPTMR_CFG = (SLEEPTMR_ENABLE | //enable TMR 00103 (0 << SLEEPTMR_DBGPAUSE_BIT)| //TMR paused when halted 00104 (0 << SLEEPTMR_CLKDIV_BIT) | //already 1024Hz 00105 (0 << SLEEPTMR_CLKSEL_BIT)) ; //select SlowRC 00106 #ifndef DISABLE_RC_CALIBRATION 00107 halInternalCalibrateSlowRc(); //calibrate SlowRC to 1024Hz 00108 #endif//DISABLE_RC_CALIBRATION 00109 #endif//ENABLE_OSC32K 00110 00111 //clear out any stale interrupts 00112 INT_SLEEPTMRFLAG = (INT_SLEEPTMRWRAP | INT_SLEEPTMRCMPA | INT_SLEEPTMRCMPB); 00113 //turn off second level interrupts. they will be enabled elsewhere as needed 00114 INT_SLEEPTMRCFG = INT_SLEEPTMRCFG_RESET; 00115 //enable top-level interrupt 00116 INT_CFGSET = INT_SLEEPTMR; 00117 00118 return 0; 00119 } 00120 00121