From 1cabc38c3a44bea8adbfbdce0ae012236c89bcb2 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Fri, 7 Jan 2011 17:07:25 +0100 Subject: [PATCH] EXTI bugfix in exti_select_source(). AFIO_EXTICR[1 to 4] registers were not beeing set correctly. You have to force a 0 on the bits that are 0 for the mutex to work. Thanks Linus Casassa for the patch! --- lib/stm32/exti.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/stm32/exti.c b/lib/stm32/exti.c index cdc23474..de037e7a 100644 --- a/lib/stm32/exti.c +++ b/lib/stm32/exti.c @@ -129,12 +129,17 @@ void exti_select_source(u32 exti, u32 gpioport) } /* Ensure that only valid EXTI lines are used. */ - if (exti < EXTI4) - AFIO_EXTICR1 &= ~(bits << shift); - else if (exti < EXTI8) - AFIO_EXTICR2 &= ~(bits << shift); - else if (exti < EXTI12) - AFIO_EXTICR3 &= ~(bits << shift); - else if (exti < EXTI16) - AFIO_EXTICR4 &= ~(bits << shift); + if (exti < EXTI4) { + AFIO_EXTICR1 &= ~(0x000F << shift); + AFIO_EXTICR1 |= (~bits << shift); + } else if (exti < EXTI8) { + AFIO_EXTICR2 &= ~(0x000F << shift); + AFIO_EXTICR2 |= (~bits << shift); + } else if (exti < EXTI12) { + AFIO_EXTICR3 &= ~(0x000F << shift); + AFIO_EXTICR3 |= (~bits << shift); + } else if (exti < EXTI16) { + AFIO_EXTICR4 &= ~(0x000F << shift); + AFIO_EXTICR4 |= (~bits << shift); + } }