STM32F0 program moved to STM32G0 PB3 edge interrupt not running
//STM32F0 PB3 interrupt part program:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void EXTI2_3_IRQHandler(void)
{
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);
// printf("EXTI2_3_IRQHandler \r\n");
}
}
void init_zerox_pin(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
/*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);
}
void config_exti_line3_to_zerox(unsigned char enable_disable)
{
/* Enable SYSCFG clock */
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
/* Connect EXTI3 Line to PB3 pin */
uint32_t tmp = 0x00;
tmp = ((uint32_t)0x0F) << (0x04 * (((uint8_t)0x03) & (uint8_t)0x03)); //(uint8_t)0x03):PB3
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)));
/* Configure EXTI3 line */
tmp = (uint32_t)EXTI_BASE;
if(enable_disable == ENABLE)
{
printf("config_exti_line3:ENABLE\r\n");
/* Clear EXTI line configuration */
EXTI->IMR &= ~((uint32_t)0x00000008);
EXTI->EMR &= ~((uint32_t)0x00000008);
tmp += 0x00;
*(__IO uint32_t *) tmp |= ((uint32_t)0x00000008);
/* Clear Rising Falling edge configuration */
EXTI->RTSR &= ~((uint32_t)0x00000008);
EXTI->FTSR &= ~((uint32_t)0x00000008);
/* Select the trigger for the selected interrupts */
tmp = (uint32_t)EXTI_BASE;
/* falling edge set */
tmp += 0x0C; //EXTI_FTSR: Address offset: 0x0C
*(__IO uint32_t *) tmp |= ((uint32_t)0x00000008);
}
else
{ printf("config_exti_line33:DISABLE\r\n");
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);
}
After changing to STM32G0, the program is as follows:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void EXTI2_3_IRQHandler(void)
{
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)));
。。。。。。。。。。。
/* Clear the EXTI line 3 pending bit */
EXTI->FPR1 = ((uint32_t)0x00000008);
// printf("EXTI2_3_IRQHandler \r\n");
}
else if((EXTI->RPR1 & ((uint32_t)0x00000008)) != 0)
{
printf("EXTI->RPR1 = ((uint32_t)0x00000008)\r\n");
EXTI->RPR1 = ((uint32_t)0x00000008);
}
}
void init_zerox_pin(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
/*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);
}
void config_exti_line3_to_zerox(unsigned char enable_disable)
{
/* Enable SYSCFG clock */
#if 0
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
#else
// RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;
__HAL_RCC_SYSCFG_CLK_ENABLE();
#endif
/* Connect EXTI3 Line to PB3 pin */
uint32_t tmp = 0x00;
#if 0
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
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)
{
printf("config_exti_line3:ENABLE\r\n");
/* Clear EXTI line configuration */
#if 0
EXTI->IMR &= ~((uint32_t)0x00000008);
EXTI->EMR &= ~((uint32_t)0x00000008);
#else
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
EXTI->RTSR &= ~((uint32_t)0x00000008);
EXTI->FTSR &= ~((uint32_t)0x00000008);
#else
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 += 0x04; //EXTI_FTSR1:Address offset: 0x04
*(__IO uint32_t *) tmp |= ((uint32_t)0x00000008);
}
else
{ printf("config_exti_line33:DISABLE\r\n");
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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Before the migration, the STM32F030 chip was used, which was driven by early registers, and the program ran normally. When porting this part of the edge interrupt program to STM32G070, it will not run directly. Is it that some register configuration on STM32G070 is not properly configured?
