- 灵动微MM32F003硬件最小系统 --- 可编程的电平检测器P
- 灵动微MM32F003硬件最小系统 --- GPIO OUTPU
- 灵动微MM32F003硬件最小系统 --- GPIO INPUT
- 灵动微MM32F003硬件最小系统 --- keil mdk编译
- 灵动微MM32F003硬件最小系统 --- PWM例程解析【17
- 灵动微MM32F003硬件最小系统 --- 多路ADC DMA中
- 灵动微MM32F003硬件最小系统 --- SWD配置为GPIO
- 灵动微MM32F003硬件最小系统 --- GPIO外部中断例程
- 灵动微MM32F003硬件最小系统 --- SPI+DMA查询模
- 灵动微MM32F003硬件最小系统 --- SPI查询模式读写2
用户可以通过设置可编程电平检测器PVD来监控单片机系统电压。当系统电压低于或高于预设的PVD电压时,会在外部中断的第16线产生中断,中断服务程序会被调用。

本例程上电会先控制LED常量2秒,然后配置PVD电压。然后在while循环中以200ms的间隔闪烁LED。当系统电压改变时,会自动触发第16线中断,启动中断服务程序。此时中断服务程序会设置一个变量,使LED进入短暂的慢闪烁状态,几秒后又恢复快速闪烁状态。从而使我们可以判断是否产生PVD事件。
例程分为三个部分:
1 LED控制功能函数
#define LED1_ON() GPIO_ResetBits(LED1_Port,LED1_Pin)
#define LED1_OFF() GPIO_SetBits(LED1_Port,LED1_Pin)
#define LED1_TOGGLE() (GPIO_ReadOutputDataBit(LED1_Port,LED1_Pin))?(GPIO_ResetBits(LED1_Port,LED1_Pin)):(GPIO_SetBits(LED1_Port,LED1_Pin))
2 PVD功能初始化
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and
falling edges */
EXTI_ClearITPendingBit(EXTI_Line16);
EXTI_InitStructure.EXTI_Line = EXTI_Line16;// PVD map to EXTI_Line16
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/*******************************************************************************
* @name : NVIC_Configuration
* @brief : NVIC config
* @param : None
* @retval : void
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the PVD Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3 main函数
int main(void)
{
IsEnterPVD = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Configure EXTI Line to generate an interrupt on falling edge */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
EXTI_Configuration();
Uart_ConfigInit(9600);
/* NVIC configuration */
NVIC_Configuration();
delay_init();
LED_Init();
LED1_ON();
delay_ms(2000);
/* Configure the PVD Level to 1.8V */
// PWR_PVDLevelConfig(PWR_PVDLevel_1V8);
// PWR_PVDLevelConfig(PWR_PVDLevel_2V1);
// PWR_PVDLevelConfig(PWR_PVDLevel_2V4);
// PWR_PVDLevelConfig(PWR_PVDLevel_2V7);
// PWR_PVDLevelConfig(PWR_PVDLevel_3V0);
// PWR_PVDLevelConfig(PWR_PVDLevel_3V3);
// PWR_PVDLevelConfig(PWR_PVDLevel_3V6);
// PWR_PVDLevelConfig(PWR_PVDLevel_3V9);
// PWR_PVDLevelConfig(PWR_PVDLevel_4V2);
// PWR_PVDLevelConfig(PWR_PVDLevel_4V5);
PWR_PVDLevelConfig(PWR_PVDLevel_4V8);
/* Enable the PVD Output */
PWR_PVDCmd(ENABLE);
while(1) {
if(IsEnterPVD == 0){
LED1_TOGGLE();
delay_ms(200);
}
else{
LED1_ON();
delay_ms(5000);
LED1_OFF();
delay_ms(2000);
LED1_ON();
delay_ms(2000);
IsEnterPVD = 0;
}
}
}
由于PVD有一个110mV的迟滞电压,当系统电压下降或上升高于迟滞电压时,才会产生中断。
另外做个小广告,我自己打样的mm32f003最小系统板已经焊接调试成功,如果大家想要玩玩这块芯片,可以直接到我的淘宝小店---EE百宝箱---购买,可以免去你画板子焊板子的繁琐工作,拿到最小系统板后可以直接烧写程序,可以验证官方每一个官方例程,快速上手。
你的支持和点赞,是让我坚持下去的最大动力!
网友评论