📄 pmu.c
字号:
#include "hardware.h"
#include "hardware_reg.h"
#include "HA_typedef.h"
#include "stdio.h"
extern void get_PDandPV(U32 *PD_r, U32 *PV_r, int num_m){//MHz
int i;
int tmp1;
U32 PD;
U32 PV;
//U32 MPLLCON;
for(i = 1; i <= 16; i++){
tmp1 = 2 * i * num_m;
if((tmp1>=120) && (tmp1<=280)){
PD = i - 1;
break;
}
}
PV = num_m*2*(PD+1)/2*2.5; //2~5MHz,取4MHz。
*PD_r=PD;
*PV_r=PV;
}
extern void set_to_normal(int num_m){
int i;
U32 MPLLCON;
U32 PD_r, PV_r;
PD_r = 0;
PV_r = 0;
get_PDandPV(&PD_r, &PV_r, num_m);
MPLLCON = PV_r | 0x380 | (PD_r << 10); //make out config value
*(RP)0x10001004 = (MPLLCON | 0x8000);
i++;
i--;
i++;
i--;
// must finish config
*(RP)0x10001004 = MPLLCON;
*(RP)PMU_PMDR = 0x01; //set to normal
for(i = 0; i < 100; i++);
}
extern void set_to_slow(){
int i;
*(RP)PMU_PMDR = 0x00;
for(i = 0; i < 50; i++);
}
#if 0
extern void set_to_idle(){
int i;
U32 IMR_save;
//close cpu irqen
IMR_save = *(RP)INTC_IMR;
*(RP)INTC_IMR |= 0xffffffff;
*(RP)PMU_PMDR = 0x3; //set to idle
for(i = 0; i < 100; i++);
//open cpu irqen
*(RP)INTC_IMR = IMR_save;
}
extern void set_to_sleep(){
int i,flag;
U32 IMR_save;
//检查LCDC/DMAC等外设是否已经关闭,否则直接返回
flag = check_peri()
if(flag == -1){
return 0
}
//关闭所有中断
IMR_save = *(RP)INTC_IMR;
*(RP)INTC_IMR |= 0xffffffff; //close cpu irqen
//配置PMC进入SLEEP模式
*(RP)PMU_PMDR = 0x2; //set to sleep
//部分空操作
for(i = 0; i < 100; i++);
//开启中断
*(RP)INTC_IMR = IMR_save; //open cpu irqen
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -