请选择 进入手机版 | 继续访问电脑版
搜索
查看: 88|回复: 1

[求助] STM32L476如何确认停机模式多外部中断唤醒对应的引脚

[复制链接]

该用户从未签到

3

主题

28

帖子

0

蝴蝶豆

中级会员

最后登录
2020-9-19
发表于 2020-9-19 09:38:21 | 显示全部楼层 |阅读模式
最近在用STM32L476,做一个中断唤醒触发计数的应用,遇到一个问题,如下:
1、初始化为4个外部中断下降沿唤醒,MCU外部上拉电阻,同时也使能了内部上拉,设置3个变量,在中断函数内分别对3个变量进行自增计数,并于3个外部中断对应,另一个中断仅用于唤醒,没有计数变量,程序初始化后进入停机模式。
2、程序可以正常唤醒,但是任意一个外部中断触发都会触发所有的引脚中断。

现在不明白什么设置造成了所有中断的触发,有人遇到过吗?

也就是停机模式设置多个外部中断唤醒,从停机唤醒后要确认是那个引脚引起的。

  /*Configure GPIO pins : PCPin PCPin PCPin */
  GPIO_InitStruct.Pin = A_Count_Pin|B_Count_Pin|C_Count_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = SYS_WKUP1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(SYS_WKUP1_GPIO_Port, &GPIO_InitStruct);


//引脚中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//        SystemClock_Config();
//        HAL_Delay(100);
        if(GPIO_Pin == GPIO_PIN_0)//PA0 WKUP1
        {
//                HAL_GPIO_TogglePin(RunLed_GPIO_Port,RunLed_Pin);
        }
        else if(GPIO_Pin == GPIO_PIN_1)//PC1
        {
                UserData.C_Temp ++;
//                HAL_GPIO_TogglePin(RunLed_GPIO_Port,RunLed_Pin);
        }
        else if(GPIO_Pin == GPIO_PIN_2)//PC2
        {
                UserData.B_Temp ++;
//                HAL_GPIO_TogglePin(RunLed_GPIO_Port,RunLed_Pin);
        }
        else if(GPIO_Pin == GPIO_PIN_3)//PC3
        {
                UserData.A_Temp ++;
//                HAL_GPIO_TogglePin(RunLed_GPIO_Port,RunLed_Pin);
        }
}

回复

使用道具 举报

该用户从未签到

3

主题

28

帖子

0

蝴蝶豆

中级会员

最后登录
2020-9-19
 楼主| 发表于 2020-9-19 10:08:50 | 显示全部楼层
被自己坑了一把,进入停机前的引脚处理有问题,为了偷懒, 我是先全部设置所有引脚为模式输入MX_GPIO_DeInit(),再将要设置为中断唤醒的引脚重新设置一下,这样问题就出现了.改为直接设置非中断唤醒引脚就可以了.

static void GPIO_LowPower_Config(void)//引脚处理,设置唤醒源中断 错误方式
{
        /*GPIO端口配置成模拟输入,不使用的时钟全部关闭,GPIOC时钟保留,因使用PC13唤醒*/
        GPIO_InitTypeDef GPIO_InitStruct = {0};
       
        MX_GPIO_DeInit();/*不能执行这个,否则唤醒后就进入中断*/
       
  __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();

        GPIO_InitStruct.Pin = A_Count_Pin|B_Count_Pin|C_Count_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);//PC1:3
       
  GPIO_InitStruct.Pin = SYS_WKUP1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;
  HAL_GPIO_Init(SYS_WKUP1_GPIO_Port, &GPIO_InitStruct);//PA0

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);

  HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);               
}
/*新的*/
static void GPIO_LowPower_Config(void)//引脚处理,设置唤醒源中断 正确方式
{
        GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, Lora_RST_Pin|W4G_PWR_Pin|ADC_PWR_Pin|DIS_PWR_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(RunLed_GPIO_Port, RunLed_Pin, GPIO_PIN_SET);

  /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
  GPIO_InitStruct.Pin = Lora_RST_Pin|W4G_PWR_Pin|ADC_PWR_Pin|DIS_PWR_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = W4G_STA_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(W4G_STA_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PB11 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PCPin PCPin PCPin PCPin */
  GPIO_InitStruct.Pin = Key4_Pin|Key3_Pin|Key2_Pin|Key1_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = RunLed_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(RunLed_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PA11 PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//        __HAL_RCC_GPIOA_CLK_DISABLE();
        __HAL_RCC_GPIOB_CLK_DISABLE();
//        __HAL_RCC_GPIOC_CLK_DISABLE();
        __HAL_RCC_GPIOD_CLK_DISABLE();
//        __HAL_RCC_GPIOE_CLK_DISABLE();
//        __HAL_RCC_GPIOF_CLK_DISABLE();
//        __HAL_RCC_GPIOG_CLK_DISABLE();
        __HAL_RCC_GPIOH_CLK_DISABLE();
}

void MX_GPIO_DeInit(void)
{
/*GPIO端口配置成模拟输入,时钟全部关闭*/
        GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
//        __HAL_RCC_GPIOE_CLK_ENABLE();
//        __HAL_RCC_GPIOF_CLK_ENABLE();
//        __HAL_RCC_GPIOG_CLK_ENABLE();
        __HAL_RCC_GPIOH_CLK_ENABLE();
       
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        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(GPIOE, &GPIO_InitStruct);
//        HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
//        HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
        HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
       
//        __HAL_RCC_GPIOA_CLK_DISABLE();
        __HAL_RCC_GPIOB_CLK_DISABLE();
        __HAL_RCC_GPIOC_CLK_DISABLE();
        __HAL_RCC_GPIOD_CLK_DISABLE();
//        __HAL_RCC_GPIOE_CLK_DISABLE();
//        __HAL_RCC_GPIOF_CLK_DISABLE();
//        __HAL_RCC_GPIOG_CLK_DISABLE();
        __HAL_RCC_GPIOH_CLK_DISABLE();
}

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, Lora_RST_Pin|W4G_PWR_Pin|ADC_PWR_Pin|DIS_PWR_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(RunLed_GPIO_Port, RunLed_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pins : PCPin PCPin PCPin */
  GPIO_InitStruct.Pin = A_Count_Pin|B_Count_Pin|C_Count_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);//计数

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = SYS_WKUP1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;
  HAL_GPIO_Init(SYS_WKUP1_GPIO_Port, &GPIO_InitStruct);//唤醒

  /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
  GPIO_InitStruct.Pin = Lora_RST_Pin|W4G_PWR_Pin|ADC_PWR_Pin|DIS_PWR_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = W4G_STA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(W4G_STA_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PB11 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PCPin PCPin PCPin PCPin */
  GPIO_InitStruct.Pin = Key4_Pin|Key3_Pin|Key2_Pin|Key1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = RunLed_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(RunLed_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PA11 PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);

  HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2020-10-31 19:23 , Processed in 0.082475 second(s), 14 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表