一、電源管理模塊 PMU(Power Management Unit)
電源管理模塊 PMU是芯片的 “能耗與電源管家”,核心目標(biāo)是平衡功耗與供電穩(wěn)定性,適配嵌入式設(shè)備的低功耗、長(zhǎng)續(xù)航需求,具體作用包括:
1. 多電源域的獨(dú)立管控
為了有效地控制 MCU 的功耗,對(duì)模塊的劃分包括 AON(Always On)模塊、Main 模塊和 ANA 模塊。
AON 模塊:其供電有 RTC 模擬 IP 提供 1.2V 的電源,并提供工作的 32KHz時(shí)鐘。該模塊會(huì)控制 Main 和 ANA 模塊的電源開(kāi)關(guān)。在深度睡眠模式下,AON 會(huì)關(guān)閉 Main 和ANA 的電源。
Main 模塊:該模塊包含所有的內(nèi)核邏輯和外設(shè)邏輯。其電源由 PMB 提供。
ANA 模塊:該模塊包含 ADC、DAC、PLL、ROSC16M、EFLASH 等模擬 IP模塊。
例如,當(dāng)芯片進(jìn)入深度休眠模式時(shí),PMU 可切斷內(nèi)核和外設(shè)電源域的供電,僅保留 RTC 和喚醒源對(duì)應(yīng)的電源域,將靜態(tài)功耗降至 uA 級(jí);而喚醒后又能按優(yōu)先級(jí)依次恢復(fù)各電源域供電,避免上電時(shí)序紊亂。

2.低功耗模式的調(diào)度與切換
PMU 是 RISC-V 芯片低功耗模式(如 Sleep、Deep Sleep等)的核心控制單元:一方面,它負(fù)責(zé)解析軟件下發(fā)的低功耗指令,完成核心時(shí)鐘關(guān)閉、外設(shè)休眠、寄存器數(shù)據(jù)備份等流程;另一方面,它管理所有喚醒源(如特定GPIO 電平變化、看門狗、RTC等),當(dāng)檢測(cè)到有效喚醒信號(hào)時(shí),觸發(fā)芯片從低功耗模式快速恢復(fù)到正常工作模式,同時(shí)保證喚醒時(shí)序的準(zhǔn)確性。
3.動(dòng)態(tài)電壓頻率調(diào)節(jié)(DVFS)
針對(duì)支持變頻調(diào)壓的 RISC-V 芯片,PMU 可聯(lián)動(dòng)時(shí)鐘模塊(PLL/CLKGEN)實(shí)現(xiàn)DVFS 機(jī)制:根據(jù) CPU 負(fù)載(如指令執(zhí)行密度、外設(shè)工作狀態(tài))自動(dòng)調(diào)整內(nèi)核的供電電壓和工作頻率。例如,當(dāng)芯片僅執(zhí)行低速傳感器數(shù)據(jù)采集任務(wù)時(shí),PMU 將內(nèi)核主頻從 160MHz 降至 80MHz,同時(shí)降低供電電壓,大幅降低動(dòng)態(tài)功耗;當(dāng)需要執(zhí)行復(fù)雜運(yùn)算時(shí),再快速提升主頻和電壓,保障性能需求。
4.電源監(jiān)測(cè)與安全保護(hù)
PMU 內(nèi)置電壓、電流監(jiān)測(cè)電路,可實(shí)時(shí)監(jiān)控芯片各電源域的供電狀態(tài):若出現(xiàn)過(guò)壓、欠壓、過(guò)流等異常,PMU 會(huì)觸發(fā)硬件保護(hù)機(jī)制(如自動(dòng)切斷對(duì)應(yīng)電源域、上報(bào)中斷),防止芯片燒毀。
5.時(shí)鐘系統(tǒng)的協(xié)同管理
RISC-V 芯片的多時(shí)鐘源(內(nèi)部 32KRC、外部晶振、PLL)由 PMU 統(tǒng)一協(xié)調(diào),它可根據(jù)工作模式切換時(shí)鐘源(如休眠時(shí)切換到低功耗 32K 時(shí)鐘,正常工作時(shí)切換到高頻 PLL 時(shí)鐘),同時(shí)關(guān)閉未使用的時(shí)鐘分支,減少時(shí)鐘樹(shù)的冗余功耗。
二、 特性
- 支持低功耗模式(SLEEP/DEEP_SLEEP/WAKEUP)的切換
- 支持喚醒源的配置(外部 IO/RTC/IWDG)
- 支持 FIRC 的開(kāi)啟與關(guān)閉
系統(tǒng)的電源管理狀態(tài)有 4 種,分別是正常模式、省電模式、睡眠模式和深度睡眠模式。其四種狀態(tài)之間的轉(zhuǎn)換如下圖所示:

