你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8l的PVD低电压检测程序

[复制链接]
jeromeRo 提问时间:2014-12-9 13:46 /
看了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();                                    //全局中断使能
}
下面该怎么办?
收藏 评论16 发布时间:2014-12-9 13:46

举报

16个回答
wamcncn 回答时间: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-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: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-9 15:13:33
既然是产生中断,应该会有一个表示产生中断的标志位,检测该标志位是否置位,当置位就点灯,我的理解,仅供参考
巅峰残狼 回答时间:2014-12-11 13:16:08
这个是STM32的PVD,应该和STM8差不多少,监测的话应该是通过程序设置,当高于时候会怎么样,低于的时候会怎么样,就是说两个方向的监测 9CB_GIL)FENYX]~FQ`W(`]4.jpg
奔跑小蜗牛 回答时间: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();
}
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)

试过了,没反应
wamcncn 回答时间:2014-12-17 21:31:01
请问楼主的开发环境是否配置好了
jeromeRo 回答时间:2014-12-18 10:12:17
wambob 发表于 2014-12-17 21:31
请问楼主的开发环境是否配置好了

IAR ,完全配置好。I2C程序已经调通,现在就是PVD,使用的stm8L151F2,其电源接口和参考电压接口是一样的,PVD是直接检测电源的,除了时钟无需配置其他
AndyYau-268557 回答时间:2014-12-26 11:53:50
按照楼上两位的程序,应该可以,标志位由硬件操作。只需要产生中断就可以。请检查硬件后,在查看软件配置。另外考虑电平持续时间的问题
拼命三郎 回答时间:2015-2-7 10:41:44
xxxxxxxxxx.jpg
默罕默德.ST 回答时间:2015-2-7 11:00:19
xxxxxxxxxx.jpg
拼命三郎 回答时间:2015-2-10 12:49:50
xxzc.jpg
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版