CH57x_int.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : CH57x_int.c
  3. * Author : WCH
  4. * Version : V1.0
  5. * Date : 2020/03/18
  6. * Description
  7. *******************************************************************************/
  8. #include "CH57x_common.h"
  9. /*******************************************************************************
  10. * Function Name : NMI_Handler
  11. * Description : NMI中断函数
  12. * Input : None
  13. * Return : None
  14. *******************************************************************************/
  15. //__attribute__((section("NMICode")))
  16. void NMI_Handler( void )
  17. {
  18. UINT32 i=0;
  19. if( (R8_HFCK_PWR_CTRL & RB_CLK_INT32M_PON) == 0 )
  20. {
  21. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  22. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  23. R8_HFCK_PWR_CTRL |= RB_CLK_INT32M_PON; // 打开内部32M
  24. }
  25. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  26. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  27. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  28. R16_POWER_PLAN &= ~(RB_PWR_DCDC_EN|RB_PWR_DCDC_PRE); // 旁路 DC/DC
  29. R8_HFCK_PWR_CTRL |= RB_CLK_PLL_PON; // 打开PLL
  30. R8_SAFE_ACCESS_SIG = 0;
  31. while(1)
  32. {
  33. if(R8_BAT_STATUS & RB_BAT_STAT_LOWER) i = 0;
  34. else i++;
  35. if( i>2000 )
  36. {
  37. /* 执行系统复位 */
  38. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  39. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  40. R8_RST_WDOG_CTRL = RB_SOFTWARE_RESET;
  41. R8_SAFE_ACCESS_SIG = 0;
  42. }
  43. }
  44. }
  45. /*******************************************************************************
  46. * Function Name : LowPower_Halt_1
  47. * Description : 低功耗-Halt_1模式。
  48. 此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
  49. * Input : None
  50. * Return : None
  51. *******************************************************************************/
  52. //__attribute__((section("NMICode")))
  53. void LowPower_Halt_1( void )
  54. {
  55. UINT8 x32Kpw, x32Mpw;
  56. x32Kpw = R8_XT32K_TUNE;
  57. x32Mpw = R8_XT32M_TUNE;
  58. x32Mpw = (x32Mpw&0xfc)|0x03; // 150%额定电流
  59. if(R16_RTC_CNT_32K>0x3fff){ // 超过500ms
  60. x32Kpw = (x32Kpw&0xfc)|0x01; // LSE驱动电流降低到额定电流
  61. }
  62. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  63. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  64. R8_SLP_POWER_CTRL &= ~RB_SLP_ROM_PWR_DN; // flash待机
  65. R8_BAT_DET_CTRL = 0; // 关闭电压监控
  66. R8_XT32K_TUNE = x32Kpw;
  67. R8_XT32M_TUNE = x32Mpw;
  68. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  69. R8_SAFE_ACCESS_SIG = 0;
  70. SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk; //deep sleep
  71. __WFI();
  72. R8_SAFE_ACCESS_SIG = 0;
  73. /* 开启电压监控 */
  74. PowerMonitor( ENABLE );
  75. }
  76. /*******************************************************************************
  77. * Function Name : LowPower_Halt_2
  78. * Description : 低功耗-Halt_2模式。
  79. 此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
  80. * Input : None
  81. * Return : None
  82. *******************************************************************************/
  83. //__attribute__((section("NMICode")))
  84. void LowPower_Halt_2( void )
  85. {
  86. UINT8 x32Kpw, x32Mpw;
  87. x32Kpw = R8_XT32K_TUNE;
  88. x32Mpw = R8_XT32M_TUNE;
  89. x32Mpw = (x32Mpw&0xfc)|0x03; // 150%额定电流
  90. if(R16_RTC_CNT_32K>0x3fff){ // 超过500ms
  91. x32Kpw = (x32Kpw&0xfc)|0x01; // LSE驱动电流降低到额定电流
  92. }
  93. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  94. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  95. R8_SLP_POWER_CTRL |= RB_SLP_ROM_PWR_DN; // flash停机
  96. R8_BAT_DET_CTRL = 0; // 关闭电压监控
  97. R8_XT32K_TUNE = x32Kpw;
  98. R8_XT32M_TUNE = x32Mpw;
  99. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  100. R8_SAFE_ACCESS_SIG = 0;
  101. SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk; //deep sleep
  102. __WFI();
  103. R8_SAFE_ACCESS_SIG = 0;
  104. /* 开启电压监控 */
  105. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  106. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  107. R8_BAT_DET_CFG = 1; // 2.05V - 2.33V
  108. R8_BAT_DET_CTRL = RB_BAT_DET_EN;
  109. R8_SAFE_ACCESS_SIG = 0;
  110. __nop(); __nop();
  111. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  112. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  113. R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
  114. R8_SAFE_ACCESS_SIG = 0;
  115. }
  116. /*******************************************************************************
  117. * Function Name : LowPower_Sleep
  118. * Description : 低功耗-Sleep模式。
  119. 此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
  120. 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
  121. * Input : rm:
  122. RB_PWR_RAM2K - 最后2K SRAM 供电
  123. RB_PWR_RAM14K - 0x20004000 - 0x20007800 14K SRAM 供电
  124. RB_PWR_EXTEND - USB和RF 单元保留区域供电
  125. NULL - 以上单元都断电
  126. * Return : None
  127. *******************************************************************************/
  128. //__attribute__((section("NMICode")))
  129. void LowPower_Sleep( UINT8 rm )
  130. {
  131. UINT8 x32Kpw, x32Mpw;
  132. x32Kpw = R8_XT32K_TUNE;
  133. x32Mpw = R8_XT32M_TUNE;
  134. x32Mpw = (x32Mpw&0xfc)|0x03; // 150%额定电流
  135. if(R16_RTC_CNT_32K>0x3fff){ // 超过500ms
  136. x32Kpw = (x32Kpw&0xfc)|0x01; // LSE驱动电流降低到额定电流
  137. }
  138. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  139. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  140. R16_POWER_PLAN = RB_PWR_PLAN_EN \
  141. |RB_PWR_MUST_0010 \
  142. |RB_PWR_CORE \
  143. |rm;
  144. R8_SAFE_ACCESS_SIG = 0;
  145. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  146. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  147. R8_BAT_DET_CTRL = 0; // 关闭电压监控
  148. R8_XT32K_TUNE = x32Kpw;
  149. R8_XT32M_TUNE = x32Mpw;
  150. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  151. R8_SAFE_ACCESS_SIG = 0;
  152. SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk; //deep sleep
  153. __WFI();
  154. R8_SAFE_ACCESS_SIG = 0;
  155. /* 开启电压监控 */
  156. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  157. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  158. R8_BAT_DET_CFG = 1; // 2.05V - 2.33V
  159. R8_BAT_DET_CTRL = RB_BAT_DET_EN;
  160. R8_SAFE_ACCESS_SIG = 0;
  161. __nop(); __nop();
  162. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  163. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  164. R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
  165. R8_SAFE_ACCESS_SIG = 0;
  166. }
  167. /*******************************************************************************
  168. * Function Name : LowPower_Shutdown
  169. * Description : 低功耗-Shutdown模式。
  170. 此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
  171. 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
  172. * Input : rm:
  173. RB_PWR_RAM2K - 最后2K SRAM 供电
  174. NULL - 以上单元都断电
  175. * Return : None
  176. *******************************************************************************/
  177. //__attribute__((section("NMICode")))
  178. void LowPower_Shutdown( UINT8 rm )
  179. {
  180. UINT8 x32Kpw, x32Mpw;
  181. x32Kpw = R8_XT32K_TUNE;
  182. x32Mpw = R8_XT32M_TUNE;
  183. x32Mpw = (x32Mpw&0xfc)|0x03; // 150%额定电流
  184. if(R16_RTC_CNT_32K>0x3fff){ // 超过500ms
  185. x32Kpw = (x32Kpw&0xfc)|0x01; // LSE驱动电流降低到额定电流
  186. }
  187. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  188. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  189. R16_POWER_PLAN = RB_PWR_PLAN_EN \
  190. |RB_PWR_MUST_0010 \
  191. |rm;
  192. R8_SAFE_ACCESS_SIG = 0;
  193. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  194. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  195. R8_BAT_DET_CTRL = 0; // 关闭电压监控
  196. R8_XT32K_TUNE = x32Kpw;
  197. R8_XT32M_TUNE = x32Mpw;
  198. R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
  199. R8_SAFE_ACCESS_SIG = 0;
  200. SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk; //deep sleep
  201. __WFI();
  202. R8_SAFE_ACCESS_SIG = 0;
  203. /* 开启电压监控 */
  204. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  205. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  206. R8_BAT_DET_CFG = 1; // 2.05V - 2.33V
  207. R8_BAT_DET_CTRL = RB_BAT_DET_EN;
  208. R8_SAFE_ACCESS_SIG = 0;
  209. __nop(); __nop();
  210. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  211. R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  212. R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
  213. R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
  214. R8_SAFE_ACCESS_SIG = 0;
  215. }