• PY32F003F18之PVD可编程电压检测


    一、PVD功能介绍

    PY32F003F18有一个PVD可编程电压检测模块。

    "PVD可编程电压检测"可以用来检测"VCC引脚电压",也可以检测"PB7引脚电压";
    当使用VCC作为检测源时,VCC > "PVDT[2:0]设置的值" 或者 VCC < "PVDT[2:0]设置的值" 时,"EXTI line 16"会产生"上升/下降沿中断"
    当使用PB07引脚作为检测源时,Vpb07 > VREFINT 或者 Vpb07 < VREFINT 时,"EXTI line 16"会产生"上升/下降沿中断"
    VREFINT固定值为1.2V

    "电源控制寄存器2(PWR_CR2)"中的SRCSEL=0,VCC电压会与"PVDT[2:0]设置的值(检测阈值)"进行比较;测试时,通过调节VCC电压,可发现"EXTI line 16"会产生"上升/下降沿中断"

    "电源控制寄存器2(PWR_CR2)"中的SRCSEL=1,PB7上的电压会在内部与VREFINT进行比较
    PB7作为检测源,PB7上的电压会在内部与VREFINT进行比较,因此,设置"检测阈值PVDT[2:0]"无效。

    二、测试程序

    1. #include "PVD.h"
    2. #include "LED.h"
    3. /*
    4. "PVD可编程电压检测"可以用来检测"VCC引脚电压",也可以检测"PB7引脚电压";
    5. 当使用VCC作为检测源时,VCC > "PVDT[2:0]设置的值" 或者 VCC < "PVDT[2:0]设置的值" 时,"EXTI line 16"会产生"上升/下降沿中断"
    6. 当使用PB07引脚作为检测源时,Vpb07 > VREFINT 或者 Vpb07 < VREFINT 时,"EXTI line 16"会产生"上升/下降沿中断"
    7. VREFINT固定值为1.2V
    8. "电源控制寄存器2(PWR_CR2)"中的SRCSEL=0,VCC电压会与"PVDT[2:0]设置的值(检测阈值)"进行比较
    9. 测试时,通过调节VCC电压,可发现"EXTI line 16"会产生"上升/下降沿中断"
    10. "电源控制寄存器2(PWR_CR2)"中的SRCSEL=1,PB7上的电压会在内部与VREFINT进行比较
    11. PB07作为检测源,PB7上的电压会在内部与VREFINT进行比较,因此,设置"检测阈值PVDT[2:0]"无效
    12. */
    13. void PVD_Init_With_PB7(void);
    14. void PVD_Init_With_VCC(void);
    15. //函数功能:使用"PB7引脚"作为"PVD检测源"
    16. void PVD_Init_With_PB7(void)
    17. {
    18. GPIO_InitTypeDef GPIO_InitStructure;
    19. PWR_PVDTypeDef PWR_PVDStructure;
    20. PB7引脚初始化为模拟输入口开始//
    21. __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟
    22. GPIO_InitStructure.Pin = GPIO_PIN_7;
    23. GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    24. GPIO_InitStructure.Pull = GPIO_PULLUP;
    25. HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
    26. PB7引脚初始化为模拟输入口结束//
    27. __HAL_RCC_PWR_CLK_ENABLE(); //PWR时钟使能
    28. PWR_PVDStructure.PVDSource=PWR_PVD_SOURCE_PB07; //PVD检测为PB07
    29. PWR_PVDStructure.Mode=PWR_PVD_MODE_IT_RISING_FALLING; //PVD配置为上升沿和下降沿中断
    30. PWR_PVDStructure.PVDFilter=PWR_PVD_FILTER_NONE; //"数字滤波功能"
    31. PWR_PVDStructure.PVDLevel=PWR_PVDLEVEL_0;
    32. //PB07作为检测源,PB7上的电压会在内部与VREFINT进行比较,因此,设置PVDT[2:0]无效
    33. //VCC作为检测源,VCC电压会与"PVDT[2:0]设置的值"进行比较
    34. HAL_PWR_ConfigPVD(&PWR_PVDStructure); //PVD初始化
    35. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_0,电压上升沿检测阈值大约为1.8V;
    36. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_1,电压上升沿检测阈值大约为2.0V;
    37. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_2,电压上升沿检测阈值大约为2.2V;
    38. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_3,电压上升沿检测阈值大约为2.4V;
    39. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_4,电压上升沿检测阈值大约为2.6V;
    40. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_5,电压上升沿检测阈值大约为2.8V;
    41. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_6,电压上升沿检测阈值大约为3.0V;
    42. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_7,电压上升沿检测阈值大约为3.2V;
    43. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_NONE,无"数字滤波功能"
    44. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_1CLOCK,滤波时间大约为30us
    45. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_2CLOCK,滤波时间大约为60us
    46. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_4CLOCK,滤波时间大约为120us
    47. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_16CLOCK,滤波时间大约为480us
    48. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_64CLOCK,滤波时间大约为1.92ms
    49. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_128CLOCK,滤波时间大约为3.8ms
    50. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_1024CLOCK,滤波时间大约为30.7ms
    51. //PWR_PVDStructure->PVDSource=PWR_PVD_SOURCE_PB07,检测PB7引脚电压
    52. //PWR_PVDStructure->PVDSource=PWR_PVD_SOURCE_VCC,检测VCC引脚电压
    53. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_RISING,PVD配置为上升沿中断
    54. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_FALLING,PVD配置为下降沿中断
    55. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_RISING_FALLING,PVD配置为上升沿和下降沿中断
    56. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_RISING,PVD配置为上升沿事件唤醒
    57. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_FALLING,PVD配置为下降沿事件唤醒
    58. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_RISING_FALLING,PVD配置为上升沿和下降沿事件唤醒
    59. HAL_NVIC_EnableIRQ(PVD_IRQn);
    60. //使能"PVD中断源"产生中断
    61. HAL_PWR_EnablePVD();//使能PVD电压检测
    62. }
    63. //函数功能:使用"VCC引脚"作为"PVD检测源"
    64. //调节VCC电压,测试正常
    65. void PVD_Init_With_VCC(void)
    66. {
    67. PWR_PVDTypeDef PWR_PVDStructure;
    68. __HAL_RCC_PWR_CLK_ENABLE(); //PWR时钟使能
    69. PWR_PVDStructure.PVDSource=PWR_PVD_SOURCE_VCC; //PVD检测为VCC引脚
    70. PWR_PVDStructure.Mode=PWR_PVD_MODE_IT_RISING_FALLING; //PVD配置为上升沿和下降沿中断
    71. PWR_PVDStructure.PVDFilter=PWR_PVD_FILTER_NONE; //"数字滤波功能"
    72. PWR_PVDStructure.PVDLevel=PWR_PVDLEVEL_7;
    73. //电压上升沿检测阈值大约为3.2V;
    74. //VCC作为检测源,VCC电压会与"PVDT[2:0]设置的值"进行比较
    75. //PB07作为检测源,PB7上的电压会在内部与VREFINT进行比较,因此,设置PVDT[2:0]无效
    76. HAL_PWR_ConfigPVD(&PWR_PVDStructure); //PVD初始化
    77. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_0,电压上升沿检测阈值大约为1.8V;
    78. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_1,电压上升沿检测阈值大约为2.0V;
    79. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_2,电压上升沿检测阈值大约为2.2V;
    80. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_3,电压上升沿检测阈值大约为2.4V;
    81. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_4,电压上升沿检测阈值大约为2.6V;
    82. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_5,电压上升沿检测阈值大约为2.8V;
    83. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_6,电压上升沿检测阈值大约为3.0V;
    84. //PWR_PVDStructure->PVDLevel=PWR_PVDLEVEL_7,电压上升沿检测阈值大约为3.2V;
    85. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_NONE,无"数字滤波功能"
    86. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_1CLOCK,滤波时间大约为30us
    87. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_2CLOCK,滤波时间大约为60us
    88. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_4CLOCK,滤波时间大约为120us
    89. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_16CLOCK,滤波时间大约为480us
    90. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_64CLOCK,滤波时间大约为1.92ms
    91. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_128CLOCK,滤波时间大约为3.8ms
    92. //PWR_PVDStructure->PVDFilter=PWR_PVD_FILTER_1024CLOCK,滤波时间大约为30.7ms
    93. //PWR_PVDStructure->PVDSource=PWR_PVD_SOURCE_PB07,检测PB7引脚电压
    94. //PWR_PVDStructure->PVDSource=PWR_PVD_SOURCE_VCC,检测VCC引脚电压
    95. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_RISING,PVD配置为上升沿中断
    96. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_FALLING,PVD配置为下降沿中断
    97. //PWR_PVDStructure->Mode=PWR_PVD_MODE_IT_RISING_FALLING,PVD配置为上升沿和下降沿中断
    98. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_RISING,PVD配置为上升沿事件唤醒
    99. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_FALLING,PVD配置为下降沿事件唤醒
    100. //PWR_PVDStructure->Mode=PWR_PVD_MODE_EVENT_RISING_FALLING,PVD配置为上升沿和下降沿事件唤醒
    101. HAL_NVIC_EnableIRQ(PVD_IRQn);
    102. //使能"PVD中断源"产生中断
    103. __HAL_PWR_PVD_EXTI_CLEAR_FLAG();
    104. //"挂起寄存器EXTI_PR"中的PR16位,PR16=1表示清除"EXTI line 16上升沿/下降沿/软件触发事件请求"
    105. //Clear PVD exti pending bit
    106. HAL_PWR_EnablePVD();//使能PVD电压检测
    107. }
    108. //函数功能:PVD上升沿/下降沿中断服务函数
    109. //"EXTI line 16"上升/下降沿中断
    110. void PVD_IRQHandler(void)
    111. {
    112. if(__HAL_PWR_PVD_EXTI_GET_FLAG() != 0x0U)
    113. {//"挂起寄存器EXTI_PR"中的PR16位,PR16=1表示产生"EXTI line 16上升沿/下降沿/软件触发事件请求"
    114. __HAL_PWR_PVD_EXTI_CLEAR_FLAG();
    115. //"挂起寄存器EXTI_PR"中的PR16位,PR16=1表示清除"EXTI line 16上升沿/下降沿/软件触发事件请求"
    116. //Clear PVD exti pending bit
    117. //HAL_PWR_PVD_Callback函数开始
    118. if(__HAL_PWR_GET_FLAG(PWR_SR_PVDO))//小于"PVD选择的比较阈值"
    119. { //(__FLAG__)=PWR_FLAG_PVDO,读"电源状态寄存器PWR_SR"中的PVDO位
    120. //返回值0,PVD检测结果输出:被检测的VCC或者PB7超出PVD选择的比较阈值
    121. //返回值1,PVD检测结果输出:被检测的VCC或者PB7低于PVD选择的比较阈值
    122. // MCU_LED_Off();
    123. MCU_LED_On();
    124. }
    125. else//大于"PVD选择的比较阈值"
    126. {
    127. // MCU_LED_On();
    128. MCU_LED_Off();
    129. }
    130. //HAL_PWR_PVD_Callback函数结束
    131. }
    132. }
    1. #include "py32f0xx_hal.h"
    2. #include "SystemClock.h"
    3. #include "delay.h"
    4. #include "LED.h"
    5. #include "SystemClock.h"
    6. #include "USART2.h"
    7. #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
    8. #include "string.h" //使能strcpy(),strlen(),memset()
    9. #include "PVD.h"
    10. const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
    11. const char CPU_Run_REG[]="\r\nCPU run!\r\n";
    12. int main(void)
    13. {
    14. HSE_Config();
    15. // HSI_Config();
    16. // HAL_Init();//systick初始化
    17. delay_init();
    18. HAL_Delay(1000);
    19. USART2_Init(115200);
    20. //PA0是为USART2_TX,PA1是USART2_RX
    21. //中断优先级为0x01
    22. //波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
    23. printf("%s",CPU_Reset_REG);
    24. HAL_Delay(1000);
    25. printf("%s",CPU_Run_REG);
    26. MCU_LED_Init();
    27. // PVD_Init_With_PB7();//使用"PB7引脚"作为"PVD检测源"
    28. PVD_Init_With_VCC(); //使用"VCC引脚"作为"PVD检测源",调节VCC电压,测试正常
    29. while (1)
    30. {
    31. HAL_Delay(500);
    32. // MCU_LED_Toggle();
    33. printf("1234567890\r\n");
    34. }
    35. }

    三、实验结果

    "EXTI line 16"会产生"上升/下降沿中断",LED状态会改变。

  • 相关阅读:
    Java策略模式之总有你想不到的知识
    入行 4 年,跳槽 2 次,我摸透了软件测试这一行
    Flink 任务失败重启与恢复策略
    Jmeter-非GUI模式下运行jmeter脚本-适用于服务器上持续集成测试
    基于SSM实现的艺术品鉴定管理系统+App
    [C# WPF] 如何给控件添加边框(Border)?
    记CVE-2022-39227-Python-JWT漏洞
    【强化学习篇】on-policy 和 off-policy 的区别
    vue 测试环境配置test
    反射工具类 guava Apache spring
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/133668775