📄 stm8l15x_tim5.c
字号:
/**
******************************************************************************
* @file stm8l15x_tim5.c
* @author MCD Application Team
* @version V1.5.0
* @date 13-May-2011
* @brief This file provides firmware functions to manage the following
* functionalities of the TIM5 peripheral:
* - TimeBase management
* - Output Compare management
* - Input Capture management
* - Interrupts, DMA and flags management
* - Clocks management
* - Synchronization management
* - Specific interface management
*
* @verbatim
*
* ===================================================================
* How to use this driver
* ===================================================================
* This driver provides functions to configure and initialise the TIM5
* peripheral
* These functions are split in 7 groups:
*
* 1. TIM5 TimeBase management: this group includes all needed functions
* to configure the TIM Timebase unit:
* - Set/Get Prescaler
* - Set/Get Autoreload
* - Counter modes configuration
* - Select the One Pulse mode
* - Update Request Configuration
* - Update Disable Configuration
* - Auto-Preload Configuration
* - Enable/Disable the counter
*
* 2. TIM5 Output Compare management: this group includes all needed
* functions to configure the Capture/Compare unit used in Output
* compare mode:
* - Configure each channel, independently, in Output Compare mode
* - Select the output compare modes
* - Select the Polarities of each channel
* - Set/Get the Capture/Compare register values
* - Select the Output Compare Fast mode
* - Select the Output Compare Forced mode
* - Output Compare-Preload Configuration
* - Enable/Disable the Capture/Compare Channels
*
* 3. TIM5 Input Capture management: this group includes all needed
* functions to configure the Capture/Compare unit used in
* Input Capture mode:
* - Configure each channel in input capture mode
* - Configure Channel1/2 in PWM Input mode
* - Set the Input Capture Prescaler
* - Get the Capture/Compare values
*
* 4. TIM5 interrupts, DMA and flags management
* - Enable/Disable interrupt sources
* - Get flags status
* - Clear flags/ Pending bits
* - Enable/Disable DMA requests
* - Select CaptureCompare DMA request
*
* 5. TIM5 clocks management: this group includes all needed functions
* to configure the clock controller unit:
* - Select internal/External clock
* - Select the external clock mode: ETR(Mode1/Mode2) or TIx
*
* 6. TIM5 synchronization management: this group includes all needed
* functions to configure the Synchronization unit:
* - Select Input Trigger
* - Select Output Trigger
* - Select Master Slave Mode
* - ETR Configuration when used as external trigger
*
* 7. TIM5 specific interface management, this group includes all
* needed functions to use the specific TIM5 interface:
* - Encoder Interface Configuration
* - Select Hall Sensor
*
* @endverbatim
*
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm8l15x_TIM5.h"
/** @addtogroup STM8L15x_StdPeriph_Driver
* @{
*/
/** @defgroup TIM5
* @brief TIM5 driver modules
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void TI1_Config(TIM5_ICPolarity_TypeDef TIM5_ICPolarity,
TIM5_ICSelection_TypeDef TIM5_ICSelection,
uint8_t TIM5_ICFilter);
static void TI2_Config(TIM5_ICPolarity_TypeDef TIM5_ICPolarity,
TIM5_ICSelection_TypeDef TIM5_ICSelection,
uint8_t TIM5_ICFilter);
/** @defgroup TIM5_Private_Functions
* @{
*/
/** @defgroup TIM5_Group1 TimeBase management functions
* @brief TimeBase management functions
*
@verbatim
===============================================================================
TimeBase management functions
===============================================================================
===================================================================
TIM5 Driver: how to use it in Timing(Time base) Mode
===================================================================
To use the Timer in Timing(Time base) mode, the following steps are mandatory:
1. Enable TIM5 clock using CLK_PeripheralClockConfig(CLK_Peripheral_TIM5, ENABLE) function.
2. Call TIM5_TimeBaseInit() to configure the Time Base unit with the
corresponding configuration.
3. Enable global interrupts if you need to generate the update interrupt.
4. Enable the corresponding interrupt using the function TIM5_ITConfig(TIM5_IT_Update)
5. Call the TIM5_Cmd(ENABLE) function to enable the TIM5 counter.
Note1: All other functions can be used separately to modify, if needed,
a specific feature of the Timer.
@endverbatim
* @{
*/
/**
* @brief Deinitialize the TIM5 peripheral registers to their default reset values.
* @param None
* @retval None
*/
void TIM5_DeInit(void)
{
TIM5->CR1 = TIM_CR1_RESET_VALUE;
TIM5->CR2 = TIM_CR2_RESET_VALUE;
TIM5->SMCR = TIM_SMCR_RESET_VALUE;
TIM5->ETR = TIM_ETR_RESET_VALUE;
TIM5->IER = TIM_IER_RESET_VALUE;
TIM5->SR2 = TIM_SR2_RESET_VALUE;
/* Disable channels */
TIM5->CCER1 = TIM_CCER1_RESET_VALUE;
/* Configure channels as inputs: it is necessary if lock level is equal to 2 or 3 */
TIM5->CCMR1 = 0x01;/*TIM5_ICxSource_TIxFPx */
TIM5->CCMR2 = 0x01;/*TIM5_ICxSource_TIxFPx */
/* Then reset channel registers: it also works if lock level is equal to 2 or 3 */
TIM5->CCER1 = TIM_CCER1_RESET_VALUE;
TIM5->CCMR1 = TIM_CCMR1_RESET_VALUE;
TIM5->CCMR2 = TIM_CCMR2_RESET_VALUE;
TIM5->CNTRH = TIM_CNTRH_RESET_VALUE;
TIM5->CNTRL = TIM_CNTRL_RESET_VALUE;
TIM5->PSCR = TIM_PSCR_RESET_VALUE;
TIM5->ARRH = TIM_ARRH_RESET_VALUE;
TIM5->ARRL = TIM_ARRL_RESET_VALUE;
TIM5->CCR1H = TIM_CCR1H_RESET_VALUE;
TIM5->CCR1L = TIM_CCR1L_RESET_VALUE;
TIM5->CCR2H = TIM_CCR2H_RESET_VALUE;
TIM5->CCR2L = TIM_CCR2L_RESET_VALUE;
TIM5->OISR = TIM_OISR_RESET_VALUE;
TIM5->EGR = 0x01;/* TIM_EGR_UG */
TIM5->BKR = TIM_BKR_RESET_VALUE;
TIM5->SR1 = TIM_SR1_RESET_VALUE;
}
/**
* @brief Initializes the TIM5 Time Base Unit according to the specified parameters.
* @param TIM5_Prescaler: Prescaler
* This parameter can be one of the following values:
* @arg TIM5_Prescaler_1: Time base Prescaler = 1 (No effect)
* @arg TIM5_Prescaler_2: Time base Prescaler = 2
* @arg TIM5_Prescaler_4: Time base Prescaler = 4
* @arg TIM5_Prescaler_8: Time base Prescaler = 8
* @arg TIM5_Prescaler_16: Time base Prescaler = 16
* @arg TIM5_Prescaler_32: Time base Prescaler = 32
* @arg TIM5_Prescaler_64: Time base Prescaler = 64
* @arg TIM5_Prescaler_128: Time base Prescaler = 128
* @param TIM5_CounterMode: Counter mode
* This parameter can be one of the following values:
* @arg TIM5_CounterMode_Up: Counter Up Mode
* @arg TIM5_CounterMode_Down: Counter Down Mode
* @arg TIM5_CounterMode_CenterAligned1: Counter Central aligned Mode 1
* @arg TIM5_CounterMode_CenterAligned2: Counter Central aligned Mode 2
* @arg TIM5_CounterMode_CenterAligned3: Counter Central aligned Mode 3
* @param TIM5_Period: This parameter must be a value between 0x0000 and 0xFFFF.
* @retval None
*/
void TIM5_TimeBaseInit(TIM5_Prescaler_TypeDef TIM5_Prescaler,
TIM5_CounterMode_TypeDef TIM5_CounterMode,
uint16_t TIM5_Period)
{
assert_param(IS_TIM5_PRESCALER(TIM5_Prescaler));
assert_param(IS_TIM5_COUNTER_MODE(TIM5_CounterMode));
/* Set the Autoreload value */
TIM5->ARRH = (uint8_t)(TIM5_Period >> 8) ;
TIM5->ARRL = (uint8_t)(TIM5_Period);
/* Set the Prescaler value */
TIM5->PSCR = (uint8_t)(TIM5_Prescaler);
/* Select the Counter Mode */
TIM5->CR1 &= (uint8_t)((uint8_t)(~TIM_CR1_CMS)) & ((uint8_t)(~TIM_CR1_DIR));
TIM5->CR1 |= (uint8_t)(TIM5_CounterMode);
/* Generate an update event to reload the Prescaler value immediately */
TIM5->EGR = TIM5_EventSource_Update;
}
/**
* @brief Configures the TIM5 Prescaler.
* @param Prescaler: Specifies the Prescaler Register value
* This parameter can be one of the following values:
* @arg TIM5_Prescaler_1: Time base Prescaler = 1 (No effect)
* @arg TIM5_Prescaler_2: Time base Prescaler = 2
* @arg TIM5_Prescaler_4: Time base Prescaler = 4
* @arg TIM5_Prescaler_8: Time base Prescaler = 8
* @arg TIM5_Prescaler_16: Time base Prescaler = 16
* @arg TIM5_Prescaler_32: Time base Prescaler = 32
* @arg TIM5_Prescaler_64: Time base Prescaler = 64
* @arg TIM5_Prescaler_128: Time base Prescaler = 128
* @param TIM5_PSCReloadMode: Specifies the TIM5 Prescaler Reload mode.
* This parameter can be one of the following values:
* @arg TIM5_PSCReloadMode_Update: Prescaler value is reloaded at every update
* @arg TIM5_PSCReloadMode_Immediate: Prescaler value is reloaded at every update
* @retval None
*/
void TIM5_PrescalerConfig(TIM5_Prescaler_TypeDef Prescaler,
TIM5_PSCReloadMode_TypeDef TIM5_PSCReloadMode)
{
/* Check the parameters */
assert_param(IS_TIM5_PRESCALER(Prescaler));
assert_param(IS_TIM5_PRESCALER_RELOAD(TIM5_PSCReloadMode));
/* Set the Prescaler value */
TIM5->PSCR = (uint8_t)(Prescaler);
/* Set or reset the UG Bit */
if (TIM5_PSCReloadMode == TIM5_PSCReloadMode_Immediate)
{
TIM5->EGR |= TIM_EGR_UG ;
}
else
{
TIM5->EGR &= (uint8_t)(~TIM_EGR_UG) ;
}
}
/**
* @brief Specifies the TIM5 Counter Mode to be used.
* @param TIM5_CounterMode: Specifies the Counter Mode to be used
* This parameter can be one of the following values:
* @arg TIM5_CounterMode_Up: Counter Up Mode
* @arg TIM5_CounterMode_Down: Counter Down Mode
* @arg TIM5_CounterMode_CenterAligned1: Counter Central aligned Mode 1
* @arg TIM5_CounterMode_CenterAligned2: Counter Central aligned Mode 2
* @arg TIM5_CounterMode_CenterAligned3: Counter Central aligned Mode 3
* @retval None
*/
void TIM5_CounterModeConfig(TIM5_CounterMode_TypeDef TIM5_CounterMode)
{
uint8_t tmpcr1 = 0;
/* Check the parameters */
assert_param(IS_TIM5_COUNTER_MODE(TIM5_CounterMode));
tmpcr1 = TIM5->CR1;
/* Reset the CMS and DIR Bits */
tmpcr1 &= (uint8_t)((uint8_t)(~TIM_CR1_CMS) & (uint8_t)(~TIM_CR1_DIR));
/* Set the Counter Mode */
tmpcr1 |= (uint8_t)TIM5_CounterMode;
TIM5->CR1 = tmpcr1;
}
/**
* @brief Sets the TIM5 Counter Register value.
* @param Counter: Specifies the Counter register new value.
* This parameter is between 0x0000 and 0xFFFF.
* @retval None
*/
void TIM5_SetCounter(uint16_t Counter)
{
/* Set the Counter Register value */
TIM5->CNTRH = (uint8_t)(Counter >> 8);
TIM5->CNTRL = (uint8_t)(Counter);
}
/**
* @brief Sets the TIM5 Autoreload Register value.
* @param Autoreload: Specifies the Autoreload register new value.
* This parameter is between 0x0000 and 0xFFFF.
* @retval None
*/
void TIM5_SetAutoreload(uint16_t Autoreload)
{
/* Set the Autoreload Register value */
TIM5->ARRH = (uint8_t)(Autoreload >> 8);
TIM5->ARRL = (uint8_t)(Autoreload);
}
/**
* @brief Gets the TIM5 Counter value.
* @param None
* @retval Counter Register value.
*/
uint16_t TIM5_GetCounter(void)
{
uint16_t tmpcnt = 0;
uint8_t tmpcntrl, tmpcntrh;
tmpcntrh = TIM5->CNTRH;
tmpcntrl = TIM5->CNTRL;
tmpcnt = (uint16_t)(tmpcntrl);
tmpcnt |= (uint16_t)((uint16_t)tmpcntrh << 8);
/* Get the Counter Register value */
return ((uint16_t)tmpcnt);
}
/**
* @brief Gets the TIM5 Prescaler value.
* @param None
* @retval TIM5 Prescaler, it can be one of the following values:
* - TIM5_Prescaler_1: Time base Prescaler = 1 (No effect)
* - TIM5_Prescaler_2: Time base Prescaler = 2
* - TIM5_Prescaler_4: Time base Prescaler = 4
* - TIM5_Prescaler_8: Time base Prescaler = 8
* - TIM5_Prescaler_16: Time base Prescaler = 16
* - TIM5_Prescaler_32: Time base Prescaler = 32
* - TIM5_Prescaler_64: Time base Prescaler = 64
* - TIM5_Prescaler_128: Time base Prescaler = 128
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -