• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32L4 停止模式PA口设为模拟 PB无法唤醒

823da780032cf479 2019-01-18 浏览量:989

STM32L4 进入停止模式前PA口设为模拟 PB 无法唤醒  调试发现无法进入外部中断,但是不把PA设置为模拟又正常 求解。

以下是进入休眠前的设置

void KeyWKUPSet(void)
{
		GPIO_InitTypeDef GPIO_InitStruct;
		
		__HAL_RCC_GPIOB_CLK_ENABLE();
	
		GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
		GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;    //下降沿触发
		GPIO_InitStruct.Pull = GPIO_NOPULL;							//无上拉无下拉
		HAL_GPIO_Init(GPIOB &GPIO_InitStruct);
		
		HAL_NVIC_SetPriority(EXTI15_10_IRQn 0 0);				//设置中断分组
		HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);								//使能外部中断
}

void enter_stopmode(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_GPIOD_CLK_ENABLE();
	__HAL_RCC_GPIOH_CLK_ENABLE();  
	
	GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|
	GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12|	GPIO_PIN_15;
	HAL_GPIO_Init(GPIOA &GPIO_InitStruct);
	
	GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Pin = GPIO_PIN_All;	
	
//	HAL_GPIO_Init(GPIOA &GPIO_InitStruct);
	HAL_GPIO_Init(GPIOB &GPIO_InitStruct);
	HAL_GPIO_Init(GPIOC &GPIO_InitStruct);
	HAL_GPIO_Init(GPIOD &GPIO_InitStruct);
	HAL_GPIO_Init(GPIOH &GPIO_InitStruct);  	

  __HAL_RCC_GPIOD_CLK_DISABLE();
	__HAL_RCC_GPIOH_CLK_DISABLE();	

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA &GPIO_InitStruct);

//  HAL_UART_Init(&huart1);
//	HAL_UART_Init(&huart2);
//	HAL_UART_Init(&huart3);
//	HAL_UART_Init(&huart4);
//	HAL_UART_Init(&huart5);
	GPIO_InitStruct.Pin = GPIO_PIN_11;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
	HAL_GPIO_Init(GPIOC &GPIO_InitStruct);	

	GPIO_InitStruct.Pin = GPIO_PIN_10;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
	HAL_GPIO_Init(GPIOA &GPIO_InitStruct);	

	GPIO_InitStruct.Pin = GPIO_PIN_3;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
	HAL_GPIO_Init(GPIOA &GPIO_InitStruct);	

	GPIO_InitStruct.Pin = GPIO_PIN_11;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
	HAL_GPIO_Init(GPIOB &GPIO_InitStruct);
	

//  GPIO_InitStruct.Pin = LED_BAT_Pin;
//  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
//  GPIO_InitStruct.Pull = GPIO_NOPULL; 
//  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  
//  HAL_GPIO_Init(GPIOC &GPIO_InitStruct);  
}
接下来是进入休眠的代码
	 if(API_SystemClock_TimingQuery_ms(SellpModeTimeSTOPTIME)==TimeOut)
	 {
		  HAL_GPIO_WritePin(LCD1_GPIO_Port LCD1_Pin GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(LCD2_GPIO_PortLCD2_PinGPIO_PIN_SET);
			enter_stopmode();
			KeyWKUPSet();
			HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ONPWR_STOPENTRY_WFE);  //进入停止模式
		  SystemClock_Config();
			SellpModeTime = API_SystemClock_CurrentTime_ms();
		  if(WKUPFlag==0)
		  {
/************必须初始化按键原因未知***************/  
				GPIO_InitTypeDef GPIO_InitStruct;
				
				GPIO_InitStruct.Pin = KEY1_Pin|KEY2_Pin|KEY3_Pin|KEY4_Pin;
				GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
				GPIO_InitStruct.Pull = GPIO_NOPULL;
				HAL_GPIO_Init(GPIOB &GPIO_InitStruct);

		  }
		  else if( WKUPFlag==2)
		  {
				 MX_GPIO_Init();  
				 HAL_GPIO_WritePin(LCD1_GPIO_Port LCD1_Pin GPIO_PIN_SET);
				 HAL_GPIO_WritePin(LCD2_GPIO_PortLCD2_PinGPIO_PIN_RESET); 
				 initial_lcd();   
				 clear_screen();   
				 WKUPFlag=0; 		
			}
WKUPFlag 是我用来判断是那个按键产生的中断

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 唤醒不能用ad功能,ad在停机下不可用,只能外部中断
    • 发布于 2019-01-18
    • 举报
    • 评论 2
    • 0
    • 0
823da780032cf479 回复了 yhj416606438:我并没有用AD 回复
823da780032cf479 回复了 yhj416606438:我并没有用AD 回复

其他答案 数量:7
  • 目前已找到原因 插烧写器供电就会这样子 其他供电就不会 猜测可能是共地的原因
    • 发布于2019-01-18
    • 举报
    • 评论 0
    • 0
    • 0

  • 可能是共地的原因,具体测试过了么
    • 发布于2019-01-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 共地问题的话,具体测试过了吗
    • 发布于2019-01-26
    • 举报
    • 评论 0
    • 0
    • 0

  • PA哪个口设置为模拟呢?不是每个PA口都支持模拟输入的。
    • 发布于2019-01-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 程序应该是没什么问题的,你可以用示波器看一下硬件是不是有问题
    • 发布于2019-02-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 要看一下你的模拟输出端口,是不是你的IO不支持模拟输出
    • 发布于2019-02-23
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

STM32L4 停止模式PA口设为模拟 PB无法唤醒