你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103停止模式唤醒异常,求助啦

[复制链接]
wakojosin 提问时间:2015-6-2 23:23 /
本帖最后由 wakojosin 于 2015-6-3 16:28 编辑

现在对这个问题做一个小结吧,希望对遇到类似问题的朋友有点参考价值。如有什么不对或是不全的地方,希望大神能够指出,在此谢谢啦。
1.关于无法进入停机模式,单独运行却可以:目前的解决方法是当通过仿真器下载完程序之后,拔掉仿真器后运行就OK了,具体为什么会造成单独运行停机模式是可以的,加入其他程序就不行的原因还未知,但是这也算一个解决方法吧。
2.关于PA0的WKUP功能,从手册上看,WKUP功能是在待机模式下使用的,在停机模式下,现在的测试结果是无效,同时使能唤醒Pin功能之后对PA0的中断有影响,这个也就是造成了在进入停机模式之前,PA0的中断函数是能够进入的,但是进入停机模式之后却没有任何反应,因为在进入停机模式之前开启了WKUP功能。
3.关于USART2对PA0的影响,首先PA0的复用功能有USART_CTS,这是硬件流控制使用的,我在配置串口的时候未使用该功能,在程序测试中,USART2暂时还没有出现对唤醒功能有影响,或是PA0的设置对串口有影响的情况。

我在使用PA0中是将PA0配置成普通中断使用来唤醒停机模式的,为什么选PA0也是为了之后在待机模式上作兼容的考虑。仅供各位参考哈。

==============分=============割=============线===================

程序独立运行的时候没有问题,但是加入了串口,定时器等等,就出现问题了;其中定时器是开中断的,但是在进入停止模式之前停止了,并且做了定时器中断标志位的清除,如下:
TIM_Cmd(TIM2, DISABLE);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* Enable PWR and BKP clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//进入停机模式
SYSCLKConfig();
/* TIM2 enable counter */
TIM_Cmd(TIM2, ENABLE);

程序运行之后直接跳过了停机模式,不知道为什么,看了和试了好多例子都不行,希望大神出来指点一下吧

今天用同样的程序竟然可以进停止模式了!!原因未知好郁闷。

使用PA0的WKUP功能需要作引脚映射吗?

