EXTI driver.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12432 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
Giovanni Di Sirio 2018-11-18 08:51:22 +00:00
parent db6f9df412
commit 7c77845aa7
4 changed files with 375 additions and 0 deletions

View File

@ -0,0 +1,2 @@
PLATFORMSRC += $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c
PLATFORMINC += $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1

View File

@ -0,0 +1,14 @@
STM32 EXTIv1 driver.
Driver capability:
- Support for the EXTI peripheral.
The file registry must export:
STM32_EXTI_NUM_LINES - Number of EXTI lines, it can be between 0 and 63.
STM32_EXTI_IMR1_MASK - Mask of the fixed lines that must not be
handled by the driver (0..31).
STM32_EXTI_IMR2_MASK - Mask of the fixed lines that must not be
handled by the driver (32..63).

View File

@ -0,0 +1,247 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file EXTIv1/stm32_exti.c
* @brief EXTI helper driver code.
*
* @addtogroup STM32_EXTI
* @details EXTI sharing helper driver.
* @{
*/
#include "hal.h"
/* The following macro is only defined if some driver requiring EXTI services
has been enabled.*/
#if defined(STM32_EXTI_REQUIRED) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/* Handling differences in ST headers.*/
#if !defined(STM32L4XX) && !defined(STM32L4XXP)
#define EMR1 EMR
#define IMR1 IMR
#define PR1 PR
#define RTSR1 RTSR
#define FTSR1 FTSR
#endif
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief STM32 EXTI group 1 lines initialization.
*
* @param[in] mask mask of group 1 lines to be initialized
* @param[in] mode initialization mode
*
* @api
*/
void extiEnableGroup1(uint32_t mask, extimode_t mode) {
/* Masked out lines must not be touched by this driver.*/
osalDbgAssert((mask & STM32_EXTI_IMR1_MASK) == 0U, "fixed line");
if ((mode & EXTI_MODE_EDGES_MASK) == 0U) {
/* Disabling channels.*/
EXTI->IMR1 &= ~mask;
EXTI->EMR1 &= ~mask;
EXTI->RTSR1 &= ~mask;
EXTI->FTSR1 &= ~mask;
EXTI->PR1 = mask;
}
else {
/* Programming edge registers.*/
if (mode & EXTI_MODE_RISING_EDGE) {
EXTI->RTSR1 |= mask;
}
else {
EXTI->RTSR1 &= ~mask;
}
if (mode & EXTI_MODE_FALLING_EDGE) {
EXTI->FTSR1 |= mask;
}
else {
EXTI->FTSR1 &= ~mask;
}
/* Programming interrupt and event registers.*/
if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) {
EXTI->IMR1 |= mask;
EXTI->EMR1 &= ~mask;
}
else {
EXTI->EMR1 |= mask;
EXTI->IMR1 &= ~mask;
}
}
}
#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__)
/**
* @brief STM32 EXTI group 2 lines initialization.
*
* @param[in] mask mask of group 2 lines to be initialized
* @param[in] mode initialization mode
*
* @api
*/
void extiEnableGroup2(uint32_t mask, extimode_t mode) {
/* Masked out lines must not be touched by this driver.*/
osalDbgAssert((mask & STM32_EXTI_IMR2_MASK) == 0U, "fixed line");
if ((mode & EXTI_MODE_EDGES_MASK) == 0U) {
/* Disabling channels.*/
EXTI->IMR2 &= ~mask;
EXTI->EMR2 &= ~mask;
EXTI->RTSR2 &= ~mask;
EXTI->FTSR2 &= ~mask;
EXTI->PR2 = mask;
}
else {
/* Programming edge registers.*/
if (mode & EXTI_MODE_RISING_EDGE) {
EXTI->RTSR2 |= mask;
}
else {
EXTI->RTSR2 &= ~mask;
}
if (mode & EXTI_MODE_FALLING_EDGE) {
EXTI->FTSR2 |= mask;
}
else {
EXTI->FTSR2 &= ~mask;
}
/* Programming interrupt and event registers.*/
if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) {
EXTI->IMR2 |= mask;
EXTI->EMR2 &= ~mask;
}
else {
EXTI->EMR2 |= mask;
EXTI->IMR2 &= ~mask;
}
}
}
#endif /* STM32_EXTI_NUM_LINES > 32 */
/**
* @brief STM32 EXTI line initialization.
*
* @param[in] line line to be initialized
* @param[in] mode initialization mode
*
* @api
*/
void extiEnableLine(extiline_t line, extimode_t mode) {
uint32_t mask = (1U << (line & 0x1FU));
osalDbgCheck(line < STM32_EXTI_NUM_LINES);
osalDbgCheck((mode & ~EXTI_MODE_MASK) == 0U);
#if STM32_EXTI_NUM_LINES > 32
if (line < 32) {
#endif
extiEnableGroup1(mask, mode);
#if STM32_EXTI_NUM_LINES > 32
}
else {
extiEnableGroup2(mask, mode);
}
#endif
}
/**
* @brief STM32 EXTI group 1 IRQ status clearing.
*
* @param[in] mask mask of group 1 lines to be initialized
*
* @api
*/
void extiClearGroup1(uint32_t mask) {
/* Masked out lines must not be touched by this driver.*/
osalDbgAssert((mask & STM32_EXTI_IMR1_MASK) == 0U, "fixed line");
EXTI->PR1 = mask;
}
#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__)
/**
* @brief STM32 EXTI group 2 IRQ status clearing.
*
* @param[in] mask mask of group 2 lines to be initialized
*
* @api
*/
void extiClearGroup2(uint32_t mask) {
/* Masked out lines must not be touched by this driver.*/
osalDbgAssert((mask & STM32_EXTI_IMR2_MASK) == 0U, "fixed line");
EXTI->PR2 = mask;
}
#endif /* STM32_EXTI_NUM_LINES > 32 */
/**
* @brief STM32 EXTI line IRQ status clearing.
*
* @param[in] line line to be initialized
*
* @api
*/
void extiClearLine(extiline_t line) {
uint32_t mask = (1U << (line & 0x1FU));
osalDbgCheck(line < STM32_EXTI_NUM_LINES);
#if STM32_EXTI_NUM_LINES > 32
if (line < 32) {
#endif
extiClearGroup1(mask);
#if STM32_EXTI_NUM_LINES > 32
}
else {
extiClearGroup2(mask);
}
#endif
}
#endif /* STM32_EXTI_REQUIRED */
/** @} */

