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

停机突然变成了复位

[复制链接]
yyq006 提问时间:2018-2-9 20:26 /
本帖最后由 yyq006 于 2018-2-10 10:05 编辑

用STM32F103C8T6做了个模块,空闲时进入停机模式,有需要时再唤醒。本来程序运行的好好的,停机和唤醒都没有问题。今天改了一个数据计算的参数(与工作模式无关),重新编译了一下后停机命令就变成复位了,停机命令执行完直接跳到程序起点。有谁知道是怎么回事?
编译器用的是keil5,中间升级过pack。
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.   uint32_t tempbak;
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration----------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* USER CODE BEGIN Init */

  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */

  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_DMA_Init();
  18.   MX_ADC1_Init();
  19.   MX_I2C1_Init();
  20.   MX_USART1_UART_Init();
  21.   MX_USART3_UART_Init();
  22.   MX_TIM3_Init();
  23.   MX_RTC_Init();
  24.   MX_TIM4_Init();

  25.   /* USER CODE BEGIN 2 */
  26.   HAL_GPIO_WritePin(GPIOB,LED_B_Pin, GPIO_PIN_RESET);
  27.   HAL_TIM_Base_Start_IT(&htim4);
  28.   __HAL_RCC_PWR_CLK_ENABLE();
  29.   //HAL_PWR_DisableWakeUpPin(PWR_CSR_EWUP);                     //½ûÖ¹wakeup PA0,×÷ΪÆÕͨÒý½Å
  30.   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  31.   HAL_UART_Receive_DMA(&huart1, UsartType1.usartDMA_rxBuf, RECEIVELEN);
  32.   __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
  33.   HAL_UART_Receive_DMA(&huart3, UsartType3.usartDMA_rxBuf, RECEIVELEN);
  34.   HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 12);
  35.   HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_RESET);
  36. //  MX680Q_Init();
  37.   FLASH_If_Init();
  38.   Readset();
  39.   while(!adcok){};
  40.   adcok=0;
  41.   COLL_data.SYS_sta=0xff;
  42.   if(BAT_id==4)COLL_data.SYS_sta&=0xf7;
  43.   if(COLL_data.BAT_val==0)COLL_data.SYS_sta&=0xfd;
  44.   if(HAL_GPIO_ReadPin(GPIOA,VIN_Pin)==1)  //Ö÷µç¹¤×÷
  45.   {
  46.             Vext=1;
  47.             COLL_data.power=0;
  48.                 HAL_TIM_Base_Start_IT(&htim3);
  49.                 if(BAT_id==2)
  50.                 {
  51.                         HAL_GPIO_WritePin(GPIOB,CHG_SEL_Pin,GPIO_PIN_RESET);     //ÉèÖÃС³äµçµçÁ÷
  52.                         HAL_GPIO_WritePin(GPIOB,CHG_EN_Pin,GPIO_PIN_RESET);    //Æô¶¯³äµç
  53.                 }
  54.                 if(BAT_id==3)
  55.                 {
  56.                         HAL_GPIO_WritePin(GPIOB,CHG_SEL_Pin,GPIO_PIN_SET);     //ÉèÖôó³äµçµçÁ÷
  57.                         HAL_GPIO_WritePin(GPIOB,CHG_EN_Pin,GPIO_PIN_RESET);    //Æô¶¯³äµç
  58.                 }
  59.   }



  60.   /* USER CODE END 2 */

  61.   /* Infinite loop */
  62.   /* USER CODE BEGIN WHILE */
  63.      HAL_RTC_GetTime(&hrtc, &rtctime1, RTC_FORMAT_BCD);  
  64.   while(1)
  65.   {
  66.          
  67.                   HAL_GPIO_TogglePin(GPIOB,LED_R_Pin);
  68.                   HAL_Delay(100);
  69.          
  70. //          HAL_GPIO_WritePin(GPIOB,LED_B_Pin,GPIO_PIN_SET);
  71.           rtcalarm1.Alarm=RTC_ALARM_A;   
  72.       rtcalarm1.AlarmTime.Hours=rtctime1.Hours;
  73.           rtcalarm1.AlarmTime.Minutes=rtctime1.Minutes;
  74.           rtcalarm1.AlarmTime.Seconds=rtctime1.Seconds+0x10;
  75.           if(rtcalarm1.AlarmTime.Seconds >0x60)
  76.           {rtcalarm1.AlarmTime.Seconds-=0x60;rtcalarm1.AlarmTime.Minutes++;}
  77.          if(HAL_RTC_SetAlarm_IT(&hrtc, &rtcalarm1, RTC_FORMAT_BCD)!=HAL_OK)
  78.      {
  79.   
  80.        Error_Handler();
  81.      }
  82.    
  83.      HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_SET);
  84.           HAL_ADC_Stop(&hadc1);
  85.           stop=0;
  86.       HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);   //stop
  87.       SYSCLKConfig_STOP();

  88.         HAL_GPIO_WritePin(GPIOB,LED_R_Pin,GPIO_PIN_RESET);
  89.                 HAL_Delay (100);
  90.              HAL_RTC_GetTime(&hrtc, &rtctime1, RTC_FORMAT_BCD);
  91.                  HAL_UART_Transmit_IT(&huart1, (uint8_t *)&rtctime1  , 3);
  92.                 HAL_GPIO_WritePin(GPIOB,LED_R_Pin,GPIO_PIN_SET);
  93.       if(stop==2)
  94.           {
  95.             HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_RESET);
  96.                 HAL_Delay(20);
  97.                 //readsms();
  98.           }
  99.   }
