本帖最后由 suzhwt 于 2010-10-13 17:05 编辑
请教:
无论我怎样设置STM8L152的外设或其他单元,其最小电流总在140微安左右,与手册上标明的相去甚远,检查检查再检查,可能还是同一个思路,找不出产生问题的原因,哪位有空的话帮忙看一下,先行谢过.
硬件为最小系统,外部有一个电位器ADC.
/*****************************************************
@Fn: ConfigClock()
@Br: 配置处理器的时钟
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigClock( void ){
CLK_CKDIVR = 0; /* 无分频 */
CLK_ICKCR = ( 1 << HSION ); /* 使能内部高速RC OSC */
while(( CLK_ICKCR & 0x02 ) == 0 ); /* ( 1 << HSIRDY ) */
CLK_ICKCR |= ( 1 << LSION );
while(( CLK_ICKCR & ( 1 << LSIRDY )) == 0 );
CLK_SWR = F_MASTER_LSI; /* 指定切换的LSI主时钟 */
CLK_SWCR |= ( 1 << SWEN ); /* 使能执行切换 */
while(( CLK_SCSR & F_MASTER_LSI ) == 0 );
CLK_CKDIVR = CLK_DIV_001; /* Internal Fcpu = 38KHz => 0.13mA */
CLK_ICKCR &= ~( 1 << HSION ); /* 关闭内部高速RC OSC */
CLK_SWCR &= ~( 1 << SWEN ); /* 关闭执行切换 */
CLK_PCKENR2 = ( 1 << ADC1_CLK_ENABLE )
+ ( 1 << TM1_CLK_ENABLE );
}
/************************************************************
@Fn: ConfigGPIO()
@Br: 配置GPIO
@Pa: 无
@Rt: 无
@Specification: 无
************************************************************/
void ConfigGPIO( void ){
PA_DDR = ( 1 << PA4 ); /* 输出 */
PA_CR1 = ( 1 << PA4); /* 推挽模式 */
PA_CR2 = 0x00; /* 速度2MHz */
PA_ODR = ( 1 << PA4 );
PB_DDR = 0;
PB_CR1 = 0xFF; /* 输入上拉 */
PB_CR2 = 0;
PB_ODR = 0xFF; /* 配置为高电平 */
PC_DDR = 0;
PC_CR1 = 0xFF;
PC_CR2 = 0;
PC_ODR = 0xFF;
PD_DDR = 0;
PD_CR1 = 0xFF;
PD_CR2 = 0;
PD_ODR = 0xFF;
}
/************************************************************
@Fn: ConfigTimer()
@Br: 配置定时器
@Pa: 无
@Rt: 无
@Specification: 无
************************************************************/
void ConfigTimer( void ){
TIM1_PSCRH = ( 1 << PSC10 );
TIM1_PSCRL = 0xFF;
/* Configure TIM1 prescaler = 512 */
/* Fck_cnt = Fck_psc / ( 2 ^[15:0] + 1 ) */
TIM1_PSCRH = 0;
TIM1_PSCRL = ( 1 << PSC01 ) + ( 1 << PSC00 );
/* Configure TIM1 prescaler = 4 */
/* Fck_cnt = Fck_psc / ( 2 ^[15:0] + 1 ) */
TIM1_ARRH = 0x94; /* TIM1的自动装载寄存器 */
TIM1_ARRL = 0x70;
TIM1_CNTRH = 0x94; /* TIM1的计数器 */
TIM1_CNTRL = 0x70;
/*
38,000
CNTR = ----------- * 4s = 0x9470 =>4s 产生一次中断
4
*/
TIM1_CR1 = ( 1 << ARPE ) + ( 1 << CEN ); /* 允许自动重装载,使能计数器 */
TIM1_IER = ( 1 << UIE ); /* 允许更新中断 */
}
/************************************************************
@Fn: ConfigADC()
@Br: 配置ADC
@Pa: 无
@Rt: 无
@Specification: 无
************************************************************/
void ConfigADC( void ){
ADC1_SR = 0;
ADC1_SQR1 = ( 1 << DMAOFF ); /* 禁止DMA传输,单转换模式 */
ADC1_SQR4 = ( 1 << CHSEL_S00 ); /* 使能ADC IN0通道 */
ADC1_CR3 = ADC_CH00; /* 第0通道 */
ADC1_CR2 = ( 1 << SMTP12 ) + ( 1 << SMTP11 ) + ( 1 << SMTP10 );
/* 时钟无分频,慢速模式的384个ADC时钟周期 */
ADC1_TRIGR1 &= ~( 1 << VREFINTON ); /* 关闭内部VREF参考源 */
ADC1_CR1 = ( 1 << EOCIE ) + ( 1 << CONT );
/* 中断使能,12位分辨率,连续模式 */
ADC1_CR1 |= ( 1 << ADON ); /* 打开ADC电源 */
/* 此处要延时,设置完成至少需要3uS时间等待参考源稳定 */
ADC1_CR1 |= ( 1 << START ); /* 软件启动转换 */
}
/************************************************************
@Fn: ConfigCPU()
@Br: 配置CPU及外围
@Pa: 无
@Rt: 无
@Specification: 无
************************************************************/
void ConfigCPU( void ){
_DI();
ConfigClock();
ConfigGPIO();
ConfigADC();
ConfigTimer();
_EI();
}
void main( void ){
uiTenor = 0;
ConfigCPU();
while( 1 )
{
if( uiTenor & T1_FLAG )
{
CLK_PCKENR2 |= ( 1 << ADC1_CLK_ENABLE );
ADC1_CR1 |= ( 1 << ADON );
ADC1_CR1 |= ( 1 << START ); /* 软件启动转换,由硬件自动清零 */
while(( uiTenor & ADC1_FLAG ) == 0 ); /* 至少3微秒时间延时确保精度 */
uiTenor &= ~ADC1_FLAG;
while(( uiTenor & ADC1_FLAG ) == 0 );
uiTenor &= ~ADC1_FLAG; /* 第一次结果不能使用 */
ADC1_CR1 &= ~( 1 << ADON );
uiTenor &= ~T1_FLAG;
}
if( uiTenor == 0 )
{
CLK_PCKENR2 &= ~( 1 << ADC1_CLK_ENABLE );
_WAIT_INTERR();
}
}
} |