mapp_pwr.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  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. if (gtPwrCfg.taskTmr <= OS_TIMER_1S) {
  167. break;
  168. }
  169. gtPwrCfg.taskTmr = 0;
  170. gtPwrCfg.state++;
  171. break;
  172. case POWER_ON_RESET9212:
  173. if (gtPwrCfg.taskTmr <= OS_TIMER_2S) {
  174. break;
  175. }
  176. gtPwrCfg.state++;
  177. break;
  178. case POWER_ON_CONFIG:
  179. gtPwrCfg.taskTmr =0;
  180. gtPwrCfg.state++;
  181. break;
  182. case POWER_ON_INIT: /* Init module hardware */
  183. // if (gtPwrCfg.taskTmr <= WAIT_SYS_RUN_TIMER) {
  184. // break;
  185. // }
  186. // gtArm.i2cstate = I2C_ON_RESET;
  187. gtPwrCfg.CanLostTmr =0;
  188. gtPwrCfg.taskTmr =0;
  189. gtPwrCfg.state++;
  190. break;
  191. case POWER_LED_IO_INIT:
  192. if (gtPwrCfg.taskTmr <= WAIT_SYS_RUN_TIMER) {
  193. break;
  194. }
  195. gtPwrCfg.state++;
  196. break;
  197. case POWER_SYSTEM_RUN:
  198. //------------------------------------------------------------------
  199. // monitor system ACC state.
  200. // 21:54pm, 27.Nov.2012, modified by Sirius
  201. //------------------------------------------------------------------
  202. // OSQPost(ArmMsgQueue, ARM_MSG_KEY, 0); //dwdtest
  203. break;
  204. case POWER_OFF_INIT:
  205. //------------------------------------------------------------------
  206. // Sleep if all communication finished, otherwise recover.
  207. // 21:57pm, 27.Nov.2012, modified by Sirius
  208. //------------------------------------------------------------------
  209. if (gtPwrCfg.taskTmr <= WAIT_SYS_OFF_TIMER) {
  210. break;
  211. }
  212. gtPwrCfg.taskTmr = 0;
  213. gtPwrCfg.state = POWER_OFF_SLEEP;
  214. break;
  215. case POWER_OFF_SLEEP:
  216. //------------------------------------------------------------------
  217. // Wait 100ms for CAN sleep process stable.
  218. //------------------------------------------------------------------
  219. if (gtPwrCfg.taskTmr < OS_TIMER_100MS) {
  220. break;
  221. }
  222. //Befor_goto_Stop();
  223. EXTI_KEY_Init(); //外部中断初始化
  224. Sys_Stop();//可以用外部中断唤醒,如PB0
  225. SystemInit();
  226. gtArm.workmode =1;
  227. if (SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC))
  228. {
  229. /* Capture error */
  230. while (1);
  231. }
  232. gtPwrCfg.state = POWER_LED_IO_INIT;
  233. gtPwrCfg.taskTmr = 0;
  234. break;
  235. default:
  236. break;
  237. }
  238. }
  239. /*----------------------------------------------------------------------
  240. // Function uses : PwrTaskTmr
  241. // Input parameter :
  242. // Output parameter :
  243. // Use Function :
  244. // Reserve date : 09:11am, 30.Aug.2012, written by Sirius
  245. ----------------------------------------------------------------------*/
  246. void PwrTaskTmr(void)
  247. {
  248. if (gtPwrCfg.taskTmr != 0xffff) {gtPwrCfg.taskTmr++;}
  249. if (gtPwrCfg.CanLostTmr != 0xffff) {gtPwrCfg.CanLostTmr++;}
  250. }
  251. /*----------------------------------------------------------------------
  252. // Function uses : PwrWakeupISRHandler
  253. // Input parameter :
  254. // Output parameter :
  255. // Use Function : External wake-up ISR for system power.
  256. // Reserve date : 19:34pm, 01.Mar.2013, written by Sirius
  257. ----------------------------------------------------------------------*/
  258. void PwrWakeupISRHandler(void)
  259. {
  260. if (EXTI_GetITStatus(WAKE_UP_EXTI_LINE) != RESET) {
  261. /* Clear the Key Button EXTI line pending bit */
  262. EXTI_ClearFlag(WAKE_UP_EXTI_LINE);
  263. //EXTI->IMR &= ~EXTI_Line12;
  264. gtPwrCfg.sleepState = FALSE;
  265. }
  266. }
  267. //---------------------------------------------------------------------------
  268. /*----------------------------------------------------------------------
  269. // Function uses : s_PwrPeripheralCfg
  270. // Input parameter : 'stat': DISABLE or ENABLE.
  271. // Output parameter :
  272. // Use Function : disalbe or re-enable peripheral & interrupt before system sleep.
  273. // Reserve date : 09:45am, 28.Nov.2012, written by Sirius
  274. ----------------------------------------------------------------------*/
  275. static void s_PwrPeripheralCfg(FunctionalState stat)
  276. {
  277. if (stat == DISABLE) {
  278. ADC_Cmd(ADC1, stat);
  279. Uart1CfgDisable();
  280. SysTick->CTRL &= (U32)(~SysTick_CTRL_ENABLE_Msk);
  281. } else {
  282. GpioCfgInit();
  283. Uart1CfgInit();
  284. //AdcCfgInit();
  285. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  286. }
  287. }
  288. /*----------------------------------------------------------------------
  289. // Function uses : s_PwrRCCCfg
  290. // Input parameter : 'stat': DISABLE or ENABLE.
  291. // Output parameter :
  292. // Use Function : Configure RCC for power module.
  293. // Reserve date : 20:06pm, 04.Mar.2013, written by Sirius
  294. ----------------------------------------------------------------------*/
  295. static void s_PwrRCCCfg(FunctionalState stat)
  296. {
  297. if (stat == DISABLE) {
  298. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,DISABLE);
  299. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
  300. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE);
  301. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE);
  302. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, DISABLE);
  303. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, DISABLE);
  304. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, DISABLE);
  305. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, DISABLE);
  306. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, DISABLE);
  307. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
  308. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
  309. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, DISABLE);
  310. //#if 0 //dwd170224
  311. RCC_HSICmd(ENABLE);
  312. while ((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY){} /* Wait till HSI ready */
  313. IWDG_ReloadCounter();
  314. RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  315. while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI){} /* Wait till HSI used as system clock source */
  316. IWDG_ReloadCounter();
  317. RCC_PLLCmd(DISABLE);
  318. //RCC_PLL2Cmd(DISABLE);
  319. RCC_HSEConfig(RCC_HSE_OFF);
  320. while ((RCC->CR & RCC_CR_HSERDY) == RCC_CR_HSERDY){} /* Wait till HSE OFF */
  321. FLASH_SetLatency(FLASH_Latency_0);
  322. RCC_HCLKConfig(RCC_SYSCLK_Div16);///125k
  323. IWDG_ReloadCounter();
  324. // #endif
  325. } else {
  326. //#if 0 //dwd170224
  327. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  328. FLASH_SetLatency(FLASH_Latency_1);
  329. IWDG_ReloadCounter();
  330. RCC_HSEConfig(RCC_HSE_ON);
  331. while ((RCC->CR & RCC_CR_HSERDY) != RCC_CR_HSERDY){} /* Wait till HSE ON */
  332. IWDG_ReloadCounter();
  333. //RCC_PLL2Cmd(ENABLE);
  334. //while ((RCC->CR & RCC_CR_PLL2RDY) != RCC_CR_PLL2RDY){} /* Wait till PLL2 ON */
  335. //IWDG_ReloadCounter();
  336. RCC_PLLCmd(ENABLE);
  337. while ((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY){} /* Wait till PLL ON */
  338. IWDG_ReloadCounter();
  339. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  340. while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL){} /* Wait till HSE used as system clock source */
  341. IWDG_ReloadCounter();
  342. // #endif
  343. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  344. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  345. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  346. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  347. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);
  348. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
  349. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  350. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  351. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  352. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  353. //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  354. }
  355. }
  356. /*------------------------------- E O F ----------------------------------------*/