jeromeRo 发表于 2014-12-9 13:46:55

stm8l的PVD低电压检测程序

看了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();                                    //全局中断使能
}
下面该怎么办?

巅峰残狼 发表于 2014-12-9 15:13:33

既然是产生中断,应该会有一个表示产生中断的标志位,检测该标志位是否置位,当置位就点灯,我的理解,仅供参考

jeromeRo 发表于 2014-12-9 15:35:26

谢谢你的解答,在固件库里定义了:
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

巅峰残狼 发表于 2014-12-11 13:16:08

这个是STM32的PVD,应该和STM8差不多少,监测的话应该是通过程序设置,当高于时候会怎么样,低于的时候会怎么样,就是说两个方向的监测

巅峰残狼 发表于 2014-12-11 13:21:21

jeromeRo 发表于 2014-12-9 15:35
谢谢你的解答,在固件库里定义了:
enum   PWR_FLAG_TypeDef { PWR_FLAG_PVDOF = (uint8_t)0x40, PWR_FLAG_ ...

“PVDO是0代表高过配置电压,1代表低于配置电压”当高于阀值电压时,表示正常,PVDO为0;低于阀值时PVDO置1,产生中断,起到监测的目的;之后在中断函数里写保护代码就可以了啊

奔跑小蜗牛 发表于 2014-12-13 14:26:55

主程序:
void main(void)

    时钟初始化;
   GPIO初始化;
   PWR_INC();
   while(1);

stm8l15x_it.c中断函数:
INTERRUPT_HANDLER(EXTIE_F_PVD_IRQHandler,5)
{
LED_work();
}

wambob 发表于 2014-12-16 21:47:56

#define LED1_L()   (GPIO_ResetBits(GPIOD,GPIO_Pin_6))

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)
{
   
}
}

jeromeRo 发表于 2014-12-17 11:21:41

wambob 发表于 2014-12-16 21:47
#define LED1_L()   (GPIO_ResetBits(GPIOD,GPIO_Pin_6))

void CLK_INC(void)                            ...

你这个程序,无法进入中断的,我实验过了,仿真板无任何反应

jeromeRo 发表于 2014-12-17 11:23:52

奔跑小蜗牛 发表于 2014-12-13 14:26
主程序:
void main(void)



试过了,没反应

wambob 发表于 2014-12-17 21:31:01

请问楼主的开发环境是否配置好了:L
页: [1] 2
查看完整版本: stm8l的PVD低电压检测程序