OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 412|回复: 7

STM32F0改成stm32g0,外部中断线配制后,中断不工作...

[复制链接]

94

主题

545

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3268
金钱
3268
注册时间
2016-1-7
在线时间
534 小时
发表于 2024-2-20 14:38:37 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 challenger 于 2024-2-20 14:40 编辑

STM32F0换成STM32G0芯片后,配制PB3外部中断线,发现EXTI2_3_IRQHandler不工作,这是什么鬼?

void init_PB3_pin(void)
{
#if 0  //STM32F0

  /* 1 - Enable the peripheral clock of GPIOB */
  //RCC->AHBENR |= (1 << 18);

  /* 2 - Select input mode (00) on PB3, reset is input mode */

  /* 3 - Pull-up/Pull-down resistor configuration */
  //GPIOB->PUPDR |= (1 << 6);      

#else  ////STM32g0

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOB_CLK_ENABLE();

  #if 0
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;

    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = 0;//0
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(EXTI2_3_IRQn, 3, 1);
    HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
  #else
      /*Configure GPIO pin : PB3 */
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  #endif

#endif
}


//下面这个STM32G0外部中断线配制不工作,程序如下:

void config_exti_line3_to_zerox(unsigned char enable_disable)
{

  init_PB3_pin();
///////////////////////////////////////////////////
  /* Enable SYSCFG clock */

#if 0 //STM32F0 配制
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;

#else  //STM32G0配制

//  RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;
  __HAL_RCC_SYSCFG_CLK_ENABLE();
#endif

  /* Connect EXTI3 Line to PB3 pin */
  uint32_t tmp = 0x00;

#if 0 //STM32F0 配制
  tmp = ((uint32_t)0x0F) << (0x04 * (((uint8_t)0x03) & (uint8_t)0x03));
  SYSCFG->EXTICR[((uint8_t)0x03) >> 0x02] &= ~tmp;
  SYSCFG->EXTICR[((uint8_t)0x03) >> 0x02] |= (((uint32_t)((uint8_t)0x01)) << (0x04 * (((uint8_t)0x03) & (uint8_t)0x03)));

#else  //STM32G0配制

  tmp = ((uint32_t)0x0F) << (0x08 * (((uint8_t)0x03) & (uint8_t)0x03));
  EXTI->EXTICR[((uint8_t)0x03) >> 0x02] &= ~tmp;
  EXTI->EXTICR[((uint8_t)0x03) >> 0x02] |= (((uint32_t)((uint8_t)0x01)) << (0x08 * (((uint8_t)0x03) & (uint8_t)0x03)));
#endif  

  /* Configure EXTI3 line */
  tmp = (uint32_t)EXTI_BASE;

  if(enable_disable == ENABLE)
  {
    /* Clear EXTI line configuration */

#if 0 //STM32F0 配制

    EXTI->IMR &= ~((uint32_t)0x00000008);
    EXTI->EMR &= ~((uint32_t)0x00000008);

#else  //STM32G0 配制

    EXTI->IMR1 &= ~((uint32_t)0x00000008);
    EXTI->EMR1 &= ~((uint32_t)0x00000008);

#endif   
    tmp += 0x00;

    *(__IO uint32_t *) tmp |= ((uint32_t)0x00000008);

    /* Clear Rising Falling edge configuration */

#if 0 //STM32F0 配制
    EXTI->RTSR &= ~((uint32_t)0x00000008);
    EXTI->FTSR &= ~((uint32_t)0x00000008);

#else //STM32g0 配制

    EXTI->RTSR1 &= ~((uint32_t)0x00000008);
    EXTI->FTSR1 &= ~((uint32_t)0x00000008);
#endif
    /* Select the trigger for the selected interrupts */

    tmp = (uint32_t)EXTI_BASE;
    /* falling edge set */
    tmp += 0x0C;

    *(__IO uint32_t *) tmp |= ((uint32_t)0x00000008);
  }
  else
  {
    tmp += 0x00;

    /* Disable the selected external lines */
    *(__IO uint32_t *) tmp &= ~((uint32_t)0x00000008);
  }

  /* Configure NVIC for External Interrupt */

  /* Enable Interrupt on EXTI2_3 */
  NVIC_EnableIRQ(EXTI2_3_IRQn);

  /* Set priority for EXTI2_3 */
  NVIC_SetPriority(EXTI2_3_IRQn,0);
}


