CH579 CH573 CH582 GPIO睡眠喚醒操作


7.2 外部中斷/喚醒
芯片的部分 I/O 管腳具有中斷功能,並可實現睡眠喚醒。
為了使用外部中斷,端口位必須配置成輸入模式。並提供 4 種觸發模式:高電平、低電平、上升
沿、下降沿。
喚醒功能需要打開端口位的中斷使能 R16_Px_INT_EN,並開啟寄存器 R8_SLP_WAKE_CTRL 中的 GPIO
喚醒控制位 RB_SLP_GPIO_WAKE。


1
/********************************** (C) COPYRIGHT ******************************* 2 * File Name : Main.c 3 * Author : LB 4 * Version : V1.0 5 * Date : 2021/12/28 6 * Description : 系統睡眠模式並喚醒演示:GPIOA_5作為喚醒源,共4種睡眠等級 7 *******************************************************************************/ 8 9 /* 10 注意:切換到HSE時鍾源,所需等待穩定時間和選擇的外置晶體參數有關,選擇一款新的晶體最好閱讀廠家提供的晶體及其 11 負載電容參數值。通過配置R8_XT32M_TUNE寄存器,可以配置不同的負載電容和偏置電流,調整晶體穩定時間。 12 */ 13 14 #include "CH58x_common.h" 15 16 void DebugInit( void ) 17 { 18 GPIOA_SetBits( GPIO_Pin_9 ); 19 GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA ); 20 UART1_DefInit(); 21 } 22 23 int main() 24 { 25 SetSysClock( CLK_SOURCE_PLL_60MHz ); 26 27 GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU ); 28 GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU ); 29 30 /* 配置串口調試 */ 31 DebugInit(); 32 PRINT( "Start @ChipID=%02x\n", R8_CHIP_ID ); 33 DelayMs( 200 ); 34 35 #if 1 36 /* 配置喚醒源為 GPIO - PA5 */ 37 GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeIN_PU ); //初始化IO狀態 38 GPIOA_ITModeCfg( GPIO_Pin_5, GPIO_ITMode_FallEdge ); // 設置下降沿喚醒 39 PFIC_EnableIRQ( GPIO_A_IRQn ); //開啟GPIO中斷 PA口 40 41 GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PD ); //初始化IO狀態 42 GPIOB_ITModeCfg( GPIO_Pin_4, GPIO_ITMode_HighLevel ); // 高電平喚醒 43 PFIC_EnableIRQ( GPIO_B_IRQn ); //開啟GPIO中斷 PB口 44 PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Long_Delay );//開啟GPIO喚醒使能 45 #endif 46 47 #if 0 48 PRINT( "IDLE mode sleep \n" ); 49 DelayMs( 1 ); 50 LowPower_Idle(); 51 PRINT( "wake.. \n" ); 52 DelayMs( 500 ); 53 #endif 54 55 #if 0 56 PRINT( "Halt mode sleep \n" ); 57 DelayMs( 2 ); 58 LowPower_Halt(); 59 HSECFG_Current( HSE_RCur_100 ); // 降為額定電流(低功耗函數中提升了HSE偏置電流) 60 DelayMs( 2 ); 61 PRINT( "wake.. \n" ); 62 DelayMs( 500 ); 63 #endif 64 65 while(1) //睡眠模式演示 66 { 67 #if 1 68 PRINT( "sleep mode sleep \n" ); 69 DelayMs( 2 ); 70 // 注意當主頻為80M時,Sleep睡眠喚醒中斷不可調用flash內代碼。 71 LowPower_Sleep( RB_PWR_RAM30K | RB_PWR_RAM2K ); //只保留30+2K SRAM 供電 72 HSECFG_Current( HSE_RCur_100 ); // 降為額定電流(低功耗函數中提升了HSE偏置電流) 73 DelayMs( 5 );//等時鍾穩定 74 PRINT( "wake.. \n" ); 75 DelayMs( 5 ); 76 #endif 77 } 78 79 #if 0 80 PRINT( "shut down mode sleep \n" ); 81 PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Long_Delay ); 82 DelayMs( 2 ); 83 LowPower_Shutdown( 0 ); //全部斷電,喚醒后復位 84 /* 85 此模式喚醒后會執行復位,所以下面代碼不會運行, 86 注意要確保系統睡下去再喚醒才是喚醒復位,否則有可能變成IDLE等級喚醒 87 */ 88 HSECFG_Current( HSE_RCur_100 ); // 降為額定電流(低功耗函數中提升了HSE偏置電流) 89 PRINT( "wake.. \n" ); 90 DelayMs( 500 ); 91 #endif 92 93 while( 1 ) 94 ; 95 } 96 97 __INTERRUPT 98 __HIGH_CODE 99 void GPIOA_IRQHandler( void ) 100 { 101 GPIOA_ClearITFlagBit( GPIO_Pin_5 ); //GPIO喚醒會進中斷,要清除GPIO中斷 102 } 103 104 __INTERRUPT 105 __HIGH_CODE 106 void GPIOB_IRQHandler( void ) 107 { 108 GPIOB_ClearITFlagBit( GPIO_Pin_4 ); //GPIO喚醒會進中斷,要清除GPIO中斷 109 }

CH573的PB22和PB23支持睡眠喚醒和GPIO中斷

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM