From 72c3417c88c7133ce4e38c49e7d25befea877131 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 25 Dec 2017 16:14:03 +0000 Subject: More H7-related changes. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11182 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/ports/STM32/LLD/GPIOv2/hal_pal_lld.c | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'os/hal/ports/STM32/LLD/GPIOv2') diff --git a/os/hal/ports/STM32/LLD/GPIOv2/hal_pal_lld.c b/os/hal/ports/STM32/LLD/GPIOv2/hal_pal_lld.c index 85d16a375..f8ac6b761 100644 --- a/os/hal/ports/STM32/LLD/GPIOv2/hal_pal_lld.c +++ b/os/hal/ports/STM32/LLD/GPIOv2/hal_pal_lld.c @@ -158,8 +158,13 @@ void _pal_lld_enablepadevent(ioportid_t port, /* Multiple channel setting of the same channel not allowed, first disable it. This is done because on STM32 the same channel cannot be mapped on multiple ports.*/ +#if defined(STM32_EXTI_ENHANCED) + osalDbgAssert(((EXTI->RTSR1 & padmask) == 0U) && + ((EXTI->FTSR1 & padmask) == 0U), "channel already in use"); +#else osalDbgAssert(((EXTI->RTSR & padmask) == 0U) && ((EXTI->FTSR & padmask) == 0U), "channel already in use"); +#endif /* Index and mask of the SYSCFG CR register to be used.*/ cridx = (uint32_t)pad >> 2U; @@ -174,6 +179,20 @@ void _pal_lld_enablepadevent(ioportid_t port, SYSCFG->EXTICR[cridx] = (SYSCFG->EXTICR[cridx] & crmask) | (portidx << croff); /* Programming edge registers.*/ +#if defined(STM32_EXTI_ENHANCED) + if (mode & PAL_EVENT_MODE_RISING_EDGE) + EXTI->RTSR1 |= padmask; + else + EXTI->RTSR1 &= ~padmask; + if (mode & PAL_EVENT_MODE_FALLING_EDGE) + EXTI->FTSR1 |= padmask; + else + EXTI->FTSR1 &= ~padmask; + + /* Programming interrupt and event registers.*/ + EXTI_D1->IMR1 |= padmask; + EXTI_D1->EMR1 &= ~padmask; +#else if (mode & PAL_EVENT_MODE_RISING_EDGE) EXTI->RTSR |= padmask; else @@ -186,6 +205,7 @@ void _pal_lld_enablepadevent(ioportid_t port, /* Programming interrupt and event registers.*/ EXTI->IMR |= padmask; EXTI->EMR &= ~padmask; +#endif } /** @@ -200,8 +220,13 @@ void _pal_lld_enablepadevent(ioportid_t port, void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad) { uint32_t padmask, rtsr1, ftsr1; +#if defined(STM32_EXTI_ENHANCED) + rtsr1 = EXTI->RTSR1; + ftsr1 = EXTI->FTSR1; +#else rtsr1 = EXTI->RTSR; ftsr1 = EXTI->FTSR; +#endif /* Mask of the pad.*/ padmask = 1U << (uint32_t)pad; @@ -222,12 +247,21 @@ void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad) { osalDbgAssert(crport == portidx, "channel mapped on different port"); +#if defined(STM32_EXTI_ENHANCED) + /* Disabling channel.*/ + EXTI_D1->IMR1 &= ~padmask; + EXTI_D1->EMR1 &= ~padmask; + EXTI->RTSR1 = rtsr1 & ~padmask; + EXTI->FTSR1 = ftsr1 & ~padmask; + EXTI_D1->PR1 = padmask; +#else /* Disabling channel.*/ EXTI->IMR &= ~padmask; EXTI->EMR &= ~padmask; EXTI->RTSR = rtsr1 & ~padmask; EXTI->FTSR = ftsr1 & ~padmask; EXTI->PR = padmask; +#endif #if PAL_USE_CALLBACKS || PAL_USE_WAIT /* Callback cleared and/or thread reset.*/ -- cgit v1.2.3