看了stm8l的资料,知道了可以通过PVD直接对低电压进行程序操作,省去了AD转换那些麻烦问题。但是我从没使用过,看了网上有人发过stm32的PVD电压检测程序,一头雾水。请大家指导下STM8L的PVD低电压检测该怎么写,使用官方固件库,比如低于2.65V就调用LED闪。 void LED_work(void) {...} void PWR_INC(void) //PWR初始化 { PWR_PVDLevelConfig(PWR_PVDLevel_2V65); //PVD设置2.65V PWR_PVDCmd(ENABLE); //PVD使能 PWR_PVDITConfig(ENABLE); //PVD中断使能 __enable_interrupt(); //全局中断使能 } 下面该怎么办? |
void CLK_INC(void) //时钟配置
{
CLK_SYSCLKDivConfig (CLK_SYSCLKDiv_16); //时钟16分频
}
void GPIO_INC(void) //IO口初始化
{
GPIO_Init(GPIOD,GPIO_Pin_6,GPIO_Mode_Out_PP_High_Slow);
}
void delayms(u16 i)
{
u16 j;
for(;i > 0;i --)
for(j = 500;j > 0;j --); //延时
}
void PWR_INC(void) //PWR初始化
{
PWR_PVDLevelConfig(PWR_PVDLevel_2V85); //PVD设置2.85V
PWR_PVDCmd(ENABLE); //PVD使能
PWR_PVDITConfig(ENABLE); //PVD中断使能
}
void main(void)
{
CLK_INC();
GPIO_INC();
PWR_INC(); //进入中断点亮LED
__enable_interrupt(); //全局中断使能
while (1)
{
}
}
enum PWR_FLAG_TypeDef { PWR_FLAG_PVDOF = (uint8_t)0x40, PWR_FLAG_PVDIF = (uint8_t)0x20, PWR_FLAG_VREFINTF = (uint8_t)0x01 }
其中PVDOF是高低电压的标志。但是RM0031手册的70页里面写的是PVDO是0代表高过配置电压,1代表低于配置电压。而不是说的标志,是寄存器配置
有点搞不清该怎么写了
PVDOF: PVD output flag
This bit is set and cleared by hardware.
0: VDD/VDDA is above the VPVD threshold
1: VDD/VDDA is below the VPVD threshold
“PVDO是0代表高过配置电压,1代表低于配置电压”当高于阀值电压时,表示正常,PVDO为0;低于阀值时PVDO置1,产生中断,起到监测的目的;之后在中断函数里写保护代码就可以了啊
void main(void)
{
时钟初始化;
GPIO初始化;
PWR_INC();
while(1);
}
stm8l15x_it.c中断函数:
INTERRUPT_HANDLER(EXTIE_F_PVD_IRQHandler,5)
{
LED_work();
}
你这个程序,无法进入中断的,我实验过了,仿真板无任何反应
试过了,没反应
IAR ,完全配置好。I2C程序已经调通,现在就是PVD,使用的stm8L151F2,其电源接口和参考电压接口是一样的,PVD是直接检测电源的,除了时钟无需配置其他