void EXTI2_3_IRQHandler(void)
{
#if 0  //STM32F0
  if((EXTI->pR & ((uint32_t)0x00000008)) != 0)  /* Check line 3 has triggered the IT */
  {  
    printf("EXTI2_3_IRQHandler:pR=%d\r\n",(EXTI->pR & ((uint32_t)0x00000008)));
     ......................
    /* Clear the EXTI line 3 pending bit */
    EXTI->pR = ((uint32_t)0x00000008);
  }


#else  //stm32g0

  if((EXTI->FPR1 & ((uint32_t)0x00000008)) != 0)  /* Check line 3 has triggered the IT */
  {  
     printf("EXTI2_3_IRQHandler:FPR1=%d\r\n",(EXTI->FPR1 & ((uint32_t)0x00000008)));
    ......................
    EXTI->FPR1 = ((uint32_t)0x00000008);
  }


}
以上程序在STM32F0基础上,改为STM32G0后,发现EXTI2_3_IRQHandler不工作,找了半天,没找出问题。有哪位大虾,玩过STM32G0系列的,程序哪里配制有问题?


最佳答案

查看完整内容[请看2#楼]

搞定了,是程序边沿中断时序的问题,还有一个定时器控制有点问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

94

主题

545

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3268
金钱
3268
注册时间
2016-1-7
在线时间
534 小时
 楼主| 发表于 2024-2-20 14:38:38 | 显示全部楼层
搞定了,是程序边沿中断时序的问题,还有一个定时器控制有点问题。
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-1-4
在线时间
61 小时
发表于 2024-2-20 14:49:46 | 显示全部楼层
寄存器配置怎么不用库函数呢
回复

使用道具 举报

94

主题

545

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3268
金钱
3268
注册时间
2016-1-7
在线时间
534 小时
 楼主| 发表于 2024-2-20 15:56:06 | 显示全部楼层
马超飞燕 发表于 2024-2-20 14:49
寄存器配置怎么不用库函数呢

代码早期是STM32F0的,早期是别人做的,用寄存器,后面我接手了,换芯片为STM32G0, 不可能全部重新弄,以前能用的,就不想改。于是就这样。
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-1-4
在线时间
61 小时
发表于 2024-2-20 16:19:36 | 显示全部楼层
本帖最后由 马超飞燕 于 2024-2-20 16:27 编辑
challenger 发表于 2024-2-20 15:56
代码早期是STM32F0的,早期是别人做的,用寄存器,后面我接手了,换芯片为STM32G0, 不可能全部重新弄,以 ...

那对着应用手册对看那块没初始化对,这个别人找问题也只能这么找没什么好的方法
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PB3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

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

}

回复

使用道具 举报

28

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
991
金钱
991
注册时间
2021-2-4
在线时间
136 小时
发表于 2024-2-21 13:36:47 | 显示全部楼层
重写初始化吧 我PC13外部中断不工作 现在还没找到问题
回复

使用道具 举报

94

主题

545

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3268
金钱
3268
注册时间
2016-1-7
在线时间
534 小时
 楼主| 发表于 2024-2-22 15:44:51 | 显示全部楼层
电子控2021 发表于 2024-2-21 13:36
重写初始化吧 我PC13外部中断不工作 现在还没找到问题

嗯,关键是STM32G0系列网上资料相对较少,G0系列增加了不少寄存器,官方连找个寄存器版的边沿触发中断的例程,完全找不到,若全部按STM32FX系列配制,还工作不了。
回复

使用道具 举报

28

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
991
金钱
991
注册时间
2021-2-4
在线时间
136 小时
发表于 2024-2-22 16:14:52 | 显示全部楼层
challenger 发表于 2024-2-22 15:44
嗯,关键是STM32G0系列网上资料相对较少,G0系列增加了不少寄存器,官方连找个寄存器版的边沿触发中断的 ...

我用的就是G0 但是用的库 比你这个舒服多了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 03:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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