停机突然变成了复位
本帖最后由 yyq006 于 2018-2-10 10:05 编辑用STM32F103C8T6做了个模块,空闲时进入停机模式,有需要时再唤醒。本来程序运行的好好的,停机和唤醒都没有问题。今天改了一个数据计算的参数(与工作模式无关),重新编译了一下后停机命令就变成复位了,停机命令执行完直接跳到程序起点。有谁知道是怎么回事?
编译器用的是keil5,中间升级过pack。
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t tempbak;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
MX_USART3_UART_Init();
MX_TIM3_Init();
MX_RTC_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOB,LED_B_Pin, GPIO_PIN_RESET);
HAL_TIM_Base_Start_IT(&htim4);
__HAL_RCC_PWR_CLK_ENABLE();
//HAL_PWR_DisableWakeUpPin(PWR_CSR_EWUP); //½ûÖ¹wakeup PA0,×÷ΪÆÕͨÒý½Å
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, UsartType1.usartDMA_rxBuf, RECEIVELEN);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart3, UsartType3.usartDMA_rxBuf, RECEIVELEN);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 12);
HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_RESET);
//MX680Q_Init();
FLASH_If_Init();
Readset();
while(!adcok){};
adcok=0;
COLL_data.SYS_sta=0xff;
if(BAT_id==4)COLL_data.SYS_sta&=0xf7;
if(COLL_data.BAT_val==0)COLL_data.SYS_sta&=0xfd;
if(HAL_GPIO_ReadPin(GPIOA,VIN_Pin)==1)//Ö÷µç¹¤×÷
{
Vext=1;
COLL_data.power=0;
HAL_TIM_Base_Start_IT(&htim3);
if(BAT_id==2)
{
HAL_GPIO_WritePin(GPIOB,CHG_SEL_Pin,GPIO_PIN_RESET); //ÉèÖÃС³äµçµçÁ÷
HAL_GPIO_WritePin(GPIOB,CHG_EN_Pin,GPIO_PIN_RESET); //Æô¶¯³äµç
}
if(BAT_id==3)
{
HAL_GPIO_WritePin(GPIOB,CHG_SEL_Pin,GPIO_PIN_SET); //ÉèÖôó³äµçµçÁ÷
HAL_GPIO_WritePin(GPIOB,CHG_EN_Pin,GPIO_PIN_RESET); //Æô¶¯³äµç
}
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_RTC_GetTime(&hrtc, &rtctime1, RTC_FORMAT_BCD);
while(1)
{
HAL_GPIO_TogglePin(GPIOB,LED_R_Pin);
HAL_Delay(100);
// HAL_GPIO_WritePin(GPIOB,LED_B_Pin,GPIO_PIN_SET);
rtcalarm1.Alarm=RTC_ALARM_A;
rtcalarm1.AlarmTime.Hours=rtctime1.Hours;
rtcalarm1.AlarmTime.Minutes=rtctime1.Minutes;
rtcalarm1.AlarmTime.Seconds=rtctime1.Seconds+0x10;
if(rtcalarm1.AlarmTime.Seconds >0x60)
{rtcalarm1.AlarmTime.Seconds-=0x60;rtcalarm1.AlarmTime.Minutes++;}
if(HAL_RTC_SetAlarm_IT(&hrtc, &rtcalarm1, RTC_FORMAT_BCD)!=HAL_OK)
{
Error_Handler();
}
HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_SET);
HAL_ADC_Stop(&hadc1);
stop=0;
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI); //stop
SYSCLKConfig_STOP();
HAL_GPIO_WritePin(GPIOB,LED_R_Pin,GPIO_PIN_RESET);
HAL_Delay (100);
HAL_RTC_GetTime(&hrtc, &rtctime1, RTC_FORMAT_BCD);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)&rtctime1, 3);
HAL_GPIO_WritePin(GPIOB,LED_R_Pin,GPIO_PIN_SET);
if(stop==2)
{
HAL_GPIO_WritePin(GPIOA,G_DTR_Pin,GPIO_PIN_RESET);
HAL_Delay(20);
//readsms();
}
} 请尽可能的将问题的前因后果叙述清楚 其次说的不要那么果断 如果按你描述的 之前没有任何问题 只改了一个计算公式 结果还和工作模式没有任何关系 那么我只能说那就活见鬼了 把你修改的地方重新设置 feixiang20 发表于 2018-2-9 21:21
把你修改的地方重新设置
重新设置了,还是一样。改的是这个位置,判断电池类型的,改了比较的阈值。7000改成6500,4000改成4500.
temp=ADC_Value+ ADC_Value+ADC_Value;//µç³ØÀàÐÍ£º£¨ÎÞ£©-10000-£¨´óÈÝÁ¿7100£©-6500-£¨ï®ÑÇ6000£©-4500-£¨Ð¡ÈÝÁ¿2200£©
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;} 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;} 楼主,先用PWR_EnterSTANDBYMode模式测试一下,如果不复位,看一下是不是哪个中断唤醒的。测试的时候是仿真模式下吗? 找到问题了,是芯片有问题,换了个新的就好了。不过这坏的也太稀奇了,只有低功耗模式进不去,其他部分还是好的,只要不进低功耗模式程序运行一切正常。 楼主试过新换的芯片,停机模式下再唤醒OK吗。买的芯片是原装的吗。
页:
[1]