OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2536|回复: 2

stm32f103rbt6怎么设置为睡眠模式,求例程

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2019-7-29
在线时间
59 小时
发表于 2019-11-14 15:47:07 | 显示全部楼层 |阅读模式
5金钱
stm32f103rbt6怎么设置为睡眠模式,求例程

只能选用睡眠模式,当一分钟检测不到输入电压和开关信号(设置的引脚为PA6,PB3),mcu进入睡眠模式。当这两个引脚任意一个置位低电平时,MCU重启。这种应该怎么去写,算什么唤醒。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-11-14 15:47:08 | 显示全部楼层
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "key.h"
  6. #include "iwdg.h"
  7. #include "wwdg.h"
  8. #include "exti.h"


  9. void Sys_Standby(void)
  10. {
  11.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                 //使能PWR外设时钟
  12.     PWR_WakeUpPinCmd(ENABLE);                                                                          //使能唤醒管脚功能  WKUP
  13.     PWR_EnterSTANDBYMode();                                                                           //进入待机(standby)模式
  14. }

  15. //系统进入待机模式   WKUP引脚上升沿、RTC脑子、NRST复位、IWDG复位 唤醒  中断不能唤醒
  16. void Sys_Enter_Standby(void)
  17. {
  18.     RCC_APB2PeriphResetCmd(0X01FC, DISABLE);                                         //复位所有IO口,屏蔽这条语句也没有看到什么影响
  19.     Sys_Standby();
  20. }

  21. //进入停止模式   任意外部中断唤醒  WKUP不能唤醒  停止模式唤醒后系统 默认为 HSI 需要重新设置时钟
  22. void enter_stop_mode(void)
  23. {
  24.     EXIT_UART_Init();                                                                                        //RX引脚配置为外部中断
  25.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                 //开电源管理时钟

  26.     PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);                //进入停机模式
  27. }
  28. //进入睡眠模式 任意中断唤醒  WKUP不能唤醒
  29. void sleep_mode_wfi(void)
  30. {
  31.     __WFI();                                                                                                        //WFI指令进入睡眠
  32. }
  33. //进入睡眠模式 唤醒事件唤醒  WKUP 不能唤醒
  34. void sleep_mode_wfe(void)
  35. {
  36.     __WFE();
  37. }


  38. int main(void)
  39. {
  40.     u8 i = 0, j = 0;
  41.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  42.     delay_init();                                                                                       //延时函数初始化
  43.     LED_Init();                                                                                         //初始化与LED连接的硬件接口
  44.     KEY_Init();
  45.     uart_init(9600);

  46.     LED = 1;
  47.     delay_ms(500);
  48.     printf("low power test! \r\n\r\n");
  49.     while(1)
  50.     {
  51.         i =  KEY_Scan(1);

  52.         switch(i)
  53.         {
  54.         case 0:
  55.             break;
  56.         case 1:
  57.             printf("进入停机模式\r\n\r\n");
  58.             enter_stop_mode();                                                                        //唤醒后从程序下一条语句开始执行
  59.             printf("退出停机模式\r\n\r\n");                              //唤醒后执行当前语句
  60.             break;
  61.         case 2:
  62.             printf("进入待机模式\r\n\r\n");                               
  63.             Sys_Enter_Standby();                                                                 //唤醒后从程序开始位置执行
  64.             printf("退出待机模式\r\n\r\n");                                                 //执行不到这块
  65.             break;
  66.         case 3:
  67.             printf("进入睡眠模式 中断唤醒 \r\n\r\n");
  68.             sleep_mode_wfi();                                                                        //唤醒后接着下一条语句执行
  69.             printf("退出睡眠模式 中断唤醒 \r\n\r\n");                     //唤醒后执行当前语句
  70.             break;
  71.         case 4:
  72.             printf("进入睡眠模式 事件唤醒 \r\n\r\n");
  73.             sleep_mode_wfe();                                                                        //唤醒后接着下一条语句执行
  74.             printf("退出睡眠模式 事件唤醒 \r\n\r\n");                                //唤醒后执行当前语句
  75.             break;
  76.         }

  77.         j++;
  78.       
  79.                 if(j>199)
  80.                 {
  81.                           j = 0;
  82.                         printf("low power test running!\r\n");
  83.                 }

  84.            if(j % 5==0)
  85.         {      
  86.             LED = !LED;
  87.         }
  88.         delay_ms(10);

  89.     }
  90. }


复制代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-11-15 03:22:47 | 显示全部楼层
例程可以看ST官方的代码,自己写也不难,就是参考数据手册序列。最后,可以尝试论坛搜索找找看有没有参考。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 00:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表