Cannot set EXTICR register in STM32F205
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-06-20 3:14 PM
Following the example for the STM3240G I set up the KEY pushbutton (PG15) as an external interrupt:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); // enable port
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // enable external interrupts
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG, EXTI_PinSource15); // KEY switch IRQ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // inputs
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // external pull-ups
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // slow inputs
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOG, &GPIO_InitStructure); // PG15 KEY pushbutton
// Enable the EXTI line 15 on falling edge for KEY pushbutton
EXTI_ClearITPendingBit(EXTI_Line15); // clear pending IRQs
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_Line15; // set up irq trigger
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // falling edge on button push
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; // KEY irq vector (shared)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = GPIODEV_EXT_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
I verified the SYSCFG is enabled, RCC_APB2ENR is set to 0x4000 (SYSCFG clock on). However, after I do the
SYSCFG_EXTILineConfig
call the SYSCFG->EXTICR4 register is still set to 0x0000. Pin PG15 is not linked to EXTI No interrupt occurs.
Is there some setting which holds SYSCFG in reset? The obvious suspect is the SYSCFG peripheral clock but it shows as enabled.
The PG15 pin itself is working. The pushbutton shows up in the GPIOG->IDR register, so the problem seems to be the SYSCFG EXTICRn registers. I tried directly writing to the EXTICR4 register (0x6000, G15) but it reads back as zero.
Jack Peacock
#syscfg-exti
- Labels:
-
GPIO-EXTI
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-06-20 3:36 PM
Looks about right. I would however move the SYSCFG_EXTILineConfig() past the GPIO_Init() as there might be a clock/pipeline/write-buffer sensitivity between enabling the clock and programming the peripheral.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-06-20 6:16 PM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-06-21 11:22 AM
The problem was a typo elsewhere in code:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); // enable external interrupts should have been RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // enable external interrupts The SYSCFG was being held in reset, so no updates. Jack Peacock
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 3:27 AM
I also meet the same problem as you. Do you solve this issue? Could you let me know the solution if it is fixed. Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 4:00 AM
I also meet the same problem as you. Do you solve this issue? Could you let me know the solution if it is fixed.
Please read the previous post, the cause and the solution were expressed.ResetCmd should have been ClockCmd Suggest you paste in your code so people can actually assess if your problem is the same or where it might be.Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 4:10 AM
I just use pin PA3 as the interrupt pin when button is pressed. Pelase refers to code below.
[CODE] NVIC_InitTypeDef NVIC_InitStruct; EXTI_InitTypeDef EXTI_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource3); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); EXTI_ClearITPendingBit( EXTI_Line3 ); EXTI_InitStruct.EXTI_Line=EXTI_Line3; EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStruct.EXTI_LineCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelCmd=EXTI3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; EXTI_Init(&EXTI_InitStruct); //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_Init(&NVIC_InitStruct);- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 4:20 AM
Looks reasonable, what's not happening? Not seeing interrupts?
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 5:35 AM
1. After button is pressed, it should enter the IRQ handler. But it doesn't. I check the register ''EXTI->PR'', its value is 0x So MCU is able to detect the interrupt. Could you hive me some hint?
2. I also check the EXTICR value by callingSYSCFG_EXTILineConfig(EXTI_PortSourceGPIOX, EXTI_PinSourceX)
, it always return the value zero. Why?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2012-07-04 5:59 AM
Have you configured the pin? Does the IRQ handler name match the value in the vector table?
void Config_EXTI3(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // Assuming external, adjust if required
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource3);
EXTI_ClearITPendingBit( EXTI_Line3 );
EXTI_InitStruct.EXTI_Line=EXTI_Line3;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; // Grounding button
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannelCmd=EXTI3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) != RESET)
{
/* Toggle LED1 */
STM_EVAL_LEDToggle(LED1);
/* Clear the EXTI line 3 pending bit */
EXTI_ClearITPendingBit(EXTI_Line3);
}
}
Up vote any posts that you find helpful, it shows what's working..
