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(); //全局中断使能
}
下面该怎么办? 既然是产生中断,应该会有一个表示产生中断的标志位,检测该标志位是否置位,当置位就点灯,我的理解,仅供参考 谢谢你的解答,在固件库里定义了:
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 这个是STM32的PVD,应该和STM8差不多少,监测的话应该是通过程序设置,当高于时候会怎么样,低于的时候会怎么样,就是说两个方向的监测 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,产生中断,起到监测的目的;之后在中断函数里写保护代码就可以了啊 主程序:
void main(void)
{
时钟初始化;
GPIO初始化;
PWR_INC();
while(1);
}
stm8l15x_it.c中断函数:
INTERRUPT_HANDLER(EXTIE_F_PVD_IRQHandler,5)
{
LED_work();
}
#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)
{
}
} wambob 发表于 2014-12-16 21:47
#define LED1_L() (GPIO_ResetBits(GPIOD,GPIO_Pin_6))
void CLK_INC(void) ...
你这个程序,无法进入中断的,我实验过了,仿真板无任何反应 奔跑小蜗牛 发表于 2014-12-13 14:26
主程序:
void main(void)
{
试过了,没反应 请问楼主的开发环境是否配置好了:L
页:
[1]
2