[STM32F1]

低电压监测(PVD)是这样用的吗?

[复制链接]
633|3
手机看帖
扫描二维码
随时随地手机跟帖
新下级学|  楼主 | 2021-2-26 21:32 | 显示全部楼层 |阅读模式
本帖最后由 新下级学 于 2021-2-27 13:42 编辑

问题解决了,要使能 RCC_APB1ENR 的 PWR 位。手册里竟然没说!

========================================

电路如下图。

111.jpg

代码是这样:
main()
{
        PWR->CR |= PWR_CR_PLS;   //111: 2.9V
        PWR->CR |= PWR_CR_PVDE;
        while (1)
        {
                if ((PWR->CSR & PWR_CSR_PVDO) != 0)
                        GPIOB->ODR &= 0xfffE;
                else
                        GPIOB->ODR |= 0x1;
        }

}

意思就是不断检查 PWR_CSR 的 PVDO,当 电压 低于 2.9V 就点亮 LED。
但我反复调 电位器,LED 都不亮。因为只有 STLINK,所以没法在线调试。但 LED 亮、灭的代码单独验证过,所以肯定是 PVD 部分的问题。
请问怎么回事,谢谢!





使用特权

评论回复
新下级学|  楼主 | 2021-2-26 22:16 | 显示全部楼层
我还做了如下两个实验:
1、对调两个  GPIOB->ODR,变成 平时 LED 亮, 电压偏低时 LED 才灭 。
这时 倒有效了,当 3.3V 那里降到 3.1V 时, LED 灭。升高电压,就又亮。但我设定的电压是 2.9V啊!

2、 修改 PWR_CR_PLS,把电压设为 2.2V,结果还是 3.1V 时, LED 灭。说明我没能控制 LVD 的电压。

使用特权

评论回复
新下级学|  楼主 | 2021-2-27 13:01 | 显示全部楼层
我又做了第 3 个实验,证明实验 1 和 PVD 根本就没关系:
3、代码改为:
while (1)
        {
                        GPIOB->ODR &= 0xfffE;    //点亮 LED
        }
效果和实验 1 相同:当 3.3V 那里降到 3.1V 时, LED 灭。升高电压,就又亮。

使用特权

评论回复
cooldog123pp| | 2021-2-27 16:08 | 显示全部楼层
虽然我不是很明白,但是路过了就帮忙楼主顶贴一下,希望楼主问题早日解决。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

254

主题

668

帖子

3

粉丝