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

停机突然变成了复位

[复制链接]
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版