CH57x_pwr.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : CH57x_pwr.c
  3. * Author : WCH
  4. * Version : V1.0
  5. * Date : 2018/12/15
  6. * Description
  7. *******************************************************************************/
  8. #include "CH57x_common.h"
  9. /*******************************************************************************
  10. * Function Name : PWR_DCDCCfg
  11. * Description : 启用内部DC/DC电源,用于节约系统功耗
  12. * Input : s:
  13. ENABLE - 打开DCDC电源
  14. DISABLE - 关闭DCDC电源
  15. * Return : None
  16. *******************************************************************************/
  17. void PWR_DCDCCfg( UINT8 s )
  18. {
  19. if(s == DISABLE)
  20. {
  21. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  22. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  23. R16_POWER_PLAN &= ~(RB_PWR_DCDC_EN|RB_PWR_DCDC_PRE); // 旁路 DC/DC
  24. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
  25. }
  26. else
  27. {
  28. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  29. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  30. R16_POWER_PLAN |= RB_PWR_DCDC_PRE;
  31. DelayUs(10);
  32. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  33. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  34. R16_POWER_PLAN |= RB_PWR_DCDC_EN;
  35. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
  36. }
  37. }
  38. /*******************************************************************************
  39. * Function Name : PWR_UnitModCfg
  40. * Description : 可控单元模块的电源控制
  41. * Input : s:
  42. ENABLE - 打开
  43. DISABLE - 关闭
  44. unit:
  45. please refer to unit of controllable power supply
  46. * Return : None
  47. *******************************************************************************/
  48. void PWR_UnitModCfg( UINT8 s, UINT8 unit )
  49. {
  50. if(s == DISABLE) //关闭
  51. {
  52. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  53. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  54. if(unit&UNIT_ETH_PHY) R8_SLP_POWER_CTRL |= RB_SLP_ETH_PWR_DN;
  55. R8_HFCK_PWR_CTRL &= ~(unit&0x1c);
  56. R8_CK32K_CONFIG &= ~(unit&0x03);
  57. }
  58. else //打开
  59. {
  60. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  61. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  62. if(unit&UNIT_ETH_PHY) R8_SLP_POWER_CTRL &= ~RB_SLP_ETH_PWR_DN;
  63. R8_HFCK_PWR_CTRL |= (unit&0x1c);
  64. R8_CK32K_CONFIG |= (unit&0x03);
  65. }
  66. R8_SAFE_ACCESS_SIG = 0;
  67. }
  68. /*******************************************************************************
  69. * Function Name : PWR_PeriphClkCfg
  70. * Description : 外设时钟控制位
  71. * Input : s:
  72. ENABLE - 打开外设时钟
  73. DISABLE - 关闭外设时钟
  74. perph:
  75. please refer to Peripher CLK control bit define
  76. * Return : None
  77. *******************************************************************************/
  78. void PWR_PeriphClkCfg( UINT8 s, UINT16 perph )
  79. {
  80. if( s == DISABLE )
  81. {
  82. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  83. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  84. R32_SLEEP_CONTROL |= perph;
  85. }
  86. else
  87. {
  88. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  89. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  90. R32_SLEEP_CONTROL &= ~perph;
  91. }
  92. R8_SAFE_ACCESS_SIG = 0;
  93. }
  94. /*******************************************************************************
  95. * Function Name : PWR_PeriphWakeUpCfg
  96. * Description : 睡眠唤醒源配置
  97. * Input : s:
  98. ENABLE - 打开此外设睡眠唤醒功能
  99. DISABLE - 关闭此外设睡眠唤醒功能
  100. perph:
  101. RB_SLP_USB_WAKE - USB 为唤醒源
  102. RB_SLP_ETH_WAKE - ETH 为唤醒源
  103. RB_SLP_RTC_WAKE - RTC 为唤醒源
  104. RB_SLP_GPIO_WAKE - GPIO 为唤醒源
  105. RB_SLP_BAT_WAKE - BAT 为唤醒源
  106. ALL - 以上所有
  107. * Return : None
  108. *******************************************************************************/
  109. void PWR_PeriphWakeUpCfg( UINT8 s, UINT16 perph )
  110. {
  111. if( s == DISABLE )
  112. {
  113. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  114. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  115. R8_SLP_WAKE_CTRL &= ~perph;
  116. }
  117. else
  118. {
  119. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  120. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  121. R8_SLP_WAKE_CTRL |= perph;
  122. }
  123. R8_SAFE_ACCESS_SIG = 0;
  124. }
  125. /*******************************************************************************
  126. * Function Name : PowerMonitor
  127. * Description : 电源监控
  128. * Input : s:
  129. ENABLE - 打开此功能
  130. DISABLE - 关闭此功能
  131. * Return : None
  132. *******************************************************************************/
  133. void PowerMonitor( UINT8 s )
  134. {
  135. if( s == DISABLE )
  136. {
  137. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  138. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  139. R8_BAT_DET_CTRL = 0;
  140. R8_SAFE_ACCESS_SIG = 0;
  141. }
  142. else
  143. {
  144. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  145. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  146. R8_BAT_DET_CFG = 1; // 2.05V - 2.33V
  147. R8_BAT_DET_CTRL = RB_BAT_DET_EN;
  148. R8_SAFE_ACCESS_SIG = 0;
  149. mDelayuS(1);
  150. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  151. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  152. R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
  153. R8_SAFE_ACCESS_SIG = 0;
  154. }
  155. }
  156. /*******************************************************************************
  157. * Function Name : LowPower_Idle
  158. * Description : 低功耗-Idle模式
  159. * Input : None
  160. * Return : None
  161. *******************************************************************************/
  162. void LowPower_Idle( void )
  163. {
  164. SCB -> SCR &= ~SCB_SCR_SLEEPDEEP_Msk; // sleep
  165. __WFI();
  166. }
  167. /*******************************************************************************
  168. * Function Name : EnterCodeUpgrade
  169. * Description : 跳入BOOT程序,准备代码升级
  170. * Input : None
  171. * Return : None
  172. *******************************************************************************/
  173. void EnterCodeUpgrade( void )
  174. {
  175. /* RTC wakeup */
  176. UINT32 t;
  177. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  178. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  179. R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE;
  180. R16_POWER_PLAN = RB_PWR_PLAN_EN \
  181. |RB_PWR_MUST_0010;
  182. R8_SAFE_ACCESS_SIG = 0;
  183. do{
  184. t = R32_RTC_CNT_32K;
  185. }while( t != R32_RTC_CNT_32K );
  186. t = t + 10;
  187. if( t>0xA8C00000 ) t -= 0xA8C00000;
  188. if( t&0xFFFF ) t = t+0x10000;
  189. R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR|RB_RTC_TMR_CLR;
  190. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  191. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  192. R32_RTC_TRIG = t;
  193. R8_RTC_MODE_CTRL = 0x2f; // 进入boot下载必要条件
  194. R8_SAFE_ACCESS_SIG = 0;
  195. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  196. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  197. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  198. R8_SAFE_ACCESS_SIG = 0;
  199. /* ready to BOOT */
  200. __SEV();
  201. __WFE();
  202. __WFE();
  203. while(1);
  204. }