main.c
  1. #include "main.h"
  2. #include "stdio.h"

  3. void NVIC_Configuration(void)
  4. {
  5.   NVIC_InitTypeDef NVIC_InitStructure;

  6.   /* 1 bit for pre-emption priority, 3 bits for subpriority */
  7.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  8.   /* Configure and enable SPI_MASTER interrupt -------------------------------
  9.   NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
  10.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  11.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  12.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  13.   NVIC_Init(&NVIC_InitStructure);
  14.         NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  15.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  16.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  17.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  18.   NVIC_Init(&NVIC_InitStructure);*/
  19.         /* Configure and enable TIM interrupt -------------------------------*/
  20.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  21.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  22.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  23.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  24.   NVIC_Init(&NVIC_InitStructure);
  25.         /* Configure and enable USART interrupt -------------------------------*/
  26.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  27.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  28.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  29.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  30.   NVIC_Init(&NVIC_InitStructure);
  31.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  32.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  33.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  34.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  35.   NVIC_Init(&NVIC_InitStructure);
  36.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  37.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  38.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  39.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  40.   NVIC_Init(&NVIC_InitStructure);
  41. }
  42. void WKUP_IOInit(void)
  43. {
  44.         GPIO_InitTypeDef GPIO_InitStructure;
  45.         EXTI_InitTypeDef   EXTI_InitStructure;
  46.         
  47.         /* Enable GPIO clock */
  48.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  49.         
  50.         /* Configure EXTI0 line */
  51.   EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  52.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  53.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
  54.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  55.   EXTI_Init(&EXTI_InitStructure);
  56.         
  57.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  58.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  59.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  60.         
  61.   /* Connect EXTI0 Line to PA.00 pin */
  62.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
  63. }
  64. void SYSCLKReConfig(void)
  65. {
  66.         ErrorStatus HSEStartUpStatus;
  67.   /* Enable HSE */
  68.   RCC_HSEConfig(RCC_HSE_ON);

  69.   /* Wait till HSE is ready */
  70.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  71.   if(HSEStartUpStatus == SUCCESS)
  72.   {
  73.     /* Enable PLL */
  74.     RCC_PLLCmd(ENABLE);

  75.     /* Wait till PLL is ready */
  76.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  77.     {
  78.     }

  79.     /* Select PLL as system clock source */
  80.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  81.     /* Wait till PLL is used as system clock source */
  82.     while(RCC_GetSYSCLKSource() != 0x08)
  83.     {
  84.     }
  85.   }
  86. }
  87. void Board_Init(void)
  88. {
  89.         NVIC_Configuration();
  90.   My_COM2_Init(9600);
  91.         My_COM1_Init(2400);
  92.         
  93.         //My_ADC1_Init();//需要更换IO
  94.         My_Delay_Init();
  95.         TIM2_Init();
  96.         LCD_Init();
  97.         WKUP_IOInit();
  98.         
  99.         OLED_B_Init();
  100.         delayMs(500);
  101.         LLW_D_LoadData();
  102.         delayMs(500);
  103.         WIFI_Init();
  104. }
  105. uint8_t wifi_sed_s=0;
  106. int main(void)
  107. {
  108.         char lcdstr[20];
  109.         uint16_t gp2y10_data;
  110.         uint8_t keyvalue;
  111.         
  112.         Board_Init();

  113.         LCD_Fill(0x00);
  114.         
  115.   while(1)
  116.         {

  117.                 LCD_P12x24Str(0,2,"T:   H:  %");
  118.                 LCD_P12x24Str(0,5,"PM2.5:");
  119.                 while(1)
  120.                 {
  121.                         gp2y10_data=10;
  122.                         while(gp2y10_data)
  123.                         {
  124.                                 keyvalue=OLEDGUI_B_Read();
  125.                                 if(keyvalue==0XFF)
  126.                                 {
  127.                                         delayMs(100);
  128.                                 }
  129.                                 else
  130.                                 {
  131.                                         break;
  132.                                 }
  133.                                 gp2y10_data--;
  134.                         }
  135.                         if(keyvalue==0XFF)
  136.                         {
  137.                                 if(DHT11_ReadData())
  138.                                 {
  139.                                         sprintf(lcdstr,"T:%2d H:%2d%%",DHT11_Data[2],((DHT11_Data[0]&0XF0)>>4)*16+(DHT11_Data[0]&0X0F));
  140.                                         sprintf(LLW_D_TVALUE,"%2d",DHT11_Data[2]);
  141.                                         sprintf(LLW_D_HVALUE,"%2d",DHT11_Data[0]);
  142.                                         LCD_P12x24Str(0,2,lcdstr);
  143.                                 }
  144.                                 /*if((gp2y10_data=GP2Y10_ReadData())!=0XFFFF)
  145.                                 {
  146.                                         sprintf(LLW_D_PVALUE,"%3d",gp2y10_data);
  147.                                         LCD_P12x24Str(72,5,LLW_D_PVALUE);
  148.                                 }*/
  149.                                 if(wifi_sed_s)
  150.                                 {
  151.                                         wifi_sed_s=0;
  152.                                         WIFI_D_Send();
  153.                                 }
  154.                         }
  155.                         else
  156.                         {
  157.                                 break;
  158.                         }
  159.                         WIFI_EN(0);
  160.                         LCD_Fill(0x00);
  161.                         TIM_Cmd(TIM2, DISABLE);
  162.                         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  163.                         delayMs(10);
  164.                         /* Enable PWR and BKP clock */
  165.                         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  166.                         PWR_WakeUpPinCmd(ENABLE);
  167.                         PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//进入停机模式
  168.                         SYSCLKReConfig();
  169.                         /* TIM2 enable counter */
  170.                         TIM_Cmd(TIM2, ENABLE);
  171.                         WIFI_EN(1);
  172.                         delayMs(20);
  173.                 }
  174.                 //进入设置
  175.                 MenuGeneralSet();
  176.         }
  177. }
复制代码


收藏 评论17 发布时间:2015-6-2 23:23

举报

17个回答
wakojosin 回答时间:2015-6-3 16:01:05
本帖最后由 wakojosin 于 2015-6-3 16:06 编辑
安 发表于 2015-6-3 15:57
按照手册的说明是外部一个上升沿可以唤醒。进入这种STOP模式,外部只要是中断都能唤醒的。串口1对这个没影 ...