View File

@ -0,0 +1,112 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file EXTIv1/stm32_exti.h
* @brief EXTI helper driver header.
*
* @addtogroup STM32_EXTI
* @{
*/
#ifndef STM32_EXTI_H
#define STM32_EXTI_H
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/**
* @name EXTI channel modes
* @{
*/
#define EXTI_MODE_MASK 7U /**< @brief Mode parameter mask. */
#define EXTI_MODE_EDGES_MASK 3U /**< @brief Edges field mask. */
#define EXTI_MODE_DISABLED 0U /**< @brief Channel disabled. */
#define EXTI_MODE_RISING_EDGE 1U /**< @brief Rising edge callback. */
#define EXTI_MODE_FALLING_EDGE 2U /**< @brief Falling edge callback. */
#define EXTI_MODE_BOTH_EDGES 3U /**< @brief Both edges callback. */
#define EXTI_MODE_ACTION_MASK 4U /**< @brief Action field mask. */
#define EXTI_MODE_ACTION_INTERRUPT 0U /**< @brief Interrupt mode. */
#define EXTI_MODE_ACTION_EVENT 4U /**< @brief Event mode. */
/** @} */
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
#if !defined(STM32_EXTI_NUM_LINES)
#error "STM32_EXTI_NUM_LINES not defined in registry"
#endif
#if (STM32_EXTI_NUM_LINES < 0) || (STM32_EXTI_NUM_LINES > 63)
#error "invalid STM32_EXTI_NUM_LINES value"
#endif
#if !defined(STM32_EXTI_IMR1_MASK)
#error "STM32_EXTI_IMR1_MASK not defined in registry"
#endif
#if STM32_EXTI_NUM_LINES > 32
#if !defined(STM32_EXTI_IMR2_MASK)
#error "STM32_EXTI_IMR2_MASK not defined in registry"
#endif
#endif
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @brief Type of an EXTI line identifier.
*/
typedef uint32_t extiline_t;
/**
* @brief Type of an EXTI line mode.
*/
typedef uint32_t extimode_t;
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void extiEnableGroup1(uint32_t mask, extimode_t mode);
void extiClearGroup1(uint32_t mask);
#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__)
void extiEnableGroup2(uint32_t mask, extimode_t mode);
void extiClearGroup2(uint32_t mask);
#endif /* STM32_EXTI_NUM_LINES > 32 */
void extiEnableLine(extiline_t line, extimode_t mode);
void extiClearLine(extiline_t line);
#ifdef __cplusplus
}
#endif
#endif /* STM32_EXTI_H */
/** @} */