(总结)STM32关于可编程电压检测器的运用
2013-07-30 17:19
218 查看
在实际工程运用中需要对突发情况作出及时的相应,通常都需要考虑当系统电压下降或断电时,需要对控制系统加以保护。这时候就需要在程序中加入系统电压监测(PVD)。供电电压降低到某一个电压值时,需要系统进入保护状态,执行紧急关闭任务(对系统数据进行保存,并对外设进行相应的保护操作)。传统单片机例如STC12C60S2,其自带A/D,可以利用A/D对工作电压进行检测,每隔一段时间进行比较,如果异常进入保护模式,进行相关的保护措施。但是这种方法不但会占用MCU处理时间,而且利用ADC也增加了系统的功耗。STM32就可以很完美的解决这一问题,其内部自带了一个可编程电压检测器(PVD),对VDD的电压进行监控可以通过电源控制寄存器PLS[
2:0 ]位来设置监控电压的阀值,这样通过与VDD电压比较达到了监控电压的目的。电源控制状态寄存器(PWR_CSR)中的PVDO用来表明VDD是高于还是低于PVD的电压阀值。当VDD下降到PVD阀值以下或VDD上升到PVD阀值之上时,通过外部中断16线上升或下降边沿触发设置,产生PVD中断。在中断处理函数中做相应的保护措施。具体由以下两表所示。
表1 阀值与PVD输出关系
表二 具体寄存器参数
相应示例代码
PWR_PVDLevelConfig(PWR_PVDLevel_2V8); // 设定监控阀值
PWR_PVDCmd(ENABLE); // 使能PVD
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到中断线16上
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //使用中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Raising;//电压低于阀值时产生中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/**************************************************************************
//Function : void PVD_NVIC_Configuration(void)
//Description :
//Input : none;
//Output : none
//created by :
**************************************************************************/
void PVD_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //point it;cann't lose it
NVIC_Init(&NVIC_InitStructure);
}
中断函数:
extern void dev_pvd_irq_handle(void);
void PVD_IRQHandler(void)
{
dev_pvd_irq_handle();
}
/**************************************************************************
//Function : void dev_pvd_irq_handle(void)
//Description : PVD handle function;
//Input : none;
//Output : none
//created by :
**************************************************************************/
extern u8 is_power_on;
void dev_pvd_irq_handle(void)
{
EXTI_ClearITPendingBit(EXTI_Line16);//clear bit;
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{
dev_misc_power_on(0);
}
}
//主函数中的操作:
Main()
{ … … PVD_NVIC_Configuration();
EXTI_Configuration();
PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//2.8V;added for PDV;//有范围的;
PWR_PVDCmd(ENABLE); //added for PDV; … …
}
//(除了用中断的方式,也可以用查询的方式:)
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{ … …
}
2:0 ]位来设置监控电压的阀值,这样通过与VDD电压比较达到了监控电压的目的。电源控制状态寄存器(PWR_CSR)中的PVDO用来表明VDD是高于还是低于PVD的电压阀值。当VDD下降到PVD阀值以下或VDD上升到PVD阀值之上时,通过外部中断16线上升或下降边沿触发设置,产生PVD中断。在中断处理函数中做相应的保护措施。具体由以下两表所示。
表1 阀值与PVD输出关系
表二 具体寄存器参数
相应示例代码
PWR_PVDLevelConfig(PWR_PVDLevel_2V8); // 设定监控阀值
PWR_PVDCmd(ENABLE); // 使能PVD
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到中断线16上
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //使用中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Raising;//电压低于阀值时产生中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/**************************************************************************
//Function : void PVD_NVIC_Configuration(void)
//Description :
//Input : none;
//Output : none
//created by :
**************************************************************************/
void PVD_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //point it;cann't lose it
NVIC_Init(&NVIC_InitStructure);
}
中断函数:
extern void dev_pvd_irq_handle(void);
void PVD_IRQHandler(void)
{
dev_pvd_irq_handle();
}
/**************************************************************************
//Function : void dev_pvd_irq_handle(void)
//Description : PVD handle function;
//Input : none;
//Output : none
//created by :
**************************************************************************/
extern u8 is_power_on;
void dev_pvd_irq_handle(void)
{
EXTI_ClearITPendingBit(EXTI_Line16);//clear bit;
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{
dev_misc_power_on(0);
}
}
//主函数中的操作:
Main()
{ … … PVD_NVIC_Configuration();
EXTI_Configuration();
PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//2.8V;added for PDV;//有范围的;
PWR_PVDCmd(ENABLE); //added for PDV; … …
}
//(除了用中断的方式,也可以用查询的方式:)
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{ … …
}
相关文章推荐
- 关于编程的那些事--学习总结
- 浅谈C#关于AOP编程的学习总结
- stm32 PVD 可编程电压监测器
- 关于网络编程中MTU、TCP、UDP优化配置的一些总结
- 关于名片管理系统的编程思想总结
- 为SSD编程(6):总结—每个程序员都应该了解的关于固态硬盘的知识
- angualr4.0的项目总结-关于vertical-align的运用和理解
- leetcode总结-- heapq运用,关于super ugly number, merge k sorted list
- 关于接口在J2EE编程中的小运用及一些体会
- 关于Java并发编程的总结和思考
- STM32的bootloader IAP编程(转载总结)
- 菜鸟编程 关于函数的一点总结
- 关于Java并发编程的总结和思考
- 关于Java并发编程的总结和思考
- 关于linux串口编程的一点总结
- 关于网络编程中MTU、TCP、UDP优化配置的一些总结
- C#编程中关于数据缓存的经验总结
- 10010---关于Java并发编程的总结和思考
- STM32定时器中断关于何时清除中断的总结
- 自己关于java编程的部分知识点总结