这个WKUP唤醒是在待机模式,手册上没有对停机模式有这个描述,是写了中断唤醒。现在的状态是,拔掉仿真器的线,全部OK,再次插上线之后也是正常进入停止模式,还有唤醒。所以这个又有还多需要学习研究的了。通过断开仿真器线后正常运行程序也解释了,昨天为什么不能进入待机模式和程序不能正常跑,而今天再次运行就可以了,可能是仿真器的状态影响着单片机的程序执行,所以出现了这种效果,详情还得好好学习学习才知道了。
废鱼 回答时间:2015-6-3 10:47:36
在线仿真的时候,是进去不了休眠模式的。要进入需要设置,休眠模式建议不要在线仿真。
insec 回答时间:2020-3-31 18:55:41
wakojosin 发表于 2015-6-3 15:36
独立运行是可以的,也是用串口2,串口1应该对PA0没有影响吧。目前中断是在while之外是可以进入的,但是进 ...

PA0是特殊的外部中断引脚,功能就是用来唤醒待机或者停止模式的单片机,之前拿这个脚来做普通上下拉引脚,结果死活不成功,吃亏了后来才知道,然而我的问题很奇怪,我可以进入停止模式,也可以通过外部中断唤醒进入主函数,但是重复一些次数之后就会出现程序只能运行到进入停止模式的函数体之后剩余的部分,函数体结束之后不能进入主函数,只能断电重新开启才能再次正常工作,但是多重复几次之后又会出现上面的问题,,,,就很奇怪
废鱼 回答时间:2015-6-3 09:01:45
楼主用的是在线仿真吗?
wakojosin 回答时间:2015-6-3 10:33:10
安 发表于 2015-6-3 09:01
楼主用的是在线仿真吗?

嗯嗯是的,用的stlink
wakojosin 回答时间:2015-6-3 11:09:18
安 发表于 2015-6-3 10:47
在线仿真的时候,是进去不了休眠模式的。要进入需要设置,休眠模式建议不要在线仿真。 ...

可以的呀,在调试模式里面的低功耗模式调试支持有写可以的,只要配置一下就可以了,如果不配置,仿真会断开,而且在单独运行停止模式的时候也没有什么问题呢,就是加入了其他东西之后就不正常了。试了一下,不仿真,通过串口打印信息,也是没有达到进入低功耗的效果
你好我好大家好! 回答时间:2015-6-3 12:51:24
帮顶了              
废鱼 回答时间:2015-6-3 14:06:53
楼主可否将整个工程上传一下?看不到其他的代码配置。
wakojosin 回答时间:2015-6-3 14:34:40
安 发表于 2015-6-3 14:06
楼主可否将整个工程上传一下?看不到其他的代码配置。

main.c已经贴出来了,现在的问题是无法唤醒,用的PA0,有问题不明白,PA0中断唤醒跟其他外部中断唤醒有什么区别吗
废鱼 回答时间:2015-6-3 15:17:35
之前的唤醒,有没有考虑是串口中断引起的?
我这边测试PA0配置可以产生中断。楼主在运行模式下,PA0是否可以产生中断?
wakojosin 回答时间:2015-6-3 15:36:49
安 发表于 2015-6-3 15:17
之前的唤醒,有没有考虑是串口中断引起的?
我这边测试PA0配置可以产生中断。楼主在运行模式下,PA0是否可 ...

独立运行是可以的,也是用串口2,串口1应该对PA0没有影响吧。目前中断是在while之外是可以进入的,但是进入之后也不好把握这个是否能够进入中断,因为很快就断开仿真了。没法看,在进入停止模式之前能不能进入中断函数,我再试试。关于PA0 它的复用功能有一个是WKUP,这个是指唤醒的IO吗?只是在待机模式跟其他IO有区别是吧,我从手册上理解是这样的,因为STOP模式所有EXTI都可以唤醒,但觉也就没啥区别了吧
废鱼 回答时间:2015-6-3 15:57:37
按照手册的说明是外部一个上升沿可以唤醒。进入这种STOP模式,外部只要是中断都能唤醒的。串口1对这个没影响。楼主的串口2用的是哪个IO?通过PWR_CSR的描述,WKUP这里开启就可以了。应该是不用配置中断就可以将MCU唤醒。这个还需要进行测试一下。
废鱼 回答时间:2015-6-3 16:39:56
手册中没有详细描述这个功能。从他的字面意思上去理解和十几测试来获得正确结果。很多功能,我们不用的时候可能不去仔细研究他,用到的时候,测试+手册说明来证明。
wakojosin 回答时间:2015-6-3 16:52:31
安 发表于 2015-6-3 16:39
手册中没有详细描述这个功能。从他的字面意思上去理解和十几测试来获得正确结果。很多功能,我们不用的时候 ...

是的是的,谢谢版主大人的指导
废鱼 回答时间:2015-6-3 17:09:46
这是我应该做的。我希望和大家一块探讨,有问题随时留贴。
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版