2013-09-07 09:54 PM
My question is probably simple. Can I configure external interrupts triggered by PA10, PA11, PA12 and PA13?
Studing the EXTI example I understood something like this: PA0 is connected to EXTI_Line0 and about the handler: EXTI0_IRQHandler(). So... For PA10,11,12 and 13 how should it be? I was trying the following to configure the pins as IT sources:void GPIO_IT_Setup()
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// Configure IT sources
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Connect sources to EXTI Lines
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
// Configure Button EXTI lines
EXTI_InitStructure.EXTI_Line = EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// Enable EXTI Interrupts
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
And the following to configure the handlers:
void EXTI10_IRQnHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line10) != RESET)
{
// Random code
EXTI_ClearITPendingBit(EXTI_Line10);
}
}
void EXTI11_IRQnHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line11) != RESET)
{
// Random code
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
void EXTI12_IRQnHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line12) != RESET)
{
// Random code
EXTI_ClearITPendingBit(EXTI_Line12);
}
}
void EXTI13_IRQnHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line13) != RESET)
{
// Random code
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
But obviously didn't work.
I would love if someone could help me with this.
Thanks since now!
#stm32vldiscovery #stm32vl
2013-09-08 04:28 AM
Try this
// High order EXTI - STM32-VLDiscovery - sourcer32@gmail.com
#include ''STM32vldiscovery.h''
int main(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// Enable clocks first so peripherals work, AFIO required for EXTI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// Configure IT sources
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // You sure? For a button I'd pull up
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Connect sources to EXTI Lines
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
// Configure Button EXTI lines
EXTI_InitStructure.EXTI_Line = EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// Enable EXTI Interrupts
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1);
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line10) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line10);
// Random code
}
if (EXTI_GetITStatus(EXTI_Line11) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line11);
// Random code
}
if (EXTI_GetITStatus(EXTI_Line12) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12);
// Random code
}
if (EXTI_GetITStatus(EXTI_Line13) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13);
// Random code
}
}
2013-09-08 08:12 AM
Thank you very much Clive!
EXTI_Line10, 11 and 12 are working perfectly. But EXTI_Line13 is firing even without the external trigger. You know what can be?I'm configuring the GPIO_Mode as GPIO_Mode_IPD because the triggers are mechanical keys that are normally open. It's a mistake?One more thing. There is some document that contains a Pin_Function/AF table for stm32vl board?Thanks again!2013-09-08 08:52 AM
And how are they connected when they are closed?
Pull-down and Falling Edge are counter-intuitive, if they close to ground (ie H->L), then a pull-up surely? The VL-Discovery has a user manual, the F100 part has a data sheet/manual. Wouldn't PA13 conflict with the SWDIO pin of the debug interface?2013-09-08 10:06 AM
The keys (in series with a resistor [1K]) are connected to 3.0V. When closed they put high level in the IO port (L > H). It's working fine...
I need to handle with rising and falling events of the keys to drive some lights.The interrupts configured to PA10, PA11 and PA12 are good. But for PA13, 14 and 15 aren't. I don't have any idea about what is the cause. I'll configure the EXTI_Line1 and use PA1 instead of PA13.Thanks for all Clive. If you discover why the Pins 13~15 didn't work please let me know.2013-09-08 12:37 PM
If you discover why the Pins 13~15 didn't work please let me know.
I don't think I need to discover why PA13/PA14 are problematic. PA15 is going to require JTAG being remapped.http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/CD00267113.pdf
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00251732.pdf
2013-09-08 01:49 PM
Okay! Got it mate.