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

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

作者: 黄开通 | 来源:发表于2020-11-23 14:48 被阅读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百宝箱---购买,可以免去你画板子焊板子的繁琐工作,拿到最小系统板后可以直接烧写程序,可以验证官方每一个官方例程,快速上手。
    你的支持和点赞,是让我坚持下去的最大动力!

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/gufviktx.html