mapp_pwr.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. //==================================================================
  2. //
  3. // Filename: mapp_pwr.c
  4. // Description: Power driver
  5. //
  6. //------------------------------------------------------------------
  7. //
  8. // version:
  9. // date: 23:54pm, 08.Apr.2012, by Sirius
  10. // Description:
  11. //
  12. //------------------------------------------------------------------
  13. //==================================================================
  14. /*------------------------------------------------------------------------------
  15. * I N C L U D E
  16. *------------------------------------------------------------------------------*/
  17. #include "stm32f0xx.h"
  18. #include "general.h"
  19. #include "main.h"
  20. #include "mapp_can.h"
  21. #include "mapp_ext.h"
  22. #include "mapp_gpio.h"
  23. #include "mapp_pwr.h"
  24. #include "mapp_msg.h"
  25. #include "mapp_arm.h"
  26. #include "mapp_uart1.h"
  27. #include "mapp_arm.h"
  28. /*------------------------------------------------------------------------------
  29. * D E F I N E
  30. *------------------------------------------------------------------------------*/
  31. /* Macro define for start or sleep wait timer */
  32. #define WAIT_SYS_OFF_TIMER (OS_TIMER_1S) /* Timer: ON -> SLEEP */
  33. #define WAIT_SYS_RUN_TIMER (OS_TIMER_5S) /* Timer: SLEEP ->ON */
  34. /* Wake-up EXTI define for sleep mode */
  35. #define WAKE_UP_GPIO_PORT (EXTI_PortSourceGPIOC) /* Timer: ON -> SLEEP */
  36. #define WAKE_UP_GPIO_PIN (GPIO_PinSource5) /* Timer: ON -> SLEEP */
  37. #define WAKE_UP_EXTI_LINE (EXTI_Line5) /* Timer: ON -> SLEEP */
  38. #define WAKE_UP_EXTI_EDGE (EXTI_Trigger_Falling) /* Timer: ON -> SLEEP */
  39. /*------------------------------------------------------------------------------
  40. * S T R U C T
  41. *------------------------------------------------------------------------------*/
  42. /*------------------------------------------------------------------------------
  43. * S T A T I C - V A R I A B L E S
  44. *------------------------------------------------------------------------------*/
  45. T_PWR_CFG gtPwrCfg ;
  46. /*------------------------------------------------------------------------------
  47. * E X T E R N
  48. *------------------------------------------------------------------------------*/
  49. /*------------------------------------------------------------------------------
  50. * P R O T O T Y P E
  51. *------------------------------------------------------------------------------*/
  52. static void s_PwrPeripheralCfg(FunctionalState stat);
  53. static void s_PwrRCCCfg(FunctionalState stat);
  54. /*----------------------------------------------------------------------
  55. // Function uses : PwrVarInit
  56. // Input parameter :
  57. // Output parameter :
  58. // Use Function : Power task variables init.
  59. // Reserve date : 20:34pm, 01.Mar.2013, written by Sirius
  60. ----------------------------------------------------------------------*/
  61. void PwrVarInit(void)
  62. {
  63. gtPwrCfg.state = POWER_ON_RESET;
  64. gtPwrCfg.taskTmr = 0;
  65. gtPwrCfg.sleepMode = SLEEP_INTO_NORMAL;
  66. gtPwrCfg.sleepState = FALSE;
  67. gtPwrCfg.CanLostTmr =0;
  68. }
  69. /***************************************
  70. * 函数描述:外部中断0服务程序
  71. * 输入参数:No
  72. * 返 回 值:No
  73. * 说 明:
  74. * 修改记录:
  75. ****************************************/
  76. void DMA1_Channel4_5_IRQHandler(void)
  77. {
  78. if(EXTI_GetITStatus(EXTI_Line14) != RESET)//判断线0上的中断是否发生,可以理解为标志位
  79. {
  80. /* Toggle LED3 and LED4 */
  81. // GPIO_WriteBit(GPIOC, GPIO_Pin_8,
  82. // (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8))));
  83. // GPIO_WriteBit(GPIOC, GPIO_Pin_9,
  84. // (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9))));
  85. /* Clear the EXTI line 0 pending bit */
  86. EXTI_ClearITPendingBit(EXTI_Line14);//清除LINE0上的中断标志位
  87. }
  88. }
  89. void Sys_Stop(void)
  90. {
  91. SysTick->CTRL = 0x00;
  92. SysTick->VAL = 0x00;
  93. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
  94. PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  95. }
  96. /***************************************
  97. * 函数描述:外部中断初始化
  98. * 输入参数:No
  99. * 返 回 值:No
  100. * 说 明:
  101. * 修改记录:
  102. ****************************************/
  103. void EXTI_KEY_Init(void)
  104. {
  105. EXTI_InitTypeDef EXTI_InitStructure;
  106. NVIC_InitTypeDef NVIC_InitStructure;
  107. GPIO_InitTypeDef GPIO_InitStructure;
  108. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  109. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
  110. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  111. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  112. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  113. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  114. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  115. GPIO_Init(GPIOA, &GPIO_InitStructure);
  116. GPIO_SetBits(GPIOA, GPIO_Pin_10);
  117. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
  118. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  119. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  120. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  121. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  122. GPIO_Init(GPIOF, &GPIO_InitStructure);
  123. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource0);
  124. /* Configure Button EXTI line */
  125. EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  126. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  127. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  128. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  129. EXTI_Init(&EXTI_InitStructure);
  130. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
  131. NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  132. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  133. NVIC_Init(&NVIC_InitStructure);
  134. /*
  135. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能系统时钟配置
  136. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource14); //配置GPIO与中断线的映射关系
  137. EXTI_InitStruct.EXTI_Line = EXTI_Line14; //中断线标号0
  138. EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //外部中断模式
  139. EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //下降沿中断
  140. EXTI_InitStruct.EXTI_LineCmd = ENABLE; //中断线使能
  141. EXTI_Init(&EXTI_InitStruct);
  142. NVIC_InitStruct.NVIC_IRQChannel = EXTI4_15_IRQn;
  143. NVIC_InitStruct.NVIC_IRQChannelPriority = 0x00;
  144. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  145. NVIC_Init(&NVIC_InitStruct);*/
  146. }
  147. /*----------------------------------------------------------------------
  148. // Function uses : PwrTask
  149. // Input parameter :
  150. // Output parameter :
  151. // Use Function : Main task for power manage.
  152. // Reserve date : 20:07pm, 20.Feb.2013, written by Sirius
  153. ----gtPwrCfg.state------------------------------------------------------------------*/
  154. void PwrTask(void)
  155. {
  156. switch (gtPwrCfg.state) {
  157. case POWER_ON_RESET:
  158. gtPwrCfg.state++;
  159. //------------------------------------------------------------------
  160. // clear task timer before start.
  161. // 21:59pm, 29.Aug.2012, modified by Sirius
  162. //------------------------------------------------------------------
  163. gtPwrCfg.taskTmr = 0;
  164. break;
  165. case POWER_ON_WAIT:
  166. gtPwrCfg.taskTmr = 0;
  167. gtPwrCfg.state++;
  168. break;
  169. case POWER_ON_RESET9212:
  170. gtPwrCfg.state++;
  171. break;
  172. case POWER_ON_CONFIG:
  173. gtPwrCfg.taskTmr =0;
  174. gtPwrCfg.state++;
  175. break;
  176. case POWER_ON_INIT: /* Init module hardware */
  177. // if (gtPwrCfg.taskTmr <= WAIT_SYS_RUN_TIMER) {
  178. // break;
  179. // }
  180. // gtArm.i2cstate = I2C_ON_RESET;
  181. gtPwrCfg.CanLostTmr =0;
  182. gtPwrCfg.taskTmr =0;
  183. gtPwrCfg.state++;
  184. break;
  185. case POWER_LED_IO_INIT:
  186. if (gtPwrCfg.taskTmr <= WAIT_SYS_RUN_TIMER) {
  187. break;
  188. }
  189. gtPwrCfg.state++;
  190. break;
  191. case POWER_SYSTEM_RUN:
  192. //------------------------------------------------------------------
  193. // monitor system ACC state.
  194. // 21:54pm, 27.Nov.2012, modified by Sirius
  195. //------------------------------------------------------------------
  196. // OSQPost(ArmMsgQueue, ARM_MSG_KEY, 0); //dwdtest
  197. break;
  198. case POWER_OFF_INIT:
  199. //------------------------------------------------------------------
  200. // Sleep if all communication finished, otherwise recover.
  201. // 21:57pm, 27.Nov.2012, modified by Sirius
  202. //------------------------------------------------------------------
  203. if (gtPwrCfg.taskTmr <= WAIT_SYS_OFF_TIMER) {
  204. break;
  205. }
  206. gtPwrCfg.taskTmr = 0;
  207. gtPwrCfg.state = POWER_OFF_SLEEP;
  208. break;
  209. case POWER_OFF_SLEEP:
  210. //------------------------------------------------------------------
  211. // Wait 100ms for CAN sleep process stable.
  212. //------------------------------------------------------------------
  213. if (gtPwrCfg.taskTmr < OS_TIMER_100MS) {
  214. break;
  215. }
  216. //Befor_goto_Stop();
  217. EXTI_KEY_Init(); //外部中断初始化
  218. Sys_Stop();//可以用外部中断唤醒,如PB0
  219. SystemInit();
  220. gtArm.workmode =1;
  221. if (SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC))
  222. {
  223. /* Capture error */
  224. while (1);
  225. }
  226. gtPwrCfg.state = POWER_LED_IO_INIT;
  227. gtPwrCfg.taskTmr = 0;
  228. break;
  229. default:
  230. break;
  231. }
  232. }
  233. /*----------------------------------------------------------------------
  234. // Function uses : PwrTaskTmr
  235. // Input parameter :
  236. // Output parameter :
  237. // Use Function :
  238. // Reserve date : 09:11am, 30.Aug.2012, written by Sirius
  239. ----------------------------------------------------------------------*/
  240. void PwrTaskTmr(void)
  241. {
  242. if (gtPwrCfg.taskTmr != 0xffff) {gtPwrCfg.taskTmr++;}
  243. if (gtPwrCfg.CanLostTmr != 0xffff) {gtPwrCfg.CanLostTmr++;}
  244. }
  245. /*----------------------------------------------------------------------
  246. // Function uses : PwrWakeupISRHandler
  247. // Input parameter :
  248. // Output parameter :
  249. // Use Function : External wake-up ISR for system power.
  250. // Reserve date : 19:34pm, 01.Mar.2013, written by Sirius
  251. ----------------------------------------------------------------------*/
  252. void PwrWakeupISRHandler(void)
  253. {
  254. if (EXTI_GetITStatus(WAKE_UP_EXTI_LINE) != RESET) {
  255. /* Clear the Key Button EXTI line pending bit */
  256. EXTI_ClearFlag(WAKE_UP_EXTI_LINE);
  257. //EXTI->IMR &= ~EXTI_Line12;
  258. gtPwrCfg.sleepState = FALSE;
  259. }
  260. }
  261. //---------------------------------------------------------------------------
  262. /*----------------------------------------------------------------------
  263. // Function uses : s_PwrPeripheralCfg
  264. // Input parameter : 'stat': DISABLE or ENABLE.
  265. // Output parameter :
  266. // Use Function : disalbe or re-enable peripheral & interrupt before system sleep.
  267. // Reserve date : 09:45am, 28.Nov.2012, written by Sirius
  268. ----------------------------------------------------------------------*/
  269. static void s_PwrPeripheralCfg(FunctionalState stat)
  270. {
  271. if (stat == DISABLE) {
  272. ADC_Cmd(ADC1, stat);
  273. Uart1CfgDisable();
  274. SysTick->CTRL &= (U32)(~SysTick_CTRL_ENABLE_Msk);
  275. } else {
  276. GpioCfgInit();
  277. //AdcCfgInit();
  278. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  279. }
  280. }
  281. /*----------------------------------------------------------------------
  282. // Function uses : s_PwrRCCCfg
  283. // Input parameter : 'stat': DISABLE or ENABLE.
  284. // Output parameter :
  285. // Use Function : Configure RCC for power module.
  286. // Reserve date : 20:06pm, 04.Mar.2013, written by Sirius
  287. ----------------------------------------------------------------------*/
  288. static void s_PwrRCCCfg(FunctionalState stat)
  289. {
  290. if (stat == DISABLE) {
  291. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,DISABLE);
  292. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
  293. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE);
  294. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE);
  295. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, DISABLE);
  296. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, DISABLE);
  297. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, DISABLE);
  298. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, DISABLE);
  299. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, DISABLE);
  300. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
  301. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
  302. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, DISABLE);
  303. //#if 0 //dwd170224
  304. RCC_HSICmd(ENABLE);
  305. while ((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY){} /* Wait till HSI ready */
  306. IWDG_ReloadCounter();
  307. RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  308. while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI){} /* Wait till HSI used as system clock source */
  309. IWDG_ReloadCounter();
  310. RCC_PLLCmd(DISABLE);
  311. //RCC_PLL2Cmd(DISABLE);
  312. RCC_HSEConfig(RCC_HSE_OFF);
  313. while ((RCC->CR & RCC_CR_HSERDY) == RCC_CR_HSERDY){} /* Wait till HSE OFF */
  314. FLASH_SetLatency(FLASH_Latency_0);
  315. RCC_HCLKConfig(RCC_SYSCLK_Div16);///125k
  316. IWDG_ReloadCounter();
  317. // #endif
  318. } else {
  319. //#if 0 //dwd170224
  320. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  321. FLASH_SetLatency(FLASH_Latency_1);
  322. IWDG_ReloadCounter();
  323. RCC_HSEConfig(RCC_HSE_ON);
  324. while ((RCC->CR & RCC_CR_HSERDY) != RCC_CR_HSERDY){} /* Wait till HSE ON */
  325. IWDG_ReloadCounter();
  326. //RCC_PLL2Cmd(ENABLE);
  327. //while ((RCC->CR & RCC_CR_PLL2RDY) != RCC_CR_PLL2RDY){} /* Wait till PLL2 ON */
  328. //IWDG_ReloadCounter();
  329. RCC_PLLCmd(ENABLE);
  330. while ((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY){} /* Wait till PLL ON */
  331. IWDG_ReloadCounter();
  332. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  333. while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL){} /* Wait till HSE used as system clock source */
  334. IWDG_ReloadCounter();
  335. // #endif
  336. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  337. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  338. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  339. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  340. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);
  341. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
  342. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  343. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  344. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  345. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  346. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  347. }
  348. }
  349. /*------------------------------- E O F ----------------------------------------*/