复制代码
收藏 评论7 发布时间:2018-2-9 20:26

举报

7个回答
Tcreat 回答时间:2018-2-9 21:11:39
请尽可能的将问题的前因后果叙述清楚 其次说的不要那么果断 如果按你描述的 之前没有任何问题 只改了一个计算公式 结果还和工作模式没有任何关系 那么我只能说那就活见鬼了
feixiang20 回答时间:2018-2-9 21:21:13
把你修改的地方重新设置
yyq006 回答时间:2018-2-9 21:34:32
feixiang20 发表于 2018-2-9 21:21
把你修改的地方重新设置

重新设置了,还是一样。改的是这个位置,判断电池类型的,改了比较的阈值。7000改成6500,4000改成4500.
  1. temp=ADC_Value[0]+ ADC_Value[4]+ADC_Value[8];//µç³ØÀàÐÍ£º£¨ÎÞ£©-10000-£¨´óÈÝÁ¿7100£©-6500-£¨ï®ÑÇ6000£©-4500-£¨Ð¡ÈÝÁ¿2200£©
  2.         if(temp>10000){BAT_id=4;COLL_data.SYS_sta&=0xf7;}
  3.         else if(temp>6500){BAT_id=3;COLL_data.SYS_sta|=0x08;}
  4.         else if(temp>4500){BAT_id=1;COLL_data.SYS_sta|=0x08;}
  5.         else {BAT_id=2;COLL_data.SYS_sta|=0x08;}
复制代码
yyq006 回答时间:2018-2-9 21:39:18
Tcreat 发表于 2018-2-9 21:11
请尽可能的将问题的前因后果叙述清楚 其次说的不要那么果断 如果按你描述的 之前没有任何问题 只改了一个计 ...

确实是只改了判断电池类型的阈值。因为程序都已经基本调好了,测试中发现电池类型有判断错误的,就改了一下比较的数值。我也很奇怪啊。
if(temp>10000){BAT_id=4;COLL_data.SYS_sta&=0xf7;}
        else if(temp>6500){BAT_id=3;COLL_data.SYS_sta|=0x08;}
        else if(temp>4500){BAT_id=1;COLL_data.SYS_sta|=0x08;}
        else {BAT_id=2;COLL_data.SYS_sta|=0x08;}
回答时间:2018-2-10 09:08:34
楼主,先用PWR_EnterSTANDBYMode模式测试一下,如果不复位,看一下是不是哪个中断唤醒的。测试的时候是仿真模式下吗?
yyq006 回答时间:2018-2-10 10:08:10
找到问题了,是芯片有问题,换了个新的就好了。不过这坏的也太稀奇了,只有低功耗模式进不去,其他部分还是好的,只要不进低功耗模式程序运行一切正常。
hello_bug 回答时间:2018-2-11 09:10:05
楼主试过新换的芯片,停机模式下再唤醒OK吗。买的芯片是原装的吗。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版