mirror of https://github.com/rusefi/ChibiOS.git
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1423 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
8b165fe3e2
commit
6716159ba1
|
@ -31,7 +31,7 @@ PROJECT_NAME = ChibiOS/RT
|
||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 1.3.5
|
PROJECT_NUMBER = 1.3.6
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
|
|
|
@ -72,10 +72,8 @@ extern "C" {
|
||||||
void pwmObjectInit(PWMDriver *pwmp);
|
void pwmObjectInit(PWMDriver *pwmp);
|
||||||
void pwmStart(PWMDriver *pwmp, const PWMConfig *config);
|
void pwmStart(PWMDriver *pwmp, const PWMConfig *config);
|
||||||
void pwmStop(PWMDriver *pwmp);
|
void pwmStop(PWMDriver *pwmp);
|
||||||
void pwmSetCallback(PWMDriver *pwmp,
|
void pwmSetupChannel(PWMDriver *pwmp, pwmchannel_t channel,
|
||||||
pwmchannel_t channel,
|
const PWMChannelConfig *pccp);
|
||||||
pwmedge_t edge,
|
|
||||||
pwmcallback_t callback);
|
|
||||||
void pwmEnableChannel(PWMDriver *pwmp,
|
void pwmEnableChannel(PWMDriver *pwmp,
|
||||||
pwmchannel_t channel,
|
pwmchannel_t channel,
|
||||||
pwmcnt_t width);
|
pwmcnt_t width);
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
/*
|
||||||
|
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
|
||||||
|
|
||||||
|
This file is part of ChibiOS/RT.
|
||||||
|
|
||||||
|
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file STM32/pwm_lld.c
|
||||||
|
* @brief STM32 PWM subsystem low level driver header.
|
||||||
|
* @addtogroup STM32_PWM
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ch.h"
|
||||||
|
#include "hal.h"
|
||||||
|
|
||||||
|
#if CH_HAL_USE_PWM || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/** @brief PWM1 driver identifier.*/
|
||||||
|
#if defined(USE_STM32_PWM1) || defined(__DOXYGEN__)
|
||||||
|
PWMDriver PWMD1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Low Level Driver exported variables. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Low Level Driver local variables. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Low Level Driver local functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Low Level Driver interrupt handlers. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Low Level Driver exported functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low level PWM driver initialization.
|
||||||
|
*/
|
||||||
|
void pwm_lld_init(void) {
|
||||||
|
|
||||||
|
#if USE_STM32_PWM1
|
||||||
|
/* TIM1 reset, ensures reset state in order to avoid trouble with JTAGs.*/
|
||||||
|
RCC->APB2RSTR = RCC_APB2RSTR_TIM1RST;
|
||||||
|
RCC->APB2RSTR = 0;
|
||||||
|
|
||||||
|
/* Driver initialization.*/
|
||||||
|
pwmObjectInit(&PWMD1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and activates the PWM peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
*/
|
||||||
|
void pwm_lld_start(PWMDriver *pwmp) {
|
||||||
|
|
||||||
|
if (pwmp->pd_state == PWM_STOP) {
|
||||||
|
/* Clock activation.*/
|
||||||
|
#if USE_STM32_PWM1
|
||||||
|
if (&PWMD1 == pwmp) {
|
||||||
|
NVICEnableVector(TIM1_CC_IRQn, STM32_PWM1_IRQ_PRIORITY);
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* Configuration.*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deactivates the PWM peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
*/
|
||||||
|
void pwm_lld_stop(PWMDriver *pwmp) {
|
||||||
|
|
||||||
|
/* If in ready state then disables the PWM clock.*/
|
||||||
|
if (pwmp->pd_state == PWM_READY) {
|
||||||
|
#if USE_STM32_PWM1
|
||||||
|
if (&PWMD1 == pwmp) {
|
||||||
|
NVICDisableVector(TIM1_CC_IRQn);
|
||||||
|
RCC->APB2ENR &= ~RCC_APB2ENR_TIM1EN;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines whatever the PWM channel is already enabled.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
* @param[in] channel PWM channel identifier
|
||||||
|
*
|
||||||
|
* @return The PWM channel status.
|
||||||
|
* @retval FALSE the channel is not enabled.
|
||||||
|
* @retval TRUE the channel is enabled.
|
||||||
|
*/
|
||||||
|
bool_t pwm_lld_is_enabled(PWMDriver *pwmp, pwmchannel_t channel) {
|
||||||
|
|
||||||
|
return (pwmp->pd_enabled_channels & (1 << channel)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Setups a PWM channel.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
* @param[in] channel PWM channel identifier
|
||||||
|
*/
|
||||||
|
void pwm_lld_setup_channel(PWMDriver *pwmp, pwmchannel_t channel) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables a PWM channel.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
* @param[in] channel PWM channel identifier
|
||||||
|
* @param[in] width PWM pulse width as clock pulses number
|
||||||
|
*/
|
||||||
|
void pwm_lld_enable_channel(PWMDriver *pwmp,
|
||||||
|
pwmchannel_t channel,
|
||||||
|
pwmcnt_t width) {
|
||||||
|
|
||||||
|
pwmp->pd_enabled_channels |= (1 << channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables a PWM channel.
|
||||||
|
* @details The channel is disabled and its output line returned to the
|
||||||
|
* idle state.
|
||||||
|
*
|
||||||
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
|
* @param[in] channel PWM channel identifier
|
||||||
|
*/
|
||||||
|
void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel) {
|
||||||
|
|
||||||
|
pwmp->pd_enabled_channels &= ~(1 << channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CH_HAL_USE_PWM */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
|
||||||
|
|
||||||
|
This file is part of ChibiOS/RT.
|
||||||
|
|
||||||
|
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file STM32/pwm_lld.h
|
||||||
|
* @brief STM32 PWM subsystem low level driver header.
|
||||||
|
* @addtogroup STM32_PWM
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PWM_LLD_H_
|
||||||
|
#define _PWM_LLD_H_
|
||||||
|
|
||||||
|
#if CH_HAL_USE_PWM || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver constants. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Number of PWM channels per PWM driver.
|
||||||
|
*/
|
||||||
|
#define PWM_CHANNELS 4
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver pre-compile time settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM1 driver enable switch.
|
||||||
|
* @details If set to @p TRUE the support for PWM1 is included.
|
||||||
|
* @note The default is @p TRUE.
|
||||||
|
*/
|
||||||
|
#if !defined(USE_STM32_PWM1) || defined(__DOXYGEN__)
|
||||||
|
#define USE_STM32_PWM1 TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM1 interrupt priority level setting.
|
||||||
|
* @note @p BASEPRI_KERNEL >= @p STM32_PWM1_IRQ_PRIORITY > @p PRIORITY_PENDSV.
|
||||||
|
*/
|
||||||
|
#if !defined(STM32_PWM1_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||||
|
#define STM32_PWM1_IRQ_PRIORITY 0x80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver data structures and types. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM channel type.
|
||||||
|
*/
|
||||||
|
typedef uint8_t pwmchannel_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM counter type.
|
||||||
|
*/
|
||||||
|
typedef uint16_t pwmcnt_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM driver configuration structure.
|
||||||
|
* @note It could be empty on some architectures.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
} PWMConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PWM driver channel configuration structure.
|
||||||
|
* @note It could be empty on some architectures.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* @brief Channel idle logic level.
|
||||||
|
*/
|
||||||
|
pwmmode_t pcc_mode;
|
||||||
|
/**
|
||||||
|
* @brief Channel callback edges.
|
||||||
|
*/
|
||||||
|
pwmedge_t pcc_edge;
|
||||||
|
/**
|
||||||
|
* @brief Channel callback pointer.
|
||||||
|
*/
|
||||||
|
pwmcallback_t pcc_callback;
|
||||||
|
/* End of the mandatory fields.*/
|
||||||
|
} PWMChannelConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure representing a PWM driver.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* @brief Driver state.
|
||||||
|
*/
|
||||||
|
pwmstate_t pd_state;
|
||||||
|
/**
|
||||||
|
* @brief Current driver configuration data.
|
||||||
|
*/
|
||||||
|
const PWMConfig *pd_config;
|
||||||
|
/**
|
||||||
|
* @brief Current channel configurations.
|
||||||
|
*/
|
||||||
|
const PWMChannelConfig *pd_channel_configs[PWM_CHANNELS];
|
||||||
|
/* End of the mandatory fields.*/
|
||||||
|
/**
|
||||||
|
* @brief Bit mask of the enabled channels.
|
||||||
|
*/
|
||||||
|
uint32_t pd_enabled_channels;
|
||||||
|
} PWMDriver;
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* External declarations. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/** @cond never*/
|
||||||
|
#if defined(USE_STM32_PWM1)
|
||||||
|
extern PWMDriver PWMD1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
void pwm_lld_init(void);
|
||||||
|
void pwm_lld_start(PWMDriver *pwmp);
|
||||||
|
void pwm_lld_stop(PWMDriver *pwmp);
|
||||||
|
bool_t pwm_lld_is_enabled(PWMDriver *pwmp, pwmchannel_t channel);
|
||||||
|
void pwm_lld_setup_channel(PWMDriver *pwmp, pwmchannel_t channel);
|
||||||
|
void pwm_lld_enable_channel(PWMDriver *pwmp,
|
||||||
|
pwmchannel_t channel,
|
||||||
|
pwmcnt_t width);
|
||||||
|
void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/** @endcond*/
|
||||||
|
|
||||||
|
#endif /* CH_HAL_USE_PWM */
|
||||||
|
|
||||||
|
#endif /* _PWM_LLD_H_ */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -40,7 +40,7 @@ void pwmInit(void) {
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the standard part of a @p PWMDriver structure.
|
* @brief Initializes the standard part of a @p PWMDriver structure.
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
*/
|
*/
|
||||||
void pwmObjectInit(PWMDriver *pwmp) {
|
void pwmObjectInit(PWMDriver *pwmp) {
|
||||||
|
|
||||||
|
@ -51,8 +51,8 @@ void pwmObjectInit(PWMDriver *pwmp) {
|
||||||
/**
|
/**
|
||||||
* @brief Configures and activates the PWM peripheral.
|
* @brief Configures and activates the PWM peripheral.
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
* @param[in] config pointer to the @p PWMConfig object
|
* @param[in] config pointer to a @p PWMConfig object
|
||||||
*/
|
*/
|
||||||
void pwmStart(PWMDriver *pwmp, const PWMConfig *config) {
|
void pwmStart(PWMDriver *pwmp, const PWMConfig *config) {
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ void pwmStart(PWMDriver *pwmp, const PWMConfig *config) {
|
||||||
/**
|
/**
|
||||||
* @brief Deactivates the PWM peripheral.
|
* @brief Deactivates the PWM peripheral.
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
*/
|
*/
|
||||||
void pwmStop(PWMDriver *pwmp) {
|
void pwmStop(PWMDriver *pwmp) {
|
||||||
|
|
||||||
|
@ -87,32 +87,31 @@ void pwmStop(PWMDriver *pwmp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables a callback mode for the specified PWM channel.
|
* @brief Setups a PWM channel.
|
||||||
* @details The callback mode must be set before starting a PWM channel.
|
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
* @param[in] channel PWM channel identifier
|
* @param[in] channel PWM channel identifier
|
||||||
* @param[in] edge output edge mode
|
* @param[in] pccp pointer to a @p PWMChannelConfig object
|
||||||
* @param[in] callback the callback function
|
|
||||||
*/
|
*/
|
||||||
void pwmSetCallback(PWMDriver *pwmp, pwmchannel_t channel,
|
void pwmSetupChannel(PWMDriver *pwmp, pwmchannel_t channel,
|
||||||
pwmedge_t edge, pwmcallback_t callback) {
|
const PWMChannelConfig *pccp) {
|
||||||
|
|
||||||
chDbgCheck((pwmp != NULL) && (channel < PWM_CHANNELS),
|
chDbgCheck((pwmp != NULL) && (channel < PWM_CHANNELS) && (pccp != NULL),
|
||||||
"pwmSetCallback");
|
"pwmSetupChannel");
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
chDbgAssert((pwmp->pd_state == PWM_READY) &&
|
chDbgAssert((pwmp->pd_state == PWM_READY) &&
|
||||||
!pwm_lld_is_enabled(pwmp, channel),
|
!pwm_lld_is_enabled(pwmp, channel),
|
||||||
"pwmSetCallback(), #1", "invalid state");
|
"pwmSetupChannel(), #1", "invalid state");
|
||||||
pwm_lld_set_callback(pwmp, channel, edge, callback);
|
pwmp->pd_channel_configs[channel] = pccp;
|
||||||
|
pwm_lld_setup_channel(pwmp, channel);
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables a PWM channel.
|
* @brief Enables a PWM channel.
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
* @param[in] channel PWM channel identifier
|
* @param[in] channel PWM channel identifier
|
||||||
* @param[in] width PWM pulse width as clock pulses number
|
* @param[in] width PWM pulse width as clock pulses number
|
||||||
*/
|
*/
|
||||||
|
@ -135,7 +134,7 @@ void pwmEnableChannel(PWMDriver *pwmp,
|
||||||
* @details The channel is disabled and its output line returned to the
|
* @details The channel is disabled and its output line returned to the
|
||||||
* idle state.
|
* idle state.
|
||||||
*
|
*
|
||||||
* @param[in] pwmp pointer to the @p PWMDriver object
|
* @param[in] pwmp pointer to a @p PWMDriver object
|
||||||
* @param[in] channel PWM channel identifier
|
* @param[in] channel PWM channel identifier
|
||||||
*/
|
*/
|
||||||
void pwmDisableChannel(PWMDriver *pwmp, pwmchannel_t channel) {
|
void pwmDisableChannel(PWMDriver *pwmp, pwmchannel_t channel) {
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
/**
|
/**
|
||||||
* Kernel version string.
|
* Kernel version string.
|
||||||
*/
|
*/
|
||||||
#define CH_KERNEL_VERSION "1.3.5unstable"
|
#define CH_KERNEL_VERSION "1.3.6unstable"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kernel version major number.
|
* Kernel version major number.
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
/**
|
/**
|
||||||
* Kernel version patch number.
|
* Kernel version patch number.
|
||||||
*/
|
*/
|
||||||
#define CH_KERNEL_PATCH 5
|
#define CH_KERNEL_PATCH 6
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common values.
|
* Common values.
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
*** Releases ***
|
*** Releases ***
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
|
*** 1.3.6 ***
|
||||||
|
|
||||||
*** 1.3.5 ***
|
*** 1.3.5 ***
|
||||||
- FIX: Fixed problem with memory core allocator (bug 2912528).
|
- FIX: Fixed problem with memory core allocator (bug 2912528).
|
||||||
- FIX: Fixed problem with CH_USE_MEMCORE option (bug 2912522).
|
- FIX: Fixed problem with CH_USE_MEMCORE option (bug 2912522).
|
||||||
|
|
Loading…
Reference in New Issue