灵动微MM32F003硬件最小系统 --- 可编程的电平检测器P

2020-11-23  本文已影响0人  黄开通

用户可以通过设置可编程电平检测器PVD来监控单片机系统电压。当系统电压低于或高于预设的PVD电压时,会在外部中断的第16线产生中断,中断服务程序会被调用。


PVD设置表

本例程上电会先控制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百宝箱---购买,可以免去你画板子焊板子的繁琐工作,拿到最小系统板后可以直接烧写程序,可以验证官方每一个官方例程,快速上手。
你的支持和点赞,是让我坚持下去的最大动力!

上一篇下一篇

猜你喜欢

热点阅读