進(jìn)入省電模式下,系統(tǒng)低頻時(shí)鐘運(yùn)行(關(guān)閉 PLL,系統(tǒng)的工作頻率由 OSC 或FIRC 提供),而且可以關(guān)閉部分外設(shè)。用戶可以在正常模式或睡眠模式下進(jìn)入省電模式。
?1 省電模式需要關(guān)閉PLL
?2 進(jìn)入省電模式后,由于時(shí)鐘變化需要對(duì)串口、IIC等外設(shè)進(jìn)行重新配置
?3 睡眠模式進(jìn)入省電模式的前提是進(jìn)入睡眠模式之前MCU是工作在省電模式
對(duì)應(yīng)代碼如下所示:
if(key3_flag)
{
key3_flag = 0;
key3_cnt++;
if(old_key3_cnt == key3_cnt)
{
Printf( "SRUN Statern" );
Systemclock_SRUN**_Init();**
User_Print_Init(115200);
Printf( "SRUN Statern" );
}
else
{
key3_cnt=0;
Printf( "Normal Statern");
Systemclock_Init();
User_Print_Init(115200);
Printf( "Normal Statern");
}
}
/ *
*** Function: Systemclock**_SRUN**_Init**
*** Description: Configure Systemclock_Init.**
*** Param: None**
*** Return: None.**
*/
void****Systemclock_SRUN**_Init()**
{
//注意:此處需要開(kāi)啟系統(tǒng)總線級(jí)的時(shí)鐘配置,具體外設(shè)時(shí)鐘配置可在各模塊初始化函數(shù)中具體開(kāi)啟 ,具體請(qǐng)參考時(shí)鐘樹(shù)或者下圖注釋
/ AXIBus3 clock operation Guide /**
AXIBUS3_CLK_ENABLE();
AXI4TOAPB0_CLK_ENABLE();
APBBUS0_CLK_ENABLE();
AXILITEBUS1_CLK_ENABLE();
AXILITEBUS2_CLK_ENABLE();
EFLASH_CLK_ENABLE();
PLIC_CLK_ENABLE();
CLINT_CLK_ENABLE();
USART0_CLK_ENABLE();
DMA0_CLK_ENABLE();
SMU_PLLInitTypeDef SMU_PLLInitStruct;
SMU_ClockInitTypeDef SMU_ClockInitStruct;
/ Set System Clock parameters values /
SMU_ClockInitStruct.SYSCLKSelect = SMU_SYSCLK_FIRC;
SMU_ClockInitStruct.AXI4Bus3CLKDiv = AXI4Bus3CLKDiv1;
SMU_ClockInitStruct.APBBus0CLKDiv = APBBus0CLKDiv1;
SMU_ClockInitStruct.APBBus1CLKDiv = APBBus1CLKDiv1;
SMU_ClockInitStruct.CANX2CLKDiv = CANX2CLKDiv1;
SMU_ClockInit (&SMU_ClockInitStruct);
SMU_PLLCmd(DISABLE);
EFLASH_CLK_UPDATE_ENABLE();
EFLASH_CLK_UPDATE_DISABLE();
FLASH_LockCtrl();
/ Get System Clock values /
SMU_GetClocksFreq (&SMU_ClocksStruct);
}
void****Systemclock_Init()
{
//注意:此處需要開(kāi)啟系統(tǒng)總線級(jí)的時(shí)鐘配置,具體外設(shè)時(shí)鐘配置可在各模塊初始化函數(shù)中具體開(kāi)啟 ,具體請(qǐng)參考時(shí)鐘樹(shù)或者下圖注釋
/ AXIBus3 clock operation Guide /**
AXIBUS3_CLK_ENABLE();
AXI4TOAPB0_CLK_ENABLE();
APBBUS0_CLK_ENABLE();
AXILITEBUS1_CLK_ENABLE();
AXILITEBUS2_CLK_ENABLE();
EFLASH_CLK_ENABLE();
PLIC_CLK_ENABLE();
CLINT_CLK_ENABLE();
USART0_CLK_ENABLE();
DMA0_CLK_ENABLE();
SMU_PLLInitTypeDef SMU_PLLInitStruct;
SMU_ClockInitTypeDef SMU_ClockInitStruct;
/ Set PLL parameters values /
SMU_PLLInitStruct.OscillatorType = SMU_OSCILLATORTYPE_OSC;
SMU_PLLInitStruct.FIRCOscState = DISABLE;
SMU_PLLInitStruct.FIRCCalibrationValue = 0x00;
SMU_PLLInitStruct.PLLConfig.PLLState = ENABLE;
SMU_PLLInitStruct.PLLConfig.PLLSource = SMU_PLLCLK_OSC;
SMU_PLLInitStruct.PLLConfig.PLLDivR = 0x04;
SMU_PLLInitStruct.PLLConfig.PLLDivQ = 0x01;
SMU_PLLInitStruct.PLLConfig.PLLDivN = 0x14;
SMU_PLLInitStruct.PLLConfig.PLLDivF = 0x78;
SMU_PLLInit (&SMU_PLLInitStruct);
/ Ensure that the EFLASH is consistent with the system clock /
FLASH_UnlockCtrl();
FLASH_SetCLKFreq(0x78)
/ Set System Clock parameters values /
SMU_ClockInitStruct.SYSCLKSelect = SMU_SYSCLK_PLL;
SMU_ClockInitStruct.AXI4Bus3CLKDiv = AXI4Bus3CLKDiv1;
SMU_ClockInitStruct.APBBus0CLKDiv = APBBus0CLKDiv1;
SMU_ClockInitStruct.APBBus1CLKDiv = APBBus1CLKDiv1;
SMU_ClockInitStruct.CANX2CLKDiv = CANX2CLKDiv1;
SMU_ClockInit (&SMU_ClockInitStruct);
EFLASH_CLK_UPDATE_ENABLE();
EFLASH_CLK_UPDATE_DISABLE();
FLASH_LockCtrl();
/ Get System Clock values /
SMU_GetClocksFreq (&SMU_ClocksStruct);
}
在睡眠模式下,用戶需要復(fù)位/禁止 PLL 輸出、禁止 FIRC 輸出時(shí)鐘、ADC、DAC 等處于低功耗模式,要進(jìn)入睡眠/深度睡眠模式,請(qǐng)遵循以下步驟:
- 讀取喚醒信息:讀取 PMU_WKP 寄存器,若有位為 1 則寫(xiě) 1 清除該位,若皆為 0 則進(jìn)入下一步操作;
- 配置喚醒通道:將 PMU_WKEN 寄存器的對(duì)應(yīng)喚醒通道配置為 1,其他通道配置為0;
- 保存?zhèn)浞菪畔ⅲ簩⑿枰獋浞莸男畔⒋鎯?chǔ)到 Bkp RAM 內(nèi);
- 配置睡眠模式:配置 PMU_MODE 寄存器的值,配置 1 進(jìn)入深度睡眠模式,配置 2 進(jìn)入睡眠模式;
- 系統(tǒng)將自動(dòng)睡眠。 喚醒后,可通過(guò) PMU_WKP 寄存器讀取喚醒信息,獲取喚醒源。
注意:


*1:進(jìn)入睡眠/深度睡眠前要確認(rèn)喚醒寄存器狀態(tài)是否清空,喚醒后要及時(shí)清除喚醒寄存器
*2:DeepSleep 喚醒:等效于系統(tǒng)軟重啟,程序從復(fù)位入口重新執(zhí)行,片內(nèi)常規(guī) RAM數(shù)據(jù)完全丟失;關(guān)鍵數(shù)據(jù)需預(yù)先存入備份 RAM(Backup RAM)以實(shí)現(xiàn)掉電 / 深睡保留。

*3:Sleep 喚醒:系統(tǒng)僅恢復(fù) CPU 運(yùn)行,程序從 Sleep 指令下一條語(yǔ)句繼續(xù)執(zhí)行(通常是 while (1) 循環(huán)內(nèi)斷點(diǎn)),常規(guī) RAM 數(shù)據(jù)完整保留,無(wú)需重新初始化時(shí)鐘、外設(shè)等硬件配置。
以下為進(jìn)入喚醒睡眠模式流程圖

此圖為我司提供的開(kāi)發(fā)板對(duì)應(yīng)電流3.62mA
在深度睡眠模式下,需要 PMU 關(guān)閉 PMB 輸出,使 Main 和 ANA 進(jìn)入掉電狀態(tài)。此時(shí)喚醒只能通過(guò) RTC 或外部引腳喚醒進(jìn)入正常工作模式。以下為進(jìn)入喚醒深度睡眠模式流程圖

此圖為我司提供的開(kāi)發(fā)板對(duì)應(yīng)電流291uA
對(duì)應(yīng)代碼:
/ *
*** Brief: Main program**
*** Description:**
*** Param: None.**
*** Return: None.**
*/
void****main()
{
uint32_t led_count = 0;
Systemclock_Init();
delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);
/ Initialize print usart /
User_Print_Init(115200);
User_KEY_Init();
Wake_KEY_Init();
/ Configure the FCU /
//FCUConfig();
/ USART send data /
Printf( "AS32X601 Power mode switching!rn");
PMU_WKFlagJudg();
#if IWDG
IWDG_SetPrescaler(200);
IWDG_SetDivider(745);
IWDG_SetTimeout(4);
IWDG_ENCmd(I_CFG_EN,ENABLE);
IWDG_ResetCounter();
num = IWDG_GetCounter();
#endif
#if IWDG
PMU_WakeUpSourceCmd(PMU_WKSource_IWDG, ENABLE);
#endif
#if RTC
RTC_Config() ;//10S后喚醒
PMU_WakeUpSourceCmd(PMU_WKSource_RTC, ENABLE);
#endif
/ Enable PH2 wakeup source /
PMU_WakeUpSourceCmd(PMU_WKSource_PH2, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH3, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH4, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH5, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH6, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH7, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH8, ENABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH9, ENABLE);
pwk = (PMU->WKEN)&0x3FFF;
Printf( "WKEN %xrn", pwk);
while(1)
{
if(key1_flag)
{
key1_flag = 0;
/ Set sleep mode /
power_status = PMU_GetPowerModeStatus();
if((power_status == PMU_PowerMode_INIT)||(power_status == PMU_PowerMode_Normal))
{
PMU_ClearFlag(0x3FFF);
Printf( "POWER_SATUS %drn", power_status);
Printf( "DEEP SLEEP!rn");
PMU_PowerModeConfig(PMU_PowerMode_DeepSleep);
}
}
if(key2_flag)
{
key2_flag = 0;
power_status = PMU_GetPowerModeStatus();
if((power_status == PMU_PowerMode_INIT)||(power_status == PMU_PowerMode_Normal))
{
PMU_ClearFlag(0x3FFF);
Printf( "POWER_SATUS %drn", power_status);
Printf( "SLEEP!rn");
PMU_PowerModeConfig(PMU_PowerMode_Sleep);
}
}
}
}
/ *
*** Function: PMU_WKFlagJudg**
*** Description: Wake up source status judgment.**
*** Param: None.**
*** Return: None.**
*/
voidPMU_WKFlagJudg(void)
{
Printf( "WKFR: 0x%x ! rn" , PMU->WKFR);
if(PMU_GetFlagStatus(PMU_FLAG_IWDGWK) == SET)
{
Printf( "IWDG wake up!rn");
PMU_ClearFlag(PMU_CLEAR_IWDGWKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_RTCWK) == SET)
{
Printf( "RTC wake up!rn");
PMU_ClearFlag(PMU_CLEAR_RTCWKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH0WK) == SET)
{
Printf( "PH0 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH0WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH1WK) == SET)
{
Printf( "PH1 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH1WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH2WK) == SET)
{
Printf( "PH2 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH2WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH3WK) == SET)
{
Printf( "PH3 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH3WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH4WK) == SET)
{
Printf( "PH4 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH4WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH5WK) == SET)
{
Printf( "PH5 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH5WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH6WK) == SET)
{
Printf( "PH6 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH6WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH7WK) == SET)
{
Printf( "PH7 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH7WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH8WK) == SET)
{
Printf( "PH8 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH8WKF);
}
if(PMU_GetFlagStatus(PMU_FLAG_PH9WK) == SET)
{
Printf( "PH9 wake up!rn");
PMU_ClearFlag(PMU_CLEAR_PH9WKF);
}
PMU_WakeUpSourceCmd(PMU_WKSource_PH2, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH3, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH4, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH5, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH6, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH7, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH8, DISABLE);
PMU_WakeUpSourceCmd(PMU_WKSource_PH9, DISABLE);
Printf( "WKFR: 0x%x ! rn" , PMU->WKFR);
}
/ *
*** Function: Systemclock_Init**
*** Description: Configure Systemclock_Init.**
*** Param: None**
*** Return: None.**
*/
void****Systemclock_Init()
{
//注意:此處需要開(kāi)啟系統(tǒng)總線級(jí)的時(shí)鐘配置,具體外設(shè)時(shí)鐘配置可在各模塊初始化函數(shù)中具體開(kāi)啟 ,具體請(qǐng)參考時(shí)鐘樹(shù)或者下圖注釋
// 1. 使用串口時(shí),由于串口掛在APB0總線下,需要在此處開(kāi)啟AXIBUS3時(shí)鐘、AXI4TOAPB0時(shí)鐘以及APBBUS0時(shí)鐘。
// 2. 使用延時(shí)函數(shù)時(shí),需要開(kāi)啟CLINT時(shí)鐘
// 3. 使用eflash、qspi時(shí),需要開(kāi)啟AXIBUS3時(shí)鐘、AXILITEBUS2時(shí)鐘
//注意:osc經(jīng)過(guò)PLLDIVN分頻之后頻率應(yīng)在0.95-2.1MHz之間
// core_clock (無(wú)需使能) = pll_Q = osc % PLLDIVN x PLLDIVF % PLLDIVQ (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 16-180MHz之間 )
// AXI4Bus0 (無(wú)需使能) = pll_Q = osc % PLLDIVN x PLLDIVF % PLLDIVQ (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 16-180MHz之間 )
// AXI4Bus1 (無(wú)需使能) = pll_Q % 2 (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 8-90MHz之間 )
// AXI4Bus2 (無(wú)需使能) = pll_Q (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 16-180MHz之間 )
// |__AXILite4Bus0 (無(wú)需使能) = AXI4Bus2
// AXI4Bus3 (按需使能) = pll_Q % 2 % AXI4Bus3CLKDiv (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 8-90MHz之間 )
// |__AXI4TOAPB0_CLK (按需使能)
// | |__APBBus0 (按需使能) = AXI4Bus3 % APBBus0CLKDiv (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 4-45MHz之間 )
// |__AXI4TOAPB1_CLK (按需使能)
// | |__APBBus1 (按需使能) = AXI4Bus3 % APBBus1CLKDiv (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 4-45MHz之間 )
// |__AXILite4Bus1 (按需使能) = AXI4Bus3
// |__AXILite4Bus2 (按需使能) = AXI4Bus3
// CANCLK (接口使能) = pll_R = osc % PLLDIVN x PLLDIVF % PLLDIVR (注:此部分時(shí)鐘計(jì)算范圍應(yīng)在 8-80MHz之間 )
// APBBusS (無(wú)需使能) = 32.768kHz
/ AXIBus3 clock operation Guide /**
AXIBUS3_CLK_ENABLE();
AXI4TOAPB0_CLK_ENABLE();
APBBUS0_CLK_ENABLE();
AXILITEBUS1_CLK_ENABLE();
AXILITEBUS2_CLK_ENABLE();
EFLASH_CLK_ENABLE();
PLIC_CLK_ENABLE();
CLINT_CLK_ENABLE();
USART0_CLK_ENABLE();
DMA0_CLK_ENABLE();
SMU_PLLInitTypeDef SMU_PLLInitStruct;
SMU_ClockInitTypeDef SMU_ClockInitStruct;
/ Set PLL parameters values /
SMU_PLLInitStruct.OscillatorType = SMU_OSCILLATORTYPE_OSC;
SMU_PLLInitStruct.FIRCOscState = DISABLE;
SMU_PLLInitStruct.FIRCCalibrationValue = 0x00;
SMU_PLLInitStruct.PLLConfig.PLLState = ENABLE;
SMU_PLLInitStruct.PLLConfig.PLLSource = SMU_PLLCLK_OSC;
SMU_PLLInitStruct.PLLConfig.PLLDivR = 0x04;
SMU_PLLInitStruct.PLLConfig.PLLDivQ = 0x01;
SMU_PLLInitStruct.PLLConfig.PLLDivN = 0x14;
SMU_PLLInitStruct.PLLConfig.PLLDivF = 0x78;
SMU_PLLInit(&SMU_PLLInitStruct);
/ Ensure that the EFLASH is consistent with the system clock /
FLASH_UnlockCtrl();
FLASH_SetCLKFreq(0x78);
/ Set System Clock parameters values /
SMU_ClockInitStruct.SYSCLKSelect = SMU_SYSCLK_PLL;
SMU_ClockInitStruct.AXI4Bus3CLKDiv = AXI4Bus3CLKDiv1;
SMU_ClockInitStruct.APBBus0CLKDiv = APBBus0CLKDiv1;
SMU_ClockInitStruct.APBBus1CLKDiv = APBBus1CLKDiv1;
SMU_ClockInitStruct.CANX2CLKDiv = CANX2CLKDiv1;
SMU_ClockInit(&SMU_ClockInitStruct);
EFLASH_CLK_UPDATE_ENABLE();
EFLASH_CLK_UPDATE_DISABLE();
FLASH_LockCtrl();
/ Get System Clock values /
SMU_GetClocksFreq(&SMU_ClocksStruct);
}
/ *
*** Function : FCUConfig**
*** Description: Configure the FPU behavior**
*** Param : None**
*** Return : None**
*/
voidFCUConfig(void)
{
FCU_CLK_ENABLE();
FCU_InitTypeDef FCU_InitStructure;
FCU_StructInit(&FCU_InitStructure);
FCU_InitStructure.FCU_Channel = FCU_CHANNEL_IWDG;/ Specifies the channel to be configured /
FCU_InitStructure.FCU_FaultToResetCnt = 0;/ Specifies the count to reset under the fault level /
FCU_InitStructure.FCU_AlarmToFaultCnt = 1;/ Specifies the count to change the level from alarm to fault /
FCU_InitStructure.FCU_FaultAction = GLOBAL_SOFTWARE_RESET;/ Specifies the actin when the fault occured every time /
FCU_InitStructure.FCU_AlarmAction = NONE;/ Specifies the actin when the alarm occured every time /
FCU_InitStructure.FCU_FaultLevel = FAULT;/ Specifies the fault level /
FCU_InitStructure.FCU_MaskEnable = DISABLE;/ Specifies the mask enable /
FCU_Init(&FCU_InitStructure);
FCU_ClearSoftwareFault(FCU_CHANNEL_IWDG);
FCU_Cmd(FCU_CHANNEL_IWDG,ENABLE);
}
/ *
*** Function: User_KEY_Init**
*** Description: Configure KEY GPIO.**
*** Param: None.**
*** Return: None.**
*/
void****Wake_KEY_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/ GPIOB Configure /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_IType = GPIO_IPU;
GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;
GPIO_Init(GPIOH, &GPIO_InitStructure);
}
/ *
*** Function: User_KEY_Init**
*** Description: Configure KEY GPIO.**
*** Param: None.**
*** Return: None.**
*/
void****User_KEY_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
PLIC_InitTypeDef PLIC_InitStructure;
GPIOB_CLK_ENABLE();
GPIOE_CLK_ENABLE();
PLIC_CLK_ENABLE();
/ GPIOE Configure /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_IType = GPIO_IPU;
GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/ GPIOB Configure /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
PLIC_InitStructure.PLIC_IRQChannel = GPIOE_IRQn;
PLIC_InitStructure.PLIC_IRQPriority = 1;
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
PLIC_Init(&PLIC_InitStructure);
PLIC_InitStructure.PLIC_IRQChannel = GPIOB_IRQn;
PLIC_InitStructure.PLIC_IRQPriority = 2;
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
PLIC_Init(&PLIC_InitStructure);
/ Clear Interrupt start state /
GPIO_ClearITPendingBit(GPIOE, GPIO_Pin_10);
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_4|GPIO_Pin_3);
/ Config Interrupt trigger type /
GPIO_ITConfig(GPIOE, GPIO_Pin_10, GPIO_ITType_EDGEDOWN, ENABLE);
GPIO_ITConfig(GPIOB, GPIO_Pin_4|GPIO_Pin_3, GPIO_ITType_EDGEDOWN, ENABLE);
}
void****GPIOE_IRQ_Handler()
{
if(GPIO_GetITStatus(GPIOE, GPIO_Pin_10) == SET)
{
key1_flag = 1;
/ Clear Interrupt start state /
GPIO_ClearITPendingBit(GPIOE, GPIO_Pin_10);
}
}
void****GPIOB_IRQ_Handler()
{
if(GPIO_GetITStatus(GPIOB, GPIO_Pin_4) == SET)
{
key2_flag = 1;
/ Clear Interrupt start state /
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_4);
}
if(GPIO_GetITStatus(GPIOB, GPIO_Pin_3) == SET)
{
key3_flag = 1;
/ Clear Interrupt start state /
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_3);
}
}
審核編輯 黃宇
-
mcu
+關(guān)注
關(guān)注
147文章
18646瀏覽量
388300 -
PMU
+關(guān)注
關(guān)注
1文章
126瀏覽量
23045 -
芯片電源
+關(guān)注
關(guān)注
0文章
9瀏覽量
10122
發(fā)布評(píng)論請(qǐng)先 登錄
基于AS32A601型MCU芯片的屏幕驅(qū)動(dòng)IC方案的技術(shù)研究
AS32S601型MCU芯片在商業(yè)衛(wèi)星電源系統(tǒng)伺服控制器中的性能分析與應(yīng)用解析
AS32S601ZIT2型MCU:基于RISC-V架構(gòu)的抗輻照設(shè)計(jì)與試驗(yàn)評(píng)估
AS32S601在軌重構(gòu)(OTA)方案的優(yōu)化與分析
AS32S601與ASP4644S芯片抗輻照性能解析及核電站消防應(yīng)用
AS32S601 芯片 ADC 模塊交流耦合測(cè)試:技術(shù)要點(diǎn)與實(shí)踐
RY1303 3通道5.5V 2A 1.2MHz DC/DC降壓型電源管理單元(PMU)數(shù)據(jù)手冊(cè)
MCU芯片AS32S601在衛(wèi)星光纖放大器(EDFA)中的應(yīng)用探索
MAX3485在MCU芯片AS32S601-485通信外設(shè)中的應(yīng)用
AS32S601 芯片在衛(wèi)星互聯(lián)網(wǎng)推進(jìn)系統(tǒng)中的技術(shù)適配性研究
AS32X601驅(qū)動(dòng)系列教程 SMU_系統(tǒng)時(shí)鐘詳解
皮秒脈沖激光技術(shù)在AS32S601單粒子效應(yīng)評(píng)估中的應(yīng)用

AS32S601型MCU芯片電源管理(PMU)模塊詳解
評(píng)論