commit
bddb91a0cf
@ -0,0 +1,7 @@ |
||||
cmake-build-debug/ |
||||
Build/ |
||||
CMakeLists.txt |
||||
*.o |
||||
*.rel |
||||
*.a |
||||
.idea/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,338 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_adc1.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the prototypes/macros for the ADC1 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_ADC1_H |
||||
#define __STM8S_ADC1_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ADC1_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief ADC1 clock prescaler selection |
||||
*/ |
||||
|
||||
typedef enum
|
||||
{ |
||||
ADC1_PRESSEL_FCPU_D2 = (uint8_t)0x00, /**< Prescaler selection fADC1 = fcpu/2 */ |
||||
ADC1_PRESSEL_FCPU_D3 = (uint8_t)0x10, /**< Prescaler selection fADC1 = fcpu/3 */ |
||||
ADC1_PRESSEL_FCPU_D4 = (uint8_t)0x20, /**< Prescaler selection fADC1 = fcpu/4 */ |
||||
ADC1_PRESSEL_FCPU_D6 = (uint8_t)0x30, /**< Prescaler selection fADC1 = fcpu/6 */ |
||||
ADC1_PRESSEL_FCPU_D8 = (uint8_t)0x40, /**< Prescaler selection fADC1 = fcpu/8 */ |
||||
ADC1_PRESSEL_FCPU_D10 = (uint8_t)0x50, /**< Prescaler selection fADC1 = fcpu/10 */ |
||||
ADC1_PRESSEL_FCPU_D12 = (uint8_t)0x60, /**< Prescaler selection fADC1 = fcpu/12 */ |
||||
ADC1_PRESSEL_FCPU_D18 = (uint8_t)0x70 /**< Prescaler selection fADC1 = fcpu/18 */ |
||||
} ADC1_PresSel_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 External conversion trigger event selection |
||||
*/ |
||||
typedef enum
|
||||
{ |
||||
ADC1_EXTTRIG_TIM = (uint8_t)0x00, /**< Conversion from Internal TIM1 TRGO event */ |
||||
ADC1_EXTTRIG_GPIO = (uint8_t)0x10 /**< Conversion from External interrupt on ADC_ETR pin*/ |
||||
} ADC1_ExtTrig_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 data alignment |
||||
*/ |
||||
typedef enum
|
||||
{ |
||||
ADC1_ALIGN_LEFT = (uint8_t)0x00, /**< Data alignment left */ |
||||
ADC1_ALIGN_RIGHT = (uint8_t)0x08 /**< Data alignment right */ |
||||
} ADC1_Align_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 Interrupt source |
||||
*/ |
||||
typedef enum
|
||||
{ |
||||
ADC1_IT_AWDIE = (uint16_t)0x010, /**< Analog WDG interrupt enable */ |
||||
ADC1_IT_EOCIE = (uint16_t)0x020, /**< EOC interrupt enable */ |
||||
ADC1_IT_AWD = (uint16_t)0x140, /**< Analog WDG status */ |
||||
ADC1_IT_AWS0 = (uint16_t)0x110, /**< Analog channel 0 status */ |
||||
ADC1_IT_AWS1 = (uint16_t)0x111, /**< Analog channel 1 status */ |
||||
ADC1_IT_AWS2 = (uint16_t)0x112, /**< Analog channel 2 status */ |
||||
ADC1_IT_AWS3 = (uint16_t)0x113, /**< Analog channel 3 status */ |
||||
ADC1_IT_AWS4 = (uint16_t)0x114, /**< Analog channel 4 status */ |
||||
ADC1_IT_AWS5 = (uint16_t)0x115, /**< Analog channel 5 status */ |
||||
ADC1_IT_AWS6 = (uint16_t)0x116, /**< Analog channel 6 status */ |
||||
ADC1_IT_AWS7 = (uint16_t)0x117, /**< Analog channel 7 status */ |
||||
ADC1_IT_AWS8 = (uint16_t)0x118, /**< Analog channel 8 status */ |
||||
ADC1_IT_AWS9 = (uint16_t)0x119, /**< Analog channel 9 status */ |
||||
ADC1_IT_AWS12 = (uint16_t)0x11C, /**< Analog channel 12 status */ |
||||
/* refer to product datasheet for channel 12 availability */ |
||||
ADC1_IT_EOC = (uint16_t)0x080 /**< EOC pending bit */ |
||||
|
||||
} ADC1_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 Flags |
||||
*/ |
||||
typedef enum
|
||||
{ |
||||
ADC1_FLAG_OVR = (uint8_t)0x41, /**< Overrun status flag */ |
||||
ADC1_FLAG_AWD = (uint8_t)0x40, /**< Analog WDG status */ |
||||
ADC1_FLAG_AWS0 = (uint8_t)0x10, /**< Analog channel 0 status */ |
||||
ADC1_FLAG_AWS1 = (uint8_t)0x11, /**< Analog channel 1 status */ |
||||
ADC1_FLAG_AWS2 = (uint8_t)0x12, /**< Analog channel 2 status */ |
||||
ADC1_FLAG_AWS3 = (uint8_t)0x13, /**< Analog channel 3 status */ |
||||
ADC1_FLAG_AWS4 = (uint8_t)0x14, /**< Analog channel 4 status */ |
||||
ADC1_FLAG_AWS5 = (uint8_t)0x15, /**< Analog channel 5 status */ |
||||
ADC1_FLAG_AWS6 = (uint8_t)0x16, /**< Analog channel 6 status */ |
||||
ADC1_FLAG_AWS7 = (uint8_t)0x17, /**< Analog channel 7 status */ |
||||
ADC1_FLAG_AWS8 = (uint8_t)0x18, /**< Analog channel 8 status*/ |
||||
ADC1_FLAG_AWS9 = (uint8_t)0x19, /**< Analog channel 9 status */ |
||||
ADC1_FLAG_AWS12 = (uint8_t)0x1C, /**< Analog channel 12 status */ |
||||
/* refer to product datasheet for channel 12 availability */ |
||||
ADC1_FLAG_EOC = (uint8_t)0x80 /**< EOC falg */ |
||||
}ADC1_Flag_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief ADC1 schmitt Trigger |
||||
*/ |
||||
typedef enum
|
||||
{ |
||||
ADC1_SCHMITTTRIG_CHANNEL0 = (uint8_t)0x00, /**< Schmitt trigger disable on AIN0 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL1 = (uint8_t)0x01, /**< Schmitt trigger disable on AIN1 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL2 = (uint8_t)0x02, /**< Schmitt trigger disable on AIN2 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL3 = (uint8_t)0x03, /**< Schmitt trigger disable on AIN3 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL4 = (uint8_t)0x04, /**< Schmitt trigger disable on AIN4 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL5 = (uint8_t)0x05, /**< Schmitt trigger disable on AIN5 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL6 = (uint8_t)0x06, /**< Schmitt trigger disable on AIN6 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL7 = (uint8_t)0x07, /**< Schmitt trigger disable on AIN7 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL8 = (uint8_t)0x08, /**< Schmitt trigger disable on AIN8 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL9 = (uint8_t)0x09, /**< Schmitt trigger disable on AIN9 */ |
||||
ADC1_SCHMITTTRIG_CHANNEL12 = (uint8_t)0x0C, /**< Schmitt trigger disable on AIN12 */
|
||||
/* refer to product datasheet for channel 12 availability */
|
||||
ADC1_SCHMITTTRIG_ALL = (uint8_t)0xFF /**< Schmitt trigger disable on All channels */
|
||||
} ADC1_SchmittTrigg_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 conversion mode selection |
||||
*/ |
||||
|
||||
typedef enum
|
||||
{ |
||||
ADC1_CONVERSIONMODE_SINGLE = (uint8_t)0x00, /**< Single conversion mode */ |
||||
ADC1_CONVERSIONMODE_CONTINUOUS = (uint8_t)0x01 /**< Continuous conversion mode */ |
||||
} ADC1_ConvMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC1 analog channel selection |
||||
*/ |
||||
|
||||
typedef enum
|
||||
{ |
||||
ADC1_CHANNEL_0 = (uint8_t)0x00, /**< Analog channel 0 */ |
||||
ADC1_CHANNEL_1 = (uint8_t)0x01, /**< Analog channel 1 */ |
||||
ADC1_CHANNEL_2 = (uint8_t)0x02, /**< Analog channel 2 */ |
||||
ADC1_CHANNEL_3 = (uint8_t)0x03, /**< Analog channel 3 */ |
||||
ADC1_CHANNEL_4 = (uint8_t)0x04, /**< Analog channel 4 */ |
||||
ADC1_CHANNEL_5 = (uint8_t)0x05, /**< Analog channel 5 */ |
||||
ADC1_CHANNEL_6 = (uint8_t)0x06, /**< Analog channel 6 */ |
||||
ADC1_CHANNEL_7 = (uint8_t)0x07, /**< Analog channel 7 */ |
||||
ADC1_CHANNEL_8 = (uint8_t)0x08, /**< Analog channel 8 */ |
||||
ADC1_CHANNEL_9 = (uint8_t)0x09, /**< Analog channel 9 */ |
||||
ADC1_CHANNEL_12 = (uint8_t)0x0C /**< Analog channel 12 */
|
||||
/* refer to product datasheet for channel 12 availability */ |
||||
} ADC1_Channel_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ADC1_Private_Macros
|
||||
* @brief Macros used by the assert function to check the different functions parameters. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different prescaler's values. |
||||
*/ |
||||
#define IS_ADC1_PRESSEL_OK(PRESCALER) (((PRESCALER) == ADC1_PRESSEL_FCPU_D2) || \ |
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D3) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D4) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D6) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D8) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D10) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D12) || \
|
||||
((PRESCALER) == ADC1_PRESSEL_FCPU_D18)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different external trigger values. |
||||
*/ |
||||
#define IS_ADC1_EXTTRIG_OK(EXTRIG) (((EXTRIG) == ADC1_EXTTRIG_TIM) || \ |
||||
((EXTRIG) == ADC1_EXTTRIG_GPIO)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different alignment modes. |
||||
*/ |
||||
#define IS_ADC1_ALIGN_OK(ALIGN) (((ALIGN) == ADC1_ALIGN_LEFT) || \ |
||||
((ALIGN) == ADC1_ALIGN_RIGHT)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the Interrupt source. |
||||
*/ |
||||
#define IS_ADC1_IT_OK(IT) (((IT) == ADC1_IT_EOCIE) || \ |
||||
((IT) == ADC1_IT_AWDIE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the ADC1 Flag. |
||||
*/ |
||||
#define IS_ADC1_FLAG_OK(FLAG) (((FLAG) == ADC1_FLAG_EOC)|| \ |
||||
((FLAG) == ADC1_FLAG_OVR) || \
|
||||
((FLAG) == ADC1_FLAG_AWD) || \
|
||||
((FLAG) == ADC1_FLAG_AWS0) || \
|
||||
((FLAG) == ADC1_FLAG_AWS1) || \
|
||||
((FLAG) == ADC1_FLAG_AWS2) || \
|
||||
((FLAG) == ADC1_FLAG_AWS3) || \
|
||||
((FLAG) == ADC1_FLAG_AWS4) || \
|
||||
((FLAG) == ADC1_FLAG_AWS5) || \
|
||||
((FLAG) == ADC1_FLAG_AWS6) || \
|
||||
((FLAG) == ADC1_FLAG_AWS7) || \
|
||||
((FLAG) == ADC1_FLAG_AWS8) || \
|
||||
((FLAG) == ADC1_FLAG_AWS9)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the ADC1 pending bits. |
||||
*/ |
||||
#define IS_ADC1_ITPENDINGBIT_OK(ITPENDINGBIT) (((ITPENDINGBIT) == ADC1_IT_EOC) || \ |
||||
((ITPENDINGBIT) == ADC1_IT_AWD) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS0) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS1) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS2) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS3) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS4) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS5) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS6) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS7) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS8) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS12) || \
|
||||
((ITPENDINGBIT) == ADC1_IT_AWS9)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different schmitt trigger values. |
||||
*/ |
||||
#define IS_ADC1_SCHMITTTRIG_OK(SCHMITTTRIG) (((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL0) || \ |
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL1) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL2) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL3) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL4) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL5) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL6) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL7) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL8) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL12) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_ALL) || \
|
||||
((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL9)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different conversion modes. |
||||
*/ |
||||
#define IS_ADC1_CONVERSIONMODE_OK(MODE) (((MODE) == ADC1_CONVERSIONMODE_SINGLE) || \ |
||||
((MODE) == ADC1_CONVERSIONMODE_CONTINUOUS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different channels values. |
||||
*/ |
||||
#define IS_ADC1_CHANNEL_OK(CHANNEL) (((CHANNEL) == ADC1_CHANNEL_0) || \ |
||||
((CHANNEL) == ADC1_CHANNEL_1) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_2) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_3) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_4) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_5) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_6) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_7) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_8) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_12) || \
|
||||
((CHANNEL) == ADC1_CHANNEL_9)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the possible buffer values. |
||||
*/ |
||||
#define IS_ADC1_BUFFER_OK(BUFFER) ((BUFFER) <= (uint8_t)0x09) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup ADC1_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void ADC1_DeInit(void); |
||||
void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode,
|
||||
ADC1_Channel_TypeDef ADC1_Channel, |
||||
ADC1_PresSel_TypeDef ADC1_PrescalerSelection,
|
||||
ADC1_ExtTrig_TypeDef ADC1_ExtTrigger,
|
||||
FunctionalState ADC1_ExtTriggerState, ADC1_Align_TypeDef ADC1_Align,
|
||||
ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel,
|
||||
FunctionalState ADC1_SchmittTriggerState); |
||||
void ADC1_Cmd(FunctionalState NewState); |
||||
void ADC1_ScanModeCmd(FunctionalState NewState); |
||||
void ADC1_DataBufferCmd(FunctionalState NewState); |
||||
void ADC1_ITConfig(ADC1_IT_TypeDef ADC1_IT, FunctionalState NewState); |
||||
void ADC1_PrescalerConfig(ADC1_PresSel_TypeDef ADC1_Prescaler); |
||||
void ADC1_SchmittTriggerConfig(ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, |
||||
FunctionalState NewState); |
||||
void ADC1_ConversionConfig(ADC1_ConvMode_TypeDef ADC1_ConversionMode,
|
||||
ADC1_Channel_TypeDef ADC1_Channel,
|
||||
ADC1_Align_TypeDef ADC1_Align); |
||||
void ADC1_ExternalTriggerConfig(ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState NewState); |
||||
void ADC1_AWDChannelConfig(ADC1_Channel_TypeDef Channel, FunctionalState NewState); |
||||
void ADC1_StartConversion(void); |
||||
uint16_t ADC1_GetConversionValue(void); |
||||
void ADC1_SetHighThreshold(uint16_t Threshold); |
||||
void ADC1_SetLowThreshold(uint16_t Threshold); |
||||
uint16_t ADC1_GetBufferValue(uint8_t Buffer); |
||||
FlagStatus ADC1_GetAWDChannelStatus(ADC1_Channel_TypeDef Channel); |
||||
FlagStatus ADC1_GetFlagStatus(ADC1_Flag_TypeDef Flag); |
||||
void ADC1_ClearFlag(ADC1_Flag_TypeDef Flag); |
||||
ITStatus ADC1_GetITStatus(ADC1_IT_TypeDef ITPendingBit); |
||||
void ADC1_ClearITPendingBit(ADC1_IT_TypeDef ITPendingBit); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_ADC1_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,256 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_adc2.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the prototypes/macros for the ADC2 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_ADC2_H |
||||
#define __STM8S_ADC2_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ADC2_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief ADC2 clock prescaler selection |
||||
*/ |
||||
|
||||
typedef enum { |
||||
ADC2_PRESSEL_FCPU_D2 = (uint8_t)0x00, /**< Prescaler selection fADC2 = fcpu/2 */ |
||||
ADC2_PRESSEL_FCPU_D3 = (uint8_t)0x10, /**< Prescaler selection fADC2 = fcpu/3 */ |
||||
ADC2_PRESSEL_FCPU_D4 = (uint8_t)0x20, /**< Prescaler selection fADC2 = fcpu/4 */ |
||||
ADC2_PRESSEL_FCPU_D6 = (uint8_t)0x30, /**< Prescaler selection fADC2 = fcpu/6 */ |
||||
ADC2_PRESSEL_FCPU_D8 = (uint8_t)0x40, /**< Prescaler selection fADC2 = fcpu/8 */ |
||||
ADC2_PRESSEL_FCPU_D10 = (uint8_t)0x50, /**< Prescaler selection fADC2 = fcpu/10 */ |
||||
ADC2_PRESSEL_FCPU_D12 = (uint8_t)0x60, /**< Prescaler selection fADC2 = fcpu/12 */ |
||||
ADC2_PRESSEL_FCPU_D18 = (uint8_t)0x70 /**< Prescaler selection fADC2 = fcpu/18 */ |
||||
} ADC2_PresSel_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC2 External conversion trigger event selection |
||||
*/ |
||||
typedef enum { |
||||
ADC2_EXTTRIG_TIM = (uint8_t)0x00, /**< Conversion from Internal TIM TRGO event */ |
||||
ADC2_EXTTRIG_GPIO = (uint8_t)0x01 /**< Conversion from External interrupt on ADC_ETR pin*/ |
||||
} ADC2_ExtTrig_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC2 data alignment |
||||
*/ |
||||
typedef enum { |
||||
ADC2_ALIGN_LEFT = (uint8_t)0x00, /**< Data alignment left */ |
||||
ADC2_ALIGN_RIGHT = (uint8_t)0x08 /**< Data alignment right */ |
||||
} ADC2_Align_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC2 schmitt Trigger |
||||
*/ |
||||
typedef enum { |
||||
ADC2_SCHMITTTRIG_CHANNEL0 = (uint8_t)0x00, /**< Schmitt trigger disable on AIN0 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL1 = (uint8_t)0x01, /**< Schmitt trigger disable on AIN1 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL2 = (uint8_t)0x02, /**< Schmitt trigger disable on AIN2 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL3 = (uint8_t)0x03, /**< Schmitt trigger disable on AIN3 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL4 = (uint8_t)0x04, /**< Schmitt trigger disable on AIN4 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL5 = (uint8_t)0x05, /**< Schmitt trigger disable on AIN5 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL6 = (uint8_t)0x06, /**< Schmitt trigger disable on AIN6 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL7 = (uint8_t)0x07, /**< Schmitt trigger disable on AIN7 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL8 = (uint8_t)0x08, /**< Schmitt trigger disable on AIN8 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL9 = (uint8_t)0x09, /**< Schmitt trigger disable on AIN9 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL10 = (uint8_t)0x0A, /**< Schmitt trigger disable on AIN10 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL11 = (uint8_t)0x0B, /**< Schmitt trigger disable on AIN11 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL12 = (uint8_t)0x0C, /**< Schmitt trigger disable on AIN12 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL13 = (uint8_t)0x0D, /**< Schmitt trigger disable on AIN13 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL14 = (uint8_t)0x0E, /**< Schmitt trigger disable on AIN14 */ |
||||
ADC2_SCHMITTTRIG_CHANNEL15 = (uint8_t)0x0F, /**< Schmitt trigger disable on AIN15 */ |
||||
ADC2_SCHMITTTRIG_ALL = (uint8_t)0x1F /**< Schmitt trigger disable on all channels */ |
||||
|
||||
} ADC2_SchmittTrigg_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC2 conversion mode selection |
||||
*/ |
||||
|
||||
typedef enum { |
||||
ADC2_CONVERSIONMODE_SINGLE = (uint8_t)0x00, /**< Single conversion mode */ |
||||
ADC2_CONVERSIONMODE_CONTINUOUS = (uint8_t)0x01 /**< Continuous conversion mode */ |
||||
} ADC2_ConvMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ADC2 analog channel selection |
||||
*/ |
||||
|
||||
typedef enum { |
||||
ADC2_CHANNEL_0 = (uint8_t)0x00, /**< Analog channel 0 */ |
||||
ADC2_CHANNEL_1 = (uint8_t)0x01, /**< Analog channel 1 */ |
||||
ADC2_CHANNEL_2 = (uint8_t)0x02, /**< Analog channel 2 */ |
||||
ADC2_CHANNEL_3 = (uint8_t)0x03, /**< Analog channel 3 */ |
||||
ADC2_CHANNEL_4 = (uint8_t)0x04, /**< Analog channel 4 */ |
||||
ADC2_CHANNEL_5 = (uint8_t)0x05, /**< Analog channel 5 */ |
||||
ADC2_CHANNEL_6 = (uint8_t)0x06, /**< Analog channel 6 */ |
||||
ADC2_CHANNEL_7 = (uint8_t)0x07, /**< Analog channel 7 */ |
||||
ADC2_CHANNEL_8 = (uint8_t)0x08, /**< Analog channel 8 */ |
||||
ADC2_CHANNEL_9 = (uint8_t)0x09, /**< Analog channel 9 */ |
||||
ADC2_CHANNEL_10 = (uint8_t)0x0A, /**< Analog channel 10 */ |
||||
ADC2_CHANNEL_11 = (uint8_t)0x0B, /**< Analog channel 11 */ |
||||
ADC2_CHANNEL_12 = (uint8_t)0x0C, /**< Analog channel 12 */ |
||||
ADC2_CHANNEL_13 = (uint8_t)0x0D, /**< Analog channel 13 */ |
||||
ADC2_CHANNEL_14 = (uint8_t)0x0E, /**< Analog channel 14 */ |
||||
ADC2_CHANNEL_15 = (uint8_t)0x0F /**< Analog channel 15 */ |
||||
} ADC2_Channel_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ADC2_Private_Macros
|
||||
* @brief Macros used by the assert function to check the different functions parameters. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different prescaler's values. |
||||
*/ |
||||
#define IS_ADC2_PRESSEL_OK(PRESCALER) (((PRESCALER) == ADC2_PRESSEL_FCPU_D2) || \ |
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D3) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D4) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D6) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D8) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D10) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D12) || \
|
||||
((PRESCALER) == ADC2_PRESSEL_FCPU_D18)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different external trigger values. |
||||
*/ |
||||
#define IS_ADC2_EXTTRIG_OK(EXTRIG) (((EXTRIG) == ADC2_EXTTRIG_TIM) || \ |
||||
((EXTRIG) == ADC2_EXTTRIG_GPIO)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different alignment modes. |
||||
*/ |
||||
#define IS_ADC2_ALIGN_OK(ALIGN) (((ALIGN) == ADC2_ALIGN_LEFT) || \ |
||||
((ALIGN) == ADC2_ALIGN_RIGHT)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different schmitt trigger values. |
||||
*/ |
||||
#define IS_ADC2_SCHMITTTRIG_OK(SCHMITTTRIG) (((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL0) || \ |
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL1) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL2) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL3) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL4) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL5) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL6) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL7) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL8) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL9) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL10) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL11) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL12) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL13) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL14) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL15) || \
|
||||
((SCHMITTTRIG) == ADC2_SCHMITTTRIG_ALL)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different conversion modes. |
||||
*/ |
||||
#define IS_ADC2_CONVERSIONMODE_OK(MODE) (((MODE) == ADC2_CONVERSIONMODE_SINGLE) || \ |
||||
((MODE) == ADC2_CONVERSIONMODE_CONTINUOUS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different channels values. |
||||
*/ |
||||
#define IS_ADC2_CHANNEL_OK(CHANNEL) (((CHANNEL) == ADC2_CHANNEL_0) || \ |
||||
((CHANNEL) == ADC2_CHANNEL_1) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_2) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_3) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_4) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_5) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_6) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_7) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_8) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_9) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_10) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_11) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_12) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_13) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_14) || \
|
||||
((CHANNEL) == ADC2_CHANNEL_15)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup ADC2_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void ADC2_DeInit(void); |
||||
void ADC2_Init(ADC2_ConvMode_TypeDef ADC2_ConversionMode,
|
||||
ADC2_Channel_TypeDef ADC2_Channel,
|
||||
ADC2_PresSel_TypeDef ADC2_PrescalerSelection,
|
||||
ADC2_ExtTrig_TypeDef ADC2_ExtTrigger,
|
||||
FunctionalState ADC2_ExtTriggerState,
|
||||
ADC2_Align_TypeDef ADC2_Align,
|
||||
ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel,
|
||||
FunctionalState ADC2_SchmittTriggerState); |
||||
void ADC2_Cmd(FunctionalState NewState); |
||||
void ADC2_ITConfig(FunctionalState NewState); |
||||
void ADC2_PrescalerConfig(ADC2_PresSel_TypeDef ADC2_Prescaler); |
||||
void ADC2_SchmittTriggerConfig(ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel,
|
||||
FunctionalState NewState); |
||||
void ADC2_ConversionConfig(ADC2_ConvMode_TypeDef ADC2_ConversionMode,
|
||||
ADC2_Channel_TypeDef ADC2_Channel,
|
||||
ADC2_Align_TypeDef ADC2_Align); |
||||
void ADC2_ExternalTriggerConfig(ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState NewState); |
||||
void ADC2_StartConversion(void); |
||||
uint16_t ADC2_GetConversionValue(void); |
||||
FlagStatus ADC2_GetFlagStatus(void); |
||||
void ADC2_ClearFlag(void); |
||||
ITStatus ADC2_GetITStatus(void); |
||||
void ADC2_ClearITPendingBit(void); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_ADC2_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,147 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_awu.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the AWU peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_AWU_H |
||||
#define __STM8S_AWU_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup AWU_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief AWU TimeBase selection |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
AWU_TIMEBASE_NO_IT = (uint8_t)0, /*!< No AWU interrupt selected */ |
||||
AWU_TIMEBASE_250US = (uint8_t)1, /*!< AWU Timebase equals 0.25 ms */ |
||||
AWU_TIMEBASE_500US = (uint8_t)2, /*!< AWU Timebase equals 0.5 ms */ |
||||
AWU_TIMEBASE_1MS = (uint8_t)3, /*!< AWU Timebase equals 1 ms */ |
||||
AWU_TIMEBASE_2MS = (uint8_t)4, /*!< AWU Timebase equals 2 ms */ |
||||
AWU_TIMEBASE_4MS = (uint8_t)5, /*!< AWU Timebase equals 4 ms */ |
||||
AWU_TIMEBASE_8MS = (uint8_t)6, /*!< AWU Timebase equals 8 ms */ |
||||
AWU_TIMEBASE_16MS = (uint8_t)7, /*!< AWU Timebase equals 16 ms */ |
||||
AWU_TIMEBASE_32MS = (uint8_t)8, /*!< AWU Timebase equals 32 ms */ |
||||
AWU_TIMEBASE_64MS = (uint8_t)9, /*!< AWU Timebase equals 64 ms */ |
||||
AWU_TIMEBASE_128MS = (uint8_t)10, /*!< AWU Timebase equals 128 ms */ |
||||
AWU_TIMEBASE_256MS = (uint8_t)11, /*!< AWU Timebase equals 256 ms */ |
||||
AWU_TIMEBASE_512MS = (uint8_t)12, /*!< AWU Timebase equals 512 ms */ |
||||
AWU_TIMEBASE_1S = (uint8_t)13, /*!< AWU Timebase equals 1 s */ |
||||
AWU_TIMEBASE_2S = (uint8_t)14, /*!< AWU Timebase equals 2 s */ |
||||
AWU_TIMEBASE_12S = (uint8_t)15, /*!< AWU Timebase equals 12 s */ |
||||
AWU_TIMEBASE_30S = (uint8_t)16 /*!< AWU Timebase equals 30 s */ |
||||
} AWU_Timebase_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup AWU_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define LSI_FREQUENCY_MIN ((uint32_t)110000) /*!< LSI minimum value in Hertz */ |
||||
#define LSI_FREQUENCY_MAX ((uint32_t)150000) /*!< LSI maximum value in Hertz */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup AWU_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the AWU timebases |
||||
*/ |
||||
#define IS_AWU_TIMEBASE_OK(TB) \ |
||||
(((TB) == AWU_TIMEBASE_NO_IT) || \
|
||||
((TB) == AWU_TIMEBASE_250US) || \
|
||||
((TB) == AWU_TIMEBASE_500US) || \
|
||||
((TB) == AWU_TIMEBASE_1MS) || \
|
||||
((TB) == AWU_TIMEBASE_2MS) || \
|
||||
((TB) == AWU_TIMEBASE_4MS) || \
|
||||
((TB) == AWU_TIMEBASE_8MS) || \
|
||||
((TB) == AWU_TIMEBASE_16MS) || \
|
||||
((TB) == AWU_TIMEBASE_32MS) || \
|
||||
((TB) == AWU_TIMEBASE_64MS) || \
|
||||
((TB) == AWU_TIMEBASE_128MS) || \
|
||||
((TB) == AWU_TIMEBASE_256MS) || \
|
||||
((TB) == AWU_TIMEBASE_512MS) || \
|
||||
((TB) == AWU_TIMEBASE_1S) || \
|
||||
((TB) == AWU_TIMEBASE_2S) || \
|
||||
((TB) == AWU_TIMEBASE_12S) || \
|
||||
((TB) == AWU_TIMEBASE_30S)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the LSI frequency (in Hz) |
||||
*/ |
||||
#define IS_LSI_FREQUENCY_OK(FREQ) \ |
||||
(((FREQ) >= LSI_FREQUENCY_MIN) && \
|
||||
((FREQ) <= LSI_FREQUENCY_MAX)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup AWU_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void AWU_DeInit(void); |
||||
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase); |
||||
void AWU_Cmd(FunctionalState NewState); |
||||
void AWU_LSICalibrationConfig(uint32_t LSIFreqHz); |
||||
void AWU_IdleModeEnable(void); |
||||
FlagStatus AWU_GetFlagStatus(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_AWU_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,119 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_beep.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the BEEP peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_BEEP_H |
||||
#define __STM8S_BEEP_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup BEEP_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief BEEP Frequency selection |
||||
*/ |
||||
typedef enum { |
||||
BEEP_FREQUENCY_1KHZ = (uint8_t)0x00, /*!< Beep signal output frequency equals to 1 KHz */ |
||||
BEEP_FREQUENCY_2KHZ = (uint8_t)0x40, /*!< Beep signal output frequency equals to 2 KHz */ |
||||
BEEP_FREQUENCY_4KHZ = (uint8_t)0x80 /*!< Beep signal output frequency equals to 4 KHz */ |
||||
} BEEP_Frequency_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup BEEP_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BEEP_CALIBRATION_DEFAULT ((uint8_t)0x0B) /*!< Default value when calibration is not done */ |
||||
|
||||
#define LSI_FREQUENCY_MIN ((uint32_t)110000) /*!< LSI minimum value in Hertz */ |
||||
#define LSI_FREQUENCY_MAX ((uint32_t)150000) /*!< LSI maximum value in Hertz */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup BEEP_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the BEEP frequencies. |
||||
*/ |
||||
#define IS_BEEP_FREQUENCY_OK(FREQ) \ |
||||
(((FREQ) == BEEP_FREQUENCY_1KHZ) || \
|
||||
((FREQ) == BEEP_FREQUENCY_2KHZ) || \
|
||||
((FREQ) == BEEP_FREQUENCY_4KHZ)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the LSI frequency (in Hz). |
||||
*/ |
||||
#define IS_LSI_FREQUENCY_OK(FREQ) \ |
||||
(((FREQ) >= LSI_FREQUENCY_MIN) && \
|
||||
((FREQ) <= LSI_FREQUENCY_MAX)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup BEEP_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void BEEP_DeInit(void); |
||||
void BEEP_Init(BEEP_Frequency_TypeDef BEEP_Frequency); |
||||
void BEEP_Cmd(FunctionalState NewState); |
||||
void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_BEEP_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,521 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_can.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the CAN peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_CAN_H |
||||
#define __STM8S_CAN_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
#define CAN_STDID_SIZE ((uint16_t)0x07FF) |
||||
#define CAN_EXTID_SIZE ((uint32_t)0x1FFFFFFF) |
||||
#define CAN_DLC_MAX ((uint8_t)0x08) |
||||
|
||||
|
||||
/** @addtogroup CAN_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @brief CAN Page Mapping |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
CAN_Page_TxMailBox0 = ((uint8_t) 0), /*!< CAN TX mailbox 0 reg page */ |
||||
CAN_Page_TxMailBox1 = ((uint8_t) 1), /*!< CAN TX mailbox 1 reg page */ |
||||
CAN_Page_TxMailBox2 = ((uint8_t) 5), /*!< CAN TX mailbox 2 reg page */ |
||||
CAN_Page_Filter01 = ((uint8_t) 2), /*!< CAN Filters 0 & 1 reg page*/ |
||||
CAN_Page_Filter23 = ((uint8_t) 3), /*!< CAN Filters 2 & 3 reg page*/ |
||||
CAN_Page_Filter45 = ((uint8_t) 4), /*!< CAN Filters 4 & 5 reg page*/ |
||||
CAN_Page_Config = ((uint8_t) 6), /*!< CAN Configuration control/status reg page*/ |
||||
CAN_Page_RxFifo = ((uint8_t) 7) /*!< CAN RX FIFO registers page */ |
||||
}CAN_Page_TypeDef; |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief CAN sleep constants
|
||||
*/ |
||||
typedef enum { |
||||
CAN_InitStatus_Failed =0, /*!< CAN initialization failed */ |
||||
CAN_InitStatus_Success =! CAN_InitStatus_Failed /*!< CAN initialization OK*/ |
||||
} CAN_InitStatus_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief CAN operating mode */ |
||||
typedef enum |
||||
{ |
||||
CAN_OperatingMode_Initialization =((uint8_t)0x00), /*!< Initialization mode */ |
||||
CAN_OperatingMode_Normal =((uint8_t)0x01), /*!< Normal mode */ |
||||
CAN_OperatingMode_Sleep =((uint8_t)0x02) /*!< sleep mode */ |
||||
}CAN_OperatingMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN operating mode status */ |
||||
typedef enum |
||||
{ |
||||
CAN_ModeStatus_Failed = ((uint8_t)0x00), /*!< CAN entering the specific mode failed */ |
||||
CAN_ModeStatus_Success =! CAN_ModeStatus_Failed /*!< CAN entering the specific mode Succeed */ |
||||
}CAN_ModeStatus_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN Time Triggered Communication mode
|
||||
*/ |
||||
typedef enum |
||||
{ |
||||
CAN_MasterCtrl_AllDisabled =((uint8_t)0x00), /*!< CAN ALL Master Control Option are DISABLED */ |
||||
CAN_MasterCtrl_AllEnabled =((uint8_t)0xFC), /*!< CAN ALL Master Control Option are DISABLED */ |
||||
CAN_MasterCtrl_TimeTriggerCOMMode =((uint8_t)0x80), /*!< CAN Time Triggered Communication mode ENABLED */ |
||||
CAN_MasterCtrl_AutoBusOffManagement =((uint8_t)0x40), /*!< CAN Auto Bus Off Management ENABLED */ |
||||
CAN_MasterCtrl_AutoWakeUpMode =((uint8_t)0x20), /*!< CAN Automatic WakeUp Mode ENABLED , sleep mode is left automatically by hardware */ |
||||
CAN_MasterCtrl_NoAutoReTx =((uint8_t)0x10), /*!< CAN Non Automatic Retransmission ENABLED, MSG will be transmitted only once */ |
||||
CAN_MasterCtrl_RxFifoLockedMode =((uint8_t)0x08), /*!< CAN Receive FIFO Locked against overrun ENABLED */ |
||||
CAN_MasterCtrl_TxFifoPriority =((uint8_t)0x04) /*!< CAN Transmit FIFO Priority driven by the request order (not by the identifier of the MSG) */ |
||||
}CAN_MasterCtrl_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN mode options */ |
||||
typedef enum |
||||
{ |
||||
CAN_Mode_Normal =((uint8_t)0x00), /*!< normal mode */ |
||||
CAN_Mode_LoopBack =((uint8_t)0x01), /*!< loopback mode */ |
||||
CAN_Mode_Silent =((uint8_t)0x02), /*!< silent mode */ |
||||
CAN_Mode_Silent_LoopBack =((uint8_t)0x03) /*!< loopback combined with silent mode */ |
||||
}CAN_Mode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN synchronisation jump width (SJW)*/ |
||||
typedef enum |
||||
{ |
||||
CAN_SynJumpWidth_1TimeQuantum =((uint8_t)0x00), /*!< 1 time quantum */ |
||||
CAN_SynJumpWidth_2TimeQuantum =((uint8_t)0x40), /*!< 2 time quantum */ |
||||
CAN_SynJumpWidth_3TimeQuantum =((uint8_t)0x80), /*!< 3 time quantum */ |
||||
CAN_SynJumpWidth_4TimeQuantum =((uint8_t)0xC0) /*!< 4 time quantum */ |
||||
}CAN_SynJumpWidth_TypeDef; |
||||
|
||||
/**
|
||||
* @brief time quantum in bit segment 1 */ |
||||
typedef enum |
||||
{ |
||||
CAN_BitSeg1_1TimeQuantum =((uint8_t)0x00), /*!< 1 time quantum */ |
||||
CAN_BitSeg1_2TimeQuantum =((uint8_t)0x01), /*!< 2 time quantum */ |
||||
CAN_BitSeg1_3TimeQuantum =((uint8_t)0x02), /*!< 3 time quantum */ |
||||
CAN_BitSeg1_4TimeQuantum =((uint8_t)0x03) , /*!< 4 time quantum */ |
||||
CAN_BitSeg1_5TimeQuantum =((uint8_t)0x04) , /*!< 5 time quantum */ |
||||
CAN_BitSeg1_6TimeQuantum =((uint8_t)0x05) , /*!< 6 time quantum */ |
||||
CAN_BitSeg1_7TimeQuantum =((uint8_t)0x06) , /*!< 7 time quantum */ |
||||
CAN_BitSeg1_8TimeQuantum =((uint8_t)0x07), /*!< 8 time quantum */ |
||||
CAN_BitSeg1_9TimeQuantum =((uint8_t)0x08), /*!< 9 time quantum */ |
||||
CAN_BitSeg1_10TimeQuantum =((uint8_t)0x09), /*!< 10 time quantum */ |
||||
CAN_BitSeg1_11TimeQuantum =((uint8_t)0x0A), /*!< 11 time quantum */ |
||||
CAN_BitSeg1_12TimeQuantum =((uint8_t)0x0B), /*!< 12 time quantum */ |
||||
CAN_BitSeg1_13TimeQuantum =((uint8_t)0x0C), /*!< 13 time quantum */ |
||||
CAN_BitSeg1_14TimeQuantum =((uint8_t)0x0D), /*!< 14 time quantum */ |
||||
CAN_BitSeg1_15TimeQuantum =((uint8_t)0x0E), /*!< 15 time quantum */ |
||||
CAN_BitSeg1_16TimeQuantum =((uint8_t)0x0F) /*!< 16 time quantum */ |
||||
}CAN_BitSeg1_TypeDef; |
||||
|
||||
/**
|
||||
* @brief time quantum in bit segment 2 */ |
||||
typedef enum |
||||
{ |
||||
CAN_BitSeg2_1TimeQuantum = ((uint8_t)0x00), /*!< 1 time quantum */ |
||||
CAN_BitSeg2_2TimeQuantum = ((uint8_t)0x10), /*!< 2 time quantum */ |
||||
CAN_BitSeg2_3TimeQuantum = ((uint8_t)0x20), /*!< 3 time quantum */ |
||||
CAN_BitSeg2_4TimeQuantum = ((uint8_t)0x30), /*!< 4 time quantum */ |
||||
CAN_BitSeg2_5TimeQuantum = ((uint8_t)0x40), /*!< 5 time quantum */ |
||||
CAN_BitSeg2_6TimeQuantum = ((uint8_t)0x50), /*!< 6 time quantum */ |
||||
CAN_BitSeg2_7TimeQuantum = ((uint8_t)0x60), /*!< 7 time quantum */ |
||||
CAN_BitSeg2_8TimeQuantum = ((uint8_t)0x70) /*!< 8 time quantum */ |
||||
}CAN_BitSeg2_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief CAN filter number */ |
||||
typedef enum |
||||
{
|
||||
CAN_FilterNumber_0 = ((uint8_t)0x00), /*!< Filter number 0 */
|
||||
CAN_FilterNumber_1 = ((uint8_t)0x01), /*!< Filter number 1 */
|
||||
CAN_FilterNumber_2 = ((uint8_t)0x02), /*!< Filter number 2 */ |
||||
CAN_FilterNumber_3 = ((uint8_t)0x03), /*!< Filter number 3 */ |
||||
CAN_FilterNumber_4 = ((uint8_t)0x04), /*!< Filter number 4 */
|
||||
CAN_FilterNumber_5 = ((uint8_t)0x05) /*!< Filter number 5 */
|
||||
}CAN_FilterNumber_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN filter mode */ |
||||
typedef enum |
||||
{ |
||||
CAN_FilterMode_IdMask = ((uint8_t)0x00), /*!< id/mask mode */ |
||||
CAN_FilterMode_IdMask_IdList = ((uint8_t)0x10), /*!< Id/Mask mode First and IdList mode second */ |
||||
CAN_FilterMode_IdList_IdMask = ((uint8_t)0x11), /*!< IdList mode First and IdMask mode second */ |
||||
CAN_FilterMode_IdList = ((uint8_t)0x01) /*!< identifier list mode */ |
||||
}CAN_FilterMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN filter scale */ |
||||
typedef enum |
||||
{ |
||||
CAN_FilterScale_8Bit =((uint8_t)0x00), /*!< 8-bit filter scale */ |
||||
CAN_FilterScale_16_8Bit =((uint8_t)0x02), /*!< 16/8-bit filter scale */ |
||||
CAN_FilterScale_16Bit =((uint8_t)0x04), /*!< 16-bit filter scale */ |
||||
CAN_FilterScale_32Bit =((uint8_t)0x06) /*!< 32-bit filter scale */ |
||||
}CAN_FilterScale_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief CAN Tx mailboxes*/ |
||||
typedef enum |
||||
{ |
||||
CAN_TransmitMailBox_0 = ((uint8_t) 0x00), /*!< CAN TX mailbox 0 reg page */ |
||||
CAN_TransmitMailBox_1 = ((uint8_t) 0x01), /*!< CAN TX mailbox 1 reg page */ |
||||
CAN_TransmitMailBox_2 = ((uint8_t) 0x05) /*!< CAN TX mailbox 2 reg page */ |
||||
}CAN_TransmitMailBox_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN Pending Messages number*/ |
||||
typedef enum |
||||
{ |
||||
CAN_NbrPendingMessage_0 = ((uint8_t)0x00), /*!< No Msg Pending */ |
||||
CAN_NbrPendingMessage_1 = ((uint8_t)0x01), /*!< 1 Msg Pending */ |
||||
CAN_NbrPendingMessage_2 = ((uint8_t)0x02), /*!< 2 Msg Pending */ |
||||
CAN_NbrPendingMessage_3 = ((uint8_t)0x03) /*!< 3 Msg Pending */ |
||||
}CAN_NbrPendingMessage_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN identifier type */ |
||||
typedef enum |
||||
{ |
||||
CAN_Id_Standard =((uint8_t)0x00), /*!< Standard Id */ |
||||
CAN_Id_Extended =((uint8_t)0x40) /*!< Extended Id */ |
||||
}CAN_Id_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN remote transmission request */ |
||||
typedef enum |
||||
{ |
||||
CAN_RTR_Data = ((uint8_t)0x00), /*!< Data frame */ |
||||
CAN_RTR_Remote = ((uint8_t)0x20) /*!< Remote frame */ |
||||
}CAN_RTR_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN transmit Status */ |
||||
typedef enum |
||||
{ |
||||
CAN_TxStatus_Failed =((uint8_t)0xF0), /*!< CAN transmission failed */ |
||||
CAN_TxStatus_Ok =((uint8_t)0xF1), /*!< CAN transmission succeeded */ |
||||
CAN_TxStatus_Pending =((uint8_t)0xF2), /*!< CAN transmission pending */ |
||||
CAN_TxStatus_NoMailBox =((uint8_t)0xF4), /*!< CAN cell did not provide an empty mailbox */ |
||||
CAN_TxStatus_MailBoxEmpty =((uint8_t)0xF5), /*!< CAN Tx mailbox is Empty */ |
||||
CAN_TxStatus_MailBox0Ok =((uint8_t)0x00), /*!< CAN transmission succeeded by mail box 1*/ |
||||
CAN_TxStatus_MailBox1Ok =((uint8_t)0x01), /*!< CAN transmission succeeded by mail box 2*/ |
||||
CAN_TxStatus_MailBox2Ok =((uint8_t)0x05) /*!< CAN transmission succeeded by mail box 3*/ |
||||
}CAN_TxStatus_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN sleep Status */ |
||||
typedef enum |
||||
{ |
||||
CAN_Sleep_Failed = ((uint8_t)0x00), /*!< CAN did not enter the sleep mode */ |
||||
CAN_Sleep_Ok = ((uint8_t)0x01) /*!< CAN entered the sleep mode */ |
||||
}CAN_Sleep_TypeDef; |
||||
/**
|
||||
* @brief CAN wake up status */ |
||||
typedef enum |
||||
{ |
||||
CAN_WakeUp_Failed = ((uint8_t)0x00), /*!< CAN did not leave the sleep mode */ |
||||
CAN_WakeUp_Ok = ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ |
||||
}CAN_WakeUp_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN flags */ |
||||
typedef enum |
||||
{ |
||||
/* if the flag is 0x3XXX, it means that it can be got (CAN_GetFlagStatus) and Cleared (CAN_ClearFlag) */ |
||||
/* if the flag is 0x1XXX, it means that it can only be got (CAN_GetFlagStatus) */ |
||||
/*Transmit Flags*/ |
||||
CAN_FLAG_RQCP0 =((uint16_t)0x3401), /*!< Request MailBox0 Flag */ |
||||
CAN_FLAG_RQCP1 =((uint16_t)0x3402), /*!< Request MailBox1 Flag */ |
||||
CAN_FLAG_RQCP2 =((uint16_t)0x3404), /*!< Request MailBox2 Flag */ |
||||
/*Receive Flags*/ |
||||
CAN_FLAG_FMP =((uint16_t)0x1203), /*!< FIFO Message Pending Flag */ |
||||
CAN_FLAG_FF =((uint16_t)0x3208), /*!< FIFO Full Flag */ |
||||
CAN_FLAG_FOV =((uint16_t)0x3210), /*!< FIFO Overrun Flag */ |
||||
/*Wake up Flag*/ |
||||
CAN_FLAG_WKU =((uint16_t)0x3108), /*!< wake up Flag */ |
||||
/*Error Flags*/ |
||||
CAN_FLAG_EWG =((uint16_t)0x1001), /*!< Error Warning Flag */ |
||||
CAN_FLAG_EPV =((uint16_t)0x1002), /*!< Error Passive Flag */ |
||||
CAN_FLAG_BOF =((uint16_t)0x1004), /*!< Bus-Off Flag */ |
||||
CAN_FLAG_LEC =((uint16_t)0x3070) /*!< Last error code Flag */ |
||||
}CAN_FLAG_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN interrupts */ |
||||
typedef enum |
||||
{ |
||||
/*Transmit Interruption*/ |
||||
CAN_IT_TME =((uint16_t)0x0001), /*!< Transmit mailbox empty interrupt */ |
||||
/*Receive Interruptions*/ |
||||
CAN_IT_FMP =((uint16_t)0x0002), /*!< FIFO message pending interrupt */
|
||||
CAN_IT_FF =((uint16_t)0x0004), /*!< FIFO full interrupt */ |
||||
CAN_IT_FOV =((uint16_t)0x0008), /*!< FIFO overrun interrupt */ |
||||
/*Wake Up Interruption*/ |
||||
CAN_IT_WKU =((uint16_t)0x0080), /*!< Wake-up interrupt */ |
||||
/*Error Interruptions*/ |
||||
CAN_IT_ERR =((uint16_t)0x4000), /*!< Genaral Error interrupt */ |
||||
CAN_IT_EWG =((uint16_t)0x0100), /*!< Error warning interrupt */ |
||||
CAN_IT_EPV =((uint16_t)0x0200), /*!< Error passive interrupt */ |
||||
CAN_IT_BOF =((uint16_t)0x0400), /*!< Bus-off interrupt */ |
||||
CAN_IT_LEC =((uint16_t)0x0800) /*!< Last error code interrupt */ |
||||
} CAN_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN ST7 Compatibility*/ |
||||
typedef enum |
||||
{ |
||||
CAN_ST7Compatibility_Enable = ((uint8_t)0x00), /*!< CAN is compatible with ST7 beCAN (only 2 mailboxes are available)*/ |
||||
CAN_ST7Compatibility_Disable = ((uint8_t)0x10) /*!< CAN is not compatible with ST7 beCAN ( 3 mailboxes are available)*/ |
||||
}CAN_ST7Compatibility_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CAN Error Code description */ |
||||
typedef enum |
||||
{
|
||||
CAN_ErrorCode_NoErr = ((uint8_t)0x00), /*!< No Error */
|
||||
CAN_ErrorCode_StuffErr = ((uint8_t)0x10), /*!< Stuff Error */
|
||||
CAN_ErrorCode_FormErr = ((uint8_t)0x20), /*!< Form Error */
|
||||
CAN_ErrorCode_ACKErr = ((uint8_t)0x30), /*!< Acknowledgment Error */
|
||||
CAN_ErrorCode_BitRecessiveErr = ((uint8_t)0x40), /*!< Bit Recessive Error */
|
||||
CAN_ErrorCode_BitDominantErr = ((uint8_t)0x50), /*!< Bit Dominant Error */
|
||||
CAN_ErrorCode_CRCErr = ((uint8_t)0x60), /*!< CRC Error */
|
||||
CAN_ErrorCode_SoftwareSetErr = ((uint8_t)0x70) /*!< Software Set Error */
|
||||
}CAN_ErrorCode_TypeDef; |
||||
/**
|
||||
* @} |
||||
*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/** @addtogroup CAN_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the CAN ST7 Compatibility parameters. |
||||
*/ |
||||
#define IS_CAN_ST7_COMPATIBILITY_OK(STATE) (((STATE) == CAN_ST7Compatibility_Enable) || ((STATE) == CAN_ST7Compatibility_Disable)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN operating mode. |
||||
*/ |
||||
#define IS_CAN_OPERATINGMODE_OK(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\ |
||||
((MODE) == CAN_OperatingMode_Normal)|| \
|
||||
((MODE) == CAN_OperatingMode_Sleep)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN Time Triggered Communication mode. |
||||
*/ |
||||
#define IS_CAN_MASTERCTRL_OK(MODE) (((MODE) == CAN_MasterCtrl_AllDisabled) || \ |
||||
(((MODE) <= CAN_MasterCtrl_AllEnabled) && ((MODE) >= CAN_MasterCtrl_TxFifoPriority))) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN mode options . |
||||
*/ |
||||
#define IS_CAN_MODE_OK(MODE) (((MODE) == CAN_Mode_Normal) || ((MODE) == CAN_Mode_LoopBack)|| \ |
||||
((MODE) == CAN_Mode_Silent) || ((MODE) == CAN_Mode_Silent_LoopBack)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the CAN synchronisation jump width (SJW). |
||||
*/ |
||||
#define IS_CAN_SYNJUMPWIDTH_OK(SJW) (((SJW) == CAN_SynJumpWidth_1TimeQuantum) || ((SJW) == CAN_SynJumpWidth_2TimeQuantum)|| \ |
||||
((SJW) == CAN_SynJumpWidth_3TimeQuantum) || ((SJW) == CAN_SynJumpWidth_4TimeQuantum)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check time quantum in bit segment 1 . |
||||
*/ |
||||
#define IS_CAN_BITSEG1_OK(BS1) ((BS1) <= CAN_BitSeg1_16TimeQuantum) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check time quantum in bit segment 2. |
||||
*/ |
||||
#define IS_CAN_BITSEG2_OK(BS2) ((((BS2) >= CAN_BitSeg2_2TimeQuantum) && ((BS2) <= CAN_BitSeg2_8TimeQuantum))|| ((BS2) == CAN_BitSeg2_1TimeQuantum)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN clock prescaler. |
||||
*/ |
||||
#define IS_CAN_PRESCALER_OK(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 64)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN filter number. |
||||
*/ |
||||
#define IS_CAN_FILTER_NUMBER_OK(NUMBER) (((NUMBER) == CAN_FilterNumber_0) || \ |
||||
((NUMBER) == CAN_FilterNumber_1) || \
|
||||
((NUMBER) == CAN_FilterNumber_2) || \
|
||||
((NUMBER) == CAN_FilterNumber_3) || \
|
||||
((NUMBER) == CAN_FilterNumber_4) || \
|
||||
((NUMBER) == CAN_FilterNumber_5)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN filter mode. |
||||
*/ |
||||
#define IS_CAN_FILTER_MODE_OK(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ |
||||
((MODE) == CAN_FilterMode_IdMask_IdList) || \
|
||||
((MODE) == CAN_FilterMode_IdList_IdMask) || \
|
||||
((MODE) == CAN_FilterMode_IdList)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN filter scale. |
||||
*/ |
||||
#define IS_CAN_FILTER_SCALE_OK(SCALE) (((SCALE) == CAN_FilterScale_8Bit)|| \ |
||||
((SCALE) == CAN_FilterScale_16_8Bit) ||\
|
||||
((SCALE) == CAN_FilterScale_16Bit )||\
|
||||
((SCALE) == CAN_FilterScale_32Bit)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN Tx mailboxes. |
||||
*/ |
||||
#define IS_CAN_TRANSMITMAILBOX_OK(TRANSMITMAILBOX) (((TRANSMITMAILBOX) == CAN_TransmitMailBox_0) || \ |
||||
((TRANSMITMAILBOX) == CAN_TransmitMailBox_1) || \
|
||||
((TRANSMITMAILBOX) == CAN_TransmitMailBox_2)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the Standard ID to be sent. |
||||
*/ |
||||
#define IS_CAN_STDID_OK(STDID) ((STDID) <= ((uint16_t)CAN_STDID_SIZE)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the Extended ID to be sent. |
||||
*/ |
||||
#define IS_CAN_EXTID_OK(EXTID) ((EXTID) <= ((uint32_t)CAN_EXTID_SIZE)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the DLC to be sent. |
||||
*/ |
||||
#define IS_CAN_DLC_OK(DLC) ((DLC) <= CAN_DLC_MAX) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the type of the ID to be sent. |
||||
*/ |
||||
#define IS_CAN_IDTYPE_OK(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || ((IDTYPE) == CAN_Id_Extended)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN transmission Frame Type. |
||||
*/ |
||||
#define IS_CAN_RTR_OK(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN flags which can be got by @ref CAN_GetFlagStatus |
||||
*/ |
||||
#define IS_CAN_FLAG_STATUS_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\ |
||||
((FLAG) == CAN_FLAG_RQCP2) || ((FLAG) == CAN_FLAG_FMP) ||\
|
||||
((FLAG) == CAN_FLAG_FF) || ((FLAG) == CAN_FLAG_FOV) ||\
|
||||
((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_EWG) ||\
|
||||
((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_BOF) ||\
|
||||
((FLAG) == CAN_FLAG_LEC)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check CAN flags which can be cleared by @ref CAN_ClearFlag |
||||
*/ |
||||
#define IS_CAN_FLAG_CLEAR_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\ |
||||
((FLAG) == CAN_FLAG_RQCP2) || ((FLAG) == CAN_FLAG_FF) ||\
|
||||
((FLAG) == CAN_FLAG_FOV) || ((FLAG) == CAN_FLAG_WKU) ||\
|
||||
((FLAG) == CAN_FLAG_LEC)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the CAN Configuration interrupts. |
||||
*/ |
||||
#define CAN_IT_CONFIG_MASK ~(uint16_t)(CAN_IT_TME|CAN_IT_FMP|CAN_IT_FF|CAN_IT_FOV|CAN_IT_WKU|CAN_IT_EWG|CAN_IT_EPV|CAN_IT_BOF|CAN_IT_LEC|CAN_IT_ERR) |
||||
#define IS_CAN_IT_CONFIG_OK(IT) (((IT) != 0x0000) && ((uint16_t)((uint16_t)(IT) & (uint16_t)CAN_IT_CONFIG_MASK) == 0x0000)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the CAN status interrupts. |
||||
*/ |
||||
#define IS_CAN_IT_STATUS_OK(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP) ||\ |
||||
((IT) == CAN_IT_FF) || ((IT) == CAN_IT_FOV) || \
|
||||
((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_ERR) || \
|
||||
((IT) == CAN_IT_EWG) || ((IT) == CAN_IT_EPV) || \
|
||||
((IT) == CAN_IT_BOF) || ((IT) == CAN_IT_LEC) ) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the CAN Pending bit interrupts. |
||||
*/ |
||||
#define IS_CAN_IT_PENDING_BIT_OK(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF) ||\ |
||||
((IT) == CAN_IT_FOV) || ((IT) == CAN_IT_WKU) ||\
|
||||
((IT) == CAN_IT_ERR) || ((IT) == CAN_IT_EWG) ||\
|
||||
((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF)||\
|
||||
((IT) == CAN_IT_LEC)) |
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the Last Error Code. |
||||
*/ |
||||
#define IS_CAN_LAST_ERROR_CODE_OK(CODE) (((CODE) & 0x8F) == 0x00) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported function prototypes --------------------------------------------- */ |
||||
/** @addtogroup CAN_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void CAN_DeInit(void); |
||||
CAN_InitStatus_TypeDef CAN_Init(CAN_MasterCtrl_TypeDef CAN_MasterCtrl, |
||||
CAN_Mode_TypeDef CAN_Mode, |
||||
CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth, |
||||
CAN_BitSeg1_TypeDef CAN_BitSeg1, |
||||
CAN_BitSeg2_TypeDef CAN_BitSeg2, |
||||
uint8_t CAN_Prescaler); |
||||
|
||||
void CAN_FilterInit(CAN_FilterNumber_TypeDef CAN_FilterNumber, |
||||
FunctionalState CAN_FilterActivation, |
||||
CAN_FilterMode_TypeDef CAN_FilterMode, |
||||
CAN_FilterScale_TypeDef CAN_FilterScale, |
||||
uint8_t CAN_FilterID1,
|
||||
uint8_t CAN_FilterID2, |
||||
uint8_t CAN_FilterID3, |
||||
uint8_t CAN_FilterID4, |
||||
uint8_t CAN_FilterIDMask1, |
||||
uint8_t CAN_FilterIDMask2, |
||||
uint8_t CAN_FilterIDMask3, |
||||
uint8_t CAN_FilterIDMask4); |
||||
void CAN_ITConfig(CAN_IT_TypeDef CAN_IT, FunctionalState NewState); |
||||
void CAN_ST7CompatibilityCmd(CAN_ST7Compatibility_TypeDef CAN_ST7Compatibility); |
||||
CAN_TxStatus_TypeDef CAN_Transmit( uint32_t CAN_Id, |
||||
CAN_Id_TypeDef CAN_IDE, |
||||
CAN_RTR_TypeDef CAN_RTR, |
||||
uint8_t CAN_DLC, |
||||
uint8_t *CAN_Data); |
||||
void CAN_TTComModeCmd(FunctionalState NewState); |
||||
CAN_TxStatus_TypeDef CAN_TransmitStatus(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox); |
||||
void CAN_CancelTransmit(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox); |
||||
void CAN_FIFORelease(void); |
||||
CAN_NbrPendingMessage_TypeDef CAN_MessagePending(void); |
||||
void CAN_Receive(void); |
||||
uint32_t CAN_GetReceivedId(void); |
||||
CAN_Id_TypeDef CAN_GetReceivedIDE(void); |
||||
CAN_RTR_TypeDef CAN_GetReceivedRTR(void); |
||||
uint8_t CAN_GetReceivedDLC(void); |
||||
uint8_t CAN_GetReceivedData(uint8_t CAN_DataIndex); |
||||
uint8_t CAN_GetReceivedFMI(void); |
||||
uint16_t CAN_GetMessageTimeStamp(void); |
||||
CAN_Sleep_TypeDef CAN_Sleep(void); |
||||
CAN_WakeUp_TypeDef CAN_WakeUp(void); |
||||
CAN_ModeStatus_TypeDef CAN_OperatingModeRequest(CAN_OperatingMode_TypeDef CAN_OperatingMode); |
||||
CAN_ErrorCode_TypeDef CAN_GetLastErrorCode(void); |
||||
CAN_Page_TypeDef CAN_GetSelectedPage(void); |
||||
void CAN_SelectPage(CAN_Page_TypeDef CAN_Page); |
||||
FlagStatus CAN_GetFlagStatus(CAN_FLAG_TypeDef CAN_Flag); |
||||
void CAN_ClearFlag(CAN_FLAG_TypeDef CAN_Flag); |
||||
ITStatus CAN_GetITStatus(CAN_IT_TypeDef CAN_IT); |
||||
void CAN_ClearITPendingBit(CAN_IT_TypeDef CAN_IT); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* __STM8S_CAN_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,382 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_clk.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the CLK peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_CLK_H |
||||
#define __STM8S_CLK_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
/* Contains the description of all STM8 hardware registers */ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/** @addtogroup CLK_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Switch Mode Auto, Manual. |
||||
*/ |
||||
typedef enum { |
||||
CLK_SWITCHMODE_MANUAL = (uint8_t)0x00, /*!< Enable the manual clock switching mode */ |
||||
CLK_SWITCHMODE_AUTO = (uint8_t)0x01 /*!< Enable the automatic clock switching mode */ |
||||
} CLK_SwitchMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Current Clock State. |
||||
*/ |
||||
typedef enum { |
||||
CLK_CURRENTCLOCKSTATE_DISABLE = (uint8_t)0x00, /*!< Current clock disable */ |
||||
CLK_CURRENTCLOCKSTATE_ENABLE = (uint8_t)0x01 /*!< Current clock enable */ |
||||
} CLK_CurrentClockState_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Clock security system configuration. |
||||
*/ |
||||
typedef enum { |
||||
CLK_CSSCONFIG_ENABLEWITHIT = (uint8_t)0x05, /*!< Enable CSS with detection interrupt */ |
||||
CLK_CSSCONFIG_ENABLE = (uint8_t)0x01, /*!< Enable CSS without detection interrupt */ |
||||
CLK_CSSCONFIG_DISABLE = (uint8_t)0x00 /*!< Leave CSS desactivated (to be used in CLK_Init() function) */ |
||||
} CLK_CSSConfig_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK Clock Source. |
||||
*/ |
||||
typedef enum { |
||||
CLK_SOURCE_HSI = (uint8_t)0xE1, /*!< Clock Source HSI. */ |
||||
CLK_SOURCE_LSI = (uint8_t)0xD2, /*!< Clock Source LSI. */ |
||||
CLK_SOURCE_HSE = (uint8_t)0xB4 /*!< Clock Source HSE. */ |
||||
} CLK_Source_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK HSI Calibration Value. |
||||
*/ |
||||
typedef enum { |
||||
CLK_HSITRIMVALUE_0 = (uint8_t)0x00, /*!< HSI Calibration Value 0 */ |
||||
CLK_HSITRIMVALUE_1 = (uint8_t)0x01, /*!< HSI Calibration Value 1 */ |
||||
CLK_HSITRIMVALUE_2 = (uint8_t)0x02, /*!< HSI Calibration Value 2 */ |
||||
CLK_HSITRIMVALUE_3 = (uint8_t)0x03, /*!< HSI Calibration Value 3 */ |
||||
CLK_HSITRIMVALUE_4 = (uint8_t)0x04, /*!< HSI Calibration Value 4 */ |
||||
CLK_HSITRIMVALUE_5 = (uint8_t)0x05, /*!< HSI Calibration Value 5 */ |
||||
CLK_HSITRIMVALUE_6 = (uint8_t)0x06, /*!< HSI Calibration Value 6 */ |
||||
CLK_HSITRIMVALUE_7 = (uint8_t)0x07 /*!< HSI Calibration Value 7 */ |
||||
} CLK_HSITrimValue_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK Clock Output |
||||
*/ |
||||
typedef enum { |
||||
CLK_OUTPUT_HSI = (uint8_t)0x00, /*!< Clock Output HSI */ |
||||
CLK_OUTPUT_LSI = (uint8_t)0x02, /*!< Clock Output LSI */ |
||||
CLK_OUTPUT_HSE = (uint8_t)0x04, /*!< Clock Output HSE */ |
||||
CLK_OUTPUT_CPU = (uint8_t)0x08, /*!< Clock Output CPU */ |
||||
CLK_OUTPUT_CPUDIV2 = (uint8_t)0x0A, /*!< Clock Output CPU/2 */ |
||||
CLK_OUTPUT_CPUDIV4 = (uint8_t)0x0C, /*!< Clock Output CPU/4 */ |
||||
CLK_OUTPUT_CPUDIV8 = (uint8_t)0x0E, /*!< Clock Output CPU/8 */ |
||||
CLK_OUTPUT_CPUDIV16 = (uint8_t)0x10, /*!< Clock Output CPU/16 */ |
||||
CLK_OUTPUT_CPUDIV32 = (uint8_t)0x12, /*!< Clock Output CPU/32 */ |
||||
CLK_OUTPUT_CPUDIV64 = (uint8_t)0x14, /*!< Clock Output CPU/64 */ |
||||
CLK_OUTPUT_HSIRC = (uint8_t)0x16, /*!< Clock Output HSI RC */ |
||||
CLK_OUTPUT_MASTER = (uint8_t)0x18, /*!< Clock Output Master */ |
||||
CLK_OUTPUT_OTHERS = (uint8_t)0x1A /*!< Clock Output OTHER */ |
||||
} CLK_Output_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK Enable peripheral |
||||
*/ |
||||
/* Elements values convention: 0xXY
|
||||
X = choice between the peripheral registers |
||||
X = 0 : PCKENR1 |
||||
X = 1 : PCKENR2 |
||||
Y = Peripheral position in the register |
||||
*/ |
||||
typedef enum { |
||||
CLK_PERIPHERAL_I2C = (uint8_t)0x00, /*!< Peripheral Clock Enable 1, I2C */ |
||||
CLK_PERIPHERAL_SPI = (uint8_t)0x01, /*!< Peripheral Clock Enable 1, SPI */ |
||||
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || defined(STM8AF62Ax) |
||||
CLK_PERIPHERAL_UART1 = (uint8_t)0x02, /*!< Peripheral Clock Enable 1, UART1 */ |
||||
#else |
||||
CLK_PERIPHERAL_UART1 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART1 */ |
||||
#endif |
||||
CLK_PERIPHERAL_UART2 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART2 */ |
||||
CLK_PERIPHERAL_UART3 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART3 */ |
||||
CLK_PERIPHERAL_TIMER6 = (uint8_t)0x04, /*!< Peripheral Clock Enable 1, Timer6 */ |
||||
CLK_PERIPHERAL_TIMER4 = (uint8_t)0x04, /*!< Peripheral Clock Enable 1, Timer4 */ |
||||
CLK_PERIPHERAL_TIMER5 = (uint8_t)0x05, /*!< Peripheral Clock Enable 1, Timer5 */ |
||||
CLK_PERIPHERAL_TIMER2 = (uint8_t)0x05, /*!< Peripheral Clock Enable 1, Timer2 */ |
||||
CLK_PERIPHERAL_TIMER3 = (uint8_t)0x06, /*!< Peripheral Clock Enable 1, Timer3 */ |
||||
CLK_PERIPHERAL_TIMER1 = (uint8_t)0x07, /*!< Peripheral Clock Enable 1, Timer1 */ |
||||
CLK_PERIPHERAL_AWU = (uint8_t)0x12, /*!< Peripheral Clock Enable 2, AWU */ |
||||
CLK_PERIPHERAL_ADC = (uint8_t)0x13, /*!< Peripheral Clock Enable 2, ADC */ |
||||
CLK_PERIPHERAL_CAN = (uint8_t)0x17 /*!< Peripheral Clock Enable 2, CAN */ |
||||
} CLK_Peripheral_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK Flags. |
||||
*/ |
||||
/* Elements values convention: 0xXZZ
|
||||
X = choice between the flags registers |
||||
X = 1 : ICKR |
||||
X = 2 : ECKR |
||||
X = 3 : SWCR |
||||
X = 4 : CSSR |
||||
X = 5 : CCOR |
||||
ZZ = flag mask in the register (same as map file) |
||||
*/ |
||||
typedef enum { |
||||
CLK_FLAG_LSIRDY = (uint16_t)0x0110, /*!< Low speed internal oscillator ready Flag */ |
||||
CLK_FLAG_HSIRDY = (uint16_t)0x0102, /*!< High speed internal oscillator ready Flag */ |
||||
CLK_FLAG_HSERDY = (uint16_t)0x0202, /*!< High speed external oscillator ready Flag */ |
||||
CLK_FLAG_SWIF = (uint16_t)0x0308, /*!< Clock switch interrupt Flag */ |
||||
CLK_FLAG_SWBSY = (uint16_t)0x0301, /*!< Switch busy Flag */ |
||||
CLK_FLAG_CSSD = (uint16_t)0x0408, /*!< Clock security system detection Flag */ |
||||
CLK_FLAG_AUX = (uint16_t)0x0402, /*!< Auxiliary oscillator connected to master clock */ |
||||
CLK_FLAG_CCOBSY = (uint16_t)0x0504, /*!< Configurable clock output busy */ |
||||
CLK_FLAG_CCORDY = (uint16_t)0x0502 /*!< Configurable clock output ready */ |
||||
}CLK_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK interrupt configuration and Flags cleared by software. |
||||
*/ |
||||
typedef enum { |
||||
CLK_IT_CSSD = (uint8_t)0x0C, /*!< Clock security system detection Flag */ |
||||
CLK_IT_SWIF = (uint8_t)0x1C /*!< Clock switch interrupt Flag */ |
||||
}CLK_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @brief CLK Clock Divisor. |
||||
*/ |
||||
|
||||
/* Warning:
|
||||
0xxxxxx = HSI divider |
||||
1xxxxxx = CPU divider |
||||
Other bits correspond to the divider's bits mapping |
||||
*/ |
||||
typedef enum { |
||||
CLK_PRESCALER_HSIDIV1 = (uint8_t)0x00, /*!< High speed internal clock prescaler: 1 */ |
||||
CLK_PRESCALER_HSIDIV2 = (uint8_t)0x08, /*!< High speed internal clock prescaler: 2 */ |
||||
CLK_PRESCALER_HSIDIV4 = (uint8_t)0x10, /*!< High speed internal clock prescaler: 4 */ |
||||
CLK_PRESCALER_HSIDIV8 = (uint8_t)0x18, /*!< High speed internal clock prescaler: 8 */ |
||||
CLK_PRESCALER_CPUDIV1 = (uint8_t)0x80, /*!< CPU clock division factors 1 */ |
||||
CLK_PRESCALER_CPUDIV2 = (uint8_t)0x81, /*!< CPU clock division factors 2 */ |
||||
CLK_PRESCALER_CPUDIV4 = (uint8_t)0x82, /*!< CPU clock division factors 4 */ |
||||
CLK_PRESCALER_CPUDIV8 = (uint8_t)0x83, /*!< CPU clock division factors 8 */ |
||||
CLK_PRESCALER_CPUDIV16 = (uint8_t)0x84, /*!< CPU clock division factors 16 */ |
||||
CLK_PRESCALER_CPUDIV32 = (uint8_t)0x85, /*!< CPU clock division factors 32 */ |
||||
CLK_PRESCALER_CPUDIV64 = (uint8_t)0x86, /*!< CPU clock division factors 64 */ |
||||
CLK_PRESCALER_CPUDIV128 = (uint8_t)0x87 /*!< CPU clock division factors 128 */ |
||||
} CLK_Prescaler_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SWIM Clock divider. |
||||
*/ |
||||
typedef enum { |
||||
CLK_SWIMDIVIDER_2 = (uint8_t)0x00, /*!< SWIM clock is divided by 2 */ |
||||
CLK_SWIMDIVIDER_OTHER = (uint8_t)0x01 /*!< SWIM clock is not divided by 2 */ |
||||
}CLK_SWIMDivider_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup CLK_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
#define CLK_TIMEOUT ((uint16_t)0xFFFF) /*!< Max Timeout for the clock switch operation. */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/** @addtogroup CLK_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the clock switching modes. |
||||
*/ |
||||
#define IS_CLK_SWITCHMODE_OK(MODE) (((MODE) == CLK_SWITCHMODE_MANUAL) || ((MODE) == CLK_SWITCHMODE_AUTO)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the current clock state. |
||||
*/ |
||||
#define IS_CLK_CURRENTCLOCKSTATE_OK(STATE) (((STATE) == CLK_CURRENTCLOCKSTATE_DISABLE) ||\ |
||||
((STATE) == CLK_CURRENTCLOCKSTATE_ENABLE)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the CSS configuration. |
||||
*/ |
||||
#define IS_CLK_CSSCONFIG_OK(CSSVALUE) (((CSSVALUE) == CLK_CSSCONFIG_ENABLEWITHIT) ||\ |
||||
((CSSVALUE) == CLK_CSSCONFIG_ENABLE) ||\
|
||||
((CSSVALUE) == CLK_CSSCONFIG_DISABLE)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different clock sources. |
||||
*/ |
||||
#define IS_CLK_SOURCE_OK(SOURCE) (((SOURCE) == CLK_SOURCE_HSI) ||\ |
||||
((SOURCE) == CLK_SOURCE_LSI) ||\
|
||||
((SOURCE) == CLK_SOURCE_HSE)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different HSI trimming values. |
||||
*/ |
||||
#define IS_CLK_HSITRIMVALUE_OK(TRIMVALUE) (((TRIMVALUE) == CLK_HSITRIMVALUE_0) ||\ |
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_1) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_2) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_3) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_4) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_5) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_6) ||\
|
||||
((TRIMVALUE) == CLK_HSITRIMVALUE_7)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different clocks to output. |
||||
*/ |
||||
#define IS_CLK_OUTPUT_OK(OUTPUT) (((OUTPUT) == CLK_OUTPUT_HSI) ||\ |
||||
((OUTPUT) == CLK_OUTPUT_HSE) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_LSI) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPU) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV2) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV4) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV8) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV16) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV32) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_CPUDIV64) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_HSIRC) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_MASTER) ||\
|
||||
((OUTPUT) == CLK_OUTPUT_OTHERS)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different peripheral's clock. |
||||
*/ |
||||
#define IS_CLK_PERIPHERAL_OK(PERIPHERAL) (((PERIPHERAL) == CLK_PERIPHERAL_I2C) ||\ |
||||
((PERIPHERAL) == CLK_PERIPHERAL_SPI) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_UART3) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_UART2) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_UART1) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER4) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER2) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER5) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER6) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER3) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_TIMER1) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_CAN) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_ADC) ||\
|
||||
((PERIPHERAL) == CLK_PERIPHERAL_AWU)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different clock flags. |
||||
*/ |
||||
#define IS_CLK_FLAG_OK(FLAG) (((FLAG) == CLK_FLAG_LSIRDY) ||\ |
||||
((FLAG) == CLK_FLAG_HSIRDY) ||\
|
||||
((FLAG) == CLK_FLAG_HSERDY) ||\
|
||||
((FLAG) == CLK_FLAG_SWIF) ||\
|
||||
((FLAG) == CLK_FLAG_SWBSY) ||\
|
||||
((FLAG) == CLK_FLAG_CSSD) ||\
|
||||
((FLAG) == CLK_FLAG_AUX) ||\
|
||||
((FLAG) == CLK_FLAG_CCOBSY) ||\
|
||||
((FLAG) == CLK_FLAG_CCORDY)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different clock IT pending bits. |
||||
*/ |
||||
#define IS_CLK_IT_OK(IT) (((IT) == CLK_IT_CSSD) || ((IT) == CLK_IT_SWIF)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different HSI prescaler values. |
||||
*/ |
||||
#define IS_CLK_HSIPRESCALER_OK(PRESCALER) (((PRESCALER) == CLK_PRESCALER_HSIDIV1) ||\ |
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV2) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV4) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV8)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different clock prescaler values. |
||||
*/ |
||||
#define IS_CLK_PRESCALER_OK(PRESCALER) (((PRESCALER) == CLK_PRESCALER_HSIDIV1) ||\ |
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV2) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV4) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_HSIDIV8) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV1) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV2) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV4) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV8) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV16) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV32) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV64) ||\
|
||||
((PRESCALER) == CLK_PRESCALER_CPUDIV128)) |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different SWIM dividers values. |
||||
*/ |
||||
#define IS_CLK_SWIMDIVIDER_OK(SWIMDIVIDER) (((SWIMDIVIDER) == CLK_SWIMDIVIDER_2) || ((SWIMDIVIDER) == CLK_SWIMDIVIDER_OTHER)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup CLK_Exported_functions
|
||||
* @{ |
||||
*/ |
||||
void CLK_DeInit(void); |
||||
void CLK_HSECmd(FunctionalState NewState); |
||||
void CLK_HSICmd(FunctionalState NewState); |
||||
void CLK_LSICmd(FunctionalState NewState); |
||||
void CLK_CCOCmd(FunctionalState NewState); |
||||
void CLK_ClockSwitchCmd(FunctionalState NewState); |
||||
void CLK_FastHaltWakeUpCmd(FunctionalState NewState); |
||||
void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState); |
||||
void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState); |
||||
ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); |
||||
void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler); |
||||
void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO); |
||||
void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState); |
||||
void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescaler); |
||||
void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider); |
||||
void CLK_ClockSecuritySystemEnable(void); |
||||
void CLK_SYSCLKEmergencyClear(void); |
||||
void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSICalibrationValue); |
||||
uint32_t CLK_GetClockFreq(void); |
||||
CLK_Source_TypeDef CLK_GetSYSCLKSource(void); |
||||
FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef CLK_FLAG); |
||||
ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT); |
||||
void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* __STM8S_CLK_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,134 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_exti.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the EXTI peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_EXTI_H |
||||
#define __STM8S_EXTI_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup EXTI_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief EXTI Sensitivity values for PORTA to PORTE |
||||
*/ |
||||
typedef enum { |
||||
EXTI_SENSITIVITY_FALL_LOW = (uint8_t)0x00, /*!< Interrupt on Falling edge and Low level */ |
||||
EXTI_SENSITIVITY_RISE_ONLY = (uint8_t)0x01, /*!< Interrupt on Rising edge only */ |
||||
EXTI_SENSITIVITY_FALL_ONLY = (uint8_t)0x02, /*!< Interrupt on Falling edge only */ |
||||
EXTI_SENSITIVITY_RISE_FALL = (uint8_t)0x03 /*!< Interrupt on Rising and Falling edges */ |
||||
} EXTI_Sensitivity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief EXTI Sensitivity values for TLI |
||||
*/ |
||||
typedef enum { |
||||
EXTI_TLISENSITIVITY_FALL_ONLY = (uint8_t)0x00, /*!< Top Level Interrupt on Falling edge only */ |
||||
EXTI_TLISENSITIVITY_RISE_ONLY = (uint8_t)0x04 /*!< Top Level Interrupt on Rising edge only */ |
||||
} EXTI_TLISensitivity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief EXTI PortNum possible values |
||||
*/ |
||||
typedef enum { |
||||
EXTI_PORT_GPIOA = (uint8_t)0x00, /*!< GPIO Port A */ |
||||
EXTI_PORT_GPIOB = (uint8_t)0x01, /*!< GPIO Port B */ |
||||
EXTI_PORT_GPIOC = (uint8_t)0x02, /*!< GPIO Port C */ |
||||
EXTI_PORT_GPIOD = (uint8_t)0x03, /*!< GPIO Port D */ |
||||
EXTI_PORT_GPIOE = (uint8_t)0x04 /*!< GPIO Port E */ |
||||
} EXTI_Port_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup EXTI_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for PORTA to PORTE. |
||||
*/ |
||||
#define IS_EXTI_SENSITIVITY_OK(SensitivityValue) \ |
||||
(((SensitivityValue) == EXTI_SENSITIVITY_FALL_LOW) || \
|
||||
((SensitivityValue) == EXTI_SENSITIVITY_RISE_ONLY) || \
|
||||
((SensitivityValue) == EXTI_SENSITIVITY_FALL_ONLY) || \
|
||||
((SensitivityValue) == EXTI_SENSITIVITY_RISE_FALL)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for TLI. |
||||
*/ |
||||
#define IS_EXTI_TLISENSITIVITY_OK(SensitivityValue) \ |
||||
(((SensitivityValue) == EXTI_TLISENSITIVITY_FALL_ONLY) || \
|
||||
((SensitivityValue) == EXTI_TLISENSITIVITY_RISE_ONLY)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different Port values |
||||
*/ |
||||
#define IS_EXTI_PORT_OK(PORT) \ |
||||
(((PORT) == EXTI_PORT_GPIOA) ||\
|
||||
((PORT) == EXTI_PORT_GPIOB) ||\
|
||||
((PORT) == EXTI_PORT_GPIOC) ||\
|
||||
((PORT) == EXTI_PORT_GPIOD) ||\
|
||||
((PORT) == EXTI_PORT_GPIOE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different values of the EXTI PinMask |
||||
*/ |
||||
#define IS_EXTI_PINMASK_OK(PinMask) ((((PinMask) & (uint8_t)0x00) == (uint8_t)0x00) && ((PinMask) != (uint8_t)0x00)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup EXTI_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void EXTI_DeInit(void); |
||||
void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue); |
||||
void EXTI_SetTLISensitivity(EXTI_TLISensitivity_TypeDef SensitivityValue); |
||||
EXTI_Sensitivity_TypeDef EXTI_GetExtIntSensitivity(EXTI_Port_TypeDef Port); |
||||
EXTI_TLISensitivity_TypeDef EXTI_GetTLISensitivity(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_EXTI_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,300 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_flash.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the FLASH peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_FLASH_H |
||||
#define __STM8S_FLASH_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup FLASH_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define FLASH_PROG_START_PHYSICAL_ADDRESS ((uint32_t)0x008000) /*!< Program memory: start address */ |
||||
|
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) || defined (STM8AF62Ax) |
||||
#define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0x027FFF) /*!< Program memory: end address */ |
||||
#define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)1024) /*!< Program memory: total number of blocks */ |
||||
#define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ |
||||
#define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x0047FF) /*!< Data EEPROM memory: end address */ |
||||
#define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)16) /*!< Data EEPROM memory: total number of blocks */ |
||||
#define FLASH_BLOCK_SIZE ((uint8_t)128) /*!< Number of bytes in a block (common for Program and Data memories) */ |
||||
#endif /* STM8S208, STM8S207, STM8S007, STM8AF52Ax, STM8AF62Ax */ |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) |
||||
#define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0xFFFF) /*!< Program memory: end address */ |
||||
#define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)256) /*!< Program memory: total number of blocks */ |
||||
#define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ |
||||
#define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x0043FF) /*!< Data EEPROM memory: end address */ |
||||
#define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)8) /*!< Data EEPROM memory: total number of blocks */ |
||||
#define FLASH_BLOCK_SIZE ((uint8_t)128) /*!< Number of bytes in a block (common for Program and Data memories) */ |
||||
#endif /* STM8S105 or STM8AF626x */ |
||||
|
||||
#if defined(STM8S103) || defined(STM8S003) || defined(STM8S903) || defined(STM8AF622x) |
||||
#define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0x9FFF) /*!< Program memory: end address */ |
||||
#define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)128) /*!< Program memory: total number of blocks */ |
||||
#define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ |
||||
#define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x00427F) /*!< Data EEPROM memory: end address */ |
||||
#define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)10) /*!< Data EEPROM memory: total number of blocks */ |
||||
#define FLASH_BLOCK_SIZE ((uint8_t)64) /*!< Number of bytes in a block (common for Program and Data memories) */ |
||||
#endif /* STM8S103 or STM8S003 or STM8S903 or STM8AF622x*/ |
||||
|
||||
#define FLASH_RASS_KEY1 ((uint8_t)0x56) /*!< First RASS key */ |
||||
#define FLASH_RASS_KEY2 ((uint8_t)0xAE) /*!< Second RASS key */ |
||||
|
||||
#define OPTION_BYTE_START_PHYSICAL_ADDRESS ((uint16_t)0x4800) |
||||
#define OPTION_BYTE_END_PHYSICAL_ADDRESS ((uint16_t)0x487F) |
||||
#define FLASH_OPTIONBYTE_ERROR ((uint16_t)0x5555) /*!< Error code option byte |
||||
(if value read is not equal to complement value read) */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup FLASH_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief FLASH Memory types |
||||
*/ |
||||
typedef enum { |
||||
FLASH_MEMTYPE_PROG = (uint8_t)0xFD, /*!< Program memory */ |
||||
FLASH_MEMTYPE_DATA = (uint8_t)0xF7 /*!< Data EEPROM memory */ |
||||
} FLASH_MemType_TypeDef; |
||||
|
||||
/**
|
||||
* @brief FLASH programming modes |
||||
*/ |
||||
typedef enum { |
||||
FLASH_PROGRAMMODE_STANDARD = (uint8_t)0x00, /*!< Standard programming mode */ |
||||
FLASH_PROGRAMMODE_FAST = (uint8_t)0x10 /*!< Fast programming mode */ |
||||
} FLASH_ProgramMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief FLASH fixed programming time |
||||
*/ |
||||
typedef enum { |
||||
FLASH_PROGRAMTIME_STANDARD = (uint8_t)0x00, /*!< Standard programming time fixed at 1/2 tprog */ |
||||
FLASH_PROGRAMTIME_TPROG = (uint8_t)0x01 /*!< Programming time fixed at tprog */ |
||||
} FLASH_ProgramTime_TypeDef; |
||||
|
||||
/**
|
||||
* @brief FLASH Low Power mode select |
||||
*/ |
||||
typedef enum { |
||||
FLASH_LPMODE_POWERDOWN = (uint8_t)0x04, /*!< HALT: Power-Down / ACTIVE-HALT: Power-Down */ |
||||
FLASH_LPMODE_STANDBY = (uint8_t)0x08, /*!< HALT: Standby / ACTIVE-HALT: Standby */ |
||||
FLASH_LPMODE_POWERDOWN_STANDBY = (uint8_t)0x00, /*!< HALT: Power-Down / ACTIVE-HALT: Standby */ |
||||
FLASH_LPMODE_STANDBY_POWERDOWN = (uint8_t)0x0C /*!< HALT: Standby / ACTIVE-HALT: Power-Down */ |
||||
} |
||||
FLASH_LPMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief FLASH status of the last operation |
||||
*/ |
||||
typedef enum { |
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ |
||||
defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x)
|
||||
FLASH_STATUS_END_HIGH_VOLTAGE = (uint8_t)0x40, /*!< End of high voltage */ |
||||
#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ |
||||
FLASH_STATUS_SUCCESSFUL_OPERATION = (uint8_t)0x04, /*!< End of operation flag */ |
||||
FLASH_STATUS_TIMEOUT = (uint8_t)0x02, /*!< Time out error */ |
||||
FLASH_STATUS_WRITE_PROTECTION_ERROR = (uint8_t)0x01 /*!< Write attempted to protected page */ |
||||
} FLASH_Status_TypeDef; |
||||
|
||||
/**
|
||||
* @brief FLASH flags definition |
||||
* - Warning : FLAG value = mapping position register |
||||
*/ |
||||
typedef enum { |
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ |
||||
defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x) |
||||
FLASH_FLAG_HVOFF = (uint8_t)0x40, /*!< End of high voltage flag */ |
||||
#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ |
||||
FLASH_FLAG_DUL = (uint8_t)0x08, /*!< Data EEPROM unlocked flag */ |
||||
FLASH_FLAG_EOP = (uint8_t)0x04, /*!< End of programming (write or erase operation) flag */ |
||||
FLASH_FLAG_PUL = (uint8_t)0x02, /*!< Flash Program memory unlocked flag */ |
||||
FLASH_FLAG_WR_PG_DIS = (uint8_t)0x01 /*!< Write attempted to protected page flag */ |
||||
} FLASH_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different functions parameters. |
||||
* @addtogroup FLASH_Private_Macros |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the flash program Address |
||||
*/ |
||||
|
||||
#define IS_FLASH_PROG_ADDRESS_OK(ADDRESS) (((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && \ |
||||
((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom Address |
||||
*/ |
||||
|
||||
#define IS_FLASH_DATA_ADDRESS_OK(ADDRESS) (((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && \ |
||||
((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom and flash program Address |
||||
*/ |
||||
#define IS_FLASH_ADDRESS_OK(ADDRESS)((((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) || \ |
||||
(((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the flash program Block number |
||||
*/ |
||||
#define IS_FLASH_PROG_BLOCK_NUMBER_OK(BLOCKNUM) ((BLOCKNUM) < FLASH_PROG_BLOCKS_NUMBER) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom Block number |
||||
*/ |
||||
#define IS_FLASH_DATA_BLOCK_NUMBER_OK(BLOCKNUM) ((BLOCKNUM) < FLASH_DATA_BLOCKS_NUMBER) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the flash memory type |
||||
*/ |
||||
|
||||
#define IS_MEMORY_TYPE_OK(MEMTYPE) (((MEMTYPE) == FLASH_MEMTYPE_PROG) || \ |
||||
((MEMTYPE) == FLASH_MEMTYPE_DATA)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different sensitivity values for the flash program mode |
||||
*/ |
||||
|
||||
#define IS_FLASH_PROGRAM_MODE_OK(MODE) (((MODE) == FLASH_PROGRAMMODE_STANDARD) || \ |
||||
((MODE) == FLASH_PROGRAMMODE_FAST)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the program time mode |
||||
*/ |
||||
|
||||
#define IS_FLASH_PROGRAM_TIME_OK(TIME) (((TIME) == FLASH_PROGRAMTIME_STANDARD) || \ |
||||
((TIME) == FLASH_PROGRAMTIME_TPROG)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the low power mode |
||||
*/ |
||||
|
||||
#define IS_FLASH_LOW_POWER_MODE_OK(LPMODE) (((LPMODE) == FLASH_LPMODE_POWERDOWN) || \ |
||||
((LPMODE) == FLASH_LPMODE_STANDBY) || \
|
||||
((LPMODE) == FLASH_LPMODE_POWERDOWN_STANDBY) || \
|
||||
((LPMODE) == FLASH_LPMODE_STANDBY_POWERDOWN)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the option bytes Address |
||||
*/ |
||||
#define IS_OPTION_BYTE_ADDRESS_OK(ADDRESS) (((ADDRESS) >= OPTION_BYTE_START_PHYSICAL_ADDRESS) && \ |
||||
((ADDRESS) <= OPTION_BYTE_END_PHYSICAL_ADDRESS)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different flags values |
||||
*/ |
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ |
||||
defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x) |
||||
#define IS_FLASH_FLAGS_OK(FLAG) (((FLAG) == FLASH_FLAG_HVOFF) || \ |
||||
((FLAG) == FLASH_FLAG_DUL) || \
|
||||
((FLAG) == FLASH_FLAG_EOP) || \
|
||||
((FLAG) == FLASH_FLAG_PUL) || \
|
||||
((FLAG) == FLASH_FLAG_WR_PG_DIS)) |
||||
#else /* STM8S103, STM8S903, STM8AF622x */ |
||||
#define IS_FLASH_FLAGS_OK(FLAG) (((FLAG) == FLASH_FLAG_DUL) || \ |
||||
((FLAG) == FLASH_FLAG_EOP) || \
|
||||
((FLAG) == FLASH_FLAG_PUL) || \
|
||||
((FLAG) == FLASH_FLAG_WR_PG_DIS)) |
||||
#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup FLASH_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType); |
||||
void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType); |
||||
void FLASH_DeInit(void); |
||||
void FLASH_ITConfig(FunctionalState NewState); |
||||
void FLASH_EraseByte(uint32_t Address); |
||||
void FLASH_ProgramByte(uint32_t Address, uint8_t Data); |
||||
uint8_t FLASH_ReadByte(uint32_t Address); |
||||
void FLASH_ProgramWord(uint32_t Address, uint32_t Data); |
||||
uint16_t FLASH_ReadOptionByte(uint16_t Address); |
||||
void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data); |
||||
void FLASH_EraseOptionByte(uint16_t Address); |
||||
void FLASH_SetLowPowerMode(FLASH_LPMode_TypeDef FLASH_LPMode); |
||||
void FLASH_SetProgrammingTime(FLASH_ProgramTime_TypeDef FLASH_ProgTime); |
||||
FLASH_LPMode_TypeDef FLASH_GetLowPowerMode(void); |
||||
FLASH_ProgramTime_TypeDef FLASH_GetProgrammingTime(void); |
||||
uint32_t FLASH_GetBootSize(void); |
||||
FlagStatus FLASH_GetFlagStatus(FLASH_Flag_TypeDef FLASH_FLAG); |
||||
|
||||
/**
|
||||
@code |
||||
All the functions declared below must be executed from RAM exclusively, except
|
||||
for the FLASH_WaitForLastOperation function which can be executed from Flash. |
||||
|
||||
Steps of the execution from RAM differs from one toolchain to another. |
||||
for more details refer to stm8s_flash.c file. |
||||
|
||||
To enable execution from RAM you can either uncomment the following define
|
||||
in the stm8s.h file or define it in your toolchain compiler preprocessor |
||||
- #define RAM_EXECUTION (1)
|
||||
|
||||
@endcode |
||||
*/ |
||||
IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType)); |
||||
IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType,
|
||||
FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer)); |
||||
IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType)); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /*__STM8S_FLASH_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,156 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_gpio.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the GPIO peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_GPIO_H |
||||
#define __STM8S_GPIO_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported variables ------------------------------------------------------- */ |
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup GPIO_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief GPIO modes |
||||
* |
||||
* Bits definitions: |
||||
* - Bit 7: 0 = INPUT mode |
||||
* 1 = OUTPUT mode |
||||
* 1 = PULL-UP (input) or PUSH-PULL (output) |
||||
* - Bit 5: 0 = No external interrupt (input) or No slope control (output) |
||||
* 1 = External interrupt (input) or Slow control enabled (output) |
||||
* - Bit 4: 0 = Low level (output) |
||||
* 1 = High level (output push-pull) or HI-Z (output open-drain) |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
GPIO_MODE_IN_FL_NO_IT = (uint8_t)0x00, /*!< Input floating, no external interrupt */ |
||||
GPIO_MODE_IN_PU_NO_IT = (uint8_t)0x40, /*!< Input pull-up, no external interrupt */ |
||||
GPIO_MODE_IN_FL_IT = (uint8_t)0x20, /*!< Input floating, external interrupt */ |
||||
GPIO_MODE_IN_PU_IT = (uint8_t)0x60, /*!< Input pull-up, external interrupt */ |
||||
GPIO_MODE_OUT_OD_LOW_FAST = (uint8_t)0xA0, /*!< Output open-drain, low level, 10MHz */ |
||||
GPIO_MODE_OUT_PP_LOW_FAST = (uint8_t)0xE0, /*!< Output push-pull, low level, 10MHz */ |
||||
GPIO_MODE_OUT_OD_LOW_SLOW = (uint8_t)0x80, /*!< Output open-drain, low level, 2MHz */ |
||||
GPIO_MODE_OUT_PP_LOW_SLOW = (uint8_t)0xC0, /*!< Output push-pull, low level, 2MHz */ |
||||
GPIO_MODE_OUT_OD_HIZ_FAST = (uint8_t)0xB0, /*!< Output open-drain, high-impedance level,10MHz */ |
||||
GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0, /*!< Output push-pull, high level, 10MHz */ |
||||
GPIO_MODE_OUT_OD_HIZ_SLOW = (uint8_t)0x90, /*!< Output open-drain, high-impedance level, 2MHz */ |
||||
GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0 /*!< Output push-pull, high level, 2MHz */ |
||||
}GPIO_Mode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Definition of the GPIO pins. Used by the @ref GPIO_Init function in |
||||
* order to select the pins to be initialized. |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
GPIO_PIN_0 = ((uint8_t)0x01), /*!< Pin 0 selected */ |
||||
GPIO_PIN_1 = ((uint8_t)0x02), /*!< Pin 1 selected */ |
||||
GPIO_PIN_2 = ((uint8_t)0x04), /*!< Pin 2 selected */ |
||||
GPIO_PIN_3 = ((uint8_t)0x08), /*!< Pin 3 selected */ |
||||
GPIO_PIN_4 = ((uint8_t)0x10), /*!< Pin 4 selected */ |
||||
GPIO_PIN_5 = ((uint8_t)0x20), /*!< Pin 5 selected */ |
||||
GPIO_PIN_6 = ((uint8_t)0x40), /*!< Pin 6 selected */ |
||||
GPIO_PIN_7 = ((uint8_t)0x80), /*!< Pin 7 selected */ |
||||
GPIO_PIN_LNIB = ((uint8_t)0x0F), /*!< Low nibble pins selected */ |
||||
GPIO_PIN_HNIB = ((uint8_t)0xF0), /*!< High nibble pins selected */ |
||||
GPIO_PIN_ALL = ((uint8_t)0xFF) /*!< All pins selected */ |
||||
}GPIO_Pin_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup GPIO_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different |
||||
* values of GPIOMode_TypeDef. |
||||
*/ |
||||
#define IS_GPIO_MODE_OK(MODE) \ |
||||
(((MODE) == GPIO_MODE_IN_FL_NO_IT) || \
|
||||
((MODE) == GPIO_MODE_IN_PU_NO_IT) || \
|
||||
((MODE) == GPIO_MODE_IN_FL_IT) || \
|
||||
((MODE) == GPIO_MODE_IN_PU_IT) || \
|
||||
((MODE) == GPIO_MODE_OUT_OD_LOW_FAST) || \
|
||||
((MODE) == GPIO_MODE_OUT_PP_LOW_FAST) || \
|
||||
((MODE) == GPIO_MODE_OUT_OD_LOW_SLOW) || \
|
||||
((MODE) == GPIO_MODE_OUT_PP_LOW_SLOW) || \
|
||||
((MODE) == GPIO_MODE_OUT_OD_HIZ_FAST) || \
|
||||
((MODE) == GPIO_MODE_OUT_PP_HIGH_FAST) || \
|
||||
((MODE) == GPIO_MODE_OUT_OD_HIZ_SLOW) || \
|
||||
((MODE) == GPIO_MODE_OUT_PP_HIGH_SLOW)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different |
||||
* values of GPIO_Pins. |
||||
*/ |
||||
#define IS_GPIO_PIN_OK(PIN) ((PIN) != (uint8_t)0x00) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
/** @addtogroup GPIO_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void GPIO_DeInit(GPIO_TypeDef* GPIOx); |
||||
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); |
||||
void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal); |
||||
void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); |
||||
void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); |
||||
void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); |
||||
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); |
||||
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); |
||||
BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); |
||||
void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8L_GPIO_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,632 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_i2c.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the I2C peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_I2C_H |
||||
#define __STM8S_I2C_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup I2C_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief I2C duty cycle (fast mode only) |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
I2C_DUTYCYCLE_2 = (uint8_t)0x00, /*!< Fast mode Tlow/THigh = 2 */ |
||||
I2C_DUTYCYCLE_16_9 = (uint8_t)0x40 /*!< Fast mode Tlow/Thigh = 16/9 */ |
||||
} I2C_DutyCycle_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C Acknowledgement configuration |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
I2C_ACK_NONE = (uint8_t)0x00, /*!< No acknowledge */ |
||||
I2C_ACK_CURR = (uint8_t)0x01, /*!< Acknowledge on the current byte */ |
||||
I2C_ACK_NEXT = (uint8_t)0x02 /*!< Acknowledge on the next byte */ |
||||
} I2C_Ack_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C Addressing Mode (slave mode only) |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
I2C_ADDMODE_7BIT = (uint8_t)0x00, /*!< 7-bit slave address (10-bit address not acknowledged) */ |
||||
I2C_ADDMODE_10BIT = (uint8_t)0x80 /*!< 10-bit slave address (7-bit address not acknowledged) */ |
||||
} I2C_AddMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C Interrupt sources |
||||
* Warning: the values correspond to the bit position in the ITR register |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
I2C_IT_ERR = (uint8_t)0x01, /*!< Error Interruption */ |
||||
I2C_IT_EVT = (uint8_t)0x02, /*!< Event Interruption */ |
||||
I2C_IT_BUF = (uint8_t)0x04 /*!< Buffer Interruption */ |
||||
} I2C_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C transfer direction |
||||
* Warning: the values correspond to the ADD0 bit position in the OARL register |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
I2C_DIRECTION_TX = (uint8_t)0x00, /*!< Transmission direction */ |
||||
I2C_DIRECTION_RX = (uint8_t)0x01 /*!< Reception direction */ |
||||
} I2C_Direction_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C Flags |
||||
* @brief Elements values convention: 0xXXYY |
||||
* X = SRx registers index |
||||
* X = 1 : SR1 |
||||
* X = 2 : SR2 |
||||
* X = 3 : SR3 |
||||
* Y = Flag mask in the register |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
/* SR1 register flags */ |
||||
I2C_FLAG_TXEMPTY = (uint16_t)0x0180, /*!< Transmit Data Register Empty flag */ |
||||
I2C_FLAG_RXNOTEMPTY = (uint16_t)0x0140, /*!< Read Data Register Not Empty flag */ |
||||
I2C_FLAG_STOPDETECTION = (uint16_t)0x0110, /*!< Stop detected flag */ |
||||
I2C_FLAG_HEADERSENT = (uint16_t)0x0108, /*!< 10-bit Header sent flag */ |
||||
I2C_FLAG_TRANSFERFINISHED = (uint16_t)0x0104, /*!< Data Byte Transfer Finished flag */ |
||||
I2C_FLAG_ADDRESSSENTMATCHED = (uint16_t)0x0102, /*!< Address Sent/Matched (master/slave) flag */ |
||||
I2C_FLAG_STARTDETECTION = (uint16_t)0x0101, /*!< Start bit sent flag */ |
||||
|
||||
/* SR2 register flags */ |
||||
I2C_FLAG_WAKEUPFROMHALT = (uint16_t)0x0220, /*!< Wake Up From Halt Flag */ |
||||
I2C_FLAG_OVERRUNUNDERRUN = (uint16_t)0x0208, /*!< Overrun/Underrun flag */ |
||||
I2C_FLAG_ACKNOWLEDGEFAILURE = (uint16_t)0x0204, /*!< Acknowledge Failure Flag */ |
||||
I2C_FLAG_ARBITRATIONLOSS = (uint16_t)0x0202, /*!< Arbitration Loss Flag */ |
||||
I2C_FLAG_BUSERROR = (uint16_t)0x0201, /*!< Misplaced Start or Stop condition */ |
||||
|
||||
/* SR3 register flags */ |
||||
I2C_FLAG_GENERALCALL = (uint16_t)0x0310, /*!< General Call header received Flag */ |
||||
I2C_FLAG_TRANSMITTERRECEIVER = (uint16_t)0x0304, /*!< Transmitter Receiver Flag */ |
||||
I2C_FLAG_BUSBUSY = (uint16_t)0x0302, /*!< Bus Busy Flag */ |
||||
I2C_FLAG_MASTERSLAVE = (uint16_t)0x0301 /*!< Master Slave Flag */ |
||||
} I2C_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C Pending bits |
||||
* Elements values convention: 0xXYZZ |
||||
* X = SRx registers index |
||||
* X = 1 : SR1 |
||||
* X = 2 : SR2 |
||||
* Y = Position of the corresponding Interrupt |
||||
* ZZ = flag mask in the dedicated register(X register) |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
/* SR1 register flags */ |
||||
I2C_ITPENDINGBIT_TXEMPTY = (uint16_t)0x1680, /*!< Transmit Data Register Empty */ |
||||
I2C_ITPENDINGBIT_RXNOTEMPTY = (uint16_t)0x1640, /*!< Read Data Register Not Empty */ |
||||
I2C_ITPENDINGBIT_STOPDETECTION = (uint16_t)0x1210, /*!< Stop detected */ |
||||
I2C_ITPENDINGBIT_HEADERSENT = (uint16_t)0x1208, /*!< 10-bit Header sent */ |
||||
I2C_ITPENDINGBIT_TRANSFERFINISHED = (uint16_t)0x1204, /*!< Data Byte Transfer Finished */ |
||||
I2C_ITPENDINGBIT_ADDRESSSENTMATCHED = (uint16_t)0x1202, /*!< Address Sent/Matched (master/slave) */ |
||||
I2C_ITPENDINGBIT_STARTDETECTION = (uint16_t)0x1201, /*!< Start bit sent */ |
||||
|
||||
/* SR2 register flags */ |
||||
I2C_ITPENDINGBIT_WAKEUPFROMHALT = (uint16_t)0x2220, /*!< Wake Up From Halt */ |
||||
I2C_ITPENDINGBIT_OVERRUNUNDERRUN = (uint16_t)0x2108, /*!< Overrun/Underrun */ |
||||
I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE = (uint16_t)0x2104, /*!< Acknowledge Failure */ |
||||
I2C_ITPENDINGBIT_ARBITRATIONLOSS = (uint16_t)0x2102, /*!< Arbitration Loss */ |
||||
I2C_ITPENDINGBIT_BUSERROR = (uint16_t)0x2101 /*!< Misplaced Start or Stop condition */ |
||||
} I2C_ITPendingBit_TypeDef; |
||||
|
||||
/**
|
||||
* @brief I2C possible events |
||||
* Values convention: 0xXXYY |
||||
* XX = Event SR3 corresponding value |
||||
* YY = Event SR1 corresponding value |
||||
* @note if Event = EV3_2 the rule above does not apply |
||||
* YY = Event SR2 corresponding value |
||||
*/ |
||||
|
||||
typedef enum |
||||
{ |
||||
/*========================================
|
||||
|
||||
I2C Master Events (Events grouped in order of communication) |
||||
==========================================*/ |
||||
/**
|
||||
* @brief Communication start |
||||
* |
||||
* After sending the START condition (I2C_GenerateSTART() function) the master |
||||
* has to wait for this event. It means that the Start condition has been correctly |
||||
* released on the I2C bus (the bus is free, no other devices is communicating). |
||||
* |
||||
*/ |
||||
/* --EV5 */ |
||||
I2C_EVENT_MASTER_MODE_SELECT = (uint16_t)0x0301, /*!< BUSY, MSL and SB flag */ |
||||
|
||||
/**
|
||||
* @brief Address Acknowledge |
||||
* |
||||
* After checking on EV5 (start condition correctly released on the bus), the |
||||
* master sends the address of the slave(s) with which it will communicate |
||||
* (I2C_Send7bitAddress() function, it also determines the direction of the communication: |
||||
* Master transmitter or Receiver). |
||||
* Then the master has to wait that a slave acknowledges his address. |
||||
* If an acknowledge is sent on the bus, one of the following events will |
||||
* be set: |
||||
* |
||||
* 1) In case of Master Receiver (7-bit addressing): |
||||
* the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED event is set. |
||||
* |
||||
* 2) In case of Master Transmitter (7-bit addressing): |
||||
* the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED is set |
||||
* |
||||
* 3) In case of 10-Bit addressing mode, the master (just after generating the START |
||||
* and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData() |
||||
* function). |
||||
* Then master should wait on EV9. It means that the 10-bit addressing |
||||
* header has been correctly sent on the bus. |
||||
* Then master should send the second part of the 10-bit address (LSB) using |
||||
* the function I2C_Send7bitAddress(). Then master should wait for event EV6. |
||||
* |
||||
*/ |
||||
/* --EV6 */ |
||||
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED = (uint16_t)0x0782, /*!< BUSY, MSL, ADDR, TXE and TRA flags */ |
||||
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED = (uint16_t)0x0302, /*!< BUSY, MSL and ADDR flags */ |
||||
/* --EV9 */ |
||||
I2C_EVENT_MASTER_MODE_ADDRESS10 = (uint16_t)0x0308, /*!< BUSY, MSL and ADD10 flags */ |
||||
|
||||
/**
|
||||
* @brief Communication events |
||||
* |
||||
* If a communication is established (START condition generated and slave address |
||||
* acknowledged) then the master has to check on one of the following events for |
||||
* communication procedures: |
||||
* |
||||
* 1) Master Receiver mode: The master has to wait on the event EV7 then to read |
||||
* the data received from the slave (I2C_ReceiveData() function). |
||||
* |
||||
* 2) Master Transmitter mode: The master has to send data (I2C_SendData() |
||||
* function) then to wait on event EV8 or EV8_2. |
||||
* These two events are similar: |
||||
* - EV8 means that the data has been written in the data register and is |
||||
* being shifted out. |
||||
* - EV8_2 means that the data has been physically shifted out and output |
||||
* on the bus. |
||||
* In most cases, using EV8 is sufficient for the application. |
||||
* Using EV8_2 leads to a slower communication but ensures more reliable test. |
||||
* EV8_2 is also more suitable than EV8 for testing on the last data transmission |
||||
* (before Stop condition generation). |
||||
* |
||||
* @note In case the user software does not guarantee that this event EV7 is |
||||
* managed before the current byte end of transfer, then user may check on EV7 |
||||
* and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)). |
||||
* In this case the communication may be slower. |
||||
* |
||||
*/ |
||||
/* Master RECEIVER mode -----------------------------*/ |
||||
/* --EV7 */ |
||||
I2C_EVENT_MASTER_BYTE_RECEIVED = (uint16_t)0x0340, /*!< BUSY, MSL and RXNE flags */ |
||||
|
||||
/* Master TRANSMITTER mode --------------------------*/ |
||||
/* --EV8 */ |
||||
I2C_EVENT_MASTER_BYTE_TRANSMITTING = (uint16_t)0x0780, /*!< TRA, BUSY, MSL, TXE flags */ |
||||
/* --EV8_2 */ |
||||
|
||||
I2C_EVENT_MASTER_BYTE_TRANSMITTED = (uint16_t)0x0784, /*!< EV8_2: TRA, BUSY, MSL, TXE and BTF flags */ |
||||
|
||||
|
||||
/*========================================
|
||||
|
||||
I2C Slave Events (Events grouped in order of communication) |
||||
==========================================*/ |
||||
|
||||
/**
|
||||
* @brief Communication start events |
||||
* |
||||
* Wait on one of these events at the start of the communication. It means that |
||||
* the I2C peripheral detected a Start condition on the bus (generated by master |
||||
* device) followed by the peripheral address. |
||||
* The peripheral generates an ACK condition on the bus (if the acknowledge |
||||
* feature is enabled through function I2C_AcknowledgeConfig()) and the events |
||||
* listed above are set : |
||||
* |
||||
* 1) In normal case (only one address managed by the slave), when the address |
||||
* sent by the master matches the own address of the peripheral (configured by |
||||
* I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set |
||||
* (where XXX could be TRANSMITTER or RECEIVER). |
||||
* |
||||
* 2) In case the address sent by the master is General Call (address 0x00) and
|
||||
* if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd())
|
||||
* the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED.
|
||||
*
|
||||
*/ |
||||
|
||||
/* --EV1 (all the events below are variants of EV1) */ |
||||
/* 1) Case of One Single Address managed by the slave */ |
||||
I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED = (uint16_t)0x0202, /*!< BUSY and ADDR flags */ |
||||
I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED = (uint16_t)0x0682, /*!< TRA, BUSY, TXE and ADDR flags */ |
||||
|
||||
/* 2) Case of General Call enabled for the slave */ |
||||
I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED = (uint16_t)0x1200, /*!< EV2: GENCALL and BUSY flags */ |
||||
|
||||
/**
|
||||
* @brief Communication events |
||||
* |
||||
* Wait on one of these events when EV1 has already been checked : |
||||
* |
||||
* - Slave RECEIVER mode: |
||||
* - EV2: When the application is expecting a data byte to be received. |
||||
* - EV4: When the application is expecting the end of the communication: |
||||
* master sends a stop condition and data transmission is stopped. |
||||
* |
||||
* - Slave Transmitter mode: |
||||
* - EV3: When a byte has been transmitted by the slave and the application |
||||
* is expecting the end of the byte transmission. |
||||
* The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and I2C_EVENT_SLAVE_BYTE_TRANSMITTING |
||||
* are similar. The second one can optionally be used when the user software |
||||
* doesn't guarantee the EV3 is managed before the current byte end of transfer. |
||||
* - EV3_2: When the master sends a NACK in order to tell slave that data transmission |
||||
* shall end (before sending the STOP condition). |
||||
* In this case slave has to stop sending data bytes and expect a Stop |
||||
* condition on the bus. |
||||
* |
||||
* @note In case the user software does not guarantee that the event EV2 is |
||||
* managed before the current byte end of transfer, then user may check on EV2 |
||||
* and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)). |
||||
* In this case the communication may be slower. |
||||
* |
||||
*/ |
||||
/* Slave RECEIVER mode --------------------------*/ |
||||
/* --EV2 */ |
||||
I2C_EVENT_SLAVE_BYTE_RECEIVED = (uint16_t)0x0240, /*!< BUSY and RXNE flags */ |
||||
/* --EV4 */ |
||||
I2C_EVENT_SLAVE_STOP_DETECTED = (uint16_t)0x0010, /*!< STOPF flag */ |
||||
|
||||
/* Slave TRANSMITTER mode -----------------------*/ |
||||
/* --EV3 */ |
||||
I2C_EVENT_SLAVE_BYTE_TRANSMITTED = (uint16_t)0x0684, /*!< TRA, BUSY, TXE and BTF flags */ |
||||
I2C_EVENT_SLAVE_BYTE_TRANSMITTING = (uint16_t)0x0680, /*!< TRA, BUSY and TXE flags */ |
||||
/* --EV3_2 */ |
||||
I2C_EVENT_SLAVE_ACK_FAILURE = (uint16_t)0x0004 /*!< AF flag */ |
||||
} I2C_Event_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/** @addtogroup I2C_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
#define I2C_MAX_STANDARD_FREQ ((uint32_t)100000) |
||||
#define I2C_MAX_FAST_FREQ ((uint32_t)400000) |
||||
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) |
||||
#define I2C_MAX_INPUT_FREQ ((uint8_t)24) |
||||
#else |
||||
#define I2C_MAX_INPUT_FREQ ((uint8_t)16) |
||||
#endif |
||||
|
||||
/**
|
||||
*@} |
||||
*/ |
||||
|
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup I2C_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C duty cycles. |
||||
*/ |
||||
#define IS_I2C_DUTYCYCLE_OK(DUTY) \ |
||||
(((DUTY) == I2C_DUTYCYCLE_2) || \
|
||||
((DUTY) == I2C_DUTYCYCLE_16_9)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different acknowledgement configuration |
||||
*/ |
||||
#define IS_I2C_ACK_OK(ACK) \ |
||||
(((ACK) == I2C_ACK_NONE) || \
|
||||
((ACK) == I2C_ACK_CURR) || \
|
||||
((ACK) == I2C_ACK_NEXT)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C addressing modes. |
||||
*/ |
||||
#define IS_I2C_ADDMODE_OK(ADDMODE) \ |
||||
(((ADDMODE) == I2C_ADDMODE_7BIT) || \
|
||||
((ADDMODE) == I2C_ADDMODE_10BIT)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C interrupt types. |
||||
*/ |
||||
#define IS_I2C_INTERRUPT_OK(IT) \ |
||||
(((IT) == I2C_IT_ERR) || \
|
||||
((IT) == I2C_IT_EVT) || \
|
||||
((IT) == I2C_IT_BUF) || \
|
||||
((IT) == (I2C_IT_ERR | I2C_IT_EVT)) || \
|
||||
((IT) == (I2C_IT_ERR | I2C_IT_BUF)) || \
|
||||
((IT) == (I2C_IT_EVT | I2C_IT_BUF)) || \
|
||||
((IT) == (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR))) |
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C communcation direction. |
||||
*/ |
||||
#define IS_I2C_DIRECTION_OK(DIR) \ |
||||
(((DIR) == I2C_DIRECTION_TX) || \
|
||||
((DIR) == I2C_DIRECTION_RX)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C flags. |
||||
*/ |
||||
#define IS_I2C_FLAG_OK(FLAG) \ |
||||
(((FLAG) == I2C_FLAG_TXEMPTY) || \
|
||||
((FLAG) == I2C_FLAG_RXNOTEMPTY) || \
|
||||
((FLAG) == I2C_FLAG_STOPDETECTION) || \
|
||||
((FLAG) == I2C_FLAG_HEADERSENT) || \
|
||||
((FLAG) == I2C_FLAG_TRANSFERFINISHED) || \
|
||||
((FLAG) == I2C_FLAG_ADDRESSSENTMATCHED) || \
|
||||
((FLAG) == I2C_FLAG_STARTDETECTION) || \
|
||||
((FLAG) == I2C_FLAG_WAKEUPFROMHALT) || \
|
||||
((FLAG) == I2C_FLAG_OVERRUNUNDERRUN) || \
|
||||
((FLAG) == I2C_FLAG_ACKNOWLEDGEFAILURE) || \
|
||||
((FLAG) == I2C_FLAG_ARBITRATIONLOSS) || \
|
||||
((FLAG) == I2C_FLAG_BUSERROR) || \
|
||||
((FLAG) == I2C_FLAG_GENERALCALL) || \
|
||||
((FLAG) == I2C_FLAG_TRANSMITTERRECEIVER) || \
|
||||
((FLAG) == I2C_FLAG_BUSBUSY) || \
|
||||
((FLAG) == I2C_FLAG_MASTERSLAVE)) |
||||
/**
|
||||
* @brief Macro used by the assert function to check the I2C flags to clear. |
||||
*/ |
||||
|
||||
#define IS_I2C_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & (uint16_t)0xFD00) == 0x00) \ |
||||
&& ((uint16_t)(FLAG) != 0x00)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C possible pending bits. |
||||
*/ |
||||
#define IS_I2C_ITPENDINGBIT_OK(ITPENDINGBIT) \ |
||||
(((ITPENDINGBIT) == I2C_ITPENDINGBIT_TXEMPTY) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_RXNOTEMPTY) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_STOPDETECTION) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_HEADERSENT) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_TRANSFERFINISHED) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_ADDRESSSENTMATCHED) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_STARTDETECTION) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_WAKEUPFROMHALT) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_OVERRUNUNDERRUN) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_ARBITRATIONLOSS) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_BUSERROR)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C possible |
||||
* pending bits to clear by writing 0. |
||||
*/ |
||||
#define IS_I2C_CLEAR_ITPENDINGBIT_OK(ITPENDINGBIT) \ |
||||
(((ITPENDINGBIT) == I2C_ITPENDINGBIT_WAKEUPFROMHALT) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_OVERRUNUNDERRUN) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_ARBITRATIONLOSS) || \
|
||||
((ITPENDINGBIT) == I2C_ITPENDINGBIT_BUSERROR)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C possible events. |
||||
*/ |
||||
#define IS_I2C_EVENT_OK(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ |
||||
((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \
|
||||
((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \
|
||||
((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \
|
||||
((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | (uint16_t)I2C_FLAG_GENERALCALL)) || \
|
||||
((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \
|
||||
((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | (uint16_t)I2C_FLAG_GENERALCALL)) || \
|
||||
((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE) || \
|
||||
((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \
|
||||
((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different I2C possible own address. |
||||
*/ |
||||
#define IS_I2C_OWN_ADDRESS_OK(ADDRESS) \ |
||||
((ADDRESS) <= (uint16_t)0x03FF) |
||||
|
||||
/* The address must be even */ |
||||
#define IS_I2C_ADDRESS_OK(ADD) \ |
||||
(((ADD) & (uint8_t)0x01) == (uint8_t)0x00) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check that I2C Input clock frequency must be between 1MHz and 50MHz. |
||||
*/ |
||||
#define IS_I2C_INPUT_CLOCK_FREQ_OK(FREQ) \ |
||||
(((FREQ) >= (uint8_t)1) && ((FREQ) <= I2C_MAX_INPUT_FREQ)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check that I2C Output clock frequency must be between 1Hz and 400kHz. |
||||
*/ |
||||
#define IS_I2C_OUTPUT_CLOCK_FREQ_OK(FREQ) \ |
||||
(((FREQ) >= (uint8_t)1) && ((FREQ) <= I2C_MAX_FAST_FREQ)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
/** @addtogroup I2C_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void I2C_DeInit(void); |
||||
void I2C_Init(uint32_t OutputClockFrequencyHz, uint16_t OwnAddress,
|
||||
I2C_DutyCycle_TypeDef I2C_DutyCycle, I2C_Ack_TypeDef Ack,
|
||||
I2C_AddMode_TypeDef AddMode, uint8_t InputClockFrequencyMHz ); |
||||
void I2C_Cmd(FunctionalState NewState); |
||||
void I2C_GeneralCallCmd(FunctionalState NewState); |
||||
void I2C_GenerateSTART(FunctionalState NewState); |
||||
void I2C_GenerateSTOP(FunctionalState NewState); |
||||
void I2C_SoftwareResetCmd(FunctionalState NewState); |
||||
void I2C_StretchClockCmd(FunctionalState NewState); |
||||
void I2C_AcknowledgeConfig(I2C_Ack_TypeDef Ack); |
||||
void I2C_FastModeDutyCycleConfig(I2C_DutyCycle_TypeDef I2C_DutyCycle); |
||||
void I2C_ITConfig(I2C_IT_TypeDef I2C_IT, FunctionalState NewState); |
||||
uint8_t I2C_ReceiveData(void); |
||||
void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction); |
||||
void I2C_SendData(uint8_t Data); |
||||
/**
|
||||
* @brief |
||||
**************************************************************************************** |
||||
* |
||||
* I2C State Monitoring Functions |
||||
* |
||||
**************************************************************************************** |
||||
* This I2C driver provides three different ways for I2C state monitoring |
||||
* depending on the application requirements and constraints: |
||||
* |
||||
* |
||||
* 1) Basic state monitoring: |
||||
* Using I2C_CheckEvent() function: |
||||
* It compares the status registers (SR1, SR2 and SR3) content to a given event |
||||
* (can be the combination of one or more flags). |
||||
* It returns SUCCESS if the current status includes the given flags |
||||
* and returns ERROR if one or more flags are missing in the current status. |
||||
* - When to use: |
||||
* - This function is suitable for most applications as well as for startup |
||||
* activity since the events are fully described in the product reference manual |
||||
* (RM0016). |
||||
* - It is also suitable for users who need to define their own events. |
||||
* - Limitations: |
||||
* - If an error occurs (ie. error flags are set besides to the monitored flags), |
||||
* the I2C_CheckEvent() function may return SUCCESS despite the communication |
||||
* hold or corrupted real state. |
||||
* In this case, it is advised to use error interrupts to monitor the error |
||||
* events and handle them in the interrupt IRQ handler. |
||||
* |
||||
* @note |
||||
* For error management, it is advised to use the following functions: |
||||
* - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). |
||||
* - I2C_IRQHandler() which is called when the I2C interrupts occur. |
||||
* - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the |
||||
* I2Cx_IRQHandler() function in order to determine which error occurred. |
||||
* - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() |
||||
* and/or I2C_GenerateStop() in order to clear the error flag and |
||||
* source and return to correct communication status. |
||||
* |
||||
* |
||||
* 2) Advanced state monitoring: |
||||
* Using the function I2C_GetLastEvent() which returns the image of both SR1 |
||||
* & SR3 status registers in a single word (uint16_t) (Status Register 3 value |
||||
* is shifted left by 8 bits and concatenated to Status Register 1). |
||||
* - When to use: |
||||
* - This function is suitable for the same applications above but it allows to |
||||
* overcome the limitations of I2C_GetFlagStatus() function (see below). |
||||
* The returned value could be compared to events already defined in the |
||||
* library (stm8s_i2c.h) or to custom values defined by user. |
||||
* - This function is suitable when multiple flags are monitored at the same time. |
||||
* - At the opposite of I2C_CheckEvent() function, this function allows user to |
||||
* choose when an event is accepted (when all events flags are set and no |
||||
* other flags are set or just when the needed flags are set like |
||||
* I2C_CheckEvent() function). |
||||
* - Limitations: |
||||
* - User may need to define his own events. |
||||
* - Same remark concerning the error management is applicable for this |
||||
* function if user decides to check only regular communication flags (and |
||||
* ignores error flags). |
||||
* |
||||
* |
||||
* 3) Flag-based state monitoring: |
||||
* Using the function I2C_GetFlagStatus() which simply returns the status of |
||||
* one single flag (ie. I2C_FLAG_RXNE ...). |
||||
* - When to use: |
||||
* - This function could be used for specific applications or in debug phase. |
||||
* - It is suitable when only one flag checking is needed (most I2C events |
||||
* are monitored through multiple flags). |
||||
* - Limitations: |
||||
* - When calling this function, the Status register is accessed. Some flags are |
||||
* cleared when the status register is accessed. So checking the status |
||||
* of one Flag, may clear other ones. |
||||
* - Function may need to be called twice or more in order to monitor one |
||||
* single event. |
||||
* |
||||
*/ |
||||
|
||||
/**
|
||||
* |
||||
* 1) Basic state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
ErrorStatus I2C_CheckEvent(I2C_Event_TypeDef I2C_Event); |
||||
/**
|
||||
* |
||||
* 2) Advanced state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
I2C_Event_TypeDef I2C_GetLastEvent(void); |
||||
/**
|
||||
* |
||||
* 3) Flag-based state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
FlagStatus I2C_GetFlagStatus(I2C_Flag_TypeDef I2C_Flag); |
||||
/**
|
||||
* |
||||
******************************************************************************* |
||||
*/ |
||||
void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG); |
||||
ITStatus I2C_GetITStatus(I2C_ITPendingBit_TypeDef I2C_ITPendingBit); |
||||
void I2C_ClearITPendingBit(I2C_ITPendingBit_TypeDef I2C_ITPendingBit); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_I2C_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,186 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_itc.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the ITC peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_ITC_H |
||||
#define __STM8S_ITC_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ITC_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief ITC Interrupt Lines selection |
||||
*/ |
||||
typedef enum { |
||||
ITC_IRQ_TLI = (uint8_t)0, /*!< Software interrupt */ |
||||
ITC_IRQ_AWU = (uint8_t)1, /*!< Auto wake up from halt interrupt */ |
||||
ITC_IRQ_CLK = (uint8_t)2, /*!< Clock controller interrupt */ |
||||
ITC_IRQ_PORTA = (uint8_t)3, /*!< Port A external interrupts */ |
||||
ITC_IRQ_PORTB = (uint8_t)4, /*!< Port B external interrupts */ |
||||
ITC_IRQ_PORTC = (uint8_t)5, /*!< Port C external interrupts */ |
||||
ITC_IRQ_PORTD = (uint8_t)6, /*!< Port D external interrupts */ |
||||
ITC_IRQ_PORTE = (uint8_t)7, /*!< Port E external interrupts */ |
||||
|
||||
#if defined(STM8S208) || defined(STM8AF52Ax) |
||||
ITC_IRQ_CAN_RX = (uint8_t)8, /*!< beCAN RX interrupt */ |
||||
ITC_IRQ_CAN_TX = (uint8_t)9, /*!< beCAN TX/ER/SC interrupt */ |
||||
#endif /*STM8S208 or STM8AF52Ax */ |
||||
|
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
ITC_IRQ_PORTF = (uint8_t)8, /*!< Port F external interrupts */ |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
|
||||
ITC_IRQ_SPI = (uint8_t)10, /*!< SPI interrupt */ |
||||
ITC_IRQ_TIM1_OVF = (uint8_t)11, /*!< TIM1 update/overflow/underflow/trigger/
|
||||
break interrupt*/ |
||||
ITC_IRQ_TIM1_CAPCOM = (uint8_t)12, /*!< TIM1 capture/compare interrupt */ |
||||
|
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
ITC_IRQ_TIM5_OVFTRI = (uint8_t)13, /*!< TIM5 update/overflow/underflow/trigger/
|
||||
interrupt */ |
||||
ITC_IRQ_TIM5_CAPCOM = (uint8_t)14, /*!< TIM5 capture/compare interrupt */ |
||||
#else |
||||
ITC_IRQ_TIM2_OVF = (uint8_t)13, /*!< TIM2 update /overflow interrupt */ |
||||
ITC_IRQ_TIM2_CAPCOM = (uint8_t)14, /*!< TIM2 capture/compare interrupt */ |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
|
||||
ITC_IRQ_TIM3_OVF = (uint8_t)15, /*!< TIM3 update /overflow interrupt*/ |
||||
ITC_IRQ_TIM3_CAPCOM = (uint8_t)16, /*!< TIM3 update /overflow interrupt */ |
||||
|
||||
#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ |
||||
defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
|
||||
ITC_IRQ_UART1_TX = (uint8_t)17, /*!< UART1 TX interrupt */ |
||||
ITC_IRQ_UART1_RX = (uint8_t)18, /*!< UART1 RX interrupt */ |
||||
#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ |
||||
#if defined(STM8AF622x) |
||||
ITC_IRQ_UART4_TX = (uint8_t)17, /*!< UART4 TX interrupt */ |
||||
ITC_IRQ_UART4_RX = (uint8_t)18, /*!< UART4 RX interrupt */ |
||||
#endif /*STM8AF622x */ |
||||
|
||||
ITC_IRQ_I2C = (uint8_t)19, /*!< I2C interrupt */ |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) |
||||
ITC_IRQ_UART2_TX = (uint8_t)20, /*!< USART2 TX interrupt */ |
||||
ITC_IRQ_UART2_RX = (uint8_t)21, /*!< USART2 RX interrupt */ |
||||
#endif /*STM8S105 or STM8AF626x */ |
||||
|
||||
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || defined(STM8AF62Ax) |
||||
ITC_IRQ_UART3_TX = (uint8_t)20, /*!< USART3 TX interrupt */ |
||||
ITC_IRQ_UART3_RX = (uint8_t)21, /*!< USART3 RX interrupt */ |
||||
ITC_IRQ_ADC2 = (uint8_t)22, /*!< ADC2 interrupt */ |
||||
#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || defined(STM8S903) || defined(STM8AF626x) || defined(STM8AF622x) |
||||
ITC_IRQ_ADC1 = (uint8_t)22, /*!< ADC2 interrupt */ |
||||
#endif /*STM8S105 or STM8S005 or STM8S003 or STM8S103 or STM8S903 or STM8AF626x or STM8AF622x */ |
||||
|
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
ITC_IRQ_TIM6_OVFTRI = (uint8_t)23, /*!< TIM6 update/overflow/underflow/trigger/
|
||||
interrupt */ |
||||
#else |
||||
ITC_IRQ_TIM4_OVF = (uint8_t)23, /*!< TIM4 update /overflow interrupt */ |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
|
||||
ITC_IRQ_EEPROM_EEC = (uint8_t)24 /*!< Flash interrupt */ |
||||
} ITC_Irq_TypeDef; |
||||
|
||||
/**
|
||||
* @brief ITC Priority Levels selection |
||||
*/ |
||||
typedef enum { |
||||
ITC_PRIORITYLEVEL_0 = (uint8_t)0x02, /*!< Software priority level 0 (cannot be written) */ |
||||
ITC_PRIORITYLEVEL_1 = (uint8_t)0x01, /*!< Software priority level 1 */ |
||||
ITC_PRIORITYLEVEL_2 = (uint8_t)0x00, /*!< Software priority level 2 */ |
||||
ITC_PRIORITYLEVEL_3 = (uint8_t)0x03 /*!< Software priority level 3 */ |
||||
} ITC_PriorityLevel_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ITC_Exported_Constants
|
||||
* @{ |
||||
*/ |
||||
#define CPU_SOFT_INT_DISABLED ((uint8_t)0x28) /*!< Mask for I1 and I0 bits in CPU_CC register */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @brief Macros used by the assert function in order to check the different functions parameters. |
||||
* @addtogroup ITC_Private_Macros |
||||
* @{ |
||||
*/ |
||||
|
||||
/* Used by assert function */ |
||||
#define IS_ITC_IRQ_OK(IRQ) ((IRQ) <= (uint8_t)24) |
||||
|
||||
/* Used by assert function */ |
||||
#define IS_ITC_PRIORITY_OK(PriorityValue) \ |
||||
(((PriorityValue) == ITC_PRIORITYLEVEL_0) || \
|
||||
((PriorityValue) == ITC_PRIORITYLEVEL_1) || \
|
||||
((PriorityValue) == ITC_PRIORITYLEVEL_2) || \
|
||||
((PriorityValue) == ITC_PRIORITYLEVEL_3)) |
||||
|
||||
/* Used by assert function */ |
||||
#define IS_ITC_INTERRUPTS_DISABLED (ITC_GetSoftIntStatus() == CPU_SOFT_INT_DISABLED) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup ITC_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
uint8_t ITC_GetCPUCC(void); |
||||
void ITC_DeInit(void); |
||||
uint8_t ITC_GetSoftIntStatus(void); |
||||
void ITC_SetSoftwarePriority(ITC_Irq_TypeDef IrqNum, ITC_PriorityLevel_TypeDef PriorityValue); |
||||
ITC_PriorityLevel_TypeDef ITC_GetSoftwarePriority(ITC_Irq_TypeDef IrqNum); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_ITC_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,131 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_iwdg.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototypes and macros for the IWDG peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_IWDG_H |
||||
#define __STM8S_IWDG_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup IWDG_Private_Define
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Define used to prevent watchdog reset |
||||
*/ |
||||
#define IWDG_KEY_REFRESH ((uint8_t)0xAA) /*!< This value written in the Key register prevent the watchdog reset */ |
||||
|
||||
/**
|
||||
* @brief Define used to start the watchdog counter down |
||||
*/ |
||||
#define IWDG_KEY_ENABLE ((uint8_t)0xCC) /*!< This value written in the Key register start the watchdog counting down*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup IWDG_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different |
||||
* values of the prescaler. |
||||
*/ |
||||
#define IS_IWDG_PRESCALER_OK(VALUE) (((VALUE) == IWDG_Prescaler_4 ) || \ |
||||
((VALUE) == IWDG_Prescaler_8 ) || \
|
||||
((VALUE) == IWDG_Prescaler_16 ) || \
|
||||
((VALUE) == IWDG_Prescaler_32 ) || \
|
||||
((VALUE) == IWDG_Prescaler_64 ) || \
|
||||
((VALUE) == IWDG_Prescaler_128 ) || \
|
||||
((VALUE) == IWDG_Prescaler_256)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different |
||||
* values of the counter register. |
||||
*/ |
||||
#define IS_IWDG_WRITEACCESS_MODE_OK(MODE) (((MODE) == IWDG_WriteAccess_Enable) || ((MODE) == IWDG_WriteAccess_Disable)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup IWDG_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** IWDG write access enumeration */ |
||||
typedef enum |
||||
{ |
||||
IWDG_WriteAccess_Enable = (uint8_t)0x55, /*!< Code 0x55 in Key register, allow write access to Prescaler and Reload registers */ |
||||
IWDG_WriteAccess_Disable = (uint8_t)0x00 /*!< Code 0x00 in Key register, not allow write access to Prescaler and Reload registers */ |
||||
} IWDG_WriteAccess_TypeDef; |
||||
|
||||
/** IWDG prescaler enumaration */ |
||||
typedef enum |
||||
{ |
||||
IWDG_Prescaler_4 = (uint8_t)0x00, /*!< Used to set prescaler register to 4 */ |
||||
IWDG_Prescaler_8 = (uint8_t)0x01, /*!< Used to set prescaler register to 8 */ |
||||
IWDG_Prescaler_16 = (uint8_t)0x02, /*!< Used to set prescaler register to 16 */ |
||||
IWDG_Prescaler_32 = (uint8_t)0x03, /*!< Used to set prescaler register to 32 */ |
||||
IWDG_Prescaler_64 = (uint8_t)0x04, /*!< Used to set prescaler register to 64 */ |
||||
IWDG_Prescaler_128 = (uint8_t)0x05, /*!< Used to set prescaler register to 128 */ |
||||
IWDG_Prescaler_256 = (uint8_t)0x06 /*!< Used to set prescaler register to 256 */ |
||||
} IWDG_Prescaler_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup IWDG_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void IWDG_WriteAccessCmd(IWDG_WriteAccess_TypeDef IWDG_WriteAccess); |
||||
void IWDG_SetPrescaler(IWDG_Prescaler_TypeDef IWDG_Prescaler); |
||||
void IWDG_SetReload(uint8_t IWDG_Reload); |
||||
void IWDG_ReloadCounter(void); |
||||
void IWDG_Enable(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_IWDG_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,92 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_rst.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the RST peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_RST_H |
||||
#define __STM8S_RST_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup RST_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
typedef enum { |
||||
RST_FLAG_EMCF = (uint8_t)0x10, /*!< EMC reset flag */ |
||||
RST_FLAG_SWIMF = (uint8_t)0x08, /*!< SWIM reset flag */ |
||||
RST_FLAG_ILLOPF = (uint8_t)0x04, /*!< Illigal opcode reset flag */ |
||||
RST_FLAG_IWDGF = (uint8_t)0x02, /*!< Independent watchdog reset flag */ |
||||
RST_FLAG_WWDGF = (uint8_t)0x01 /*!< Window watchdog reset flag */ |
||||
}RST_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup RST_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
/**
|
||||
* @brief Macro used by the assert function to check the different RST flags. |
||||
*/ |
||||
#define IS_RST_FLAG_OK(FLAG) (((FLAG) == RST_FLAG_EMCF) || \ |
||||
((FLAG) == RST_FLAG_SWIMF) ||\
|
||||
((FLAG) == RST_FLAG_ILLOPF) ||\
|
||||
((FLAG) == RST_FLAG_IWDGF) ||\
|
||||
((FLAG) == RST_FLAG_WWDGF)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup RST_Exported_functions
|
||||
* @{ |
||||
*/ |
||||
FlagStatus RST_GetFlagStatus(RST_Flag_TypeDef RST_Flag); |
||||
void RST_ClearFlag(RST_Flag_TypeDef RST_Flag); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_RST_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,336 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_spi.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the SPI peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_SPI_H |
||||
#define __STM8S_SPI_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup SPI_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief SPI data direction mode |
||||
* Warning: element values correspond to BDM, BDOE, RXONLY bits position |
||||
*/ |
||||
typedef enum { |
||||
SPI_DATADIRECTION_2LINES_FULLDUPLEX = (uint8_t)0x00, /*!< 2-line uni-directional data mode enable */ |
||||
SPI_DATADIRECTION_2LINES_RXONLY = (uint8_t)0x04, /*!< Receiver only in 2 line uni-directional data mode */ |
||||
SPI_DATADIRECTION_1LINE_RX = (uint8_t)0x80, /*!< Receiver only in 1 line bi-directional data mode */ |
||||
SPI_DATADIRECTION_1LINE_TX = (uint8_t)0xC0 /*!< Transmit only in 1 line bi-directional data mode */ |
||||
} SPI_DataDirection_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI Slave Select management |
||||
* Warning: element values correspond to LSBFIRST bit position |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
SPI_NSS_SOFT = (uint8_t)0x02, /*!< Software slave management disabled */ |
||||
SPI_NSS_HARD = (uint8_t)0x00 /*!< Software slave management enabled */ |
||||
} SPI_NSS_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief SPI direction transmit/receive |
||||
*/ |
||||
|
||||
typedef enum { |
||||
SPI_DIRECTION_RX = (uint8_t)0x00, /*!< Selects Rx receive direction in bi-directional mode */ |
||||
SPI_DIRECTION_TX = (uint8_t)0x01 /*!< Selects Tx transmission direction in bi-directional mode */ |
||||
} SPI_Direction_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI master/slave mode |
||||
* Warning: element values correspond to MSTR bit position |
||||
*/ |
||||
typedef enum { |
||||
SPI_MODE_MASTER = (uint8_t)0x04, /*!< SPI Master configuration */ |
||||
SPI_MODE_SLAVE = (uint8_t)0x00 /*!< SPI Slave configuration */ |
||||
} SPI_Mode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI BaudRate Prescaler |
||||
* Warning: element values correspond to BR bits position |
||||
*/ |
||||
typedef enum { |
||||
SPI_BAUDRATEPRESCALER_2 = (uint8_t)0x00, /*!< SPI frequency = frequency(CPU)/2 */ |
||||
SPI_BAUDRATEPRESCALER_4 = (uint8_t)0x08, /*!< SPI frequency = frequency(CPU)/4 */ |
||||
SPI_BAUDRATEPRESCALER_8 = (uint8_t)0x10, /*!< SPI frequency = frequency(CPU)/8 */ |
||||
SPI_BAUDRATEPRESCALER_16 = (uint8_t)0x18, /*!< SPI frequency = frequency(CPU)/16 */ |
||||
SPI_BAUDRATEPRESCALER_32 = (uint8_t)0x20, /*!< SPI frequency = frequency(CPU)/32 */ |
||||
SPI_BAUDRATEPRESCALER_64 = (uint8_t)0x28, /*!< SPI frequency = frequency(CPU)/64 */ |
||||
SPI_BAUDRATEPRESCALER_128 = (uint8_t)0x30, /*!< SPI frequency = frequency(CPU)/128 */ |
||||
SPI_BAUDRATEPRESCALER_256 = (uint8_t)0x38 /*!< SPI frequency = frequency(CPU)/256 */ |
||||
} SPI_BaudRatePrescaler_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI Clock Polarity |
||||
* Warning: element values correspond to CPOL bit position |
||||
*/ |
||||
typedef enum { |
||||
SPI_CLOCKPOLARITY_LOW = (uint8_t)0x00, /*!< Clock to 0 when idle */ |
||||
SPI_CLOCKPOLARITY_HIGH = (uint8_t)0x02 /*!< Clock to 1 when idle */ |
||||
} SPI_ClockPolarity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI Clock Phase |
||||
* Warning: element values correspond to CPHA bit position |
||||
*/ |
||||
typedef enum { |
||||
SPI_CLOCKPHASE_1EDGE = (uint8_t)0x00, /*!< The first clock transition is the first data capture edge */ |
||||
SPI_CLOCKPHASE_2EDGE = (uint8_t)0x01 /*!< The second clock transition is the first data capture edge */ |
||||
} SPI_ClockPhase_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI Frame Format: MSB or LSB transmitted first |
||||
* Warning: element values correspond to LSBFIRST bit position |
||||
*/ |
||||
typedef enum { |
||||
SPI_FIRSTBIT_MSB = (uint8_t)0x00, /*!< MSB bit will be transmitted first */ |
||||
SPI_FIRSTBIT_LSB = (uint8_t)0x80 /*!< LSB bit will be transmitted first */ |
||||
} SPI_FirstBit_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI CRC Transmit/Receive |
||||
*/ |
||||
typedef enum { |
||||
SPI_CRC_RX = (uint8_t)0x00, /*!< Select Tx CRC register */ |
||||
SPI_CRC_TX = (uint8_t)0x01 /*!< Select Rx CRC register */ |
||||
} SPI_CRC_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI flags definition - Warning : FLAG value = mapping position register |
||||
*/ |
||||
typedef enum { |
||||
SPI_FLAG_BSY = (uint8_t)0x80, /*!< Busy flag */ |
||||
SPI_FLAG_OVR = (uint8_t)0x40, /*!< Overrun flag */ |
||||
SPI_FLAG_MODF = (uint8_t)0x20, /*!< Mode fault */ |
||||
SPI_FLAG_CRCERR = (uint8_t)0x10, /*!< CRC error flag */ |
||||
SPI_FLAG_WKUP = (uint8_t)0x08, /*!< Wake-up flag */ |
||||
SPI_FLAG_TXE = (uint8_t)0x02, /*!< Transmit buffer empty */ |
||||
SPI_FLAG_RXNE = (uint8_t)0x01 /*!< Receive buffer empty */ |
||||
} SPI_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief SPI_IT possible values |
||||
* Elements values convention: 0xYX |
||||
* X: Position of the corresponding Interrupt |
||||
* Y: ITPENDINGBIT position |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
SPI_IT_WKUP = (uint8_t)0x34, /*!< Wake-up interrupt*/ |
||||
SPI_IT_OVR = (uint8_t)0x65, /*!< Overrun interrupt*/ |
||||
SPI_IT_MODF = (uint8_t)0x55, /*!< Mode fault interrupt*/ |
||||
SPI_IT_CRCERR = (uint8_t)0x45, /*!< CRC error interrupt*/ |
||||
SPI_IT_TXE = (uint8_t)0x17, /*!< Transmit buffer empty interrupt*/ |
||||
SPI_IT_RXNE = (uint8_t)0x06, /*!< Receive buffer not empty interrupt*/ |
||||
SPI_IT_ERR = (uint8_t)0x05 /*!< Error interrupt*/ |
||||
} SPI_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private define ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup SPI_Private_Macros
|
||||
* @brief Macros used by the assert_param function to check the different functions parameters. |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the data direction mode values |
||||
*/ |
||||
#define IS_SPI_DATA_DIRECTION_OK(MODE) (((MODE) == SPI_DATADIRECTION_2LINES_FULLDUPLEX) || \ |
||||
((MODE) == SPI_DATADIRECTION_2LINES_RXONLY) || \
|
||||
((MODE) == SPI_DATADIRECTION_1LINE_RX) || \
|
||||
((MODE) == SPI_DATADIRECTION_1LINE_TX)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the mode
|
||||
* half duplex data direction values |
||||
*/ |
||||
#define IS_SPI_DIRECTION_OK(DIRECTION) (((DIRECTION) == SPI_DIRECTION_RX) || \ |
||||
((DIRECTION) == SPI_DIRECTION_TX)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the NSS
|
||||
* management values |
||||
*/ |
||||
#define IS_SPI_SLAVEMANAGEMENT_OK(NSS) (((NSS) == SPI_NSS_SOFT) || \ |
||||
((NSS) == SPI_NSS_HARD)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the CRC polynomial |
||||
*/ |
||||
#define IS_SPI_CRC_POLYNOMIAL_OK(POLYNOMIAL) ((POLYNOMIAL) > (uint8_t)0x00) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the SPI Mode values |
||||
*/ |
||||
#define IS_SPI_MODE_OK(MODE) (((MODE) == SPI_MODE_MASTER) || \ |
||||
((MODE) == SPI_MODE_SLAVE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the baudrate values |
||||
*/ |
||||
#define IS_SPI_BAUDRATE_PRESCALER_OK(PRESCALER) (((PRESCALER) == SPI_BAUDRATEPRESCALER_2) || \ |
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_4) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_8) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_16) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_32) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_64) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_128) || \
|
||||
((PRESCALER) == SPI_BAUDRATEPRESCALER_256)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the polarity values |
||||
*/ |
||||
#define IS_SPI_POLARITY_OK(CLKPOL) (((CLKPOL) == SPI_CLOCKPOLARITY_LOW) || \ |
||||
((CLKPOL) == SPI_CLOCKPOLARITY_HIGH)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the phase values |
||||
*/ |
||||
#define IS_SPI_PHASE_OK(CLKPHA) (((CLKPHA) == SPI_CLOCKPHASE_1EDGE) || \ |
||||
((CLKPHA) == SPI_CLOCKPHASE_2EDGE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the first
|
||||
* bit to be transmited values |
||||
*/ |
||||
#define IS_SPI_FIRSTBIT_OK(BIT) (((BIT) == SPI_FIRSTBIT_MSB) || \ |
||||
((BIT) == SPI_FIRSTBIT_LSB)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the CRC
|
||||
* Transmit/Receive |
||||
*/ |
||||
#define IS_SPI_CRC_OK(CRC) (((CRC) == SPI_CRC_TX) || \ |
||||
((CRC) == SPI_CRC_RX)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different flags values |
||||
*/ |
||||
#define IS_SPI_FLAGS_OK(FLAG) (((FLAG) == SPI_FLAG_OVR) || \ |
||||
((FLAG) == SPI_FLAG_MODF) || \
|
||||
((FLAG) == SPI_FLAG_CRCERR) || \
|
||||
((FLAG) == SPI_FLAG_WKUP) || \
|
||||
((FLAG) == SPI_FLAG_TXE) || \
|
||||
((FLAG) == SPI_FLAG_RXNE) || \
|
||||
((FLAG) == SPI_FLAG_BSY)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the flag that can be cleared
|
||||
* by writing 0 |
||||
*/ |
||||
#define IS_SPI_CLEAR_FLAGS_OK(FLAG) (((FLAG) == SPI_FLAG_CRCERR) || \ |
||||
((FLAG) == SPI_FLAG_WKUP)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the Interrupts |
||||
*/ |
||||
#define IS_SPI_CONFIG_IT_OK(Interrupt) (((Interrupt) == SPI_IT_TXE) || \ |
||||
((Interrupt) == SPI_IT_RXNE) || \
|
||||
((Interrupt) == SPI_IT_ERR) || \
|
||||
((Interrupt) == SPI_IT_WKUP)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the pending bit |
||||
*/ |
||||
#define IS_SPI_GET_IT_OK(ITPendingBit) (((ITPendingBit) == SPI_IT_OVR) || \ |
||||
((ITPendingBit) == SPI_IT_MODF) || \
|
||||
((ITPendingBit) == SPI_IT_CRCERR) || \
|
||||
((ITPendingBit) == SPI_IT_WKUP) || \
|
||||
((ITPendingBit) == SPI_IT_TXE) || \
|
||||
((ITPendingBit) == SPI_IT_RXNE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the pending bit that can be cleared |
||||
* by writing 0 |
||||
*/ |
||||
#define IS_SPI_CLEAR_IT_OK(ITPendingBit) (((ITPendingBit) == SPI_IT_CRCERR) || \ |
||||
((ITPendingBit) == SPI_IT_WKUP)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @addtogroup SPI_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void SPI_DeInit(void); |
||||
void SPI_Init(SPI_FirstBit_TypeDef FirstBit,
|
||||
SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler,
|
||||
SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity,
|
||||
SPI_ClockPhase_TypeDef ClockPhase,
|
||||
SPI_DataDirection_TypeDef Data_Direction,
|
||||
SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial); |
||||
void SPI_Cmd(FunctionalState NewState); |
||||
void SPI_ITConfig(SPI_IT_TypeDef SPI_IT, FunctionalState NewState); |
||||
void SPI_SendData(uint8_t Data); |
||||
uint8_t SPI_ReceiveData(void); |
||||
void SPI_NSSInternalSoftwareCmd(FunctionalState NewState); |
||||
void SPI_TransmitCRC(void); |
||||
void SPI_CalculateCRCCmd(FunctionalState NewState); |
||||
uint8_t SPI_GetCRC(SPI_CRC_TypeDef SPI_CRC); |
||||
void SPI_ResetCRC(void); |
||||
uint8_t SPI_GetCRCPolynomial(void); |
||||
void SPI_BiDirectionalLineConfig(SPI_Direction_TypeDef SPI_Direction); |
||||
FlagStatus SPI_GetFlagStatus(SPI_Flag_TypeDef SPI_FLAG); |
||||
void SPI_ClearFlag(SPI_Flag_TypeDef SPI_FLAG); |
||||
ITStatus SPI_GetITStatus(SPI_IT_TypeDef SPI_IT); |
||||
void SPI_ClearITPendingBit(SPI_IT_TypeDef SPI_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_SPI_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,623 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim1.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM1 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM1_H |
||||
#define __STM8S_TIM1_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup TIM1_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** TIM1 Output Compare and PWM modes */ |
||||
|
||||
typedef enum |
||||
{ |
||||
TIM1_OCMODE_TIMING = ((uint8_t)0x00), |
||||
TIM1_OCMODE_ACTIVE = ((uint8_t)0x10), |
||||
TIM1_OCMODE_INACTIVE = ((uint8_t)0x20), |
||||
TIM1_OCMODE_TOGGLE = ((uint8_t)0x30), |
||||
TIM1_OCMODE_PWM1 = ((uint8_t)0x60), |
||||
TIM1_OCMODE_PWM2 = ((uint8_t)0x70) |
||||
}TIM1_OCMode_TypeDef; |
||||
|
||||
#define IS_TIM1_OC_MODE_OK(MODE) (((MODE) == TIM1_OCMODE_TIMING) || \ |
||||
((MODE) == TIM1_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM1_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM1_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM1_OCMODE_PWM1) || \
|
||||
((MODE) == TIM1_OCMODE_PWM2)) |
||||
|
||||
#define IS_TIM1_OCM_OK(MODE)(((MODE) == TIM1_OCMODE_TIMING) || \ |
||||
((MODE) == TIM1_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM1_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM1_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM1_OCMODE_PWM1) || \
|
||||
((MODE) == TIM1_OCMODE_PWM2) || \
|
||||
((MODE) == (uint8_t)TIM1_FORCEDACTION_ACTIVE) || \
|
||||
((MODE) == (uint8_t)TIM1_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM1 One Pulse Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OPMODE_SINGLE = ((uint8_t)0x01), |
||||
TIM1_OPMODE_REPETITIVE = ((uint8_t)0x00) |
||||
}TIM1_OPMode_TypeDef; |
||||
|
||||
#define IS_TIM1_OPM_MODE_OK(MODE) (((MODE) == TIM1_OPMODE_SINGLE) || \ |
||||
((MODE) == TIM1_OPMODE_REPETITIVE)) |
||||
|
||||
/** TIM1 Channel */ |
||||
|
||||
typedef enum |
||||
{ |
||||
TIM1_CHANNEL_1 = ((uint8_t)0x00), |
||||
TIM1_CHANNEL_2 = ((uint8_t)0x01), |
||||
TIM1_CHANNEL_3 = ((uint8_t)0x02), |
||||
TIM1_CHANNEL_4 = ((uint8_t)0x03) |
||||
}TIM1_Channel_TypeDef; |
||||
|
||||
|
||||
#define IS_TIM1_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM1_CHANNEL_2) || \
|
||||
((CHANNEL) == TIM1_CHANNEL_3) || \
|
||||
((CHANNEL) == TIM1_CHANNEL_4)) |
||||
|
||||
#define IS_TIM1_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM1_CHANNEL_2)) |
||||
|
||||
#define IS_TIM1_COMPLEMENTARY_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM1_CHANNEL_2) || \
|
||||
((CHANNEL) == TIM1_CHANNEL_3)) |
||||
|
||||
|
||||
/** TIM1 Counter Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM1_COUNTERMODE_UP = ((uint8_t)0x00), |
||||
TIM1_COUNTERMODE_DOWN = ((uint8_t)0x10), |
||||
TIM1_COUNTERMODE_CENTERALIGNED1 = ((uint8_t)0x20), |
||||
TIM1_COUNTERMODE_CENTERALIGNED2 = ((uint8_t)0x40), |
||||
TIM1_COUNTERMODE_CENTERALIGNED3 = ((uint8_t)0x60) |
||||
}TIM1_CounterMode_TypeDef; |
||||
|
||||
#define IS_TIM1_COUNTER_MODE_OK(MODE) (((MODE) == TIM1_COUNTERMODE_UP) || \ |
||||
((MODE) == TIM1_COUNTERMODE_DOWN) || \
|
||||
((MODE) == TIM1_COUNTERMODE_CENTERALIGNED1) || \
|
||||
((MODE) == TIM1_COUNTERMODE_CENTERALIGNED2) || \
|
||||
((MODE) == TIM1_COUNTERMODE_CENTERALIGNED3)) |
||||
|
||||
/** TIM1 Output Compare Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OCPOLARITY_HIGH = ((uint8_t)0x00), |
||||
TIM1_OCPOLARITY_LOW = ((uint8_t)0x22) |
||||
}TIM1_OCPolarity_TypeDef; |
||||
|
||||
#define IS_TIM1_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_OCPOLARITY_HIGH) || \ |
||||
((POLARITY) == TIM1_OCPOLARITY_LOW)) |
||||
|
||||
/** TIM1 Output Compare N Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OCNPOLARITY_HIGH = ((uint8_t)0x00), |
||||
TIM1_OCNPOLARITY_LOW = ((uint8_t)0x88) |
||||
}TIM1_OCNPolarity_TypeDef; |
||||
|
||||
#define IS_TIM1_OCN_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_OCNPOLARITY_HIGH) || \ |
||||
((POLARITY) == TIM1_OCNPOLARITY_LOW)) |
||||
|
||||
/** TIM1 Output Compare states */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), |
||||
TIM1_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) |
||||
}TIM1_OutputState_TypeDef; |
||||
|
||||
#define IS_TIM1_OUTPUT_STATE_OK(STATE) (((STATE) == TIM1_OUTPUTSTATE_DISABLE) || \ |
||||
((STATE) == TIM1_OUTPUTSTATE_ENABLE)) |
||||
|
||||
/** TIM1 Output Compare N States */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OUTPUTNSTATE_DISABLE = ((uint8_t)0x00), |
||||
TIM1_OUTPUTNSTATE_ENABLE = ((uint8_t)0x44) |
||||
} TIM1_OutputNState_TypeDef; |
||||
|
||||
#define IS_TIM1_OUTPUTN_STATE_OK(STATE) (((STATE) == TIM1_OUTPUTNSTATE_DISABLE) ||\ |
||||
((STATE) == TIM1_OUTPUTNSTATE_ENABLE)) |
||||
|
||||
/** TIM1 Break Input enable/disable */ |
||||
typedef enum |
||||
{ |
||||
TIM1_BREAK_ENABLE = ((uint8_t)0x10), |
||||
TIM1_BREAK_DISABLE = ((uint8_t)0x00) |
||||
}TIM1_BreakState_TypeDef; |
||||
#define IS_TIM1_BREAK_STATE_OK(STATE) (((STATE) == TIM1_BREAK_ENABLE) || \ |
||||
((STATE) == TIM1_BREAK_DISABLE)) |
||||
|
||||
/** TIM1 Break Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM1_BREAKPOLARITY_LOW = ((uint8_t)0x00), |
||||
TIM1_BREAKPOLARITY_HIGH = ((uint8_t)0x20) |
||||
}TIM1_BreakPolarity_TypeDef; |
||||
#define IS_TIM1_BREAK_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_BREAKPOLARITY_LOW) || \ |
||||
((POLARITY) == TIM1_BREAKPOLARITY_HIGH)) |
||||
|
||||
/** TIM1 AOE Bit Set/Reset */ |
||||
typedef enum |
||||
{ |
||||
TIM1_AUTOMATICOUTPUT_ENABLE = ((uint8_t)0x40), |
||||
TIM1_AUTOMATICOUTPUT_DISABLE = ((uint8_t)0x00) |
||||
}TIM1_AutomaticOutput_TypeDef; |
||||
|
||||
#define IS_TIM1_AUTOMATIC_OUTPUT_STATE_OK(STATE) (((STATE) == TIM1_AUTOMATICOUTPUT_ENABLE) || \ |
||||
((STATE) == TIM1_AUTOMATICOUTPUT_DISABLE)) |
||||
|
||||
/** TIM1 Lock levels */ |
||||
typedef enum |
||||
{ |
||||
TIM1_LOCKLEVEL_OFF = ((uint8_t)0x00), |
||||
TIM1_LOCKLEVEL_1 = ((uint8_t)0x01), |
||||
TIM1_LOCKLEVEL_2 = ((uint8_t)0x02), |
||||
TIM1_LOCKLEVEL_3 = ((uint8_t)0x03) |
||||
}TIM1_LockLevel_TypeDef; |
||||
|
||||
#define IS_TIM1_LOCK_LEVEL_OK(LEVEL) (((LEVEL) == TIM1_LOCKLEVEL_OFF) || \ |
||||
((LEVEL) == TIM1_LOCKLEVEL_1) || \
|
||||
((LEVEL) == TIM1_LOCKLEVEL_2) || \
|
||||
((LEVEL) == TIM1_LOCKLEVEL_3)) |
||||
|
||||
/** TIM1 OSSI: Off-State Selection for Idle mode states */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OSSISTATE_ENABLE = ((uint8_t)0x04), |
||||
TIM1_OSSISTATE_DISABLE = ((uint8_t)0x00) |
||||
}TIM1_OSSIState_TypeDef; |
||||
|
||||
#define IS_TIM1_OSSI_STATE_OK(STATE) (((STATE) == TIM1_OSSISTATE_ENABLE) || \ |
||||
((STATE) == TIM1_OSSISTATE_DISABLE)) |
||||
|
||||
/** TIM1 Output Compare Idle State */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OCIDLESTATE_SET = ((uint8_t)0x55), |
||||
TIM1_OCIDLESTATE_RESET = ((uint8_t)0x00) |
||||
}TIM1_OCIdleState_TypeDef; |
||||
|
||||
#define IS_TIM1_OCIDLE_STATE_OK(STATE) (((STATE) == TIM1_OCIDLESTATE_SET) || \ |
||||
((STATE) == TIM1_OCIDLESTATE_RESET)) |
||||
|
||||
/** TIM1 Output Compare N Idle State */ |
||||
typedef enum |
||||
{ |
||||
TIM1_OCNIDLESTATE_SET = ((uint8_t)0x2A), |
||||
TIM1_OCNIDLESTATE_RESET = ((uint8_t)0x00) |
||||
}TIM1_OCNIdleState_TypeDef; |
||||
|
||||
#define IS_TIM1_OCNIDLE_STATE_OK(STATE) (((STATE) == TIM1_OCNIDLESTATE_SET) || \ |
||||
((STATE) == TIM1_OCNIDLESTATE_RESET)) |
||||
|
||||
/** TIM1 Input Capture Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM1_ICPOLARITY_RISING = ((uint8_t)0x00), |
||||
TIM1_ICPOLARITY_FALLING = ((uint8_t)0x01) |
||||
}TIM1_ICPolarity_TypeDef; |
||||
|
||||
#define IS_TIM1_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_ICPOLARITY_RISING) || \ |
||||
((POLARITY) == TIM1_ICPOLARITY_FALLING)) |
||||
|
||||
/** TIM1 Input Capture Selection */ |
||||
typedef enum |
||||
{ |
||||
TIM1_ICSELECTION_DIRECTTI = ((uint8_t)0x01), |
||||
TIM1_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), |
||||
TIM1_ICSELECTION_TRGI = ((uint8_t)0x03) |
||||
}TIM1_ICSelection_TypeDef; |
||||
|
||||
#define IS_TIM1_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM1_ICSELECTION_INDIRECTTI) || \
|
||||
((SELECTION) == TIM1_ICSELECTION_TRGI)) |
||||
|
||||
/** TIM1 Input Capture Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM1_ICPSC_DIV1 = ((uint8_t)0x00), |
||||
TIM1_ICPSC_DIV2 = ((uint8_t)0x04), |
||||
TIM1_ICPSC_DIV4 = ((uint8_t)0x08), |
||||
TIM1_ICPSC_DIV8 = ((uint8_t)0x0C) |
||||
}TIM1_ICPSC_TypeDef; |
||||
|
||||
#define IS_TIM1_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM1_ICPSC_DIV1) || \ |
||||
((PRESCALER) == TIM1_ICPSC_DIV2) || \
|
||||
((PRESCALER) == TIM1_ICPSC_DIV4) || \
|
||||
((PRESCALER) == TIM1_ICPSC_DIV8)) |
||||
|
||||
/** TIM1 Input Capture Filer Value */ |
||||
|
||||
#define IS_TIM1_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) |
||||
|
||||
/** TIM1 External Trigger Filer Value */ |
||||
#define IS_TIM1_EXT_TRG_FILTER_OK(FILTER) ((FILTER) <= 0x0F) |
||||
|
||||
/** TIM1 interrupt sources */ |
||||
typedef enum |
||||
{ |
||||
TIM1_IT_UPDATE = ((uint8_t)0x01), |
||||
TIM1_IT_CC1 = ((uint8_t)0x02), |
||||
TIM1_IT_CC2 = ((uint8_t)0x04), |
||||
TIM1_IT_CC3 = ((uint8_t)0x08), |
||||
TIM1_IT_CC4 = ((uint8_t)0x10), |
||||
TIM1_IT_COM = ((uint8_t)0x20), |
||||
TIM1_IT_TRIGGER = ((uint8_t)0x40), |
||||
TIM1_IT_BREAK = ((uint8_t)0x80) |
||||
}TIM1_IT_TypeDef; |
||||
|
||||
#define IS_TIM1_IT_OK(IT) ((IT) != 0x00) |
||||
|
||||
#define IS_TIM1_GET_IT_OK(IT) (((IT) == TIM1_IT_UPDATE) || \ |
||||
((IT) == TIM1_IT_CC1) || \
|
||||
((IT) == TIM1_IT_CC2) || \
|
||||
((IT) == TIM1_IT_CC3) || \
|
||||
((IT) == TIM1_IT_CC4) || \
|
||||
((IT) == TIM1_IT_COM) || \
|
||||
((IT) == TIM1_IT_TRIGGER) || \
|
||||
((IT) == TIM1_IT_BREAK)) |
||||
|
||||
|
||||
/** TIM1 External Trigger Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM1_EXTTRGPSC_OFF = ((uint8_t)0x00), |
||||
TIM1_EXTTRGPSC_DIV2 = ((uint8_t)0x10), |
||||
TIM1_EXTTRGPSC_DIV4 = ((uint8_t)0x20), |
||||
TIM1_EXTTRGPSC_DIV8 = ((uint8_t)0x30) |
||||
}TIM1_ExtTRGPSC_TypeDef; |
||||
|
||||
#define IS_TIM1_EXT_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM1_EXTTRGPSC_OFF) || \ |
||||
((PRESCALER) == TIM1_EXTTRGPSC_DIV2) || \
|
||||
((PRESCALER) == TIM1_EXTTRGPSC_DIV4) || \
|
||||
((PRESCALER) == TIM1_EXTTRGPSC_DIV8)) |
||||
|
||||
/** TIM1 Internal Trigger Selection */ |
||||
typedef enum |
||||
{ |
||||
TIM1_TS_TIM6 = ((uint8_t)0x00), /*!< TRIG Input source = TIM6 TRIG Output */ |
||||
TIM1_TS_TIM5 = ((uint8_t)0x30), /*!< TRIG Input source = TIM5 TRIG Output */ |
||||
TIM1_TS_TI1F_ED = ((uint8_t)0x40), |
||||
TIM1_TS_TI1FP1 = ((uint8_t)0x50), |
||||
TIM1_TS_TI2FP2 = ((uint8_t)0x60), |
||||
TIM1_TS_ETRF = ((uint8_t)0x70) |
||||
}TIM1_TS_TypeDef; |
||||
|
||||
#define IS_TIM1_TRIGGER_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_TS_TI1F_ED) || \ |
||||
((SELECTION) == TIM1_TS_TI1FP1) || \
|
||||
((SELECTION) == TIM1_TS_TI2FP2) || \
|
||||
((SELECTION) == TIM1_TS_ETRF) || \
|
||||
((SELECTION) == TIM1_TS_TIM5) || \
|
||||
((SELECTION) == TIM1_TS_TIM6)) |
||||
|
||||
|
||||
#define IS_TIM1_TIX_TRIGGER_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_TS_TI1F_ED) || \ |
||||
((SELECTION) == TIM1_TS_TI1FP1) || \
|
||||
((SELECTION) == TIM1_TS_TI2FP2)) |
||||
|
||||
/** TIM1 TIx External Clock Source */ |
||||
typedef enum |
||||
{ |
||||
TIM1_TIXEXTERNALCLK1SOURCE_TI1ED = ((uint8_t)0x40), |
||||
TIM1_TIXEXTERNALCLK1SOURCE_TI1 = ((uint8_t)0x50), |
||||
TIM1_TIXEXTERNALCLK1SOURCE_TI2 = ((uint8_t)0x60) |
||||
}TIM1_TIxExternalCLK1Source_TypeDef; |
||||
|
||||
#define IS_TIM1_TIXCLK_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI1ED) || \ |
||||
((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI2) || \
|
||||
((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI1)) |
||||
|
||||
/** TIM1 External Trigger Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM1_EXTTRGPOLARITY_INVERTED = ((uint8_t)0x80), |
||||
TIM1_EXTTRGPOLARITY_NONINVERTED = ((uint8_t)0x00) |
||||
}TIM1_ExtTRGPolarity_TypeDef; |
||||
|
||||
#define IS_TIM1_EXT_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_EXTTRGPOLARITY_INVERTED) || \ |
||||
((POLARITY) == TIM1_EXTTRGPOLARITY_NONINVERTED)) |
||||
|
||||
/** TIM1 Prescaler Reload Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM1_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), |
||||
TIM1_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) |
||||
}TIM1_PSCReloadMode_TypeDef; |
||||
|
||||
#define IS_TIM1_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM1_PSCRELOADMODE_UPDATE) || \ |
||||
((RELOAD) == TIM1_PSCRELOADMODE_IMMEDIATE)) |
||||
|
||||
/** TIM1 Encoder Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM1_ENCODERMODE_TI1 = ((uint8_t)0x01), |
||||
TIM1_ENCODERMODE_TI2 = ((uint8_t)0x02), |
||||
TIM1_ENCODERMODE_TI12 = ((uint8_t)0x03) |
||||
}TIM1_EncoderMode_TypeDef; |
||||
|
||||
#define IS_TIM1_ENCODER_MODE_OK(MODE) (((MODE) == TIM1_ENCODERMODE_TI1) || \ |
||||
((MODE) == TIM1_ENCODERMODE_TI2) || \
|
||||
((MODE) == TIM1_ENCODERMODE_TI12)) |
||||
|
||||
/** TIM1 Event Source */ |
||||
typedef enum |
||||
{ |
||||
TIM1_EVENTSOURCE_UPDATE = ((uint8_t)0x01), |
||||
TIM1_EVENTSOURCE_CC1 = ((uint8_t)0x02), |
||||
TIM1_EVENTSOURCE_CC2 = ((uint8_t)0x04), |
||||
TIM1_EVENTSOURCE_CC3 = ((uint8_t)0x08), |
||||
TIM1_EVENTSOURCE_CC4 = ((uint8_t)0x10), |
||||
TIM1_EVENTSOURCE_COM = ((uint8_t)0x20), |
||||
TIM1_EVENTSOURCE_TRIGGER = ((uint8_t)0x40), |
||||
TIM1_EVENTSOURCE_BREAK = ((uint8_t)0x80) |
||||
}TIM1_EventSource_TypeDef; |
||||
|
||||
#define IS_TIM1_EVENT_SOURCE_OK(SOURCE) ((SOURCE) != 0x00) |
||||
|
||||
/** TIM1 Update Source */ |
||||
typedef enum |
||||
{ |
||||
TIM1_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), |
||||
TIM1_UPDATESOURCE_REGULAR = ((uint8_t)0x01) |
||||
}TIM1_UpdateSource_TypeDef; |
||||
|
||||
#define IS_TIM1_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_UPDATESOURCE_GLOBAL) || \ |
||||
((SOURCE) == TIM1_UPDATESOURCE_REGULAR)) |
||||
|
||||
/** TIM1 Trigger Output Source */ |
||||
typedef enum |
||||
{ |
||||
TIM1_TRGOSOURCE_RESET = ((uint8_t)0x00), |
||||
TIM1_TRGOSOURCE_ENABLE = ((uint8_t)0x10), |
||||
TIM1_TRGOSOURCE_UPDATE = ((uint8_t)0x20), |
||||
TIM1_TRGOSource_OC1 = ((uint8_t)0x30), |
||||
TIM1_TRGOSOURCE_OC1REF = ((uint8_t)0x40), |
||||
TIM1_TRGOSOURCE_OC2REF = ((uint8_t)0x50), |
||||
TIM1_TRGOSOURCE_OC3REF = ((uint8_t)0x60) |
||||
}TIM1_TRGOSource_TypeDef; |
||||
|
||||
#define IS_TIM1_TRGO_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_TRGOSOURCE_RESET) || \ |
||||
((SOURCE) == TIM1_TRGOSOURCE_ENABLE) || \
|
||||
((SOURCE) == TIM1_TRGOSOURCE_UPDATE) || \
|
||||
((SOURCE) == TIM1_TRGOSource_OC1) || \
|
||||
((SOURCE) == TIM1_TRGOSOURCE_OC1REF) || \
|
||||
((SOURCE) == TIM1_TRGOSOURCE_OC2REF) || \
|
||||
((SOURCE) == TIM1_TRGOSOURCE_OC3REF)) |
||||
|
||||
/** TIM1 Slave Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM1_SLAVEMODE_RESET = ((uint8_t)0x04), |
||||
TIM1_SLAVEMODE_GATED = ((uint8_t)0x05), |
||||
TIM1_SLAVEMODE_TRIGGER = ((uint8_t)0x06), |
||||
TIM1_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) |
||||
}TIM1_SlaveMode_TypeDef; |
||||
|
||||
#define IS_TIM1_SLAVE_MODE_OK(MODE) (((MODE) == TIM1_SLAVEMODE_RESET) || \ |
||||
((MODE) == TIM1_SLAVEMODE_GATED) || \
|
||||
((MODE) == TIM1_SLAVEMODE_TRIGGER) || \
|
||||
((MODE) == TIM1_SLAVEMODE_EXTERNAL1)) |
||||
|
||||
/** TIM1 Flags */ |
||||
typedef enum |
||||
{ |
||||
TIM1_FLAG_UPDATE = ((uint16_t)0x0001), |
||||
TIM1_FLAG_CC1 = ((uint16_t)0x0002), |
||||
TIM1_FLAG_CC2 = ((uint16_t)0x0004), |
||||
TIM1_FLAG_CC3 = ((uint16_t)0x0008), |
||||
TIM1_FLAG_CC4 = ((uint16_t)0x0010), |
||||
TIM1_FLAG_COM = ((uint16_t)0x0020), |
||||
TIM1_FLAG_TRIGGER = ((uint16_t)0x0040), |
||||
TIM1_FLAG_BREAK = ((uint16_t)0x0080), |
||||
TIM1_FLAG_CC1OF = ((uint16_t)0x0200), |
||||
TIM1_FLAG_CC2OF = ((uint16_t)0x0400), |
||||
TIM1_FLAG_CC3OF = ((uint16_t)0x0800), |
||||
TIM1_FLAG_CC4OF = ((uint16_t)0x1000) |
||||
}TIM1_FLAG_TypeDef; |
||||
|
||||
#define IS_TIM1_GET_FLAG_OK(FLAG) (((FLAG) == TIM1_FLAG_UPDATE) || \ |
||||
((FLAG) == TIM1_FLAG_CC1) || \
|
||||
((FLAG) == TIM1_FLAG_CC2) || \
|
||||
((FLAG) == TIM1_FLAG_CC3) || \
|
||||
((FLAG) == TIM1_FLAG_CC4) || \
|
||||
((FLAG) == TIM1_FLAG_COM) || \
|
||||
((FLAG) == TIM1_FLAG_TRIGGER) || \
|
||||
((FLAG) == TIM1_FLAG_BREAK) || \
|
||||
((FLAG) == TIM1_FLAG_CC1OF) || \
|
||||
((FLAG) == TIM1_FLAG_CC2OF) || \
|
||||
((FLAG) == TIM1_FLAG_CC3OF) || \
|
||||
((FLAG) == TIM1_FLAG_CC4OF)) |
||||
|
||||
#define IS_TIM1_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & (uint16_t)0xE100) == 0x0000) && ((FLAG) != 0x0000)) |
||||
|
||||
/** TIM1 Forced Action */ |
||||
typedef enum |
||||
{ |
||||
TIM1_FORCEDACTION_ACTIVE = ((uint8_t)0x50), |
||||
TIM1_FORCEDACTION_INACTIVE = ((uint8_t)0x40) |
||||
}TIM1_ForcedAction_TypeDef; |
||||
|
||||
#define IS_TIM1_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM1_FORCEDACTION_ACTIVE) || \ |
||||
((ACTION) == TIM1_FORCEDACTION_INACTIVE)) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM1_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void TIM1_DeInit(void); |
||||
void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,
|
||||
TIM1_CounterMode_TypeDef TIM1_CounterMode, |
||||
uint16_t TIM1_Period, uint8_t TIM1_RepetitionCounter); |
||||
void TIM1_OC1Init(TIM1_OCMode_TypeDef TIM1_OCMode,
|
||||
TIM1_OutputState_TypeDef TIM1_OutputState,
|
||||
TIM1_OutputNState_TypeDef TIM1_OutputNState,
|
||||
uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity,
|
||||
TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity,
|
||||
TIM1_OCIdleState_TypeDef TIM1_OCIdleState,
|
||||
TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); |
||||
void TIM1_OC2Init(TIM1_OCMode_TypeDef TIM1_OCMode,
|
||||
TIM1_OutputState_TypeDef TIM1_OutputState,
|
||||
TIM1_OutputNState_TypeDef TIM1_OutputNState,
|
||||
uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity,
|
||||
TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity,
|
||||
TIM1_OCIdleState_TypeDef TIM1_OCIdleState,
|
||||
TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); |
||||
void TIM1_OC3Init(TIM1_OCMode_TypeDef TIM1_OCMode,
|
||||
TIM1_OutputState_TypeDef TIM1_OutputState,
|
||||
TIM1_OutputNState_TypeDef TIM1_OutputNState,
|
||||
uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity,
|
||||
TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity,
|
||||
TIM1_OCIdleState_TypeDef TIM1_OCIdleState,
|
||||
TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); |
||||
void TIM1_OC4Init(TIM1_OCMode_TypeDef TIM1_OCMode,
|
||||
TIM1_OutputState_TypeDef TIM1_OutputState, uint16_t TIM1_Pulse, |
||||
TIM1_OCPolarity_TypeDef TIM1_OCPolarity,
|
||||
TIM1_OCIdleState_TypeDef TIM1_OCIdleState); |
||||
void TIM1_BDTRConfig(TIM1_OSSIState_TypeDef TIM1_OSSIState,
|
||||
TIM1_LockLevel_TypeDef TIM1_LockLevel, uint8_t TIM1_DeadTime, |
||||
TIM1_BreakState_TypeDef TIM1_Break,
|
||||
TIM1_BreakPolarity_TypeDef TIM1_BreakPolarity,
|
||||
TIM1_AutomaticOutput_TypeDef TIM1_AutomaticOutput); |
||||
void TIM1_ICInit(TIM1_Channel_TypeDef TIM1_Channel,
|
||||
TIM1_ICPolarity_TypeDef TIM1_ICPolarity,
|
||||
TIM1_ICSelection_TypeDef TIM1_ICSelection,
|
||||
TIM1_ICPSC_TypeDef TIM1_ICPrescaler, uint8_t TIM1_ICFilter); |
||||
void TIM1_PWMIConfig(TIM1_Channel_TypeDef TIM1_Channel,
|
||||
TIM1_ICPolarity_TypeDef TIM1_ICPolarity,
|
||||
TIM1_ICSelection_TypeDef TIM1_ICSelection,
|
||||
TIM1_ICPSC_TypeDef TIM1_ICPrescaler, uint8_t TIM1_ICFilter); |
||||
void TIM1_Cmd(FunctionalState NewState); |
||||
void TIM1_CtrlPWMOutputs(FunctionalState NewState); |
||||
void TIM1_ITConfig(TIM1_IT_TypeDef TIM1_IT, FunctionalState NewState); |
||||
void TIM1_InternalClockConfig(void); |
||||
void TIM1_ETRClockMode1Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler,
|
||||
TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity,
|
||||
uint8_t ExtTRGFilter); |
||||
void TIM1_ETRClockMode2Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler,
|
||||
TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity,
|
||||
uint8_t ExtTRGFilter); |
||||
void TIM1_ETRConfig(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler,
|
||||
TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity,
|
||||
uint8_t ExtTRGFilter); |
||||
void TIM1_TIxExternalClockConfig(TIM1_TIxExternalCLK1Source_TypeDef TIM1_TIxExternalCLKSource,
|
||||
TIM1_ICPolarity_TypeDef TIM1_ICPolarity,
|
||||
uint8_t ICFilter); |
||||
void TIM1_SelectInputTrigger(TIM1_TS_TypeDef TIM1_InputTriggerSource); |
||||
void TIM1_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM1_UpdateRequestConfig(TIM1_UpdateSource_TypeDef TIM1_UpdateSource); |
||||
void TIM1_SelectHallSensor(FunctionalState NewState); |
||||
void TIM1_SelectOnePulseMode(TIM1_OPMode_TypeDef TIM1_OPMode); |
||||
void TIM1_SelectOutputTrigger(TIM1_TRGOSource_TypeDef TIM1_TRGOSource); |
||||
void TIM1_SelectSlaveMode(TIM1_SlaveMode_TypeDef TIM1_SlaveMode); |
||||
void TIM1_SelectMasterSlaveMode(FunctionalState NewState); |
||||
void TIM1_EncoderInterfaceConfig(TIM1_EncoderMode_TypeDef TIM1_EncoderMode,
|
||||
TIM1_ICPolarity_TypeDef TIM1_IC1Polarity,
|
||||
TIM1_ICPolarity_TypeDef TIM1_IC2Polarity); |
||||
void TIM1_PrescalerConfig(uint16_t Prescaler, TIM1_PSCReloadMode_TypeDef TIM1_PSCReloadMode); |
||||
void TIM1_CounterModeConfig(TIM1_CounterMode_TypeDef TIM1_CounterMode); |
||||
void TIM1_ForcedOC1Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); |
||||
void TIM1_ForcedOC2Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); |
||||
void TIM1_ForcedOC3Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); |
||||
void TIM1_ForcedOC4Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); |
||||
void TIM1_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM1_SelectCOM(FunctionalState NewState); |
||||
void TIM1_CCPreloadControl(FunctionalState NewState); |
||||
void TIM1_OC1PreloadConfig(FunctionalState NewState); |
||||
void TIM1_OC2PreloadConfig(FunctionalState NewState); |
||||
void TIM1_OC3PreloadConfig(FunctionalState NewState); |
||||
void TIM1_OC4PreloadConfig(FunctionalState NewState); |
||||
void TIM1_OC1FastConfig(FunctionalState NewState); |
||||
void TIM1_OC2FastConfig(FunctionalState NewState); |
||||
void TIM1_OC3FastConfig(FunctionalState NewState); |
||||
void TIM1_OC4FastConfig(FunctionalState NewState); |
||||
void TIM1_GenerateEvent(TIM1_EventSource_TypeDef TIM1_EventSource); |
||||
void TIM1_OC1PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); |
||||
void TIM1_OC1NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); |
||||
void TIM1_OC2PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); |
||||
void TIM1_OC2NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); |
||||
void TIM1_OC3PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); |
||||
void TIM1_OC3NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); |
||||
void TIM1_OC4PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); |
||||
void TIM1_CCxCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState); |
||||
void TIM1_CCxNCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState); |
||||
void TIM1_SelectOCxM(TIM1_Channel_TypeDef TIM1_Channel, TIM1_OCMode_TypeDef TIM1_OCMode); |
||||
void TIM1_SetCounter(uint16_t Counter); |
||||
void TIM1_SetAutoreload(uint16_t Autoreload); |
||||
void TIM1_SetCompare1(uint16_t Compare1); |
||||
void TIM1_SetCompare2(uint16_t Compare2); |
||||
void TIM1_SetCompare3(uint16_t Compare3); |
||||
void TIM1_SetCompare4(uint16_t Compare4); |
||||
void TIM1_SetIC1Prescaler(TIM1_ICPSC_TypeDef TIM1_IC1Prescaler); |
||||
void TIM1_SetIC2Prescaler(TIM1_ICPSC_TypeDef TIM1_IC2Prescaler); |
||||
void TIM1_SetIC3Prescaler(TIM1_ICPSC_TypeDef TIM1_IC3Prescaler); |
||||
void TIM1_SetIC4Prescaler(TIM1_ICPSC_TypeDef TIM1_IC4Prescaler); |
||||
uint16_t TIM1_GetCapture1(void); |
||||
uint16_t TIM1_GetCapture2(void); |
||||
uint16_t TIM1_GetCapture3(void); |
||||
uint16_t TIM1_GetCapture4(void); |
||||
uint16_t TIM1_GetCounter(void); |
||||
uint16_t TIM1_GetPrescaler(void); |
||||
FlagStatus TIM1_GetFlagStatus(TIM1_FLAG_TypeDef TIM1_FLAG); |
||||
void TIM1_ClearFlag(TIM1_FLAG_TypeDef TIM1_FLAG); |
||||
ITStatus TIM1_GetITStatus(TIM1_IT_TypeDef TIM1_IT); |
||||
void TIM1_ClearITPendingBit(TIM1_IT_TypeDef TIM1_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM1_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,342 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim2.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM2 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM2_H |
||||
#define __STM8S_TIM2_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
|
||||
/** TIM2 Forced Action */ |
||||
typedef enum |
||||
{ |
||||
TIM2_FORCEDACTION_ACTIVE = ((uint8_t)0x50), |
||||
TIM2_FORCEDACTION_INACTIVE = ((uint8_t)0x40) |
||||
}TIM2_ForcedAction_TypeDef; |
||||
|
||||
#define IS_TIM2_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM2_FORCEDACTION_ACTIVE) || \ |
||||
((ACTION) == TIM2_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM2 Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM2_PRESCALER_1 = ((uint8_t)0x00), |
||||
TIM2_PRESCALER_2 = ((uint8_t)0x01), |
||||
TIM2_PRESCALER_4 = ((uint8_t)0x02), |
||||
TIM2_PRESCALER_8 = ((uint8_t)0x03), |
||||
TIM2_PRESCALER_16 = ((uint8_t)0x04), |
||||
TIM2_PRESCALER_32 = ((uint8_t)0x05), |
||||
TIM2_PRESCALER_64 = ((uint8_t)0x06), |
||||
TIM2_PRESCALER_128 = ((uint8_t)0x07), |
||||
TIM2_PRESCALER_256 = ((uint8_t)0x08), |
||||
TIM2_PRESCALER_512 = ((uint8_t)0x09), |
||||
TIM2_PRESCALER_1024 = ((uint8_t)0x0A), |
||||
TIM2_PRESCALER_2048 = ((uint8_t)0x0B), |
||||
TIM2_PRESCALER_4096 = ((uint8_t)0x0C), |
||||
TIM2_PRESCALER_8192 = ((uint8_t)0x0D), |
||||
TIM2_PRESCALER_16384 = ((uint8_t)0x0E), |
||||
TIM2_PRESCALER_32768 = ((uint8_t)0x0F) |
||||
}TIM2_Prescaler_TypeDef; |
||||
|
||||
#define IS_TIM2_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM2_PRESCALER_1 ) || \ |
||||
((PRESCALER) == TIM2_PRESCALER_2 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_4 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_8 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_16 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_32 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_64 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_128 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_256 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_512 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_1024 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_2048 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_4096 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_8192 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_16384 ) || \
|
||||
((PRESCALER) == TIM2_PRESCALER_32768 )) |
||||
|
||||
/** TIM2 Output Compare and PWM modes */ |
||||
typedef enum |
||||
{ |
||||
TIM2_OCMODE_TIMING = ((uint8_t)0x00), |
||||
TIM2_OCMODE_ACTIVE = ((uint8_t)0x10), |
||||
TIM2_OCMODE_INACTIVE = ((uint8_t)0x20), |
||||
TIM2_OCMODE_TOGGLE = ((uint8_t)0x30), |
||||
TIM2_OCMODE_PWM1 = ((uint8_t)0x60), |
||||
TIM2_OCMODE_PWM2 = ((uint8_t)0x70) |
||||
}TIM2_OCMode_TypeDef; |
||||
|
||||
#define IS_TIM2_OC_MODE_OK(MODE) (((MODE) == TIM2_OCMODE_TIMING) || \ |
||||
((MODE) == TIM2_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM2_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM2_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM2_OCMODE_PWM1) || \
|
||||
((MODE) == TIM2_OCMODE_PWM2)) |
||||
|
||||
#define IS_TIM2_OCM_OK(MODE)(((MODE) == TIM2_OCMODE_TIMING) || \ |
||||
((MODE) == TIM2_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM2_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM2_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM2_OCMODE_PWM1) || \
|
||||
((MODE) == TIM2_OCMODE_PWM2) || \
|
||||
((MODE) == (uint8_t)TIM2_FORCEDACTION_ACTIVE) || \
|
||||
((MODE) == (uint8_t)TIM2_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM2 One Pulse Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM2_OPMODE_SINGLE = ((uint8_t)0x01), |
||||
TIM2_OPMODE_REPETITIVE = ((uint8_t)0x00) |
||||
}TIM2_OPMode_TypeDef; |
||||
|
||||
#define IS_TIM2_OPM_MODE_OK(MODE) (((MODE) == TIM2_OPMODE_SINGLE) || \ |
||||
((MODE) == TIM2_OPMODE_REPETITIVE)) |
||||
|
||||
/** TIM2 Channel */ |
||||
typedef enum |
||||
{ |
||||
TIM2_CHANNEL_1 = ((uint8_t)0x00), |
||||
TIM2_CHANNEL_2 = ((uint8_t)0x01), |
||||
TIM2_CHANNEL_3 = ((uint8_t)0x02) |
||||
}TIM2_Channel_TypeDef; |
||||
|
||||
#define IS_TIM2_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM2_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM2_CHANNEL_2) || \
|
||||
((CHANNEL) == TIM2_CHANNEL_3)) |
||||
|
||||
#define IS_TIM2_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM2_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM2_CHANNEL_2)) |
||||
|
||||
/** TIM2 Output Compare Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM2_OCPOLARITY_HIGH = ((uint8_t)0x00), |
||||
TIM2_OCPOLARITY_LOW = ((uint8_t)0x22) |
||||
}TIM2_OCPolarity_TypeDef; |
||||
|
||||
#define IS_TIM2_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM2_OCPOLARITY_HIGH) || \ |
||||
((POLARITY) == TIM2_OCPOLARITY_LOW)) |
||||
|
||||
/** TIM2 Output Compare states */ |
||||
typedef enum |
||||
{ |
||||
TIM2_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), |
||||
TIM2_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) |
||||
}TIM2_OutputState_TypeDef; |
||||
|
||||
#define IS_TIM2_OUTPUT_STATE_OK(STATE) (((STATE) == TIM2_OUTPUTSTATE_DISABLE) || \ |
||||
((STATE) == TIM2_OUTPUTSTATE_ENABLE)) |
||||
|
||||
/** TIM2 Input Capture Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM2_ICPOLARITY_RISING = ((uint8_t)0x00), |
||||
TIM2_ICPOLARITY_FALLING = ((uint8_t)0x44) |
||||
}TIM2_ICPolarity_TypeDef; |
||||
|
||||
#define IS_TIM2_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM2_ICPOLARITY_RISING) || \ |
||||
((POLARITY) == TIM2_ICPOLARITY_FALLING)) |
||||
|
||||
/** TIM2 Input Capture Selection */ |
||||
typedef enum |
||||
{ |
||||
TIM2_ICSELECTION_DIRECTTI = ((uint8_t)0x01), |
||||
TIM2_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), |
||||
TIM2_ICSELECTION_TRGI = ((uint8_t)0x03) |
||||
}TIM2_ICSelection_TypeDef; |
||||
|
||||
#define IS_TIM2_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM2_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM2_ICSELECTION_INDIRECTTI) || \
|
||||
((SELECTION) == TIM2_ICSELECTION_TRGI)) |
||||
|
||||
#define IS_TIM2_IC_SELECTION1_OK(SELECTION) (((SELECTION) == TIM2_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM2_ICSELECTION_TRGI)) |
||||
|
||||
/** TIM2 Input Capture Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM2_ICPSC_DIV1 = ((uint8_t)0x00), |
||||
TIM2_ICPSC_DIV2 = ((uint8_t)0x04), |
||||
TIM2_ICPSC_DIV4 = ((uint8_t)0x08), |
||||
TIM2_ICPSC_DIV8 = ((uint8_t)0x0C) |
||||
}TIM2_ICPSC_TypeDef; |
||||
|
||||
#define IS_TIM2_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM2_ICPSC_DIV1) || \ |
||||
((PRESCALER) == TIM2_ICPSC_DIV2) || \
|
||||
((PRESCALER) == TIM2_ICPSC_DIV4) || \
|
||||
((PRESCALER) == TIM2_ICPSC_DIV8)) |
||||
|
||||
/** TIM2 Input Capture Filer Value */ |
||||
#define IS_TIM2_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) |
||||
|
||||
/** TIM2 interrupt sources */ |
||||
typedef enum |
||||
{ |
||||
TIM2_IT_UPDATE = ((uint8_t)0x01), |
||||
TIM2_IT_CC1 = ((uint8_t)0x02), |
||||
TIM2_IT_CC2 = ((uint8_t)0x04), |
||||
TIM2_IT_CC3 = ((uint8_t)0x08) |
||||
}TIM2_IT_TypeDef; |
||||
|
||||
#define IS_TIM2_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x0F)) |
||||
|
||||
#define IS_TIM2_GET_IT_OK(IT) (((IT) == TIM2_IT_UPDATE) || \ |
||||
((IT) == TIM2_IT_CC1) || \
|
||||
((IT) == TIM2_IT_CC2) || \
|
||||
((IT) == TIM2_IT_CC3)) |
||||
|
||||
/** TIM2 Prescaler Reload Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM2_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), |
||||
TIM2_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) |
||||
}TIM2_PSCReloadMode_TypeDef; |
||||
|
||||
#define IS_TIM2_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM2_PSCRELOADMODE_UPDATE) || \ |
||||
((RELOAD) == TIM2_PSCRELOADMODE_IMMEDIATE)) |
||||
|
||||
/** TIM2 Event Source */ |
||||
typedef enum |
||||
{ |
||||
TIM2_EVENTSOURCE_UPDATE = ((uint8_t)0x01), |
||||
TIM2_EVENTSOURCE_CC1 = ((uint8_t)0x02), |
||||
TIM2_EVENTSOURCE_CC2 = ((uint8_t)0x04), |
||||
TIM2_EVENTSOURCE_CC3 = ((uint8_t)0x08) |
||||
}TIM2_EventSource_TypeDef; |
||||
|
||||
#define IS_TIM2_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) |
||||
|
||||
/** TIM2 Update Source */ |
||||
typedef enum |
||||
{ |
||||
TIM2_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), |
||||
TIM2_UPDATESOURCE_REGULAR = ((uint8_t)0x01) |
||||
}TIM2_UpdateSource_TypeDef; |
||||
|
||||
#define IS_TIM2_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM2_UPDATESOURCE_GLOBAL) || \ |
||||
((SOURCE) == TIM2_UPDATESOURCE_REGULAR)) |
||||
|
||||
/** TIM2 Flags */ |
||||
typedef enum |
||||
{ |
||||
TIM2_FLAG_UPDATE = ((uint16_t)0x0001), |
||||
TIM2_FLAG_CC1 = ((uint16_t)0x0002), |
||||
TIM2_FLAG_CC2 = ((uint16_t)0x0004), |
||||
TIM2_FLAG_CC3 = ((uint16_t)0x0008), |
||||
TIM2_FLAG_CC1OF = ((uint16_t)0x0200), |
||||
TIM2_FLAG_CC2OF = ((uint16_t)0x0400), |
||||
TIM2_FLAG_CC3OF = ((uint16_t)0x0800) |
||||
}TIM2_FLAG_TypeDef; |
||||
|
||||
#define IS_TIM2_GET_FLAG_OK(FLAG) (((FLAG) == TIM2_FLAG_UPDATE) || \ |
||||
((FLAG) == TIM2_FLAG_CC1) || \
|
||||
((FLAG) == TIM2_FLAG_CC2) || \
|
||||
((FLAG) == TIM2_FLAG_CC3) || \
|
||||
((FLAG) == TIM2_FLAG_CC1OF) || \
|
||||
((FLAG) == TIM2_FLAG_CC2OF) || \
|
||||
((FLAG) == TIM2_FLAG_CC3OF)) |
||||
|
||||
#define IS_TIM2_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF1F0) == 0x0000) && ((uint16_t)(FLAG) != 0x0000)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM2_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void TIM2_DeInit(void); |
||||
void TIM2_TimeBaseInit(TIM2_Prescaler_TypeDef TIM2_Prescaler, uint16_t TIM2_Period); |
||||
void TIM2_OC1Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_OC2Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_OC3Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_ICInit(TIM2_Channel_TypeDef TIM2_Channel, TIM2_ICPolarity_TypeDef TIM2_ICPolarity, TIM2_ICSelection_TypeDef TIM2_ICSelection, TIM2_ICPSC_TypeDef TIM2_ICPrescaler, uint8_t TIM2_ICFilter); |
||||
void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel, TIM2_ICPolarity_TypeDef TIM2_ICPolarity, TIM2_ICSelection_TypeDef TIM2_ICSelection, TIM2_ICPSC_TypeDef TIM2_ICPrescaler, uint8_t TIM2_ICFilter); |
||||
void TIM2_Cmd(FunctionalState NewState); |
||||
void TIM2_ITConfig(TIM2_IT_TypeDef TIM2_IT, FunctionalState NewState); |
||||
void TIM2_InternalClockConfig(void); |
||||
void TIM2_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM2_UpdateRequestConfig(TIM2_UpdateSource_TypeDef TIM2_UpdateSource); |
||||
void TIM2_SelectOnePulseMode(TIM2_OPMode_TypeDef TIM2_OPMode); |
||||
void TIM2_PrescalerConfig(TIM2_Prescaler_TypeDef Prescaler, TIM2_PSCReloadMode_TypeDef TIM2_PSCReloadMode); |
||||
void TIM2_ForcedOC1Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); |
||||
void TIM2_ForcedOC2Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); |
||||
void TIM2_ForcedOC3Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); |
||||
void TIM2_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM2_CCPreloadControl(FunctionalState NewState); |
||||
void TIM2_OC1PreloadConfig(FunctionalState NewState); |
||||
void TIM2_OC2PreloadConfig(FunctionalState NewState); |
||||
void TIM2_OC3PreloadConfig(FunctionalState NewState); |
||||
void TIM2_GenerateEvent(TIM2_EventSource_TypeDef TIM2_EventSource); |
||||
void TIM2_OC1PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_OC2PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_OC3PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); |
||||
void TIM2_CCxCmd(TIM2_Channel_TypeDef TIM2_Channel, FunctionalState NewState); |
||||
void TIM2_SelectOCxM(TIM2_Channel_TypeDef TIM2_Channel, TIM2_OCMode_TypeDef TIM2_OCMode); |
||||
void TIM2_SetCounter(uint16_t Counter); |
||||
void TIM2_SetAutoreload(uint16_t Autoreload); |
||||
void TIM2_SetCompare1(uint16_t Compare1); |
||||
void TIM2_SetCompare2(uint16_t Compare2); |
||||
void TIM2_SetCompare3(uint16_t Compare3); |
||||
void TIM2_SetIC1Prescaler(TIM2_ICPSC_TypeDef TIM2_IC1Prescaler); |
||||
void TIM2_SetIC2Prescaler(TIM2_ICPSC_TypeDef TIM2_IC2Prescaler); |
||||
void TIM2_SetIC3Prescaler(TIM2_ICPSC_TypeDef TIM2_IC3Prescaler); |
||||
uint16_t TIM2_GetCapture1(void); |
||||
uint16_t TIM2_GetCapture2(void); |
||||
uint16_t TIM2_GetCapture3(void); |
||||
uint16_t TIM2_GetCounter(void); |
||||
TIM2_Prescaler_TypeDef TIM2_GetPrescaler(void); |
||||
FlagStatus TIM2_GetFlagStatus(TIM2_FLAG_TypeDef TIM2_FLAG); |
||||
void TIM2_ClearFlag(TIM2_FLAG_TypeDef TIM2_FLAG); |
||||
ITStatus TIM2_GetITStatus(TIM2_IT_TypeDef TIM2_IT); |
||||
void TIM2_ClearITPendingBit(TIM2_IT_TypeDef TIM2_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM2_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,327 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim3.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM3 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM3_H |
||||
#define __STM8S_TIM3_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM3_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** TIM3 Forced Action */ |
||||
typedef enum |
||||
{ |
||||
TIM3_FORCEDACTION_ACTIVE = ((uint8_t)0x50), |
||||
TIM3_FORCEDACTION_INACTIVE = ((uint8_t)0x40) |
||||
} TIM3_ForcedAction_TypeDef; |
||||
|
||||
#define IS_TIM3_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM3_FORCEDACTION_ACTIVE) || \ |
||||
((ACTION) == TIM3_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM3 Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM3_PRESCALER_1 = ((uint8_t)0x00), |
||||
TIM3_PRESCALER_2 = ((uint8_t)0x01), |
||||
TIM3_PRESCALER_4 = ((uint8_t)0x02), |
||||
TIM3_PRESCALER_8 = ((uint8_t)0x03), |
||||
TIM3_PRESCALER_16 = ((uint8_t)0x04), |
||||
TIM3_PRESCALER_32 = ((uint8_t)0x05), |
||||
TIM3_PRESCALER_64 = ((uint8_t)0x06), |
||||
TIM3_PRESCALER_128 = ((uint8_t)0x07), |
||||
TIM3_PRESCALER_256 = ((uint8_t)0x08), |
||||
TIM3_PRESCALER_512 = ((uint8_t)0x09), |
||||
TIM3_PRESCALER_1024 = ((uint8_t)0x0A), |
||||
TIM3_PRESCALER_2048 = ((uint8_t)0x0B), |
||||
TIM3_PRESCALER_4096 = ((uint8_t)0x0C), |
||||
TIM3_PRESCALER_8192 = ((uint8_t)0x0D), |
||||
TIM3_PRESCALER_16384 = ((uint8_t)0x0E), |
||||
TIM3_PRESCALER_32768 = ((uint8_t)0x0F) |
||||
} TIM3_Prescaler_TypeDef; |
||||
|
||||
#define IS_TIM3_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM3_PRESCALER_1 ) || \ |
||||
((PRESCALER) == TIM3_PRESCALER_2 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_4 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_8 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_16 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_32 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_64 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_128 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_256 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_512 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_1024 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_2048 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_4096 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_8192 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_16384 ) || \
|
||||
((PRESCALER) == TIM3_PRESCALER_32768 )) |
||||
|
||||
/** TIM3 Output Compare and PWM modes */ |
||||
typedef enum |
||||
{ |
||||
TIM3_OCMODE_TIMING = ((uint8_t)0x00), |
||||
TIM3_OCMODE_ACTIVE = ((uint8_t)0x10), |
||||
TIM3_OCMODE_INACTIVE = ((uint8_t)0x20), |
||||
TIM3_OCMODE_TOGGLE = ((uint8_t)0x30), |
||||
TIM3_OCMODE_PWM1 = ((uint8_t)0x60), |
||||
TIM3_OCMODE_PWM2 = ((uint8_t)0x70) |
||||
} TIM3_OCMode_TypeDef; |
||||
|
||||
#define IS_TIM3_OC_MODE_OK(MODE) (((MODE) == TIM3_OCMODE_TIMING) || \ |
||||
((MODE) == TIM3_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM3_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM3_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM3_OCMODE_PWM1) || \
|
||||
((MODE) == TIM3_OCMODE_PWM2)) |
||||
|
||||
#define IS_TIM3_OCM_OK(MODE)(((MODE) == TIM3_OCMODE_TIMING) || \ |
||||
((MODE) == TIM3_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM3_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM3_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM3_OCMODE_PWM1) || \
|
||||
((MODE) == TIM3_OCMODE_PWM2) || \
|
||||
((MODE) == (uint8_t)TIM3_FORCEDACTION_ACTIVE) || \
|
||||
((MODE) == (uint8_t)TIM3_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM3 One Pulse Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM3_OPMODE_SINGLE = ((uint8_t)0x01), |
||||
TIM3_OPMODE_REPETITIVE = ((uint8_t)0x00) |
||||
} TIM3_OPMode_TypeDef; |
||||
|
||||
#define IS_TIM3_OPM_MODE_OK(MODE) (((MODE) == TIM3_OPMODE_SINGLE) || \ |
||||
((MODE) == TIM3_OPMODE_REPETITIVE)) |
||||
|
||||
/** TIM3 Channel */ |
||||
|
||||
typedef enum |
||||
{ |
||||
TIM3_CHANNEL_1 = ((uint8_t)0x00), |
||||
TIM3_CHANNEL_2 = ((uint8_t)0x01) |
||||
} TIM3_Channel_TypeDef; |
||||
|
||||
#define IS_TIM3_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM3_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM3_CHANNEL_2)) |
||||
|
||||
#define IS_TIM3_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM3_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM3_CHANNEL_2)) |
||||
|
||||
/** TIM3 Output Compare Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM3_OCPOLARITY_HIGH = ((uint8_t)0x00), |
||||
TIM3_OCPOLARITY_LOW = ((uint8_t)0x22) |
||||
} TIM3_OCPolarity_TypeDef; |
||||
|
||||
#define IS_TIM3_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM3_OCPOLARITY_HIGH) || \ |
||||
((POLARITY) == TIM3_OCPOLARITY_LOW)) |
||||
|
||||
/** TIM3 Output Compare states */ |
||||
typedef enum |
||||
{ |
||||
TIM3_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), |
||||
TIM3_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) |
||||
} TIM3_OutputState_TypeDef; |
||||
|
||||
#define IS_TIM3_OUTPUT_STATE_OK(STATE) (((STATE) == TIM3_OUTPUTSTATE_DISABLE) || \ |
||||
((STATE) == TIM3_OUTPUTSTATE_ENABLE)) |
||||
|
||||
/** TIM3 Input Capture Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM3_ICPOLARITY_RISING = ((uint8_t)0x00), |
||||
TIM3_ICPOLARITY_FALLING = ((uint8_t)0x44) |
||||
} TIM3_ICPolarity_TypeDef; |
||||
|
||||
#define IS_TIM3_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM3_ICPOLARITY_RISING) || \ |
||||
((POLARITY) == TIM3_ICPOLARITY_FALLING)) |
||||
|
||||
/** TIM3 Input Capture Selection */ |
||||
typedef enum |
||||
{ |
||||
TIM3_ICSELECTION_DIRECTTI = ((uint8_t)0x01), |
||||
TIM3_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), |
||||
TIM3_ICSELECTION_TRGI = ((uint8_t)0x03) |
||||
} TIM3_ICSelection_TypeDef; |
||||
|
||||
#define IS_TIM3_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM3_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM3_ICSELECTION_INDIRECTTI) || \
|
||||
((SELECTION) == TIM3_ICSELECTION_TRGI)) |
||||
|
||||
/** TIM3 Input Capture Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM3_ICPSC_DIV1 = ((uint8_t)0x00), |
||||
TIM3_ICPSC_DIV2 = ((uint8_t)0x04), |
||||
TIM3_ICPSC_DIV4 = ((uint8_t)0x08), |
||||
TIM3_ICPSC_DIV8 = ((uint8_t)0x0C) |
||||
} TIM3_ICPSC_TypeDef; |
||||
|
||||
#define IS_TIM3_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM3_ICPSC_DIV1) || \ |
||||
((PRESCALER) == TIM3_ICPSC_DIV2) || \
|
||||
((PRESCALER) == TIM3_ICPSC_DIV4) || \
|
||||
((PRESCALER) == TIM3_ICPSC_DIV8)) |
||||
|
||||
/** TIM3 Input Capture Filer Value */ |
||||
#define IS_TIM3_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) |
||||
|
||||
/** TIM3 interrupt sources */ |
||||
typedef enum |
||||
{ |
||||
TIM3_IT_UPDATE = ((uint8_t)0x01), |
||||
TIM3_IT_CC1 = ((uint8_t)0x02), |
||||
TIM3_IT_CC2 = ((uint8_t)0x04) |
||||
} TIM3_IT_TypeDef; |
||||
|
||||
#define IS_TIM3_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x07)) |
||||
|
||||
#define IS_TIM3_GET_IT_OK(IT) (((IT) == TIM3_IT_UPDATE) || \ |
||||
((IT) == TIM3_IT_CC1) || \
|
||||
((IT) == TIM3_IT_CC2)) |
||||
|
||||
/** TIM3 Prescaler Reload Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM3_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), |
||||
TIM3_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) |
||||
} TIM3_PSCReloadMode_TypeDef; |
||||
|
||||
#define IS_TIM3_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM3_PSCRELOADMODE_UPDATE) || \ |
||||
((RELOAD) == TIM3_PSCRELOADMODE_IMMEDIATE)) |
||||
|
||||
/** TIM3 Event Source */ |
||||
typedef enum |
||||
{ |
||||
TIM3_EVENTSOURCE_UPDATE = ((uint8_t)0x01), |
||||
TIM3_EVENTSOURCE_CC1 = ((uint8_t)0x02), |
||||
TIM3_EVENTSOURCE_CC2 = ((uint8_t)0x04) |
||||
} TIM3_EventSource_TypeDef; |
||||
|
||||
#define IS_TIM3_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) |
||||
|
||||
/** TIM3 Update Source */ |
||||
typedef enum |
||||
{ |
||||
TIM3_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), |
||||
TIM3_UPDATESOURCE_REGULAR = ((uint8_t)0x01) |
||||
} TIM3_UpdateSource_TypeDef; |
||||
|
||||
#define IS_TIM3_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM3_UPDATESOURCE_GLOBAL) || \ |
||||
((SOURCE) == TIM3_UPDATESOURCE_REGULAR)) |
||||
|
||||
/** TIM3 Flags */ |
||||
typedef enum |
||||
{ |
||||
TIM3_FLAG_UPDATE = ((uint16_t)0x0001), |
||||
TIM3_FLAG_CC1 = ((uint16_t)0x0002), |
||||
TIM3_FLAG_CC2 = ((uint16_t)0x0004), |
||||
TIM3_FLAG_CC1OF = ((uint16_t)0x0200), |
||||
TIM3_FLAG_CC2OF = ((uint16_t)0x0400) |
||||
} TIM3_FLAG_TypeDef; |
||||
|
||||
#define IS_TIM3_GET_FLAG_OK(FLAG) (((FLAG) == TIM3_FLAG_UPDATE) || \ |
||||
((FLAG) == TIM3_FLAG_CC1) || \
|
||||
((FLAG) == TIM3_FLAG_CC2) || \
|
||||
((FLAG) == TIM3_FLAG_CC1OF) || \
|
||||
((FLAG) == TIM3_FLAG_CC2OF) ) |
||||
|
||||
#define IS_TIM3_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF9F8) == 0x0000) && ((uint16_t)(FLAG)!= 0x0000)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM3_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void TIM3_DeInit(void); |
||||
void TIM3_TimeBaseInit(TIM3_Prescaler_TypeDef TIM3_Prescaler, uint16_t TIM3_Period); |
||||
void TIM3_OC1Init(TIM3_OCMode_TypeDef TIM3_OCMode, TIM3_OutputState_TypeDef TIM3_OutputState, uint16_t TIM3_Pulse, TIM3_OCPolarity_TypeDef TIM3_OCPolarity); |
||||
void TIM3_OC2Init(TIM3_OCMode_TypeDef TIM3_OCMode, TIM3_OutputState_TypeDef TIM3_OutputState, uint16_t TIM3_Pulse, TIM3_OCPolarity_TypeDef TIM3_OCPolarity); |
||||
void TIM3_ICInit(TIM3_Channel_TypeDef TIM3_Channel, TIM3_ICPolarity_TypeDef TIM3_ICPolarity, TIM3_ICSelection_TypeDef TIM3_ICSelection, TIM3_ICPSC_TypeDef TIM3_ICPrescaler, uint8_t TIM3_ICFilter); |
||||
void TIM3_PWMIConfig(TIM3_Channel_TypeDef TIM3_Channel, TIM3_ICPolarity_TypeDef TIM3_ICPolarity, TIM3_ICSelection_TypeDef TIM3_ICSelection, TIM3_ICPSC_TypeDef TIM3_ICPrescaler, uint8_t TIM3_ICFilter); |
||||
void TIM3_Cmd(FunctionalState NewState); |
||||
void TIM3_ITConfig(TIM3_IT_TypeDef TIM3_IT, FunctionalState NewState); |
||||
void TIM3_InternalClockConfig(void); |
||||
void TIM3_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM3_UpdateRequestConfig(TIM3_UpdateSource_TypeDef TIM3_UpdateSource); |
||||
void TIM3_SelectOnePulseMode(TIM3_OPMode_TypeDef TIM3_OPMode); |
||||
void TIM3_PrescalerConfig(TIM3_Prescaler_TypeDef Prescaler, TIM3_PSCReloadMode_TypeDef TIM3_PSCReloadMode); |
||||
void TIM3_ForcedOC1Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction); |
||||
void TIM3_ForcedOC2Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction); |
||||
void TIM3_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM3_CCPreloadControl(FunctionalState NewState); |
||||
void TIM3_OC1PreloadConfig(FunctionalState NewState); |
||||
void TIM3_OC2PreloadConfig(FunctionalState NewState); |
||||
void TIM3_GenerateEvent(TIM3_EventSource_TypeDef TIM3_EventSource); |
||||
void TIM3_OC1PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity); |
||||
void TIM3_OC2PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity); |
||||
void TIM3_CCxCmd(TIM3_Channel_TypeDef TIM3_Channel, FunctionalState NewState); |
||||
void TIM3_SelectOCxM(TIM3_Channel_TypeDef TIM3_Channel, TIM3_OCMode_TypeDef TIM3_OCMode); |
||||
void TIM3_SetCounter(uint16_t Counter); |
||||
void TIM3_SetAutoreload(uint16_t Autoreload); |
||||
void TIM3_SetCompare1(uint16_t Compare1); |
||||
void TIM3_SetCompare2(uint16_t Compare2); |
||||
void TIM3_SetIC1Prescaler(TIM3_ICPSC_TypeDef TIM3_IC1Prescaler); |
||||
void TIM3_SetIC2Prescaler(TIM3_ICPSC_TypeDef TIM3_IC2Prescaler); |
||||
uint16_t TIM3_GetCapture1(void); |
||||
uint16_t TIM3_GetCapture2(void); |
||||
uint16_t TIM3_GetCounter(void); |
||||
TIM3_Prescaler_TypeDef TIM3_GetPrescaler(void); |
||||
FlagStatus TIM3_GetFlagStatus(TIM3_FLAG_TypeDef TIM3_FLAG); |
||||
void TIM3_ClearFlag(TIM3_FLAG_TypeDef TIM3_FLAG); |
||||
ITStatus TIM3_GetITStatus(TIM3_IT_TypeDef TIM3_IT); |
||||
void TIM3_ClearITPendingBit(TIM3_IT_TypeDef TIM3_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM3_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,169 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim4.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM4 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM4_H |
||||
#define __STM8S_TIM4_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM4_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** TIM4 Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM4_PRESCALER_1 = ((uint8_t)0x00), |
||||
TIM4_PRESCALER_2 = ((uint8_t)0x01), |
||||
TIM4_PRESCALER_4 = ((uint8_t)0x02), |
||||
TIM4_PRESCALER_8 = ((uint8_t)0x03), |
||||
TIM4_PRESCALER_16 = ((uint8_t)0x04), |
||||
TIM4_PRESCALER_32 = ((uint8_t)0x05), |
||||
TIM4_PRESCALER_64 = ((uint8_t)0x06), |
||||
TIM4_PRESCALER_128 = ((uint8_t)0x07) |
||||
} TIM4_Prescaler_TypeDef; |
||||
|
||||
#define IS_TIM4_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM4_PRESCALER_1 ) || \ |
||||
((PRESCALER) == TIM4_PRESCALER_2 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_4 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_8 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_16 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_32 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_64 ) || \
|
||||
((PRESCALER) == TIM4_PRESCALER_128 ) ) |
||||
|
||||
/** TIM4 One Pulse Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM4_OPMODE_SINGLE = ((uint8_t)0x01), |
||||
TIM4_OPMODE_REPETITIVE = ((uint8_t)0x00) |
||||
} TIM4_OPMode_TypeDef; |
||||
|
||||
#define IS_TIM4_OPM_MODE_OK(MODE) (((MODE) == TIM4_OPMODE_SINGLE) || \ |
||||
((MODE) == TIM4_OPMODE_REPETITIVE)) |
||||
|
||||
/** TIM4 Prescaler Reload Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM4_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), |
||||
TIM4_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) |
||||
} TIM4_PSCReloadMode_TypeDef; |
||||
|
||||
#define IS_TIM4_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM4_PSCRELOADMODE_UPDATE) || \ |
||||
((RELOAD) == TIM4_PSCRELOADMODE_IMMEDIATE)) |
||||
|
||||
/** TIM4 Update Source */ |
||||
typedef enum |
||||
{ |
||||
TIM4_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), |
||||
TIM4_UPDATESOURCE_REGULAR = ((uint8_t)0x01) |
||||
} TIM4_UpdateSource_TypeDef; |
||||
|
||||
#define IS_TIM4_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM4_UPDATESOURCE_GLOBAL) || \ |
||||
((SOURCE) == TIM4_UPDATESOURCE_REGULAR)) |
||||
|
||||
/** TIM4 Event Source */ |
||||
typedef enum |
||||
{ |
||||
TIM4_EVENTSOURCE_UPDATE = ((uint8_t)0x01) |
||||
}TIM4_EventSource_TypeDef; |
||||
|
||||
#define IS_TIM4_EVENT_SOURCE_OK(SOURCE) (((SOURCE) == 0x01)) |
||||
|
||||
/** TIM4 Flags */ |
||||
typedef enum |
||||
{ |
||||
TIM4_FLAG_UPDATE = ((uint8_t)0x01) |
||||
}TIM4_FLAG_TypeDef; |
||||
|
||||
#define IS_TIM4_GET_FLAG_OK(FLAG) ((FLAG) == TIM4_FLAG_UPDATE) |
||||
|
||||
|
||||
|
||||
/** TIM4 interrupt sources */ |
||||
typedef enum |
||||
{ |
||||
TIM4_IT_UPDATE = ((uint8_t)0x01) |
||||
}TIM4_IT_TypeDef; |
||||
|
||||
#define IS_TIM4_IT_OK(IT) ((IT) == TIM4_IT_UPDATE) |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM4_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void TIM4_DeInit(void); |
||||
void TIM4_TimeBaseInit(TIM4_Prescaler_TypeDef TIM4_Prescaler, uint8_t TIM4_Period); |
||||
void TIM4_Cmd(FunctionalState NewState); |
||||
void TIM4_ITConfig(TIM4_IT_TypeDef TIM4_IT, FunctionalState NewState); |
||||
void TIM4_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM4_UpdateRequestConfig(TIM4_UpdateSource_TypeDef TIM4_UpdateSource); |
||||
void TIM4_SelectOnePulseMode(TIM4_OPMode_TypeDef TIM4_OPMode); |
||||
void TIM4_PrescalerConfig(TIM4_Prescaler_TypeDef Prescaler, TIM4_PSCReloadMode_TypeDef TIM4_PSCReloadMode); |
||||
void TIM4_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM4_GenerateEvent(TIM4_EventSource_TypeDef TIM4_EventSource); |
||||
void TIM4_SetCounter(uint8_t Counter); |
||||
void TIM4_SetAutoreload(uint8_t Autoreload); |
||||
uint8_t TIM4_GetCounter(void); |
||||
TIM4_Prescaler_TypeDef TIM4_GetPrescaler(void); |
||||
FlagStatus TIM4_GetFlagStatus(TIM4_FLAG_TypeDef TIM4_FLAG); |
||||
void TIM4_ClearFlag(TIM4_FLAG_TypeDef TIM4_FLAG); |
||||
ITStatus TIM4_GetITStatus(TIM4_IT_TypeDef TIM4_IT); |
||||
void TIM4_ClearITPendingBit(TIM4_IT_TypeDef TIM4_IT); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM4_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,478 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim5.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM5 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM5_H |
||||
#define __STM8S_TIM5_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
|
||||
/** TIM5 Forced Action */ |
||||
typedef enum |
||||
{ |
||||
TIM5_FORCEDACTION_ACTIVE =((uint8_t)0x50), |
||||
TIM5_FORCEDACTION_INACTIVE =((uint8_t)0x40) |
||||
}TIM5_ForcedAction_TypeDef; |
||||
|
||||
#define IS_TIM5_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM5_FORCEDACTION_ACTIVE) || \ |
||||
((ACTION) == TIM5_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM5 Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM5_PRESCALER_1 =((uint8_t)0x00), |
||||
TIM5_PRESCALER_2 =((uint8_t)0x01), |
||||
TIM5_PRESCALER_4 =((uint8_t)0x02), |
||||
TIM5_PRESCALER_8 =((uint8_t)0x03), |
||||
TIM5_PRESCALER_16 =((uint8_t)0x04), |
||||
TIM5_PRESCALER_32 =((uint8_t)0x05), |
||||
TIM5_PRESCALER_64 =((uint8_t)0x06), |
||||
TIM5_PRESCALER_128 =((uint8_t)0x07), |
||||
TIM5_PRESCALER_256 =((uint8_t)0x08), |
||||
TIM5_PRESCALER_512 =((uint8_t)0x09), |
||||
TIM5_PRESCALER_1024 =((uint8_t)0x0A), |
||||
TIM5_PRESCALER_2048 =((uint8_t)0x0B), |
||||
TIM5_PRESCALER_4096 =((uint8_t)0x0C), |
||||
TIM5_PRESCALER_8192 =((uint8_t)0x0D), |
||||
TIM5_PRESCALER_16384 =((uint8_t)0x0E), |
||||
TIM5_PRESCALER_32768 =((uint8_t)0x0F) |
||||
}TIM5_Prescaler_TypeDef; |
||||
|
||||
#define IS_TIM5_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM5_PRESCALER_1) || \ |
||||
((PRESCALER) == TIM5_PRESCALER_2 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_4 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_8 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_16 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_32 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_64 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_128 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_256 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_512 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_1024 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_2048 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_4096 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_8192 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_16384 ) || \
|
||||
((PRESCALER) == TIM5_PRESCALER_32768 )) |
||||
|
||||
/** TIM5 Output Compare and PWM modes */ |
||||
typedef enum |
||||
{ |
||||
TIM5_OCMODE_TIMING =((uint8_t)0x00), |
||||
TIM5_OCMODE_ACTIVE =((uint8_t)0x10), |
||||
TIM5_OCMODE_INACTIVE =((uint8_t)0x20), |
||||
TIM5_OCMODE_TOGGLE =((uint8_t)0x30), |
||||
TIM5_OCMODE_PWM1 =((uint8_t)0x60), |
||||
TIM5_OCMODE_PWM2 =((uint8_t)0x70) |
||||
}TIM5_OCMode_TypeDef; |
||||
|
||||
#define IS_TIM5_OC_MODE_OK(MODE) (((MODE) == TIM5_OCMODE_TIMING) || \ |
||||
((MODE) == TIM5_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM5_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM5_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM5_OCMODE_PWM1) || \
|
||||
((MODE) == TIM5_OCMODE_PWM2)) |
||||
|
||||
#define IS_TIM5_OCM_OK(MODE)(((MODE) == TIM5_OCMODE_TIMING) || \ |
||||
((MODE) == TIM5_OCMODE_ACTIVE) || \
|
||||
((MODE) == TIM5_OCMODE_INACTIVE) || \
|
||||
((MODE) == TIM5_OCMODE_TOGGLE)|| \
|
||||
((MODE) == TIM5_OCMODE_PWM1) || \
|
||||
((MODE) == TIM5_OCMODE_PWM2) || \
|
||||
((MODE) == (uint8_t)TIM5_FORCEDACTION_ACTIVE) || \
|
||||
((MODE) == (uint8_t)TIM5_FORCEDACTION_INACTIVE)) |
||||
|
||||
/** TIM5 One Pulse Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM5_OPMODE_SINGLE =((uint8_t)0x01), |
||||
TIM5_OPMODE_REPETITIVE =((uint8_t)0x00) |
||||
}TIM5_OPMode_TypeDef; |
||||
|
||||
#define IS_TIM5_OPM_MODE_OK(MODE) (((MODE) == TIM5_OPMODE_SINGLE) || \ |
||||
((MODE) == TIM5_OPMODE_REPETITIVE)) |
||||
|
||||
/** TIM5 Channel */ |
||||
typedef enum |
||||
{ |
||||
TIM5_CHANNEL_1 =((uint8_t)0x00), |
||||
TIM5_CHANNEL_2 =((uint8_t)0x01), |
||||
TIM5_CHANNEL_3 =((uint8_t)0x02) |
||||
}TIM5_Channel_TypeDef; |
||||
|
||||
#define IS_TIM5_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM5_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM5_CHANNEL_2) || \
|
||||
((CHANNEL) == TIM5_CHANNEL_3)) |
||||
|
||||
#define IS_TIM5_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM5_CHANNEL_1) || \ |
||||
((CHANNEL) == TIM5_CHANNEL_2)) |
||||
|
||||
/** TIM5 Output Compare Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM5_OCPOLARITY_HIGH =((uint8_t)0x00), |
||||
TIM5_OCPOLARITY_LOW =((uint8_t)0x22) |
||||
}TIM5_OCPolarity_TypeDef; |
||||
|
||||
#define IS_TIM5_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM5_OCPOLARITY_HIGH) || \ |
||||
((POLARITY) == TIM5_OCPOLARITY_LOW)) |
||||
|
||||
/** TIM5 Output Compare states */ |
||||
typedef enum |
||||
{ |
||||
TIM5_OUTPUTSTATE_DISABLE =((uint8_t)0x00), |
||||
TIM5_OUTPUTSTATE_ENABLE =((uint8_t)0x11) |
||||
}TIM5_OutputState_TypeDef; |
||||
|
||||
#define IS_TIM5_OUTPUT_STATE_OK(STATE) (((STATE) == TIM5_OUTPUTSTATE_DISABLE) || \ |
||||
((STATE) == TIM5_OUTPUTSTATE_ENABLE)) |
||||
|
||||
/** TIM5 Input Capture Polarity */ |
||||
typedef enum |
||||
{ |
||||
TIM5_ICPOLARITY_RISING =((uint8_t)0x00), |
||||
TIM5_ICPOLARITY_FALLING =((uint8_t)0x44) |
||||
}TIM5_ICPolarity_TypeDef; |
||||
|
||||
#define IS_TIM5_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM5_ICPOLARITY_RISING) || \ |
||||
((POLARITY) == TIM5_ICPOLARITY_FALLING)) |
||||
|
||||
/** TIM5 Input Capture Selection */ |
||||
typedef enum |
||||
{ |
||||
TIM5_ICSELECTION_DIRECTTI =((uint8_t)0x01), |
||||
TIM5_ICSELECTION_INDIRECTTI =((uint8_t)0x02), |
||||
TIM5_ICSELECTION_TRGI =((uint8_t)0x03) |
||||
}TIM5_ICSelection_TypeDef; |
||||
|
||||
#define IS_TIM5_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM5_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM5_ICSELECTION_INDIRECTTI) || \
|
||||
((SELECTION) == TIM5_ICSELECTION_TRGI)) |
||||
|
||||
#define IS_TIM5_IC_SELECTION1_OK(SELECTION) (((SELECTION) == TIM5_ICSELECTION_DIRECTTI) || \ |
||||
((SELECTION) == TIM5_ICSELECTION_TRGI)) |
||||
|
||||
/** TIM5 Input Capture Prescaler */ |
||||
typedef enum |
||||
{ |
||||
TIM5_ICPSC_DIV1 =((uint8_t)0x00), |
||||
TIM5_ICPSC_DIV2 =((uint8_t)0x04), |
||||
TIM5_ICPSC_DIV4 =((uint8_t)0x08), |
||||
TIM5_ICPSC_DIV8 =((uint8_t)0x0C) |
||||
}TIM5_ICPSC_TypeDef; |
||||
|
||||
#define IS_TIM5_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM5_ICPSC_DIV1) || \ |
||||
((PRESCALER) == TIM5_ICPSC_DIV2) || \
|
||||
((PRESCALER) == TIM5_ICPSC_DIV4) || \
|
||||
((PRESCALER) == TIM5_ICPSC_DIV8)) |
||||
|
||||
/** TIM5 Input Capture Filer Value */ |
||||
#define IS_TIM5_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) |
||||
|
||||
/** TIM5 interrupt sources */ |
||||
typedef enum |
||||
{ |
||||
TIM5_IT_UPDATE =((uint8_t)0x01), |
||||
TIM5_IT_CC1 =((uint8_t)0x02), |
||||
TIM5_IT_CC2 =((uint8_t)0x04), |
||||
TIM5_IT_CC3 =((uint8_t)0x08), |
||||
TIM5_IT_TRIGGER = ((uint8_t)0x40) |
||||
}TIM5_IT_TypeDef; |
||||
|
||||
#define IS_TIM5_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x4F)) |
||||
|
||||
#define IS_TIM5_GET_IT_OK(IT) (((IT) == TIM5_IT_UPDATE) || \ |
||||
((IT) == TIM5_IT_CC1) || \
|
||||
((IT) == TIM5_IT_CC2) || \
|
||||
((IT) == TIM5_IT_CC3) || \
|
||||
((IT) == TIM5_IT_TRIGGER)) |
||||
|
||||
/** TIM5 Prescaler Reload Mode */ |
||||
typedef enum |
||||
{ |
||||
TIM5_PSCRELOADMODE_UPDATE =((uint8_t)0x00), |
||||
TIM5_PSCRELOADMODE_IMMEDIATE =((uint8_t)0x01) |
||||
}TIM5_PSCReloadMode_TypeDef; |
||||
|
||||
#define IS_TIM5_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM5_PSCRELOADMODE_UPDATE) || \ |
||||
((RELOAD) == TIM5_PSCRELOADMODE_IMMEDIATE)) |
||||
|
||||
/** TIM5 Event Source */ |
||||
typedef enum |
||||
{ |
||||
TIM5_EVENTSOURCE_UPDATE =((uint8_t)0x01), |
||||
TIM5_EVENTSOURCE_CC1 =((uint8_t)0x02), |
||||
TIM5_EVENTSOURCE_CC2 =((uint8_t)0x04), |
||||
TIM5_EVENTSOURCE_CC3 =((uint8_t)0x08), |
||||
TIM5_EVENTSOURCE_TRIGGER = ((uint8_t)0x40) |
||||
}TIM5_EventSource_TypeDef; |
||||
|
||||
#define IS_TIM5_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) |
||||
|
||||
/** TIM5 Update Source */ |
||||
typedef enum |
||||
{ |
||||
TIM5_UPDATESOURCE_GLOBAL =((uint8_t)0x00), |
||||
TIM5_UPDATESOURCE_REGULAR =((uint8_t)0x01) |
||||
}TIM5_UpdateSource_TypeDef; |
||||
|
||||
|
||||
#define IS_TIM5_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM5_UPDATESOURCE_GLOBAL) || \ |
||||
((SOURCE) == TIM5_UPDATESOURCE_REGULAR)) |
||||
|
||||
/**
|
||||
* @brief TIM5 Trigger Output Source |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_TRGOSOURCE_RESET = ((uint8_t)0x00), /*!< Trigger Output source = Reset*/ |
||||
TIM5_TRGOSOURCE_ENABLE = ((uint8_t)0x10), /*!< Trigger Output source = TIM5 is enabled*/ |
||||
TIM5_TRGOSOURCE_UPDATE = ((uint8_t)0x20), /*!< Trigger Output source = Update event*/ |
||||
TIM5_TRGOSOURCE_OC1 = ((uint8_t)0x30), /*!< Trigger Output source = output compare channel1 */ |
||||
TIM5_TRGOSOURCE_OC1REF = ((uint8_t)0x40), /*!< Trigger Output source = output compare channel 1 reference */ |
||||
TIM5_TRGOSOURCE_OC2REF = ((uint8_t)0x50) /*!< Trigger Output source = output compare channel 2 reference */ |
||||
}TIM5_TRGOSource_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 TRGO source |
||||
*/ |
||||
#define IS_TIM5_TRGO_SOURCE_OK(SOURCE) \ |
||||
(((SOURCE) == TIM5_TRGOSOURCE_RESET) || \
|
||||
((SOURCE) == TIM5_TRGOSOURCE_ENABLE) || \
|
||||
((SOURCE) == TIM5_TRGOSOURCE_UPDATE) || \
|
||||
((SOURCE) == TIM5_TRGOSOURCE_OC1) || \
|
||||
((SOURCE) == TIM5_TRGOSOURCE_OC1REF) || \
|
||||
((SOURCE) == TIM5_TRGOSOURCE_OC2REF)) |
||||
|
||||
/** TIM5 Flags */ |
||||
typedef enum |
||||
{ |
||||
TIM5_FLAG_UPDATE =((uint16_t)0x0001), |
||||
TIM5_FLAG_CC1 =((uint16_t)0x0002), |
||||
TIM5_FLAG_CC2 =((uint16_t)0x0004), |
||||
TIM5_FLAG_CC3 =((uint16_t)0x0008), |
||||
TIM5_FLAG_TRIGGER = ((uint16_t)0x0040), |
||||
TIM5_FLAG_CC1OF =((uint16_t)0x0200), |
||||
TIM5_FLAG_CC2OF =((uint16_t)0x0400), |
||||
TIM5_FLAG_CC3OF =((uint16_t)0x0800) |
||||
}TIM5_FLAG_TypeDef; |
||||
|
||||
#define IS_TIM5_GET_FLAG_OK(FLAG) (((FLAG) == TIM5_FLAG_UPDATE) || \ |
||||
((FLAG) == TIM5_FLAG_CC1) || \
|
||||
((FLAG) == TIM5_FLAG_CC2) || \
|
||||
((FLAG) == TIM5_FLAG_CC3) || \
|
||||
((FLAG) == TIM5_FLAG_TRIGGER) || \
|
||||
((FLAG) == TIM5_FLAG_CC1OF) || \
|
||||
((FLAG) == TIM5_FLAG_CC2OF) || \
|
||||
((FLAG) == TIM5_FLAG_CC3OF)) |
||||
|
||||
#define IS_TIM5_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF1F0) == 0x0000) && ((uint16_t)(FLAG) != 0x0000)) |
||||
|
||||
|
||||
/**
|
||||
* @brief TIM5 Slave Mode |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_SLAVEMODE_RESET = ((uint8_t)0x04), /*!< Slave Mode Selection = Reset*/ |
||||
TIM5_SLAVEMODE_GATED = ((uint8_t)0x05), /*!< Slave Mode Selection = Gated*/ |
||||
TIM5_SLAVEMODE_TRIGGER = ((uint8_t)0x06), /*!< Slave Mode Selection = Trigger*/ |
||||
TIM5_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) /*!< Slave Mode Selection = External 1*/ |
||||
}TIM5_SlaveMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 Slave mode |
||||
*/ |
||||
#define IS_TIM5_SLAVE_MODE_OK(MODE) \ |
||||
(((MODE) == TIM5_SLAVEMODE_RESET) || \
|
||||
((MODE) == TIM5_SLAVEMODE_GATED) || \
|
||||
((MODE) == TIM5_SLAVEMODE_TRIGGER) || \
|
||||
((MODE) == TIM5_SLAVEMODE_EXTERNAL1)) |
||||
|
||||
/**
|
||||
* @brief TIM5 Internal Trigger Selection |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_TS_TIM6 = ((uint8_t)0x00), /*!< TRIG Input source = TIM6 TRIG Output */ |
||||
TIM5_TS_TIM1 = ((uint8_t)0x03) /*!< TRIG Input source = TIM1 TRIG Output */ |
||||
}TIM5_TS_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 Trigger Selection |
||||
*/ |
||||
#define IS_TIM5_TRIGGER_SELECTION_OK(SELECTION) \ |
||||
(((SELECTION) == TIM5_TS_TIM6) || \
|
||||
((SELECTION) == TIM5_TS_TIM1) ) |
||||
|
||||
|
||||
#define IS_TIM5_TIX_TRIGGER_SELECTION_OK(SELECTION) \ |
||||
(((SELECTION) == TIM5_TS_TI1F_ED) || \
|
||||
((SELECTION) == TIM5_TS_TI1FP1) || \
|
||||
((SELECTION) == TIM5_TS_TI2FP2)) |
||||
|
||||
|
||||
/**
|
||||
* @brief TIM5 Encoder Mode |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_ENCODERMODE_TI1 = ((uint8_t)0x01), /*!< Encoder mode 1*/ |
||||
TIM5_ENCODERMODE_TI2 = ((uint8_t)0x02), /*!< Encoder mode 2*/ |
||||
TIM5_ENCODERMODE_TI12 = ((uint8_t)0x03) /*!< Encoder mode 3*/ |
||||
}TIM5_EncoderMode_TypeDef; |
||||
/**
|
||||
* @brief Macro TIM5 encoder mode |
||||
*/ |
||||
#define IS_TIM5_ENCODER_MODE_OK(MODE) \ |
||||
(((MODE) == TIM5_ENCODERMODE_TI1) || \
|
||||
((MODE) == TIM5_ENCODERMODE_TI2) || \
|
||||
((MODE) == TIM5_ENCODERMODE_TI12)) |
||||
|
||||
/**
|
||||
* @brief TIM5 External Trigger Prescaler |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_EXTTRGPSC_OFF = ((uint8_t)0x00), /*!< No External Trigger prescaler */ |
||||
TIM5_EXTTRGPSC_DIV2 = ((uint8_t)0x10), /*!< External Trigger prescaler = 2 (ETRP frequency divided by 2) */ |
||||
TIM5_EXTTRGPSC_DIV4 = ((uint8_t)0x20), /*!< External Trigger prescaler = 4 (ETRP frequency divided by 4) */ |
||||
TIM5_EXTTRGPSC_DIV8 = ((uint8_t)0x30) /*!< External Trigger prescaler = 8 (ETRP frequency divided by 8) */ |
||||
}TIM5_ExtTRGPSC_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 external trigger prescaler |
||||
*/ |
||||
#define IS_TIM5_EXT_PRESCALER_OK(PRESCALER) \ |
||||
(((PRESCALER) == TIM5_EXTTRGPSC_OFF) || \
|
||||
((PRESCALER) == TIM5_EXTTRGPSC_DIV2) || \
|
||||
((PRESCALER) == TIM5_EXTTRGPSC_DIV4) || \
|
||||
((PRESCALER) == TIM5_EXTTRGPSC_DIV8)) |
||||
|
||||
/**
|
||||
* @brief TIM5 External Trigger Polarity |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM5_EXTTRGPOLARITY_INVERTED = ((uint8_t)0x80), /*!< External Trigger Polarity = inverted */ |
||||
TIM5_EXTTRGPOLARITY_NONINVERTED = ((uint8_t)0x00) /*!< External Trigger Polarity = non inverted */ |
||||
}TIM5_ExtTRGPolarity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 Trigger Polarity |
||||
*/ |
||||
#define IS_TIM5_EXT_POLARITY_OK(POLARITY) \ |
||||
(((POLARITY) == TIM5_EXTTRGPOLARITY_INVERTED) || \
|
||||
((POLARITY) == TIM5_EXTTRGPOLARITY_NONINVERTED)) |
||||
|
||||
/**
|
||||
* @brief Macro TIM5 External Trigger Filter |
||||
*/ |
||||
#define IS_TIM5_EXT_FILTER_OK(EXTFILTER) ((EXTFILTER) <= 0x0F) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM5_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void TIM5_DeInit(void); |
||||
void TIM5_TimeBaseInit(TIM5_Prescaler_TypeDef TIM5_Prescaler, uint16_t TIM5_Period); |
||||
void TIM5_OC1Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_OC2Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_OC3Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_ICInit(TIM5_Channel_TypeDef TIM5_Channel, TIM5_ICPolarity_TypeDef TIM5_ICPolarity, TIM5_ICSelection_TypeDef TIM5_ICSelection, TIM5_ICPSC_TypeDef TIM5_ICPrescaler, uint8_t TIM5_ICFilter); |
||||
void TIM5_PWMIConfig(TIM5_Channel_TypeDef TIM5_Channel, TIM5_ICPolarity_TypeDef TIM5_ICPolarity, TIM5_ICSelection_TypeDef TIM5_ICSelection, TIM5_ICPSC_TypeDef TIM5_ICPrescaler, uint8_t TIM5_ICFilter); |
||||
void TIM5_Cmd(FunctionalState NewState); |
||||
void TIM5_ITConfig(TIM5_IT_TypeDef TIM5_IT, FunctionalState NewState); |
||||
void TIM5_InternalClockConfig(void); |
||||
void TIM5_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM5_UpdateRequestConfig(TIM5_UpdateSource_TypeDef TIM5_UpdateSource); |
||||
void TIM5_SelectOnePulseMode(TIM5_OPMode_TypeDef TIM5_OPMode); |
||||
void TIM5_PrescalerConfig(TIM5_Prescaler_TypeDef Prescaler, TIM5_PSCReloadMode_TypeDef TIM5_PSCReloadMode); |
||||
void TIM5_SelectOutputTrigger(TIM5_TRGOSource_TypeDef TIM5_TRGOSource); |
||||
void TIM5_ForcedOC1Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); |
||||
void TIM5_ForcedOC2Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); |
||||
void TIM5_ForcedOC3Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); |
||||
void TIM5_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM5_CCPreloadControl(FunctionalState NewState); |
||||
void TIM5_OC1PreloadConfig(FunctionalState NewState); |
||||
void TIM5_OC2PreloadConfig(FunctionalState NewState); |
||||
void TIM5_OC3PreloadConfig(FunctionalState NewState); |
||||
void TIM5_GenerateEvent(TIM5_EventSource_TypeDef TIM5_EventSource); |
||||
void TIM5_OC1PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_OC2PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_OC3PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); |
||||
void TIM5_CCxCmd(TIM5_Channel_TypeDef TIM5_Channel, FunctionalState NewState); |
||||
void TIM5_SelectOCxM(TIM5_Channel_TypeDef TIM5_Channel, TIM5_OCMode_TypeDef TIM5_OCMode); |
||||
void TIM5_SetCounter(uint16_t Counter); |
||||
void TIM5_SetAutoreload(uint16_t Autoreload); |
||||
void TIM5_SetCompare1(uint16_t Compare1); |
||||
void TIM5_SetCompare2(uint16_t Compare2); |
||||
void TIM5_SetCompare3(uint16_t Compare3); |
||||
void TIM5_SetIC1Prescaler(TIM5_ICPSC_TypeDef TIM5_IC1Prescaler); |
||||
void TIM5_SetIC2Prescaler(TIM5_ICPSC_TypeDef TIM5_IC2Prescaler); |
||||
void TIM5_SetIC3Prescaler(TIM5_ICPSC_TypeDef TIM5_IC3Prescaler); |
||||
uint16_t TIM5_GetCapture1(void); |
||||
uint16_t TIM5_GetCapture2(void); |
||||
uint16_t TIM5_GetCapture3(void); |
||||
uint16_t TIM5_GetCounter(void); |
||||
TIM5_Prescaler_TypeDef TIM5_GetPrescaler(void); |
||||
FlagStatus TIM5_GetFlagStatus(TIM5_FLAG_TypeDef TIM5_FLAG); |
||||
void TIM5_ClearFlag(TIM5_FLAG_TypeDef TIM5_FLAG); |
||||
ITStatus TIM5_GetITStatus(TIM5_IT_TypeDef TIM5_IT); |
||||
void TIM5_ClearITPendingBit(TIM5_IT_TypeDef TIM5_IT); |
||||
void TIM5_SelectInputTrigger(TIM5_TS_TypeDef TIM5_InputTriggerSource); |
||||
void TIM5_SelectSlaveMode(TIM5_SlaveMode_TypeDef TIM5_SlaveMode); |
||||
void TIM5_EncoderInterfaceConfig(TIM5_EncoderMode_TypeDef TIM5_EncoderMode, TIM5_ICPolarity_TypeDef TIM5_IC1Polarity,TIM5_ICPolarity_TypeDef TIM5_IC2Polarity); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM5_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,287 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim6.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the TIM6 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_TIM6_H |
||||
#define __STM8S_TIM6_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported variables ------------------------------------------------------- */ |
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM6_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @brief TIM6 Prescaler |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_PRESCALER_1 = ((uint8_t)0x00), /*!< Time base Prescaler = 1 (No effect)*/ |
||||
TIM6_PRESCALER_2 = ((uint8_t)0x01), /*!< Time base Prescaler = 2 */ |
||||
TIM6_PRESCALER_4 = ((uint8_t)0x02), /*!< Time base Prescaler = 4 */ |
||||
TIM6_PRESCALER_8 = ((uint8_t)0x03), /*!< Time base Prescaler = 8 */ |
||||
TIM6_PRESCALER_16 = ((uint8_t)0x04), /*!< Time base Prescaler = 16 */ |
||||
TIM6_PRESCALER_32 = ((uint8_t)0x05), /*!< Time base Prescaler = 32 */ |
||||
TIM6_PRESCALER_64 = ((uint8_t)0x06), /*!< Time base Prescaler = 64 */ |
||||
TIM6_PRESCALER_128 = ((uint8_t)0x07) /*!< Time base Prescaler = 128 */ |
||||
}TIM6_Prescaler_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 One Pulse Mode |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_OPMODE_SINGLE = ((uint8_t)0x01), /*!< Single one Pulse mode (OPM Active) */ |
||||
TIM6_OPMODE_REPETITIVE = ((uint8_t)0x00) /*!< Repetitive Pulse mode (OPM inactive) */ |
||||
}TIM6_OPMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Prescaler Reload Mode |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_PSCRELOADMODE_UPDATE =((uint8_t)0x00), /*!< Prescaler value is reloaded at every update*/ |
||||
TIM6_PSCRELOADMODE_IMMEDIATE =((uint8_t)0x01) /*!< Prescaler value is reloaded immediately*/ |
||||
}TIM6_PSCReloadMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Update Source |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_UPDATESOURCE_GLOBAL =((uint8_t)0x00), /*!< Global Update request source */ |
||||
TIM6_UPDATESOURCE_REGULAR =((uint8_t)0x01) /*!< Regular Update request source */ |
||||
}TIM6_UpdateSource_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Event Source |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_EVENTSOURCE_UPDATE = ((uint8_t)0x01), /*!< Update Event*/ |
||||
TIM6_EVENTSOURCE_TRIGGER = ((uint8_t)0x40) /*!< Trigger Event*/ |
||||
}TIM6_EventSource_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Trigger Output Source |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_TRGOSOURCE_RESET = ((uint8_t)0x00), /*!< Trigger Output source = Reset*/ |
||||
TIM6_TRGOSOURCE_ENABLE = ((uint8_t)0x10), /*!< Trigger Output source = TIM5 is enabled*/ |
||||
TIM6_TRGOSOURCE_UPDATE = ((uint8_t)0x20) /*!< Trigger Output source = Update event*/ |
||||
}TIM6_TRGOSource_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Slave Mode |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_SLAVEMODE_DISABLE = ((uint8_t)0x00), /*!< Disable slave mode to clock the prescaler directly with the internal clock */ |
||||
TIM6_SLAVEMODE_RESET = ((uint8_t)0x04), /*!< Slave Mode Selection = Reset*/ |
||||
TIM6_SLAVEMODE_GATED = ((uint8_t)0x05), /*!< Slave Mode Selection = Gated*/ |
||||
TIM6_SLAVEMODE_TRIGGER = ((uint8_t)0x06), /*!< Slave Mode Selection = Trigger*/ |
||||
TIM6_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) /*!< Slave Mode Selection = External 1*/ |
||||
}TIM6_SlaveMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Flags |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_FLAG_UPDATE = ((uint8_t)0x01), /*!< Update Flag */ |
||||
TIM6_FLAG_TRIGGER = ((uint8_t)0x40) /*!< Trigger Flag */ |
||||
}TIM6_FLAG_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 interrupt sources |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_IT_UPDATE = ((uint8_t)0x01), /*!< Update Interrupt*/ |
||||
TIM6_IT_TRIGGER = ((uint8_t)0x40) /*!< Trigger Interrupt*/ |
||||
}TIM6_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @brief TIM6 Internal Trigger Selection |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
TIM6_TS_TIM1 = ((uint8_t)0x20),/*!< TRIG Input source = TIM1 TRIG Output */ |
||||
TIM6_TS_TIM5 = ((uint8_t)0x30) /*!< TRIG Input source = TIM5 TRIG Output */ |
||||
}TIM6_TS_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM6_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro TIM6 Prescaler |
||||
*/ |
||||
#define IS_TIM6_PRESCALER_OK(PRESCALER) \ |
||||
(((PRESCALER) == TIM6_PRESCALER_1) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_2) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_4) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_8) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_16) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_32) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_64) || \
|
||||
((PRESCALER) == TIM6_PRESCALER_128)) |
||||
/**
|
||||
* @brief Macro TIM6 One Pulse Mode |
||||
*/ |
||||
#define IS_TIM6_OPM_MODE_OK(MODE) \ |
||||
(((MODE) == TIM6_OPMODE_SINGLE) || \
|
||||
((MODE) == TIM6_OPMODE_REPETITIVE)) |
||||
|
||||
/**
|
||||
* @brief Macro TIM6 Prescaler reload |
||||
*/ |
||||
#define IS_TIM6_PRESCALER_RELOAD_OK(RELOAD) \ |
||||
(((RELOAD) == TIM6_PSCRELOADMODE_UPDATE) || \
|
||||
((RELOAD) == TIM6_PSCRELOADMODE_IMMEDIATE)) |
||||
/**
|
||||
* @brief Macro TIM6 Update source |
||||
*/ |
||||
#define IS_TIM6_UPDATE_SOURCE_OK(SOURCE) \ |
||||
(((SOURCE) == TIM6_UPDATESOURCE_GLOBAL) || \
|
||||
((SOURCE) == TIM6_UPDATESOURCE_REGULAR)) |
||||
/**
|
||||
* @brief Macro TIM6 Event source |
||||
*/ |
||||
#define IS_TIM6_EVENT_SOURCE_OK(SOURCE) \ |
||||
((((SOURCE) & (uint8_t)0xBE) == 0x00) && \
|
||||
((SOURCE) != 0x00)) |
||||
|
||||
/**
|
||||
* @brief Macro TIM6 TRGO source |
||||
*/ |
||||
#define IS_TIM6_TRGO_SOURCE_OK(SOURCE) \ |
||||
(((SOURCE) == TIM6_TRGOSOURCE_RESET) || \
|
||||
((SOURCE) == TIM6_TRGOSOURCE_ENABLE)|| \
|
||||
((SOURCE) == TIM6_TRGOSOURCE_UPDATE)) |
||||
/**
|
||||
* @brief Macro TIM6 Slave mode |
||||
*/ |
||||
#define IS_TIM6_SLAVE_MODE_OK(MODE) \ |
||||
(((MODE) == TIM6_SLAVEMODE_DISABLE) || \
|
||||
((MODE) == TIM6_SLAVEMODE_RESET) || \
|
||||
((MODE) == TIM6_SLAVEMODE_GATED) || \
|
||||
((MODE) == TIM6_SLAVEMODE_TRIGGER) || \
|
||||
((MODE) == TIM6_SLAVEMODE_EXTERNAL1)) |
||||
/**
|
||||
* @brief Macro TIM6 Flags |
||||
*/ |
||||
#define IS_TIM6_GET_FLAG_OK(FLAG) \ |
||||
(((FLAG) == TIM6_FLAG_UPDATE) || \
|
||||
((FLAG) == TIM6_FLAG_TRIGGER)) |
||||
|
||||
#define IS_TIM6_CLEAR_FLAG_OK(FLAG) \ |
||||
((((FLAG) & (uint8_t)0xBE) == 0x00) && ((FLAG) != 0x00)) |
||||
/**
|
||||
* @brief Macro TIM6 interrupts |
||||
*/ |
||||
#define IS_TIM6_IT_OK(IT) \ |
||||
(((IT) != 0x00) && \
|
||||
(((IT) & (uint8_t)(~(uint8_t)(0x41)))== 0x00)) |
||||
|
||||
#define IS_TIM6_GET_IT_OK(IT) \ |
||||
(((IT) == TIM6_IT_UPDATE) || \
|
||||
((IT) == TIM6_IT_TRIGGER)) |
||||
/**
|
||||
* @brief Macro TIM6 Trigger selection |
||||
*/ |
||||
#define IS_TIM6_TRIGGER_SELECTION_OK(SELECTION) \ |
||||
(((SELECTION) == TIM6_TS_TIM5) || \
|
||||
((SELECTION) == TIM6_TS_TIM1)) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup TIM6_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void TIM6_DeInit(void); |
||||
void TIM6_TimeBaseInit(TIM6_Prescaler_TypeDef TIM6_Prescaler, uint8_t TIM6_Period); |
||||
void TIM6_Cmd(FunctionalState NewState); |
||||
void TIM6_UpdateDisableConfig(FunctionalState NewState); |
||||
void TIM6_UpdateRequestConfig(TIM6_UpdateSource_TypeDef TIM6_UpdateSource); |
||||
void TIM6_SelectOnePulseMode(TIM6_OPMode_TypeDef TIM6_OPMode); |
||||
void TIM6_PrescalerConfig(TIM6_Prescaler_TypeDef Prescaler, TIM6_PSCReloadMode_TypeDef TIM6_PSCReloadMode); |
||||
void TIM6_ARRPreloadConfig(FunctionalState NewState); |
||||
void TIM6_SetCounter(uint8_t Counter); |
||||
void TIM6_SetAutoreload(uint8_t Autoreload); |
||||
uint8_t TIM6_GetCounter(void); |
||||
TIM6_Prescaler_TypeDef TIM6_GetPrescaler(void); |
||||
void TIM6_ITConfig(TIM6_IT_TypeDef TIM6_IT, FunctionalState NewState); |
||||
void TIM6_ClearFlag(TIM6_FLAG_TypeDef TIM6_FLAG); |
||||
ITStatus TIM6_GetITStatus(TIM6_IT_TypeDef TIM6_IT); |
||||
void TIM6_GenerateEvent(TIM6_EventSource_TypeDef TIM6_EventSource); |
||||
FlagStatus TIM6_GetFlagStatus(TIM6_FLAG_TypeDef TIM6_FLAG); |
||||
void TIM6_ClearITPendingBit(TIM6_IT_TypeDef TIM6_IT); |
||||
void TIM6_SelectOutputTrigger(TIM6_TRGOSource_TypeDef TIM6_TRGOSource); |
||||
void TIM6_SelectMasterSlaveMode(FunctionalState NewState); |
||||
void TIM6_SelectInputTrigger(TIM6_TS_TypeDef TIM6_InputTriggerSource); |
||||
void TIM6_InternalClockConfig(void); |
||||
void TIM6_SelectSlaveMode(TIM6_SlaveMode_TypeDef TIM6_SlaveMode); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_TIM6_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,383 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart1.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototypes and macros for the UART1 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_UART1_H |
||||
#define __STM8S_UART1_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART1_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @brief UART1 Irda Modes |
||||
*/ |
||||
|
||||
typedef enum { UART1_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ |
||||
UART1_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ |
||||
} UART1_IrDAMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 WakeUP Modes |
||||
*/ |
||||
typedef enum { UART1_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ |
||||
UART1_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ |
||||
} UART1_WakeUp_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 LIN Break detection length possible values |
||||
*/ |
||||
typedef enum { UART1_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ |
||||
UART1_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ |
||||
} UART1_LINBreakDetectionLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 stop bits possible values |
||||
*/ |
||||
|
||||
typedef enum { UART1_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ |
||||
UART1_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ |
||||
UART1_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ |
||||
UART1_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ |
||||
} UART1_StopBits_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 parity possible values |
||||
*/ |
||||
typedef enum { UART1_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ |
||||
UART1_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ |
||||
UART1_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ |
||||
} UART1_Parity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 Synchrone modes |
||||
*/ |
||||
typedef enum { UART1_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ |
||||
UART1_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ |
||||
UART1_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ |
||||
UART1_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ |
||||
UART1_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ |
||||
UART1_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ |
||||
UART1_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ |
||||
UART1_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ |
||||
} UART1_SyncMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 Word length possible values |
||||
*/ |
||||
typedef enum { UART1_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ |
||||
UART1_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ |
||||
} UART1_WordLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 Mode possible values |
||||
*/ |
||||
typedef enum { UART1_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ |
||||
UART1_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ |
||||
UART1_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ |
||||
UART1_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ |
||||
UART1_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ |
||||
} UART1_Mode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 Flag possible values |
||||
*/ |
||||
typedef enum { UART1_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ |
||||
UART1_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ |
||||
UART1_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ |
||||
UART1_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ |
||||
UART1_FLAG_OR = (uint16_t)0x0008, /*!< OverRun error flag */ |
||||
UART1_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ |
||||
UART1_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ |
||||
UART1_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ |
||||
UART1_FLAG_LBDF = (uint16_t)0x0210, /*!< Line Break Detection Flag */ |
||||
UART1_FLAG_SBK = (uint16_t)0x0101 /*!< Send Break characters Flag */ |
||||
} UART1_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART1 Interrupt definition |
||||
* UART1_IT possible values |
||||
* Elements values convention: 0xZYX |
||||
* X: Position of the corresponding Interrupt |
||||
* - For the following values, X means the interrupt position in the CR2 register. |
||||
* UART1_IT_TXE |
||||
* UART1_IT_TC |
||||
* UART1_IT_RXNE |
||||
* UART1_IT_IDLE
|
||||
* UART1_IT_OR
|
||||
* - For the UART1_IT_PE value, X means the flag position in the CR1 register. |
||||
* - For the UART1_IT_LBDF value, X means the flag position in the CR4 register. |
||||
* Y: Flag position |
||||
* - For the following values, Y means the flag (pending bit) position in the SR register. |
||||
* UART1_IT_TXE |
||||
* UART1_IT_TC |
||||
* UART1_IT_RXNE |
||||
* UART1_IT_IDLE
|
||||
* UART1_IT_OR |
||||
* UART1_IT_PE |
||||
* - For the UART1_IT_LBDF value, Y means the flag position in the CR4 register. |
||||
* Z: Register index: indicate in which register the dedicated interrupt source is: |
||||
* - 1==> CR1 register |
||||
* - 2==> CR2 register |
||||
* - 3==> CR4 register |
||||
*/ |
||||
typedef enum { UART1_IT_TXE = (uint16_t)0x0277, /*!< Transmit interrupt */ |
||||
UART1_IT_TC = (uint16_t)0x0266, /*!< Transmission Complete interrupt */ |
||||
UART1_IT_RXNE = (uint16_t)0x0255, /*!< Receive interrupt */ |
||||
UART1_IT_IDLE = (uint16_t)0x0244, /*!< IDLE line interrupt */ |
||||
UART1_IT_OR = (uint16_t)0x0235, /*!< Overrun Error interrupt */ |
||||
UART1_IT_PE = (uint16_t)0x0100, /*!< Parity Error interrupt */ |
||||
UART1_IT_LBDF = (uint16_t)0x0346, /**< LIN break detection interrupt */ |
||||
UART1_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ |
||||
} UART1_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART1_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the MODEs possible combination should be one of |
||||
* the following |
||||
*/ |
||||
#define IS_UART1_MODE_OK(Mode) \ |
||||
(((Mode) == (uint8_t)UART1_MODE_RX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART1_MODE_RX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART1_MODE_TX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART1_MODE_TX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART1_MODE_TXRX_ENABLE) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_ENABLE|(uint8_t)UART1_MODE_RX_ENABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_ENABLE|(uint8_t)UART1_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_DISABLE|(uint8_t)UART1_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_DISABLE|(uint8_t)UART1_MODE_RX_ENABLE))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WordLengths |
||||
*/ |
||||
#define IS_UART1_WORDLENGTH_OK(WordLength) \ |
||||
(((WordLength) == UART1_WORDLENGTH_8D) || \
|
||||
((WordLength) == UART1_WORDLENGTH_9D)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the SyncModes; it should exclude values such
|
||||
* as UART1_CLOCK_ENABLE|UART1_CLOCK_DISABLE |
||||
*/ |
||||
#define IS_UART1_SYNCMODE_OK(SyncMode) \ |
||||
(!((((SyncMode)&(((uint8_t)UART1_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART1_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART1_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART1_SYNCMODE_CLOCK_DISABLE))) \
|
||||
|| (((SyncMode)&(((uint8_t)UART1_SYNCMODE_CPOL_LOW )|((uint8_t)UART1_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART1_SYNCMODE_CPOL_LOW )|((uint8_t)UART1_SYNCMODE_CPOL_HIGH))) \
|
||||
||(((SyncMode)&(((uint8_t)UART1_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART1_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART1_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART1_SYNCMODE_CPHA_BEGINING))) \
|
||||
|| (((SyncMode)&(((uint8_t)UART1_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART1_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART1_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART1_SYNCMODE_LASTBIT_ENABLE))))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the FLAGs |
||||
*/ |
||||
#define IS_UART1_FLAG_OK(Flag) \ |
||||
(((Flag) == UART1_FLAG_TXE) || \
|
||||
((Flag) == UART1_FLAG_TC) || \
|
||||
((Flag) == UART1_FLAG_RXNE) || \
|
||||
((Flag) == UART1_FLAG_IDLE) || \
|
||||
((Flag) == UART1_FLAG_OR) || \
|
||||
((Flag) == UART1_FLAG_NF) || \
|
||||
((Flag) == UART1_FLAG_FE) || \
|
||||
((Flag) == UART1_FLAG_PE) || \
|
||||
((Flag) == UART1_FLAG_SBK) || \
|
||||
((Flag) == UART1_FLAG_LBDF)) |
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the FLAGs that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART1_CLEAR_FLAG_OK(Flag) \ |
||||
(((Flag) == UART1_FLAG_RXNE) || \
|
||||
((Flag) == UART1_FLAG_LBDF)) |
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different
|
||||
* sensitivity values for the Interrupts |
||||
*/ |
||||
|
||||
#define IS_UART1_CONFIG_IT_OK(Interrupt) \ |
||||
(((Interrupt) == UART1_IT_PE) || \
|
||||
((Interrupt) == UART1_IT_TXE) || \
|
||||
((Interrupt) == UART1_IT_TC) || \
|
||||
((Interrupt) == UART1_IT_RXNE_OR ) || \
|
||||
((Interrupt) == UART1_IT_IDLE) || \
|
||||
((Interrupt) == UART1_IT_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit |
||||
*/ |
||||
#define IS_UART1_GET_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART1_IT_TXE) || \
|
||||
((ITPendingBit) == UART1_IT_TC) || \
|
||||
((ITPendingBit) == UART1_IT_RXNE) || \
|
||||
((ITPendingBit) == UART1_IT_IDLE) || \
|
||||
((ITPendingBit) == UART1_IT_OR) || \
|
||||
((ITPendingBit) == UART1_IT_LBDF) || \
|
||||
((ITPendingBit) == UART1_IT_PE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART1_CLEAR_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART1_IT_RXNE) || \
|
||||
((ITPendingBit) == UART1_IT_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the IrDAModes |
||||
*/ |
||||
#define IS_UART1_IRDAMODE_OK(IrDAMode) \ |
||||
(((IrDAMode) == UART1_IRDAMODE_LOWPOWER) || \
|
||||
((IrDAMode) == UART1_IRDAMODE_NORMAL)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WakeUps |
||||
*/ |
||||
#define IS_UART1_WAKEUP_OK(WakeUp) \ |
||||
(((WakeUp) == UART1_WAKEUP_IDLELINE) || \
|
||||
((WakeUp) == UART1_WAKEUP_ADDRESSMARK)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different
|
||||
* sensitivity values for the LINBreakDetectionLengths |
||||
*/ |
||||
#define IS_UART1_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ |
||||
(((LINBreakDetectionLength) == UART1_LINBREAKDETECTIONLENGTH_10BITS) || \
|
||||
((LINBreakDetectionLength) == UART1_LINBREAKDETECTIONLENGTH_11BITS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the UART1_StopBits |
||||
*/ |
||||
#define IS_UART1_STOPBITS_OK(StopBit) (((StopBit) == UART1_STOPBITS_1) || \ |
||||
((StopBit) == UART1_STOPBITS_0_5) || \
|
||||
((StopBit) == UART1_STOPBITS_2) || \
|
||||
((StopBit) == UART1_STOPBITS_1_5 )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the Parity |
||||
*/ |
||||
#define IS_UART1_PARITY_OK(Parity) (((Parity) == UART1_PARITY_NO) || \ |
||||
((Parity) == UART1_PARITY_EVEN) || \
|
||||
((Parity) == UART1_PARITY_ODD )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the maximum |
||||
* baudrate value |
||||
*/ |
||||
#define IS_UART1_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the address |
||||
* of the UART1 or UART node |
||||
*/ |
||||
#define UART1_ADDRESS_MAX ((uint8_t)16) |
||||
#define IS_UART1_ADDRESS_OK(node) ((node) < UART1_ADDRESS_MAX ) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup UART1_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void UART1_DeInit(void); |
||||
void UART1_Init(uint32_t BaudRate, UART1_WordLength_TypeDef WordLength,
|
||||
UART1_StopBits_TypeDef StopBits, UART1_Parity_TypeDef Parity,
|
||||
UART1_SyncMode_TypeDef SyncMode, UART1_Mode_TypeDef Mode); |
||||
void UART1_Cmd(FunctionalState NewState); |
||||
void UART1_ITConfig(UART1_IT_TypeDef UART1_IT, FunctionalState NewState); |
||||
void UART1_HalfDuplexCmd(FunctionalState NewState); |
||||
void UART1_IrDAConfig(UART1_IrDAMode_TypeDef UART1_IrDAMode); |
||||
void UART1_IrDACmd(FunctionalState NewState); |
||||
void UART1_LINBreakDetectionConfig(UART1_LINBreakDetectionLength_TypeDef UART1_LINBreakDetectionLength); |
||||
void UART1_LINCmd(FunctionalState NewState); |
||||
void UART1_SmartCardCmd(FunctionalState NewState); |
||||
void UART1_SmartCardNACKCmd(FunctionalState NewState); |
||||
void UART1_WakeUpConfig(UART1_WakeUp_TypeDef UART1_WakeUp); |
||||
void UART1_ReceiverWakeUpCmd(FunctionalState NewState); |
||||
uint8_t UART1_ReceiveData8(void); |
||||
uint16_t UART1_ReceiveData9(void); |
||||
void UART1_SendData8(uint8_t Data); |
||||
void UART1_SendData9(uint16_t Data); |
||||
void UART1_SendBreak(void); |
||||
void UART1_SetAddress(uint8_t UART1_Address); |
||||
void UART1_SetGuardTime(uint8_t UART1_GuardTime); |
||||
void UART1_SetPrescaler(uint8_t UART1_Prescaler); |
||||
FlagStatus UART1_GetFlagStatus(UART1_Flag_TypeDef UART1_FLAG); |
||||
void UART1_ClearFlag(UART1_Flag_TypeDef UART1_FLAG); |
||||
ITStatus UART1_GetITStatus(UART1_IT_TypeDef UART1_IT); |
||||
void UART1_ClearITPendingBit(UART1_IT_TypeDef UART1_IT); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_UART1_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,447 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart2.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototypes and macros for the UART2 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_UART2_H |
||||
#define __STM8S_UART2_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART2_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief UART2 Irda Modes |
||||
*/ |
||||
|
||||
typedef enum { UART2_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ |
||||
UART2_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ |
||||
|
||||
} UART2_IrDAMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 WakeUP Modes |
||||
*/ |
||||
|
||||
typedef enum { UART2_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ |
||||
UART2_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ |
||||
} UART2_WakeUp_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART2 LIN Break detection length possible values |
||||
*/ |
||||
typedef enum { UART2_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ |
||||
UART2_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ |
||||
} UART2_LINBreakDetectionLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 stop bits possible values |
||||
*/ |
||||
|
||||
typedef enum { UART2_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ |
||||
UART2_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ |
||||
UART2_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ |
||||
UART2_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ |
||||
} UART2_StopBits_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART2 parity possible values |
||||
*/ |
||||
typedef enum { UART2_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ |
||||
UART2_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ |
||||
UART2_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ |
||||
} UART2_Parity_TypeDef; |
||||
/**
|
||||
* @brief UART2 Mode possible values |
||||
*/ |
||||
typedef enum { UART2_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ |
||||
UART2_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ |
||||
} UART2_LinMode_TypeDef; |
||||
/**
|
||||
* @brief UART2 automatic resynchronisation possible values |
||||
*/ |
||||
typedef enum { UART2_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ |
||||
UART2_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ |
||||
} UART2_LinAutosync_TypeDef; |
||||
/**
|
||||
* @brief UART2 Divider Update Method possible values |
||||
*/ |
||||
typedef enum { UART2_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ |
||||
UART2_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ |
||||
} UART2_LinDivUp_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 Synchrone modes |
||||
*/ |
||||
typedef enum { UART2_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ |
||||
UART2_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ |
||||
UART2_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ |
||||
UART2_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ |
||||
UART2_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ |
||||
UART2_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ |
||||
UART2_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ |
||||
UART2_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ |
||||
} UART2_SyncMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 Word length possible values |
||||
*/ |
||||
typedef enum { UART2_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ |
||||
UART2_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ |
||||
} UART2_WordLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 Mode possible values |
||||
*/ |
||||
typedef enum { UART2_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ |
||||
UART2_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ |
||||
UART2_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ |
||||
UART2_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ |
||||
UART2_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ |
||||
} UART2_Mode_TypeDef; |
||||
/**
|
||||
* @brief UART2 Flag possible values |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
UART2_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ |
||||
UART2_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ |
||||
UART2_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ |
||||
UART2_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ |
||||
UART2_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ |
||||
UART2_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ |
||||
UART2_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ |
||||
UART2_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ |
||||
UART2_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ |
||||
UART2_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ |
||||
UART2_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ |
||||
UART2_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ |
||||
} UART2_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART2 Interrupt definition |
||||
* UART2_IT possible values |
||||
* Elements values convention: 0xZYX |
||||
* X: Position of the corresponding Interrupt |
||||
* - For the following values, X means the interrupt position in the CR2 register. |
||||
* UART2_IT_TXE |
||||
* UART2_IT_TC |
||||
* UART2_IT_RXNE |
||||
* UART2_IT_IDLE
|
||||
* UART2_IT_OR
|
||||
* - For the UART2_IT_PE value, X means the flag position in the CR1 register. |
||||
* - For the UART2_IT_LBDF value, X means the flag position in the CR4 register. |
||||
* - For the UART2_IT_LHDF value, X means the flag position in the CR6 register. |
||||
* Y: Flag position |
||||
* - For the following values, Y means the flag (pending bit) position in the SR register. |
||||
* UART2_IT_TXE |
||||
* UART2_IT_TC |
||||
* UART2_IT_RXNE |
||||
* UART2_IT_IDLE
|
||||
* UART2_IT_OR |
||||
* UART2_IT_PE |
||||
* - For the UART2_IT_LBDF value, Y means the flag position in the CR4 register. |
||||
* - For the UART2_IT_LHDF value, Y means the flag position in the CR6 register. |
||||
* Z: Register index: indicate in which register the dedicated interrupt source is: |
||||
* - 1==> CR1 register |
||||
* - 2==> CR2 register |
||||
* - 3==> CR4 register |
||||
* - 4==> CR6 register |
||||
*/ |
||||
typedef enum { UART2_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ |
||||
UART2_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ |
||||
UART2_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ |
||||
UART2_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ |
||||
UART2_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ |
||||
UART2_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ |
||||
UART2_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ |
||||
UART2_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ |
||||
UART2_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ |
||||
} UART2_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART2_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the MODEs possible combination should be one of |
||||
* the following. |
||||
*/ |
||||
|
||||
#define IS_UART2_MODE_OK(Mode) \ |
||||
(((Mode) == (uint8_t)UART2_MODE_RX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART2_MODE_RX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART2_MODE_TX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART2_MODE_TX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART2_MODE_TXRX_ENABLE) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_ENABLE|(uint8_t)UART2_MODE_RX_ENABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_ENABLE|(uint8_t)UART2_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_DISABLE|(uint8_t)UART2_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_DISABLE|(uint8_t)UART2_MODE_RX_ENABLE))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WordLengths |
||||
*/ |
||||
#define IS_UART2_WORDLENGTH_OK(WordLength) \ |
||||
(((WordLength) == UART2_WORDLENGTH_8D) || \
|
||||
((WordLength) == UART2_WORDLENGTH_9D)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the SyncModes; it should exclude values such
|
||||
* as UART2_CLOCK_ENABLE|UART2_CLOCK_DISABLE |
||||
*/ |
||||
#define IS_UART2_SYNCMODE_OK(SyncMode) \ |
||||
(!((((SyncMode)&(((uint8_t)UART2_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART2_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART2_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART2_SYNCMODE_CLOCK_DISABLE))) || \
|
||||
(((SyncMode)&(((uint8_t)UART2_SYNCMODE_CPOL_LOW )|((uint8_t)UART2_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART2_SYNCMODE_CPOL_LOW )|((uint8_t)UART2_SYNCMODE_CPOL_HIGH))) || \
|
||||
(((SyncMode)&(((uint8_t)UART2_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART2_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART2_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART2_SYNCMODE_CPHA_BEGINING))) || \
|
||||
(((SyncMode)&(((uint8_t)UART2_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART2_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART2_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART2_SYNCMODE_LASTBIT_ENABLE))))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs |
||||
*/ |
||||
#define IS_UART2_FLAG_OK(Flag) \ |
||||
(((Flag) == UART2_FLAG_TXE) || \
|
||||
((Flag) == UART2_FLAG_TC) || \
|
||||
((Flag) == UART2_FLAG_RXNE) || \
|
||||
((Flag) == UART2_FLAG_IDLE) || \
|
||||
((Flag) == UART2_FLAG_OR_LHE) || \
|
||||
((Flag) == UART2_FLAG_NF) || \
|
||||
((Flag) == UART2_FLAG_FE) || \
|
||||
((Flag) == UART2_FLAG_PE) || \
|
||||
((Flag) == UART2_FLAG_SBK) || \
|
||||
((Flag) == UART2_FLAG_LSF) || \
|
||||
((Flag) == UART2_FLAG_LHDF) || \
|
||||
((Flag) == UART2_FLAG_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART2_CLEAR_FLAG_OK(Flag) \ |
||||
(((Flag) == UART2_FLAG_RXNE) || \
|
||||
((Flag) == UART2_FLAG_LHDF) || \
|
||||
((Flag) == UART2_FLAG_LSF) || \
|
||||
((Flag) == UART2_FLAG_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check
|
||||
* the different sensitivity values for the Interrupts |
||||
*/ |
||||
|
||||
#define IS_UART2_CONFIG_IT_OK(Interrupt) \ |
||||
(((Interrupt) == UART2_IT_PE) || \
|
||||
((Interrupt) == UART2_IT_TXE) || \
|
||||
((Interrupt) == UART2_IT_TC) || \
|
||||
((Interrupt) == UART2_IT_RXNE_OR ) || \
|
||||
((Interrupt) == UART2_IT_IDLE) || \
|
||||
((Interrupt) == UART2_IT_LHDF) || \
|
||||
((Interrupt) == UART2_IT_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit |
||||
*/ |
||||
#define IS_UART2_GET_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART2_IT_TXE) || \
|
||||
((ITPendingBit) == UART2_IT_TC) || \
|
||||
((ITPendingBit) == UART2_IT_RXNE) || \
|
||||
((ITPendingBit) == UART2_IT_IDLE) || \
|
||||
((ITPendingBit) == UART2_IT_OR) || \
|
||||
((ITPendingBit) == UART2_IT_LBDF) || \
|
||||
((ITPendingBit) == UART2_IT_LHDF) || \
|
||||
((ITPendingBit) == UART2_IT_PE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART2_CLEAR_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART2_IT_RXNE) || \
|
||||
((ITPendingBit) == UART2_IT_LHDF) || \
|
||||
((ITPendingBit) == UART2_IT_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the IrDAModes |
||||
*/ |
||||
#define IS_UART2_IRDAMODE_OK(IrDAMode) \ |
||||
(((IrDAMode) == UART2_IRDAMODE_LOWPOWER) || \
|
||||
((IrDAMode) == UART2_IRDAMODE_NORMAL)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WakeUps |
||||
*/ |
||||
#define IS_UART2_WAKEUP_OK(WakeUp) \ |
||||
(((WakeUp) == UART2_WAKEUP_IDLELINE) || \
|
||||
((WakeUp) == UART2_WAKEUP_ADDRESSMARK)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the LINBreakDetectionLengths |
||||
*/ |
||||
#define IS_UART2_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ |
||||
(((LINBreakDetectionLength) == UART2_LINBREAKDETECTIONLENGTH_10BITS) || \
|
||||
((LINBreakDetectionLength) == UART2_LINBREAKDETECTIONLENGTH_11BITS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the UART2_StopBits |
||||
*/ |
||||
#define IS_UART2_STOPBITS_OK(StopBit) (((StopBit) == UART2_STOPBITS_1) || \ |
||||
((StopBit) == UART2_STOPBITS_0_5) || \
|
||||
((StopBit) == UART2_STOPBITS_2) || \
|
||||
((StopBit) == UART2_STOPBITS_1_5 )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the Paritys |
||||
*/ |
||||
#define IS_UART2_PARITY_OK(Parity) (((Parity) == UART2_PARITY_NO) || \ |
||||
((Parity) == UART2_PARITY_EVEN) || \
|
||||
((Parity) == UART2_PARITY_ODD )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the maximum |
||||
* baudrate value |
||||
*/ |
||||
#define IS_UART2_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the address
|
||||
* of the UART2 or UART node |
||||
*/ |
||||
#define UART2_ADDRESS_MAX ((uint8_t)16) |
||||
#define IS_UART2_ADDRESS_OK(node) ((node) < UART2_ADDRESS_MAX ) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN mode |
||||
*/ |
||||
#define IS_UART2_SLAVE_OK(Mode) \ |
||||
(((Mode) == UART2_LIN_MODE_MASTER) || \
|
||||
((Mode) == UART2_LIN_MODE_SLAVE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN
|
||||
* automatic resynchronization mode |
||||
*/ |
||||
#define IS_UART2_AUTOSYNC_OK(AutosyncMode) \ |
||||
(((AutosyncMode) == UART2_LIN_AUTOSYNC_ENABLE) || \
|
||||
((AutosyncMode) == UART2_LIN_AUTOSYNC_DISABLE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN divider update method |
||||
*/ |
||||
#define IS_UART2_DIVUP_OK(DivupMethod) \ |
||||
(((DivupMethod) == UART2_LIN_DIVUP_LBRR1) || \
|
||||
((DivupMethod) == UART2_LIN_DIVUP_NEXTRXNE)) |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup UART2_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void UART2_DeInit(void); |
||||
void UART2_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength,
|
||||
UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity,
|
||||
UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode); |
||||
void UART2_Cmd(FunctionalState NewState); |
||||
void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState); |
||||
void UART2_HalfDuplexCmd(FunctionalState NewState); |
||||
void UART2_IrDAConfig(UART2_IrDAMode_TypeDef UART2_IrDAMode); |
||||
void UART2_IrDACmd(FunctionalState NewState); |
||||
void UART2_LINBreakDetectionConfig(UART2_LINBreakDetectionLength_TypeDef UART2_LINBreakDetectionLength); |
||||
void UART2_LINConfig(UART2_LinMode_TypeDef UART2_Mode,
|
||||
UART2_LinAutosync_TypeDef UART2_Autosync,
|
||||
UART2_LinDivUp_TypeDef UART2_DivUp); |
||||
void UART2_LINCmd(FunctionalState NewState); |
||||
void UART2_SmartCardCmd(FunctionalState NewState); |
||||
void UART2_SmartCardNACKCmd(FunctionalState NewState); |
||||
void UART2_WakeUpConfig(UART2_WakeUp_TypeDef UART2_WakeUp); |
||||
void UART2_ReceiverWakeUpCmd(FunctionalState NewState); |
||||
uint8_t UART2_ReceiveData8(void); |
||||
uint16_t UART2_ReceiveData9(void); |
||||
void UART2_SendData8(uint8_t Data); |
||||
void UART2_SendData9(uint16_t Data); |
||||
void UART2_SendBreak(void); |
||||
void UART2_SetAddress(uint8_t UART2_Address); |
||||
void UART2_SetGuardTime(uint8_t UART2_GuardTime); |
||||
void UART2_SetPrescaler(uint8_t UART2_Prescaler); |
||||
FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG); |
||||
void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG); |
||||
ITStatus UART2_GetITStatus(UART2_IT_TypeDef UART2_IT); |
||||
void UART2_ClearITPendingBit(UART2_IT_TypeDef UART2_IT); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_UART2_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,389 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart3.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototypes and macros for the UART3 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_UART3_H |
||||
#define __STM8S_UART3_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART3_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief UART3 WakeUP Modes |
||||
*/ |
||||
typedef enum { UART3_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up*/ |
||||
UART3_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up*/ |
||||
} UART3_WakeUp_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 LIN Break detection length possible values |
||||
*/ |
||||
typedef enum { UART3_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 10 bits Lin Break detection */ |
||||
UART3_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 11 bits Lin Break detection */ |
||||
} UART3_LINBreakDetectionLength_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART3 stop bits possible values |
||||
*/ |
||||
typedef enum { UART3_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ |
||||
UART3_STOPBITS_2 = (uint8_t)0x20 /**< Two stop bits are transmitted at the end of frame*/ |
||||
} UART3_StopBits_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 parity possible values |
||||
*/ |
||||
typedef enum { UART3_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ |
||||
UART3_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ |
||||
UART3_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ |
||||
} UART3_Parity_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 Word length possible values |
||||
*/ |
||||
typedef enum { UART3_WORDLENGTH_8D = (uint8_t)0x00, /**< 0x00 8 bits Data*/ |
||||
UART3_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data*/ |
||||
} UART3_WordLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 Mode Transmit/Receive possible values |
||||
*/ |
||||
typedef enum { UART3_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable*/ |
||||
UART3_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable*/ |
||||
UART3_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Receive Enable*/ |
||||
UART3_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode*/ |
||||
UART3_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Receive Enable and Transmit enable*/ |
||||
} UART3_Mode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 Mode possible values |
||||
*/ |
||||
typedef enum { UART3_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ |
||||
UART3_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ |
||||
} UART3_LinMode_TypeDef; |
||||
/**
|
||||
* @brief UART3 automatic resynchronisation possible values |
||||
*/ |
||||
typedef enum { UART3_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ |
||||
UART3_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ |
||||
} UART3_LinAutosync_TypeDef; |
||||
/**
|
||||
* @brief UART3 Divider Update Method possible values |
||||
*/ |
||||
typedef enum { UART3_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ |
||||
UART3_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ |
||||
} UART3_LinDivUp_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART3 Flag possible values |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
UART3_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ |
||||
UART3_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ |
||||
UART3_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ |
||||
UART3_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ |
||||
UART3_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ |
||||
UART3_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ |
||||
UART3_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ |
||||
UART3_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ |
||||
UART3_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ |
||||
UART3_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ |
||||
UART3_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ |
||||
UART3_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ |
||||
} UART3_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART3 Interrupt definition |
||||
* UART3_IT possible values |
||||
* Elements values convention: 0xZYX |
||||
* X: Position of the corresponding Interrupt |
||||
* - For the following values, X means the interrupt position in the CR2 register. |
||||
* UART3_IT_TXE |
||||
* UART3_IT_TC |
||||
* UART3_IT_RXNE |
||||
* UART3_IT_IDLE
|
||||
* UART3_IT_OR
|
||||
* - For the UART3_IT_PE value, X means the flag position in the CR1 register. |
||||
* - For the UART3_IT_LBDF value, X means the flag position in the CR4 register. |
||||
* - For the UART3_IT_LHDF value, X means the flag position in the CR6 register. |
||||
* Y: Flag position |
||||
* - For the following values, Y means the flag (pending bit) position in the SR register. |
||||
* UART3_IT_TXE |
||||
* UART3_IT_TC |
||||
* UART3_IT_RXNE |
||||
* UART3_IT_IDLE
|
||||
* UART3_IT_OR |
||||
* UART3_IT_PE |
||||
* - For the UART3_IT_LBDF value, Y means the flag position in the CR4 register. |
||||
* - For the UART3_IT_LHDF value, Y means the flag position in the CR6 register. |
||||
* Z: Register index: indicate in which register the dedicated interrupt source is: |
||||
* - 1==> CR1 register |
||||
* - 2==> CR2 register |
||||
* - 3==> CR4 register |
||||
* - 4==> CR6 register |
||||
*/ |
||||
typedef enum { UART3_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ |
||||
UART3_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ |
||||
UART3_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ |
||||
UART3_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ |
||||
UART3_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ |
||||
UART3_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ |
||||
UART3_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ |
||||
UART3_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ |
||||
UART3_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ |
||||
} UART3_IT_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros ------------------------------------------------------------*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART3_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs |
||||
*/ |
||||
#define IS_UART3_FLAG_OK(Flag) \ |
||||
(((Flag) == UART3_FLAG_TXE) || \
|
||||
((Flag) == UART3_FLAG_TC) || \
|
||||
((Flag) == UART3_FLAG_RXNE) || \
|
||||
((Flag) == UART3_FLAG_IDLE) || \
|
||||
((Flag) == UART3_FLAG_OR_LHE) || \
|
||||
((Flag) == UART3_FLAG_NF) || \
|
||||
((Flag) == UART3_FLAG_FE) || \
|
||||
((Flag) == UART3_FLAG_PE) || \
|
||||
((Flag) == UART3_FLAG_SBK) || \
|
||||
((Flag) == UART3_FLAG_LSF) || \
|
||||
((Flag) == UART3_FLAG_LHDF) || \
|
||||
((Flag) == UART3_FLAG_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART3_CLEAR_FLAG_OK(Flag) \ |
||||
(((Flag) == UART3_FLAG_RXNE) || \
|
||||
((Flag) == UART3_FLAG_LHDF) || \
|
||||
((Flag) == UART3_FLAG_LSF) || \
|
||||
((Flag) == UART3_FLAG_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the Interrupts |
||||
*/ |
||||
|
||||
#define IS_UART3_CONFIG_IT_OK(Interrupt) \ |
||||
(((Interrupt) == UART3_IT_PE) || \
|
||||
((Interrupt) == UART3_IT_TXE) || \
|
||||
((Interrupt) == UART3_IT_TC) || \
|
||||
((Interrupt) == UART3_IT_RXNE_OR ) || \
|
||||
((Interrupt) == UART3_IT_IDLE) || \
|
||||
((Interrupt) == UART3_IT_LHDF) || \
|
||||
((Interrupt) == UART3_IT_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit |
||||
*/ |
||||
#define IS_UART3_GET_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART3_IT_TXE) || \
|
||||
((ITPendingBit) == UART3_IT_TC) || \
|
||||
((ITPendingBit) == UART3_IT_RXNE) || \
|
||||
((ITPendingBit) == UART3_IT_IDLE) || \
|
||||
((ITPendingBit) == UART3_IT_OR) || \
|
||||
((ITPendingBit) == UART3_IT_LBDF) || \
|
||||
((ITPendingBit) == UART3_IT_LHDF) || \
|
||||
((ITPendingBit) == UART3_IT_PE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART3_CLEAR_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART3_IT_RXNE) || \
|
||||
((ITPendingBit) == UART3_IT_LHDF) || \
|
||||
((ITPendingBit) == UART3_IT_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the MODEs |
||||
*/ |
||||
#define IS_UART3_MODE_OK(Mode) \ |
||||
(((Mode) == (uint8_t)UART3_MODE_RX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART3_MODE_RX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART3_MODE_TX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART3_MODE_TX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART3_MODE_TXRX_ENABLE) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_ENABLE|(uint8_t)UART3_MODE_RX_ENABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_ENABLE|(uint8_t)UART3_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_DISABLE|(uint8_t)UART3_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_DISABLE|(uint8_t)UART3_MODE_RX_ENABLE))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WordLengths |
||||
*/ |
||||
#define IS_UART3_WORDLENGTH_OK(WordLength) \ |
||||
(((WordLength) == UART3_WORDLENGTH_8D) || \
|
||||
((WordLength) == UART3_WORDLENGTH_9D)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WakeUps |
||||
*/ |
||||
#define IS_UART3_WAKEUP_OK(WakeUpMode) \ |
||||
(((WakeUpMode) == UART3_WAKEUP_IDLELINE) || \
|
||||
((WakeUpMode) == UART3_WAKEUP_ADDRESSMARK)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the LINBreakDetectionLengths |
||||
*/ |
||||
#define IS_UART3_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLengths) \ |
||||
(((LINBreakDetectionLengths) == UART3_LINBREAKDETECTIONLENGTH_10BITS) || \
|
||||
((LINBreakDetectionLengths) == UART3_LINBREAKDETECTIONLENGTH_11BITS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the UART3_StopBits |
||||
*/ |
||||
#define IS_UART3_STOPBITS_OK(StopBit) \ |
||||
(((StopBit) == UART3_STOPBITS_1) || \
|
||||
((StopBit) == UART3_STOPBITS_2)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the Parity |
||||
*/ |
||||
#define IS_UART3_PARITY_OK(Parity) \ |
||||
(((Parity) == UART3_PARITY_NO) || \
|
||||
((Parity) == UART3_PARITY_EVEN) || \
|
||||
((Parity) == UART3_PARITY_ODD )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the maximum
|
||||
* baudrate value |
||||
*/ |
||||
#define IS_UART3_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the address
|
||||
* of the UART3 or UART node |
||||
*/ |
||||
#define UART3_ADDRESS_MAX ((uint8_t)16) |
||||
#define IS_UART3_ADDRESS_OK(Node) ((Node) < UART3_ADDRESS_MAX) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN mode |
||||
*/ |
||||
#define IS_UART3_SLAVE_OK(Mode) \ |
||||
(((Mode) == UART3_LIN_MODE_MASTER) || \
|
||||
((Mode) == UART3_LIN_MODE_SLAVE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN
|
||||
* automatic resynchronization mode |
||||
*/ |
||||
#define IS_UART3_AUTOSYNC_OK(AutosyncMode) \ |
||||
(((AutosyncMode) == UART3_LIN_AUTOSYNC_ENABLE) || \
|
||||
((AutosyncMode) == UART3_LIN_AUTOSYNC_DISABLE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN
|
||||
* divider update method |
||||
*/ |
||||
#define IS_UART3_DIVUP_OK(DivupMethod) \ |
||||
(((DivupMethod) == UART3_LIN_DIVUP_LBRR1) || \
|
||||
((DivupMethod) == UART3_LIN_DIVUP_NEXTRXNE)) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup UART3_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void UART3_DeInit(void); |
||||
void UART3_Init(uint32_t BaudRate, UART3_WordLength_TypeDef WordLength,
|
||||
UART3_StopBits_TypeDef StopBits, UART3_Parity_TypeDef Parity,
|
||||
UART3_Mode_TypeDef Mode); |
||||
void UART3_Cmd(FunctionalState NewState); |
||||
void UART3_ITConfig(UART3_IT_TypeDef UART3_IT, FunctionalState NewState); |
||||
void UART3_LINBreakDetectionConfig(UART3_LINBreakDetectionLength_TypeDef UART3_LINBreakDetectionLength); |
||||
void UART3_LINConfig(UART3_LinMode_TypeDef UART3_Mode,
|
||||
UART3_LinAutosync_TypeDef UART3_Autosync,
|
||||
UART3_LinDivUp_TypeDef UART3_DivUp); |
||||
void UART3_LINCmd(FunctionalState NewState); |
||||
void UART3_ReceiverWakeUpCmd(FunctionalState NewState); |
||||
void UART3_WakeUpConfig( UART3_WakeUp_TypeDef UART3_WakeUp); |
||||
uint8_t UART3_ReceiveData8(void); |
||||
uint16_t UART3_ReceiveData9(void); |
||||
void UART3_SendData8(uint8_t Data); |
||||
void UART3_SendData9(uint16_t Data); |
||||
void UART3_SendBreak(void); |
||||
void UART3_SetAddress(uint8_t UART3_Address); |
||||
FlagStatus UART3_GetFlagStatus(UART3_Flag_TypeDef UART3_FLAG); |
||||
void UART3_ClearFlag(UART3_Flag_TypeDef UART3_FLAG); |
||||
ITStatus UART3_GetITStatus(UART3_IT_TypeDef UART3_IT); |
||||
void UART3_ClearITPendingBit(UART3_IT_TypeDef UART3_IT); |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_UART3_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,444 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart4.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototypes and macros for the UART4 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_UART4_H |
||||
#define __STM8S_UART4_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART4_Exported_Types
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief UART4 Irda Modes |
||||
*/ |
||||
|
||||
typedef enum { UART4_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ |
||||
UART4_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ |
||||
|
||||
} UART4_IrDAMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 WakeUP Modes |
||||
*/ |
||||
|
||||
typedef enum { UART4_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ |
||||
UART4_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ |
||||
} UART4_WakeUp_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART4 LIN Break detection length possible values |
||||
*/ |
||||
typedef enum { UART4_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ |
||||
UART4_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ |
||||
} UART4_LINBreakDetectionLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 stop bits possible values |
||||
*/ |
||||
|
||||
typedef enum { UART4_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ |
||||
UART4_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ |
||||
UART4_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ |
||||
UART4_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ |
||||
} UART4_StopBits_TypeDef; |
||||
|
||||
|
||||
/**
|
||||
* @brief UART4 parity possible values |
||||
*/ |
||||
typedef enum { UART4_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ |
||||
UART4_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ |
||||
UART4_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ |
||||
} UART4_Parity_TypeDef; |
||||
/**
|
||||
* @brief UART4 Mode possible values |
||||
*/ |
||||
typedef enum { UART4_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ |
||||
UART4_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ |
||||
} UART4_LinMode_TypeDef; |
||||
/**
|
||||
* @brief UART4 automatic resynchronisation possible values |
||||
*/ |
||||
typedef enum { UART4_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ |
||||
UART4_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ |
||||
} UART4_LinAutosync_TypeDef; |
||||
/**
|
||||
* @brief UART4 Divider Update Method possible values |
||||
*/ |
||||
typedef enum { UART4_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ |
||||
UART4_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ |
||||
} UART4_LinDivUp_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 Synchrone modes |
||||
*/ |
||||
typedef enum { UART4_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ |
||||
UART4_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ |
||||
UART4_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ |
||||
UART4_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ |
||||
UART4_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ |
||||
UART4_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ |
||||
UART4_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ |
||||
UART4_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ |
||||
} UART4_SyncMode_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 Word length possible values |
||||
*/ |
||||
typedef enum { UART4_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ |
||||
UART4_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ |
||||
} UART4_WordLength_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 Mode possible values |
||||
*/ |
||||
typedef enum { UART4_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ |
||||
UART4_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ |
||||
UART4_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ |
||||
UART4_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ |
||||
UART4_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ |
||||
} UART4_Mode_TypeDef; |
||||
/**
|
||||
* @brief UART4 Flag possible values |
||||
*/ |
||||
typedef enum |
||||
{ |
||||
UART4_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ |
||||
UART4_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ |
||||
UART4_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ |
||||
UART4_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ |
||||
UART4_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ |
||||
UART4_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ |
||||
UART4_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ |
||||
UART4_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ |
||||
UART4_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ |
||||
UART4_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ |
||||
UART4_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ |
||||
UART4_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ |
||||
} UART4_Flag_TypeDef; |
||||
|
||||
/**
|
||||
* @brief UART4 Interrupt definition |
||||
* UART4_IT possible values |
||||
* Elements values convention: 0xZYX |
||||
* X: Position of the corresponding Interrupt |
||||
* - For the following values, X means the interrupt position in the CR2 register. |
||||
* UART4_IT_TXE |
||||
* UART4_IT_TC |
||||
* UART4_IT_RXNE |
||||
* UART4_IT_IDLE
|
||||
* UART4_IT_OR
|
||||
* - For the UART4_IT_PE value, X means the flag position in the CR1 register. |
||||
* - For the UART4_IT_LBDF value, X means the flag position in the CR4 register. |
||||
* - For the UART4_IT_LHDF value, X means the flag position in the CR6 register. |
||||
* Y: Flag position |
||||
* - For the following values, Y means the flag (pending bit) position in the SR register. |
||||
* UART4_IT_TXE |
||||
* UART4_IT_TC |
||||
* UART4_IT_RXNE |
||||
* UART4_IT_IDLE
|
||||
* UART4_IT_OR |
||||
* UART4_IT_PE |
||||
* - For the UART4_IT_LBDF value, Y means the flag position in the CR4 register. |
||||
* - For the UART4_IT_LHDF value, Y means the flag position in the CR6 register. |
||||
* Z: Register index: indicate in which register the dedicated interrupt source is: |
||||
* - 1==> CR1 register |
||||
* - 2==> CR2 register |
||||
* - 3==> CR4 register |
||||
* - 4==> CR6 register |
||||
*/ |
||||
typedef enum { UART4_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ |
||||
UART4_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ |
||||
UART4_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ |
||||
UART4_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ |
||||
UART4_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ |
||||
UART4_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ |
||||
UART4_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ |
||||
UART4_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ |
||||
UART4_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ |
||||
} UART4_IT_TypeDef; |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup UART4_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function to check the different functions parameters. |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the MODEs possible combination should be one of |
||||
* the following. |
||||
*/ |
||||
|
||||
#define IS_UART4_MODE_OK(Mode) \ |
||||
(((Mode) == (uint8_t)UART4_MODE_RX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART4_MODE_RX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART4_MODE_TX_ENABLE) || \
|
||||
((Mode) == (uint8_t)UART4_MODE_TX_DISABLE) || \
|
||||
((Mode) == (uint8_t)UART4_MODE_TXRX_ENABLE) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_ENABLE|(uint8_t)UART4_MODE_RX_ENABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_ENABLE|(uint8_t)UART4_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_DISABLE|(uint8_t)UART4_MODE_RX_DISABLE)) || \
|
||||
((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_DISABLE|(uint8_t)UART4_MODE_RX_ENABLE))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WordLengths |
||||
*/ |
||||
#define IS_UART4_WORDLENGTH_OK(WordLength) \ |
||||
(((WordLength) == UART4_WORDLENGTH_8D) || \
|
||||
((WordLength) == UART4_WORDLENGTH_9D)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the SyncModes; it should exclude values such
|
||||
* as UART4_CLOCK_ENABLE|UART4_CLOCK_DISABLE |
||||
*/ |
||||
#define IS_UART4_SYNCMODE_OK(SyncMode) \ |
||||
(!((((SyncMode)&(((uint8_t)UART4_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART4_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART4_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART4_SYNCMODE_CLOCK_DISABLE))) || \
|
||||
(((SyncMode)&(((uint8_t)UART4_SYNCMODE_CPOL_LOW )|((uint8_t)UART4_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART4_SYNCMODE_CPOL_LOW )|((uint8_t)UART4_SYNCMODE_CPOL_HIGH))) || \
|
||||
(((SyncMode)&(((uint8_t)UART4_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART4_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART4_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART4_SYNCMODE_CPHA_BEGINING))) || \
|
||||
(((SyncMode)&(((uint8_t)UART4_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART4_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART4_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART4_SYNCMODE_LASTBIT_ENABLE))))) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs |
||||
*/ |
||||
#define IS_UART4_FLAG_OK(Flag) \ |
||||
(((Flag) == UART4_FLAG_TXE) || \
|
||||
((Flag) == UART4_FLAG_TC) || \
|
||||
((Flag) == UART4_FLAG_RXNE) || \
|
||||
((Flag) == UART4_FLAG_IDLE) || \
|
||||
((Flag) == UART4_FLAG_OR_LHE) || \
|
||||
((Flag) == UART4_FLAG_NF) || \
|
||||
((Flag) == UART4_FLAG_FE) || \
|
||||
((Flag) == UART4_FLAG_PE) || \
|
||||
((Flag) == UART4_FLAG_SBK) || \
|
||||
((Flag) == UART4_FLAG_LSF) || \
|
||||
((Flag) == UART4_FLAG_LHDF) || \
|
||||
((Flag) == UART4_FLAG_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the
|
||||
* different sensitivity values for the FLAGs that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART4_CLEAR_FLAG_OK(Flag) \ |
||||
(((Flag) == UART4_FLAG_RXNE) || \
|
||||
((Flag) == UART4_FLAG_LHDF) || \
|
||||
((Flag) == UART4_FLAG_LSF) || \
|
||||
((Flag) == UART4_FLAG_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check
|
||||
* the different sensitivity values for the Interrupts |
||||
*/ |
||||
|
||||
#define IS_UART4_CONFIG_IT_OK(Interrupt) \ |
||||
(((Interrupt) == UART4_IT_PE) || \
|
||||
((Interrupt) == UART4_IT_TXE) || \
|
||||
((Interrupt) == UART4_IT_TC) || \
|
||||
((Interrupt) == UART4_IT_RXNE_OR ) || \
|
||||
((Interrupt) == UART4_IT_IDLE) || \
|
||||
((Interrupt) == UART4_IT_LHDF) || \
|
||||
((Interrupt) == UART4_IT_LBDF)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit |
||||
*/ |
||||
#define IS_UART4_GET_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART4_IT_TXE) || \
|
||||
((ITPendingBit) == UART4_IT_TC) || \
|
||||
((ITPendingBit) == UART4_IT_RXNE) || \
|
||||
((ITPendingBit) == UART4_IT_IDLE) || \
|
||||
((ITPendingBit) == UART4_IT_OR) || \
|
||||
((ITPendingBit) == UART4_IT_LBDF) || \
|
||||
((ITPendingBit) == UART4_IT_LHDF) || \
|
||||
((ITPendingBit) == UART4_IT_PE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different
|
||||
* sensitivity values for the pending bit that can be cleared by writing 0 |
||||
*/ |
||||
#define IS_UART4_CLEAR_IT_OK(ITPendingBit) \ |
||||
(((ITPendingBit) == UART4_IT_RXNE) || \
|
||||
((ITPendingBit) == UART4_IT_LHDF) || \
|
||||
((ITPendingBit) == UART4_IT_LBDF)) |
||||
|
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the IrDAModes |
||||
*/ |
||||
#define IS_UART4_IRDAMODE_OK(IrDAMode) \ |
||||
(((IrDAMode) == UART4_IRDAMODE_LOWPOWER) || \
|
||||
((IrDAMode) == UART4_IRDAMODE_NORMAL)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the WakeUps |
||||
*/ |
||||
#define IS_UART4_WAKEUP_OK(WakeUp) \ |
||||
(((WakeUp) == UART4_WAKEUP_IDLELINE) || \
|
||||
((WakeUp) == UART4_WAKEUP_ADDRESSMARK)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the LINBreakDetectionLengths |
||||
*/ |
||||
#define IS_UART4_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ |
||||
(((LINBreakDetectionLength) == UART4_LINBREAKDETECTIONLENGTH_10BITS) || \
|
||||
((LINBreakDetectionLength) == UART4_LINBREAKDETECTIONLENGTH_11BITS)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the UART4_StopBits |
||||
*/ |
||||
#define IS_UART4_STOPBITS_OK(StopBit) (((StopBit) == UART4_STOPBITS_1) || \ |
||||
((StopBit) == UART4_STOPBITS_0_5) || \
|
||||
((StopBit) == UART4_STOPBITS_2) || \
|
||||
((StopBit) == UART4_STOPBITS_1_5 )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the different |
||||
* sensitivity values for the Paritys |
||||
*/ |
||||
#define IS_UART4_PARITY_OK(Parity) (((Parity) == UART4_PARITY_NO) || \ |
||||
((Parity) == UART4_PARITY_EVEN) || \
|
||||
((Parity) == UART4_PARITY_ODD )) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the maximum |
||||
* baudrate value |
||||
*/ |
||||
#define IS_UART4_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the address
|
||||
* of the UART4 or UART node |
||||
*/ |
||||
#define UART4_ADDRESS_MAX ((uint8_t)16) |
||||
#define IS_UART4_ADDRESS_OK(node) ((node) < UART4_ADDRESS_MAX ) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN mode |
||||
*/ |
||||
#define IS_UART4_SLAVE_OK(Mode) \ |
||||
(((Mode) == UART4_LIN_MODE_MASTER) || \
|
||||
((Mode) == UART4_LIN_MODE_SLAVE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN
|
||||
* automatic resynchronization mode |
||||
*/ |
||||
#define IS_UART4_AUTOSYNC_OK(AutosyncMode) \ |
||||
(((AutosyncMode) == UART4_LIN_AUTOSYNC_ENABLE) || \
|
||||
((AutosyncMode) == UART4_LIN_AUTOSYNC_DISABLE)) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert_param function in order to check the LIN divider update method |
||||
*/ |
||||
#define IS_UART4_DIVUP_OK(DivupMethod) \ |
||||
(((DivupMethod) == UART4_LIN_DIVUP_LBRR1) || \
|
||||
((DivupMethod) == UART4_LIN_DIVUP_NEXTRXNE)) |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup UART4_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
void UART4_DeInit(void); |
||||
void UART4_Init(uint32_t BaudRate, UART4_WordLength_TypeDef WordLength,
|
||||
UART4_StopBits_TypeDef StopBits, UART4_Parity_TypeDef Parity,
|
||||
UART4_SyncMode_TypeDef SyncMode, UART4_Mode_TypeDef Mode); |
||||
void UART4_Cmd(FunctionalState NewState); |
||||
void UART4_ITConfig(UART4_IT_TypeDef UART4_IT, FunctionalState NewState); |
||||
void UART4_HalfDuplexCmd(FunctionalState NewState); |
||||
void UART4_IrDAConfig(UART4_IrDAMode_TypeDef UART4_IrDAMode); |
||||
void UART4_IrDACmd(FunctionalState NewState); |
||||
void UART4_LINBreakDetectionConfig(UART4_LINBreakDetectionLength_TypeDef UART4_LINBreakDetectionLength); |
||||
void UART4_LINConfig(UART4_LinMode_TypeDef UART4_Mode,
|
||||
UART4_LinAutosync_TypeDef UART4_Autosync,
|
||||
UART4_LinDivUp_TypeDef UART4_DivUp); |
||||
void UART4_LINCmd(FunctionalState NewState); |
||||
void UART4_SmartCardCmd(FunctionalState NewState); |
||||
void UART4_SmartCardNACKCmd(FunctionalState NewState); |
||||
void UART4_WakeUpConfig(UART4_WakeUp_TypeDef UART4_WakeUp); |
||||
void UART4_ReceiverWakeUpCmd(FunctionalState NewState); |
||||
uint8_t UART4_ReceiveData8(void); |
||||
uint16_t UART4_ReceiveData9(void); |
||||
void UART4_SendData8(uint8_t Data); |
||||
void UART4_SendData9(uint16_t Data); |
||||
void UART4_SendBreak(void); |
||||
void UART4_SetAddress(uint8_t UART4_Address); |
||||
void UART4_SetGuardTime(uint8_t UART4_GuardTime); |
||||
void UART4_SetPrescaler(uint8_t UART4_Prescaler); |
||||
FlagStatus UART4_GetFlagStatus(UART4_Flag_TypeDef UART4_FLAG); |
||||
void UART4_ClearFlag(UART4_Flag_TypeDef UART4_FLAG); |
||||
ITStatus UART4_GetITStatus(UART4_IT_TypeDef UART4_IT); |
||||
void UART4_ClearITPendingBit(UART4_IT_TypeDef UART4_IT); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_UART4_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,87 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_wwdg.h |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all functions prototype and macros for the WWDG peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __STM8S_WWDG_H |
||||
#define __STM8S_WWDG_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup WWDG_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the |
||||
* values of the window register. |
||||
*/ |
||||
#define IS_WWDG_WINDOWLIMITVALUE_OK(WindowLimitValue) ((WindowLimitValue) <= 0x7F) |
||||
|
||||
/**
|
||||
* @brief Macro used by the assert function in order to check the different |
||||
* values of the counter register. |
||||
*/ |
||||
#define IS_WWDG_COUNTERVALUE_OK(CounterValue) ((CounterValue) <= 0x7F) |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/** @addtogroup WWDG_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
void WWDG_Init(uint8_t Counter, uint8_t WindowValue); |
||||
void WWDG_SetCounter(uint8_t Counter); |
||||
uint8_t WWDG_GetCounter(void); |
||||
void WWDG_SWReset(void); |
||||
void WWDG_SetWindowValue(uint8_t WindowValue); |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __STM8S_WWDG_H */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,697 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_adc1.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions/macros for the ADC1 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_adc1.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup ADC1_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the ADC1 peripheral registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void ADC1_DeInit(void) |
||||
{ |
||||
ADC1->CSR = ADC1_CSR_RESET_VALUE; |
||||
ADC1->CR1 = ADC1_CR1_RESET_VALUE; |
||||
ADC1->CR2 = ADC1_CR2_RESET_VALUE; |
||||
ADC1->CR3 = ADC1_CR3_RESET_VALUE; |
||||
ADC1->TDRH = ADC1_TDRH_RESET_VALUE; |
||||
ADC1->TDRL = ADC1_TDRL_RESET_VALUE; |
||||
ADC1->HTRH = ADC1_HTRH_RESET_VALUE; |
||||
ADC1->HTRL = ADC1_HTRL_RESET_VALUE; |
||||
ADC1->LTRH = ADC1_LTRH_RESET_VALUE; |
||||
ADC1->LTRL = ADC1_LTRL_RESET_VALUE; |
||||
ADC1->AWCRH = ADC1_AWCRH_RESET_VALUE; |
||||
ADC1->AWCRL = ADC1_AWCRL_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the ADC1 peripheral according to the specified parameters |
||||
* @param ADC1_ConversionMode: specifies the conversion mode |
||||
* can be one of the values of @ref ADC1_ConvMode_TypeDef. |
||||
* @param ADC1_Channel: specifies the channel to convert |
||||
* can be one of the values of @ref ADC1_Channel_TypeDef. |
||||
* @param ADC1_PrescalerSelection: specifies the ADC1 prescaler |
||||
* can be one of the values of @ref ADC1_PresSel_TypeDef. |
||||
* @param ADC1_ExtTrigger: specifies the external trigger |
||||
* can be one of the values of @ref ADC1_ExtTrig_TypeDef. |
||||
* @param ADC1_ExtTriggerState: specifies the external trigger new state |
||||
* can be one of the values of @ref FunctionalState. |
||||
* @param ADC1_Align: specifies the converted data alignment |
||||
* can be one of the values of @ref ADC1_Align_TypeDef. |
||||
* @param ADC1_SchmittTriggerChannel: specifies the schmitt trigger channel |
||||
* can be one of the values of @ref ADC1_SchmittTrigg_TypeDef. |
||||
* @param ADC1_SchmittTriggerState: specifies the schmitt trigger state |
||||
* can be one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode, ADC1_Channel_TypeDef ADC1_Channel, ADC1_PresSel_TypeDef ADC1_PrescalerSelection, ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState ADC1_ExtTriggerState, ADC1_Align_TypeDef ADC1_Align, ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, FunctionalState ADC1_SchmittTriggerState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode)); |
||||
assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel)); |
||||
assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection)); |
||||
assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState)))); |
||||
assert_param(IS_ADC1_ALIGN_OK(ADC1_Align)); |
||||
assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState)); |
||||
|
||||
/*-----------------CR1 & CSR configuration --------------------*/ |
||||
/* Configure the conversion mode and the channel to convert
|
||||
respectively according to ADC1_ConversionMode & ADC1_Channel values & ADC1_Align values */ |
||||
ADC1_ConversionConfig(ADC1_ConversionMode, ADC1_Channel, ADC1_Align); |
||||
/* Select the prescaler division factor according to ADC1_PrescalerSelection values */ |
||||
ADC1_PrescalerConfig(ADC1_PrescalerSelection); |
||||
|
||||
/*-----------------CR2 configuration --------------------*/ |
||||
/* Configure the external trigger state and event respectively
|
||||
according to NewState, ADC1_ExtTrigger */ |
||||
ADC1_ExternalTriggerConfig(ADC1_ExtTrigger, ADC1_ExtTriggerState); |
||||
|
||||
/*------------------TDR configuration ---------------------------*/ |
||||
/* Configure the schmitt trigger channel and state respectively
|
||||
according to ADC1_SchmittTriggerChannel & ADC1_SchmittTriggerNewState values */ |
||||
ADC1_SchmittTriggerConfig(ADC1_SchmittTriggerChannel, ADC1_SchmittTriggerState); |
||||
|
||||
/* Enable the ADC1 peripheral */ |
||||
ADC1->CR1 |= ADC1_CR1_ADON; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the ADC1 peripheral. |
||||
* @param NewState: specifies the peripheral enabled or disabled state. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->CR1 |= ADC1_CR1_ADON; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->CR1 &= (uint8_t)(~ADC1_CR1_ADON); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the ADC1 scan mode. |
||||
* @param NewState: specifies the selected mode enabled or disabled state. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ScanModeCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->CR2 |= ADC1_CR2_SCAN; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->CR2 &= (uint8_t)(~ADC1_CR2_SCAN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the ADC1 data store into the Data Buffer registers rather than in the Data Register |
||||
* @param NewState: specifies the selected mode enabled or disabled state. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_DataBufferCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->CR3 |= ADC1_CR3_DBUF; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->CR3 &= (uint8_t)(~ADC1_CR3_DBUF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the ADC1 interrupt. |
||||
* @param ADC1_IT specifies the name of the interrupt to enable or disable. |
||||
* This parameter can be one of the following values: |
||||
* - ADC1_IT_AWDITEN : Analog WDG interrupt enable |
||||
* - ADC1_IT_EOCITEN : EOC iterrupt enable |
||||
* @param NewState specifies the state of the interrupt to apply. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ITConfig(ADC1_IT_TypeDef ADC1_IT, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_IT_OK(ADC1_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the ADC1 interrupts */ |
||||
ADC1->CSR |= (uint8_t)ADC1_IT; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the ADC1 interrupts */ |
||||
ADC1->CSR &= (uint8_t)((uint16_t)~(uint16_t)ADC1_IT); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC1 prescaler division factor. |
||||
* @param ADC1_Prescaler: the selected precaler. |
||||
* It can be one of the values of @ref ADC1_PresSel_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_PrescalerConfig(ADC1_PresSel_TypeDef ADC1_Prescaler) |
||||
{ |
||||
/* Check the parameter */ |
||||
assert_param(IS_ADC1_PRESSEL_OK(ADC1_Prescaler)); |
||||
|
||||
/* Clear the SPSEL bits */ |
||||
ADC1->CR1 &= (uint8_t)(~ADC1_CR1_SPSEL); |
||||
/* Select the prescaler division factor according to ADC1_PrescalerSelection values */ |
||||
ADC1->CR1 |= (uint8_t)(ADC1_Prescaler); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the ADC1 Schmitt Trigger on a selected channel. |
||||
* @param ADC1_SchmittTriggerChannel specifies the desired Channel. |
||||
* It can be set of the values of @ref ADC1_SchmittTrigg_TypeDef. |
||||
* @param NewState specifies Channel new status. |
||||
* can have one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_SchmittTriggerConfig(ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (ADC1_SchmittTriggerChannel == ADC1_SCHMITTTRIG_ALL) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->TDRL &= (uint8_t)0x0; |
||||
ADC1->TDRH &= (uint8_t)0x0; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->TDRL |= (uint8_t)0xFF; |
||||
ADC1->TDRH |= (uint8_t)0xFF; |
||||
} |
||||
} |
||||
else if (ADC1_SchmittTriggerChannel < ADC1_SCHMITTTRIG_CHANNEL8) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->TDRL &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << (uint8_t)ADC1_SchmittTriggerChannel)); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->TDRL |= (uint8_t)((uint8_t)0x01 << (uint8_t)ADC1_SchmittTriggerChannel); |
||||
} |
||||
} |
||||
else /* ADC1_SchmittTriggerChannel >= ADC1_SCHMITTTRIG_CHANNEL8 */ |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->TDRH &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << ((uint8_t)ADC1_SchmittTriggerChannel - (uint8_t)8))); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->TDRH |= (uint8_t)((uint8_t)0x01 << ((uint8_t)ADC1_SchmittTriggerChannel - (uint8_t)8)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC1 conversion on selected channel. |
||||
* @param ADC1_ConversionMode Specifies the conversion type. |
||||
* It can be set of the values of @ref ADC1_ConvMode_TypeDef |
||||
* @param ADC1_Channel specifies the ADC1 Channel. |
||||
* It can be set of the values of @ref ADC1_Channel_TypeDef |
||||
* @param ADC1_Align specifies the converted data alignment. |
||||
* It can be set of the values of @ref ADC1_Align_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ConversionConfig(ADC1_ConvMode_TypeDef ADC1_ConversionMode, ADC1_Channel_TypeDef ADC1_Channel, ADC1_Align_TypeDef ADC1_Align) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode)); |
||||
assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel)); |
||||
assert_param(IS_ADC1_ALIGN_OK(ADC1_Align)); |
||||
|
||||
/* Clear the align bit */ |
||||
ADC1->CR2 &= (uint8_t)(~ADC1_CR2_ALIGN); |
||||
/* Configure the data alignment */ |
||||
ADC1->CR2 |= (uint8_t)(ADC1_Align); |
||||
|
||||
if (ADC1_ConversionMode == ADC1_CONVERSIONMODE_CONTINUOUS) |
||||
{ |
||||
/* Set the continuous conversion mode */ |
||||
ADC1->CR1 |= ADC1_CR1_CONT; |
||||
} |
||||
else /* ADC1_ConversionMode == ADC1_CONVERSIONMODE_SINGLE */ |
||||
{ |
||||
/* Set the single conversion mode */ |
||||
ADC1->CR1 &= (uint8_t)(~ADC1_CR1_CONT); |
||||
} |
||||
|
||||
/* Clear the ADC1 channels */ |
||||
ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); |
||||
/* Select the ADC1 channel */ |
||||
ADC1->CSR |= (uint8_t)(ADC1_Channel); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC1 conversion on external trigger event. |
||||
* @par Full description: |
||||
* The selected external trigger event can be enabled or disabled. |
||||
* @param ADC1_ExtTrigger to select the External trigger event. |
||||
* can have one of the values of @ref ADC1_ExtTrig_TypeDef. |
||||
* @param NewState to enable/disable the selected external trigger |
||||
* can have one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ExternalTriggerConfig(ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Clear the external trigger selection bits */ |
||||
ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTSEL); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the selected external Trigger */ |
||||
ADC1->CR2 |= (uint8_t)(ADC1_CR2_EXTTRIG); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the selected external trigger */ |
||||
ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTTRIG); |
||||
} |
||||
|
||||
/* Set the selected external trigger */ |
||||
ADC1->CR2 |= (uint8_t)(ADC1_ExtTrigger); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Start ADC1 conversion |
||||
* @par Full description: |
||||
* This function triggers the start of conversion, after ADC1 configuration. |
||||
* @param None |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Enable the ADC1 peripheral before calling this function |
||||
*/ |
||||
void ADC1_StartConversion(void) |
||||
{ |
||||
ADC1->CR1 |= ADC1_CR1_ADON; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get one sample of measured signal. |
||||
* @param None |
||||
* @retval ConversionValue: value of the measured signal. |
||||
* @par Required preconditions: |
||||
* ADC1 conversion finished. |
||||
*/ |
||||
uint16_t ADC1_GetConversionValue(void) |
||||
{ |
||||
uint16_t temph = 0; |
||||
uint8_t templ = 0; |
||||
|
||||
if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */ |
||||
{ |
||||
/* Read LSB first */ |
||||
templ = ADC1->DRL; |
||||
/* Then read MSB */ |
||||
temph = ADC1->DRH; |
||||
|
||||
temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); |
||||
} |
||||
else /* Left alignment */ |
||||
{ |
||||
/* Read MSB first*/ |
||||
temph = ADC1->DRH; |
||||
/* Then read LSB */ |
||||
templ = ADC1->DRL; |
||||
|
||||
temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)((uint16_t)temph << 8)); |
||||
} |
||||
|
||||
return ((uint16_t)temph); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the analog watchdog for the given channel. |
||||
* @param Channel specifies the desired Channel. |
||||
* It can be set of the values of @ref ADC1_Channel_TypeDef. |
||||
* @param NewState specifies the analog watchdog new state. |
||||
* can have one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_AWDChannelConfig(ADC1_Channel_TypeDef Channel, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
assert_param(IS_ADC1_CHANNEL_OK(Channel)); |
||||
|
||||
if (Channel < (uint8_t)8) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->AWCRL |= (uint8_t)((uint8_t)1 << Channel); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->AWCRL &= (uint8_t)~(uint8_t)((uint8_t)1 << Channel); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC1->AWCRH |= (uint8_t)((uint8_t)1 << (Channel - (uint8_t)8)); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC1->AWCRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (uint8_t)(Channel - (uint8_t)8)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the high threshold of the analog watchdog. |
||||
* @param Threshold specifies the high threshold value. |
||||
* this value depends on the reference voltage range. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_SetHighThreshold(uint16_t Threshold) |
||||
{ |
||||
ADC1->HTRH = (uint8_t)(Threshold >> (uint8_t)2); |
||||
ADC1->HTRL = (uint8_t)Threshold; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the low threshold of the analog watchdog. |
||||
* @param Threshold specifies the low threshold value. |
||||
* this value depends on the reference voltage range. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_SetLowThreshold(uint16_t Threshold) |
||||
{ |
||||
ADC1->LTRL = (uint8_t)Threshold; |
||||
ADC1->LTRH = (uint8_t)(Threshold >> (uint8_t)2); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get one sample of measured signal. |
||||
* @param Buffer specifies the buffer to read. |
||||
* @retval BufferValue: value read from the given buffer. |
||||
* @par Required preconditions: |
||||
* ADC1 conversion finished. |
||||
*/ |
||||
uint16_t ADC1_GetBufferValue(uint8_t Buffer) |
||||
{ |
||||
uint16_t temph = 0; |
||||
uint8_t templ = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_BUFFER_OK(Buffer)); |
||||
|
||||
if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */ |
||||
{ |
||||
/* Read LSB first */ |
||||
templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1) + 1); |
||||
/* Then read MSB */ |
||||
temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1)); |
||||
|
||||
temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); |
||||
} |
||||
else /* Left alignment */ |
||||
{ |
||||
/* Read MSB first*/ |
||||
temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1)); |
||||
/* Then read LSB */ |
||||
templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1) + 1); |
||||
|
||||
temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)(temph << 8)); |
||||
} |
||||
|
||||
return ((uint16_t)temph); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks the specified analog watchdog channel status. |
||||
* @param Channel: specify the channel of which to check the analog watchdog |
||||
* can be one of the values of @ref ADC1_Channel_TypeDef. |
||||
* @retval FlagStatus Status of the analog watchdog. |
||||
*/ |
||||
FlagStatus ADC1_GetAWDChannelStatus(ADC1_Channel_TypeDef Channel) |
||||
{ |
||||
uint8_t status = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_CHANNEL_OK(Channel)); |
||||
|
||||
if (Channel < (uint8_t)8) |
||||
{ |
||||
status = (uint8_t)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << Channel)); |
||||
} |
||||
else /* Channel = 8 | 9 */ |
||||
{ |
||||
status = (uint8_t)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (Channel - (uint8_t)8))); |
||||
} |
||||
|
||||
return ((FlagStatus)status); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks the specified ADC1 flag status. |
||||
* @param Flag: ADC1 flag. |
||||
* can be one of the values of @ref ADC1_Flag_TypeDef. |
||||
* @retval FlagStatus Status of the ADC1 flag. |
||||
*/ |
||||
FlagStatus ADC1_GetFlagStatus(ADC1_Flag_TypeDef Flag) |
||||
{ |
||||
uint8_t flagstatus = 0; |
||||
uint8_t temp = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_FLAG_OK(Flag)); |
||||
|
||||
if ((Flag & 0x0F) == 0x01) |
||||
{ |
||||
/* Get OVR flag status */ |
||||
flagstatus = (uint8_t)(ADC1->CR3 & ADC1_CR3_OVR); |
||||
} |
||||
else if ((Flag & 0xF0) == 0x10) |
||||
{ |
||||
/* Get analog watchdog channel status */ |
||||
temp = (uint8_t)(Flag & (uint8_t)0x0F); |
||||
if (temp < 8) |
||||
{ |
||||
flagstatus = (uint8_t)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << temp)); |
||||
} |
||||
else |
||||
{ |
||||
flagstatus = (uint8_t)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (temp - 8))); |
||||
} |
||||
} |
||||
else /* Get EOC | AWD flag status */ |
||||
{ |
||||
flagstatus = (uint8_t)(ADC1->CSR & Flag); |
||||
} |
||||
return ((FlagStatus)flagstatus); |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear the specified ADC1 Flag. |
||||
* @param Flag: ADC1 flag. |
||||
* can be one of the values of @ref ADC1_Flag_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ClearFlag(ADC1_Flag_TypeDef Flag) |
||||
{ |
||||
uint8_t temp = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_FLAG_OK(Flag)); |
||||
|
||||
if ((Flag & 0x0F) == 0x01) |
||||
{ |
||||
/* Clear OVR flag status */ |
||||
ADC1->CR3 &= (uint8_t)(~ADC1_CR3_OVR); |
||||
} |
||||
else if ((Flag & 0xF0) == 0x10) |
||||
{ |
||||
/* Clear analog watchdog channel status */ |
||||
temp = (uint8_t)(Flag & (uint8_t)0x0F); |
||||
if (temp < 8) |
||||
{ |
||||
ADC1->AWSRL &= (uint8_t)~(uint8_t)((uint8_t)1 << temp); |
||||
} |
||||
else |
||||
{ |
||||
ADC1->AWSRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (temp - 8)); |
||||
} |
||||
} |
||||
else /* Clear EOC | AWD flag status */ |
||||
{ |
||||
ADC1->CSR &= (uint8_t) (~Flag); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the specified pending bit status |
||||
* @param ITPendingBit : the IT pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - ADC1_IT_AWD : Analog WDG IT status |
||||
* - ADC1_IT_AWS0 : Analog channel 0 IT status |
||||
* - ADC1_IT_AWS1 : Analog channel 1 IT status |
||||
* - ADC1_IT_AWS2 : Analog channel 2 IT status |
||||
* - ADC1_IT_AWS3 : Analog channel 3 IT status |
||||
* - ADC1_IT_AWS4 : Analog channel 4 IT status |
||||
* - ADC1_IT_AWS5 : Analog channel 5 IT status |
||||
* - ADC1_IT_AWS6 : Analog channel 6 IT status |
||||
* - ADC1_IT_AWS7 : Analog channel 7 IT status |
||||
* - ADC1_IT_AWS8 : Analog channel 8 IT status |
||||
* - ADC1_IT_AWS9 : Analog channel 9 IT status |
||||
* - ADC1_IT_EOC : EOC pending bit |
||||
* @retval ITStatus: status of the specified pending bit. |
||||
*/ |
||||
ITStatus ADC1_GetITStatus(ADC1_IT_TypeDef ITPendingBit) |
||||
{ |
||||
ITStatus itstatus = RESET; |
||||
uint8_t temp = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_ITPENDINGBIT_OK(ITPendingBit)); |
||||
|
||||
if (((uint16_t)ITPendingBit & 0xF0) == 0x10) |
||||
{ |
||||
/* Get analog watchdog channel status */ |
||||
temp = (uint8_t)((uint16_t)ITPendingBit & 0x0F); |
||||
if (temp < 8) |
||||
{ |
||||
itstatus = (ITStatus)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << temp)); |
||||
} |
||||
else |
||||
{ |
||||
itstatus = (ITStatus)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (temp - 8))); |
||||
} |
||||
} |
||||
else /* Get EOC | AWD flag status */ |
||||
{ |
||||
itstatus = (ITStatus)(ADC1->CSR & (uint8_t)ITPendingBit); |
||||
} |
||||
return ((ITStatus)itstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear the ADC1 End of Conversion pending bit. |
||||
* @param ITPendingBit : the IT pending bit to clear. |
||||
* This parameter can be one of the following values: |
||||
* - ADC1_IT_AWD : Analog WDG IT status |
||||
* - ADC1_IT_AWS0 : Analog channel 0 IT status |
||||
* - ADC1_IT_AWS1 : Analog channel 1 IT status |
||||
* - ADC1_IT_AWS2 : Analog channel 2 IT status |
||||
* - ADC1_IT_AWS3 : Analog channel 3 IT status |
||||
* - ADC1_IT_AWS4 : Analog channel 4 IT status |
||||
* - ADC1_IT_AWS5 : Analog channel 5 IT status |
||||
* - ADC1_IT_AWS6 : Analog channel 6 IT status |
||||
* - ADC1_IT_AWS7 : Analog channel 7 IT status |
||||
* - ADC1_IT_AWS8 : Analog channel 8 IT status |
||||
* - ADC1_IT_AWS9 : Analog channel 9 IT status |
||||
* - ADC1_IT_EOC : EOC pending bit |
||||
* @retval None |
||||
*/ |
||||
void ADC1_ClearITPendingBit(ADC1_IT_TypeDef ITPendingBit) |
||||
{ |
||||
uint8_t temp = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC1_ITPENDINGBIT_OK(ITPendingBit)); |
||||
|
||||
if (((uint16_t)ITPendingBit & 0xF0) == 0x10) |
||||
{ |
||||
/* Clear analog watchdog channel status */ |
||||
temp = (uint8_t)((uint16_t)ITPendingBit & 0x0F); |
||||
if (temp < 8) |
||||
{ |
||||
ADC1->AWSRL &= (uint8_t)~(uint8_t)((uint8_t)1 << temp); |
||||
} |
||||
else |
||||
{ |
||||
ADC1->AWSRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (temp - 8)); |
||||
} |
||||
} |
||||
else /* Clear EOC | AWD flag status */ |
||||
{ |
||||
ADC1->CSR &= (uint8_t)((uint16_t)~(uint16_t)ITPendingBit); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,398 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_adc2.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions/macros for the ADC2 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_adc2.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup ADC2_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the ADC2 peripheral registers to their default reset |
||||
* values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void ADC2_DeInit(void) |
||||
{ |
||||
ADC2->CSR = ADC2_CSR_RESET_VALUE; |
||||
ADC2->CR1 = ADC2_CR1_RESET_VALUE; |
||||
ADC2->CR2 = ADC2_CR2_RESET_VALUE; |
||||
ADC2->TDRH = ADC2_TDRH_RESET_VALUE; |
||||
ADC2->TDRL = ADC2_TDRL_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the ADC2 peripheral according to the specified parameters |
||||
* @param ADC2_ConversionMode: specifies the conversion mode |
||||
* can be one of the values of @ref ADC2_ConvMode_TypeDef. |
||||
* @param ADC2_Channel: specifies the channel to convert |
||||
* can be one of the values of @ref ADC2_Channel_TypeDef. |
||||
* @param ADC2_PrescalerSelection: specifies the ADC2 prescaler |
||||
* can be one of the values of @ref ADC2_PresSel_TypeDef. |
||||
* @param ADC2_ExtTrigger: specifies the external trigger |
||||
* can be one of the values of @ref ADC2_ExtTrig_TypeDef. |
||||
* @param ADC2_ExtTriggerState: specifies the external trigger new state |
||||
* can be one of the values of @ref FunctionalState. |
||||
* @param ADC2_Align: specifies the converted data alignment |
||||
* can be one of the values of @ref ADC2_Align_TypeDef. |
||||
* @param ADC2_SchmittTriggerChannel: specifies the schmitt trigger channel |
||||
* can be one of the values of @ref ADC2_SchmittTrigg_TypeDef. |
||||
* @param ADC2_SchmittTriggerState: specifies the schmitt trigger state |
||||
* can be one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_Init(ADC2_ConvMode_TypeDef ADC2_ConversionMode, ADC2_Channel_TypeDef ADC2_Channel, ADC2_PresSel_TypeDef ADC2_PrescalerSelection, ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState ADC2_ExtTriggerState, ADC2_Align_TypeDef ADC2_Align, ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, FunctionalState ADC2_SchmittTriggerState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC2_CONVERSIONMODE_OK(ADC2_ConversionMode)); |
||||
assert_param(IS_ADC2_CHANNEL_OK(ADC2_Channel)); |
||||
assert_param(IS_ADC2_PRESSEL_OK(ADC2_PrescalerSelection)); |
||||
assert_param(IS_ADC2_EXTTRIG_OK(ADC2_ExtTrigger)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(((ADC2_ExtTriggerState)))); |
||||
assert_param(IS_ADC2_ALIGN_OK(ADC2_Align)); |
||||
assert_param(IS_ADC2_SCHMITTTRIG_OK(ADC2_SchmittTriggerChannel)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(ADC2_SchmittTriggerState)); |
||||
|
||||
/*-----------------CR1 & CSR configuration --------------------*/ |
||||
/* Configure the conversion mode and the channel to convert
|
||||
respectively according to ADC2_ConversionMode & ADC2_Channel values & ADC2_Align values */ |
||||
ADC2_ConversionConfig(ADC2_ConversionMode, ADC2_Channel, ADC2_Align); |
||||
/* Select the prescaler division factor according to ADC2_PrescalerSelection values */ |
||||
ADC2_PrescalerConfig(ADC2_PrescalerSelection); |
||||
|
||||
/*-----------------CR2 configuration --------------------*/ |
||||
/* Configure the external trigger state and event respectively
|
||||
according to ADC2_ExtTrigStatus, ADC2_ExtTrigger */ |
||||
ADC2_ExternalTriggerConfig(ADC2_ExtTrigger, ADC2_ExtTriggerState); |
||||
|
||||
/*------------------TDR configuration ---------------------------*/ |
||||
/* Configure the schmitt trigger channel and state respectively
|
||||
according to ADC2_SchmittTriggerChannel & ADC2_SchmittTriggerNewState values */ |
||||
ADC2_SchmittTriggerConfig(ADC2_SchmittTriggerChannel, ADC2_SchmittTriggerState); |
||||
|
||||
/* Enable the ADC2 peripheral */ |
||||
ADC2->CR1 |= ADC2_CR1_ADON; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the ADC2 peripheral. |
||||
* @param NewState: specifies the peripheral enabled or disabled state. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC2->CR1 |= ADC2_CR1_ADON; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC2->CR1 &= (uint8_t)(~ADC2_CR1_ADON); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the ADC2 interrupt. |
||||
* @param NewState specifies the state of ADC2 interrupt. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_ITConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the ADC2 interrupts */ |
||||
ADC2->CSR |= (uint8_t)ADC2_CSR_EOCIE; |
||||
} |
||||
else /*NewState == DISABLE */ |
||||
{ |
||||
/* Disable the ADC2 interrupts */ |
||||
ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOCIE); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC2 prescaler division factor. |
||||
* @param ADC2_Prescaler: the selected prescaler. |
||||
* It can be one of the values of @ref ADC2_PresSel_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_PrescalerConfig(ADC2_PresSel_TypeDef ADC2_Prescaler) |
||||
{ |
||||
/* Check the parameter */ |
||||
assert_param(IS_ADC2_PRESSEL_OK(ADC2_Prescaler)); |
||||
|
||||
/* Clear the SPSEL bits */ |
||||
ADC2->CR1 &= (uint8_t)(~ADC2_CR1_SPSEL); |
||||
/* Select the prescaler division factor according to ADC2_PrescalerSelection values */ |
||||
ADC2->CR1 |= (uint8_t)(ADC2_Prescaler); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the ADC2 Schmitt Trigger on a selected channel. |
||||
* @param ADC2_SchmittTriggerChannel specifies the desired Channel. |
||||
* It can be set of the values of @ref ADC2_SchmittTrigg_TypeDef. |
||||
* @param NewState specifies the Channel ADC2 Schmitt Trigger new status. |
||||
* can have one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_SchmittTriggerConfig(ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC2_SCHMITTTRIG_OK(ADC2_SchmittTriggerChannel)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (ADC2_SchmittTriggerChannel == ADC2_SCHMITTTRIG_ALL) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC2->TDRL &= (uint8_t)0x0; |
||||
ADC2->TDRH &= (uint8_t)0x0; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC2->TDRL |= (uint8_t)0xFF; |
||||
ADC2->TDRH |= (uint8_t)0xFF; |
||||
} |
||||
} |
||||
else if (ADC2_SchmittTriggerChannel < ADC2_SCHMITTTRIG_CHANNEL8) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC2->TDRL &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << (uint8_t)ADC2_SchmittTriggerChannel)); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC2->TDRL |= (uint8_t)((uint8_t)0x01 << (uint8_t)ADC2_SchmittTriggerChannel); |
||||
} |
||||
} |
||||
else /* ADC2_SchmittTriggerChannel >= ADC2_SCHMITTTRIG_CHANNEL8 */ |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
ADC2->TDRH &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << ((uint8_t)ADC2_SchmittTriggerChannel - (uint8_t)8))); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
ADC2->TDRH |= (uint8_t)((uint8_t)0x01 << ((uint8_t)ADC2_SchmittTriggerChannel - (uint8_t)8)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC2 conversion on selected channel. |
||||
* @param ADC2_ConversionMode Specifies the conversion type. |
||||
* It can be set of the values of @ref ADC2_ConvMode_TypeDef |
||||
* @param ADC2_Channel specifies the ADC2 Channel. |
||||
* It can be set of the values of @ref ADC2_Channel_TypeDef |
||||
* @param ADC2_Align specifies the converted data alignment. |
||||
* It can be set of the values of @ref ADC2_Align_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void ADC2_ConversionConfig(ADC2_ConvMode_TypeDef ADC2_ConversionMode, ADC2_Channel_TypeDef ADC2_Channel, ADC2_Align_TypeDef ADC2_Align) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC2_CONVERSIONMODE_OK(ADC2_ConversionMode)); |
||||
assert_param(IS_ADC2_CHANNEL_OK(ADC2_Channel)); |
||||
assert_param(IS_ADC2_ALIGN_OK(ADC2_Align)); |
||||
|
||||
/* Clear the align bit */ |
||||
ADC2->CR2 &= (uint8_t)(~ADC2_CR2_ALIGN); |
||||
/* Configure the data alignment */ |
||||
ADC2->CR2 |= (uint8_t)(ADC2_Align); |
||||
|
||||
if (ADC2_ConversionMode == ADC2_CONVERSIONMODE_CONTINUOUS) |
||||
{ |
||||
/* Set the continuous conversion mode */ |
||||
ADC2->CR1 |= ADC2_CR1_CONT; |
||||
} |
||||
else /* ADC2_ConversionMode == ADC2_CONVERSIONMODE_SINGLE */ |
||||
{ |
||||
/* Set the single conversion mode */ |
||||
ADC2->CR1 &= (uint8_t)(~ADC2_CR1_CONT); |
||||
} |
||||
|
||||
/* Clear the ADC2 channels */ |
||||
ADC2->CSR &= (uint8_t)(~ADC2_CSR_CH); |
||||
/* Select the ADC2 channel */ |
||||
ADC2->CSR |= (uint8_t)(ADC2_Channel); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the ADC2 conversion on external trigger event. |
||||
* @par Full description: |
||||
* The selected external trigger event can be enabled or disabled. |
||||
* @param ADC2_ExtTrigger to select the External trigger event. |
||||
* can have one of the values of @ref ADC2_ExtTrig_TypeDef. |
||||
* @param NewState to enable/disable the selected external trigger |
||||
* can have one of the values of @ref FunctionalState. |
||||
* @retval None |
||||
*/ |
||||
void ADC2_ExternalTriggerConfig(ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_ADC2_EXTTRIG_OK(ADC2_ExtTrigger)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Clear the external trigger selection bits */ |
||||
ADC2->CR2 &= (uint8_t)(~ADC2_CR2_EXTSEL); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the selected external Trigger */ |
||||
ADC2->CR2 |= (uint8_t)(ADC2_CR2_EXTTRIG); |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the selected external trigger */ |
||||
ADC2->CR2 &= (uint8_t)(~ADC2_CR2_EXTTRIG); |
||||
} |
||||
|
||||
/* Set the selected external trigger */ |
||||
ADC2->CR2 |= (uint8_t)(ADC2_ExtTrigger); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Start ADC2 conversion |
||||
* @par Full description: |
||||
* This function triggers the start of conversion, after ADC2 configuration. |
||||
* @param None |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Enable the ADC2 peripheral before calling this function |
||||
*/ |
||||
void ADC2_StartConversion(void) |
||||
{ |
||||
ADC2->CR1 |= ADC2_CR1_ADON; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get one sample of measured signal. |
||||
* @param None |
||||
* @retval ConversionValue: value of the measured signal. |
||||
* @par Required preconditions: |
||||
* ADC2 conversion finished. |
||||
*/ |
||||
uint16_t ADC2_GetConversionValue(void) |
||||
{ |
||||
uint16_t temph = 0; |
||||
uint8_t templ = 0; |
||||
|
||||
if ((ADC2->CR2 & ADC2_CR2_ALIGN) != 0) /* Right alignment */ |
||||
{ |
||||
/* Read LSB first */ |
||||
templ = ADC2->DRL; |
||||
/* Then read MSB */ |
||||
temph = ADC2->DRH; |
||||
|
||||
temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); |
||||
} |
||||
else /* Left alignment */ |
||||
{ |
||||
/* Read MSB first*/ |
||||
temph = ADC2->DRH; |
||||
/* Then read LSB */ |
||||
templ = ADC2->DRL; |
||||
|
||||
temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)((uint16_t)temph << 8)); |
||||
} |
||||
|
||||
return ((uint16_t)temph); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks the ADC2 EOC flag status. |
||||
* @param None |
||||
* @retval FlagStatus Status of the ADC2 EOC flag. |
||||
*/ |
||||
FlagStatus ADC2_GetFlagStatus(void) |
||||
{ |
||||
/* Get EOC flag status */ |
||||
return (FlagStatus)(ADC2->CSR & ADC2_CSR_EOC); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear the ADC2 EOC Flag. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void ADC2_ClearFlag(void) |
||||
{ |
||||
ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOC); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the EOC pending bit status |
||||
* @par Parameters: |
||||
* None |
||||
* @retval FlagStatus: status of the EOC pending bit. |
||||
*/ |
||||
ITStatus ADC2_GetITStatus(void) |
||||
{ |
||||
return (ITStatus)(ADC2->CSR & ADC2_CSR_EOC); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear the ADC2 End of Conversion pending bit. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void ADC2_ClearITPendingBit(void) |
||||
{ |
||||
ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOC); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,198 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_awu.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the AWU peripheral.
|
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_awu.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* See also AWU_Timebase_TypeDef structure in stm8s_awu.h file :
|
||||
N 2 5 1 2 4 8 1 3 6 1 2 5 1 2 1 3 |
||||
O 5 0 m m m m 6 2 4 2 5 1 s s 2 0 |
||||
I 0 0 s s s s m m m 8 6 2 s s |
||||
T u u s s s m m m |
||||
s s s s s |
||||
*/ |
||||
/** Contains the different values to write in the APR register (used by AWU_Init function) */ |
||||
CONST uint8_t APR_Array[17] = |
||||
{ |
||||
0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 61, 23, 23, 62 |
||||
}; |
||||
|
||||
/** Contains the different values to write in the TBR register (used by AWU_Init function) */ |
||||
CONST uint8_t TBR_Array[17] = |
||||
{ |
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 15 |
||||
}; |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup AWU_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the AWU peripheral registers to their default reset |
||||
* values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void AWU_DeInit(void) |
||||
{ |
||||
AWU->CSR = AWU_CSR_RESET_VALUE; |
||||
AWU->APR = AWU_APR_RESET_VALUE; |
||||
AWU->TBR = AWU_TBR_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the AWU peripheral according to the specified parameters. |
||||
* @param AWU_TimeBase : Time base selection (interval between AWU interrupts). |
||||
* can be one of the values of @ref AWU_Timebase_TypeDef. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* The LS RC calibration must be performed before calling this function. |
||||
*/ |
||||
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_AWU_TIMEBASE_OK(AWU_TimeBase)); |
||||
|
||||
/* Enable the AWU peripheral */ |
||||
AWU->CSR |= AWU_CSR_AWUEN; |
||||
|
||||
/* Set the TimeBase */ |
||||
AWU->TBR &= (uint8_t)(~AWU_TBR_AWUTB); |
||||
AWU->TBR |= TBR_Array[(uint8_t)AWU_TimeBase]; |
||||
|
||||
/* Set the APR divider */ |
||||
AWU->APR &= (uint8_t)(~AWU_APR_APR); |
||||
AWU->APR |= APR_Array[(uint8_t)AWU_TimeBase]; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable or disable the AWU peripheral. |
||||
* @param NewState Indicates the new state of the AWU peripheral. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Initialisation of AWU and LS RC calibration must be done before. |
||||
*/ |
||||
void AWU_Cmd(FunctionalState NewState) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the AWU peripheral */ |
||||
AWU->CSR |= AWU_CSR_AWUEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the AWU peripheral */ |
||||
AWU->CSR &= (uint8_t)(~AWU_CSR_AWUEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Update APR register with the measured LSI frequency. |
||||
* @par Note on the APR calculation: |
||||
* A is the integer part of lsifreqkhz/4 and x the decimal part. |
||||
* x <= A/(1+2A) is equivalent to A >= x(1+2A) and also to 4A >= 4x(1+2A) [F1] |
||||
* but we know that A + x = lsifreqkhz/4 ==> 4x = lsifreqkhz-4A |
||||
* so [F1] can be written : |
||||
* 4A >= (lsifreqkhz-4A)(1+2A) |
||||
* @param LSIFreqHz Low Speed RC frequency measured by timer (in Hz). |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* - AWU must be disabled to avoid unwanted interrupts. |
||||
*/ |
||||
void AWU_LSICalibrationConfig(uint32_t LSIFreqHz) |
||||
{ |
||||
uint16_t lsifreqkhz = 0x0; |
||||
uint16_t A = 0x0; |
||||
|
||||
/* Check parameter */ |
||||
assert_param(IS_LSI_FREQUENCY_OK(LSIFreqHz)); |
||||
|
||||
lsifreqkhz = (uint16_t)(LSIFreqHz / 1000); /* Converts value in kHz */ |
||||
|
||||
/* Calculation of AWU calibration value */ |
||||
|
||||
A = (uint16_t)(lsifreqkhz >> 2U); /* Division by 4, keep integer part only */ |
||||
|
||||
if ((4U * A) >= ((lsifreqkhz - (4U * A)) * (1U + (2U * A)))) |
||||
{ |
||||
AWU->APR = (uint8_t)(A - 2U); |
||||
} |
||||
else |
||||
{ |
||||
AWU->APR = (uint8_t)(A - 1U); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures AWU in Idle mode to reduce power consumption. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void AWU_IdleModeEnable(void) |
||||
{ |
||||
/* Disable AWU peripheral */ |
||||
AWU->CSR &= (uint8_t)(~AWU_CSR_AWUEN); |
||||
|
||||
/* No AWU timebase */ |
||||
AWU->TBR = (uint8_t)(~AWU_TBR_AWUTB); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns status of the AWU peripheral flag. |
||||
* @param None |
||||
* @retval FlagStatus : Status of the AWU flag. |
||||
* This parameter can be any of the @ref FlagStatus enumeration. |
||||
*/ |
||||
FlagStatus AWU_GetFlagStatus(void) |
||||
{ |
||||
return((FlagStatus)(((uint8_t)(AWU->CSR & AWU_CSR_AWUF) == (uint8_t)0x00) ? RESET : SET)); |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,153 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_beep.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the BEEP peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_beep.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup BEEP_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the BEEP peripheral registers to their default reset |
||||
* values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void BEEP_DeInit(void) |
||||
{ |
||||
BEEP->CSR = BEEP_CSR_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the BEEP function according to the specified parameters. |
||||
* @param BEEP_Frequency Frequency selection. |
||||
* can be one of the values of @ref BEEP_Frequency_TypeDef. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* The LS RC calibration must be performed before calling this function. |
||||
*/ |
||||
void BEEP_Init(BEEP_Frequency_TypeDef BEEP_Frequency) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_BEEP_FREQUENCY_OK(BEEP_Frequency)); |
||||
|
||||
/* Set a default calibration value if no calibration is done */ |
||||
if ((BEEP->CSR & BEEP_CSR_BEEPDIV) == BEEP_CSR_BEEPDIV) |
||||
{ |
||||
BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPDIV); /* Clear bits */ |
||||
BEEP->CSR |= BEEP_CALIBRATION_DEFAULT; |
||||
} |
||||
|
||||
/* Select the output frequency */ |
||||
BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPSEL); |
||||
BEEP->CSR |= (uint8_t)(BEEP_Frequency); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable or disable the BEEP function. |
||||
* @param NewState Indicates the new state of the BEEP function. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Initialisation of BEEP and LS RC calibration must be done before. |
||||
*/ |
||||
void BEEP_Cmd(FunctionalState NewState) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the BEEP peripheral */ |
||||
BEEP->CSR |= BEEP_CSR_BEEPEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the BEEP peripheral */ |
||||
BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Update CSR register with the measured LSI frequency. |
||||
* @par Note on the APR calculation: |
||||
* A is the integer part of LSIFreqkHz/4 and x the decimal part. |
||||
* x <= A/(1+2A) is equivalent to A >= x(1+2A) and also to 4A >= 4x(1+2A) [F1] |
||||
* but we know that A + x = LSIFreqkHz/4 ==> 4x = LSIFreqkHz-4A |
||||
* so [F1] can be written : |
||||
* 4A >= (LSIFreqkHz-4A)(1+2A) |
||||
* @param LSIFreqHz Low Speed RC frequency measured by timer (in Hz). |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* - BEEP must be disabled to avoid unwanted interrupts. |
||||
*/ |
||||
void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz) |
||||
{ |
||||
uint16_t lsifreqkhz; |
||||
uint16_t A; |
||||
|
||||
/* Check parameter */ |
||||
assert_param(IS_LSI_FREQUENCY_OK(LSIFreqHz)); |
||||
|
||||
lsifreqkhz = (uint16_t)(LSIFreqHz / 1000); /* Converts value in kHz */ |
||||
|
||||
/* Calculation of BEEPER calibration value */ |
||||
|
||||
BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPDIV); /* Clear bits */ |
||||
|
||||
A = (uint16_t)(lsifreqkhz >> 3U); /* Division by 8, keep integer part only */ |
||||
|
||||
if ((8U * A) >= ((lsifreqkhz - (8U * A)) * (1U + (2U * A)))) |
||||
{ |
||||
BEEP->CSR |= (uint8_t)(A - 2U); |
||||
} |
||||
else |
||||
{ |
||||
BEEP->CSR |= (uint8_t)(A - 1U); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,756 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_clk.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the CLK peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
|
||||
#include "stm8s_clk.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/* Private Constants ---------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup CLK_Private_Constants |
||||
* @{ |
||||
*/ |
||||
|
||||
CONST uint8_t HSIDivFactor[4] = {1, 2, 4, 8}; /*!< Holds the different HSI Divider factors */ |
||||
CONST uint8_t CLKPrescTable[8] = {1, 2, 4, 8, 10, 16, 20, 40}; /*!< Holds the different CLK prescaler values */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
/**
|
||||
* @addtogroup CLK_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the CLK peripheral registers to their default reset |
||||
* values. |
||||
* @param None |
||||
* @retval None |
||||
* @par Warning: |
||||
* Resetting the CCOR register: \n |
||||
* When the CCOEN bit is set, the reset of the CCOR register require |
||||
* two consecutive write instructions in order to reset first the CCOEN bit |
||||
* and the second one is to reset the CCOSEL bits. |
||||
*/ |
||||
void CLK_DeInit(void) |
||||
{ |
||||
CLK->ICKR = CLK_ICKR_RESET_VALUE; |
||||
CLK->ECKR = CLK_ECKR_RESET_VALUE; |
||||
CLK->SWR = CLK_SWR_RESET_VALUE; |
||||
CLK->SWCR = CLK_SWCR_RESET_VALUE; |
||||
CLK->CKDIVR = CLK_CKDIVR_RESET_VALUE; |
||||
CLK->PCKENR1 = CLK_PCKENR1_RESET_VALUE; |
||||
CLK->PCKENR2 = CLK_PCKENR2_RESET_VALUE; |
||||
CLK->CSSR = CLK_CSSR_RESET_VALUE; |
||||
CLK->CCOR = CLK_CCOR_RESET_VALUE; |
||||
while ((CLK->CCOR & CLK_CCOR_CCOEN)!= 0) |
||||
{} |
||||
CLK->CCOR = CLK_CCOR_RESET_VALUE; |
||||
CLK->HSITRIMR = CLK_HSITRIMR_RESET_VALUE; |
||||
CLK->SWIMCCR = CLK_SWIMCCR_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the High Speed Internal oscillator (HSI). |
||||
* @par Full description: |
||||
* If CLK_FastHaltWakeup is enabled, HSI oscillator is automatically |
||||
* switched-on (HSIEN=1) and selected as next clock master |
||||
* (CKM=SWI=HSI) when resuming from HALT/ActiveHalt modes.\n |
||||
* @param NewState this parameter is the Wake-up Mode state. |
||||
* @retval None |
||||
*/ |
||||
void CLK_FastHaltWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set FHWU bit (HSI oscillator is automatically switched-on) */ |
||||
CLK->ICKR |= CLK_ICKR_FHWU; |
||||
} |
||||
else /* FastHaltWakeup = DISABLE */ |
||||
{ |
||||
/* Reset FHWU bit */ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_FHWU); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable or Disable the External High Speed oscillator (HSE). |
||||
* @param NewState new state of HSEEN, value accepted ENABLE, DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void CLK_HSECmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set HSEEN bit */ |
||||
CLK->ECKR |= CLK_ECKR_HSEEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Reset HSEEN bit */ |
||||
CLK->ECKR &= (uint8_t)(~CLK_ECKR_HSEEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the Internal High Speed oscillator (HSI). |
||||
* @param NewState new state of HSIEN, value accepted ENABLE, DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void CLK_HSICmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set HSIEN bit */ |
||||
CLK->ICKR |= CLK_ICKR_HSIEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Reset HSIEN bit */ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_HSIEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the Internal Low Speed oscillator (LSI). |
||||
* @param NewState new state of LSIEN, value accepted ENABLE, DISABLE. |
||||
* @note Before using the LSI clock you have to enable the option bytes (LSI_EN option bit is set). |
||||
* @retval None |
||||
*/ |
||||
void CLK_LSICmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set LSIEN bit */ |
||||
CLK->ICKR |= CLK_ICKR_LSIEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Reset LSIEN bit */ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_LSIEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disablle the Configurable Clock Output (CCO). |
||||
* @param NewState : New state of CCEN bit (CCO register). |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void CLK_CCOCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set CCOEN bit */ |
||||
CLK->CCOR |= CLK_CCOR_CCOEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Reset CCOEN bit */ |
||||
CLK->CCOR &= (uint8_t)(~CLK_CCOR_CCOEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Starts or Stops manually the clock switch execution. |
||||
* @par Full description: |
||||
* NewState parameter set the SWEN. |
||||
* @param NewState new state of SWEN, value accepted ENABLE, DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void CLK_ClockSwitchCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE ) |
||||
{ |
||||
/* Enable the Clock Switch */ |
||||
CLK->SWCR |= CLK_SWCR_SWEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the Clock Switch */ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the slow active halt wake up |
||||
* @param NewState: specifies the Slow Active Halt wake up state. |
||||
* can be set of the following values: |
||||
* - DISABLE: Slow Active Halt mode disabled; |
||||
* - ENABLE: Slow Active Halt mode enabled. |
||||
* @retval None |
||||
*/ |
||||
void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Set S_ACTHALT bit */ |
||||
CLK->ICKR |= CLK_ICKR_SWUAH; |
||||
} |
||||
else |
||||
{ |
||||
/* Reset S_ACTHALT bit */ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_SWUAH); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified peripheral CLK. |
||||
* @param CLK_Peripheral : This parameter specifies the peripheral clock to gate. |
||||
* This parameter can be any of the @ref CLK_Peripheral_TypeDef enumeration. |
||||
* @param NewState : New state of specified peripheral clock. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
assert_param(IS_CLK_PERIPHERAL_OK(CLK_Peripheral)); |
||||
|
||||
if (((uint8_t)CLK_Peripheral & (uint8_t)0x10) == 0x00) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the peripheral Clock */ |
||||
CLK->PCKENR1 |= (uint8_t)((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)); |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the peripheral Clock */ |
||||
CLK->PCKENR1 &= (uint8_t)(~(uint8_t)(((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)))); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the peripheral Clock */ |
||||
CLK->PCKENR2 |= (uint8_t)((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)); |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the peripheral Clock */ |
||||
CLK->PCKENR2 &= (uint8_t)(~(uint8_t)(((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)))); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief configures the Switch from one clock to another |
||||
* @param CLK_SwitchMode select the clock switch mode. |
||||
* It can be set of the values of @ref CLK_SwitchMode_TypeDef |
||||
* @param CLK_NewClock choice of the future clock. |
||||
* It can be set of the values of @ref CLK_Source_TypeDef |
||||
* @param NewState Enable or Disable the Clock Switch interrupt. |
||||
* @param CLK_CurrentClockState current clock to switch OFF or to keep ON. |
||||
* It can be set of the values of @ref CLK_CurrentClockState_TypeDef |
||||
* @note LSI selected as master clock source only if LSI_EN option bit is set. |
||||
* @retval ErrorStatus this shows the clock switch status (ERROR/SUCCESS). |
||||
*/ |
||||
ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState) |
||||
{ |
||||
CLK_Source_TypeDef clock_master; |
||||
uint16_t DownCounter = CLK_TIMEOUT; |
||||
ErrorStatus Swif = ERROR; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_CLK_SOURCE_OK(CLK_NewClock)); |
||||
assert_param(IS_CLK_SWITCHMODE_OK(CLK_SwitchMode)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(ITState)); |
||||
assert_param(IS_CLK_CURRENTCLOCKSTATE_OK(CLK_CurrentClockState)); |
||||
|
||||
/* Current clock master saving */ |
||||
clock_master = (CLK_Source_TypeDef)CLK->CMSR; |
||||
|
||||
/* Automatic switch mode management */ |
||||
if (CLK_SwitchMode == CLK_SWITCHMODE_AUTO) |
||||
{ |
||||
/* Enables Clock switch */ |
||||
CLK->SWCR |= CLK_SWCR_SWEN; |
||||
|
||||
/* Enables or Disables Switch interrupt */ |
||||
if (ITState != DISABLE) |
||||
{ |
||||
CLK->SWCR |= CLK_SWCR_SWIEN; |
||||
} |
||||
else |
||||
{ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); |
||||
} |
||||
|
||||
/* Selection of the target clock source */ |
||||
CLK->SWR = (uint8_t)CLK_NewClock; |
||||
|
||||
/* Wait until the target clock source is ready */ |
||||
while((((CLK->SWCR & CLK_SWCR_SWBSY) != 0 )&& (DownCounter != 0))) |
||||
{ |
||||
DownCounter--; |
||||
} |
||||
|
||||
if(DownCounter != 0) |
||||
{ |
||||
Swif = SUCCESS; |
||||
} |
||||
else |
||||
{ |
||||
Swif = ERROR; |
||||
} |
||||
} |
||||
else /* CLK_SwitchMode == CLK_SWITCHMODE_MANUAL */ |
||||
{ |
||||
/* Enables or Disables Switch interrupt if required */ |
||||
if (ITState != DISABLE) |
||||
{ |
||||
CLK->SWCR |= CLK_SWCR_SWIEN; |
||||
} |
||||
else |
||||
{ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); |
||||
} |
||||
|
||||
/* Selection of the target clock source */ |
||||
CLK->SWR = (uint8_t)CLK_NewClock; |
||||
|
||||
/* Wait until the target clock source is ready */ |
||||
while((((CLK->SWCR & CLK_SWCR_SWIF) != 0 ) && (DownCounter != 0))) |
||||
{ |
||||
DownCounter--; |
||||
} |
||||
|
||||
if(DownCounter != 0) |
||||
{ |
||||
/* Enables Clock switch */ |
||||
CLK->SWCR |= CLK_SWCR_SWEN; |
||||
Swif = SUCCESS; |
||||
} |
||||
else |
||||
{ |
||||
Swif = ERROR; |
||||
} |
||||
} |
||||
if(Swif != ERROR) |
||||
{ |
||||
/* Switch OFF current clock if required */ |
||||
if((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_HSI)) |
||||
{ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_HSIEN); |
||||
} |
||||
else if((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_LSI)) |
||||
{ |
||||
CLK->ICKR &= (uint8_t)(~CLK_ICKR_LSIEN); |
||||
} |
||||
else if ((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_HSE)) |
||||
{ |
||||
CLK->ECKR &= (uint8_t)(~CLK_ECKR_HSEEN); |
||||
} |
||||
} |
||||
return(Swif); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the HSI clock dividers. |
||||
* @param HSIPrescaler : Specifies the HSI clock divider to apply. |
||||
* This parameter can be any of the @ref CLK_Prescaler_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_HSIPRESCALER_OK(HSIPrescaler)); |
||||
|
||||
/* Clear High speed internal clock prescaler */ |
||||
CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); |
||||
|
||||
/* Set High speed internal clock prescaler */ |
||||
CLK->CKDIVR |= (uint8_t)HSIPrescaler; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Output the selected clock on a dedicated I/O pin. |
||||
* @param CLK_CCO : Specifies the clock source. |
||||
* This parameter can be any of the @ref CLK_Output_TypeDef enumeration. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* The dedicated I/O pin must be set at 1 in the corresponding Px_CR1 register \n |
||||
* to be set as input with pull-up or push-pull output. |
||||
*/ |
||||
void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_OUTPUT_OK(CLK_CCO)); |
||||
|
||||
/* Clears of the CCO type bits part */ |
||||
CLK->CCOR &= (uint8_t)(~CLK_CCOR_CCOSEL); |
||||
|
||||
/* Selects the source provided on cco_ck output */ |
||||
CLK->CCOR |= (uint8_t)CLK_CCO; |
||||
|
||||
/* Enable the clock output */ |
||||
CLK->CCOR |= CLK_CCOR_CCOEN; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified CLK interrupts. |
||||
* @param CLK_IT This parameter specifies the interrupt sources. |
||||
* It can be one of the values of @ref CLK_IT_TypeDef. |
||||
* @param NewState New state of the Interrupt. |
||||
* Value accepted ENABLE, DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
assert_param(IS_CLK_IT_OK(CLK_IT)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
switch (CLK_IT) |
||||
{ |
||||
case CLK_IT_SWIF: /* Enable the clock switch interrupt */ |
||||
CLK->SWCR |= CLK_SWCR_SWIEN; |
||||
break; |
||||
case CLK_IT_CSSD: /* Enable the clock security system detection interrupt */ |
||||
CLK->CSSR |= CLK_CSSR_CSSDIE; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
else /*(NewState == DISABLE)*/ |
||||
{ |
||||
switch (CLK_IT) |
||||
{ |
||||
case CLK_IT_SWIF: /* Disable the clock switch interrupt */ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); |
||||
break; |
||||
case CLK_IT_CSSD: /* Disable the clock security system detection interrupt */ |
||||
CLK->CSSR &= (uint8_t)(~CLK_CSSR_CSSDIE); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the HSI and CPU clock dividers. |
||||
* @param ClockPrescaler Specifies the HSI or CPU clock divider to apply. |
||||
* @retval None |
||||
*/ |
||||
void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescaler) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_PRESCALER_OK(CLK_Prescaler)); |
||||
|
||||
if (((uint8_t)CLK_Prescaler & (uint8_t)0x80) == 0x00) /* Bit7 = 0 means HSI divider */ |
||||
{ |
||||
CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); |
||||
CLK->CKDIVR |= (uint8_t)((uint8_t)CLK_Prescaler & (uint8_t)CLK_CKDIVR_HSIDIV); |
||||
} |
||||
else /* Bit7 = 1 means CPU divider */ |
||||
{ |
||||
CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_CPUDIV); |
||||
CLK->CKDIVR |= (uint8_t)((uint8_t)CLK_Prescaler & (uint8_t)CLK_CKDIVR_CPUDIV); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the SWIM clock frequency on the fly. |
||||
* @param CLK_SWIMDivider Specifies the SWIM clock divider to apply. |
||||
* can be one of the value of @ref CLK_SWIMDivider_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_SWIMDIVIDER_OK(CLK_SWIMDivider)); |
||||
|
||||
if (CLK_SWIMDivider != CLK_SWIMDIVIDER_2) |
||||
{ |
||||
/* SWIM clock is not divided by 2 */ |
||||
CLK->SWIMCCR |= CLK_SWIMCCR_SWIMDIV; |
||||
} |
||||
else /* CLK_SWIMDivider == CLK_SWIMDIVIDER_2 */ |
||||
{ |
||||
/* SWIM clock is divided by 2 */ |
||||
CLK->SWIMCCR &= (uint8_t)(~CLK_SWIMCCR_SWIMDIV); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables the Clock Security System. |
||||
* @par Full description: |
||||
* once CSS is enabled it cannot be disabled until the next reset. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void CLK_ClockSecuritySystemEnable(void) |
||||
{ |
||||
/* Set CSSEN bit */ |
||||
CLK->CSSR |= CLK_CSSR_CSSEN; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the clock source used as system clock. |
||||
* @param None |
||||
* @retval Clock source used. |
||||
* can be one of the values of @ref CLK_Source_TypeDef |
||||
*/ |
||||
CLK_Source_TypeDef CLK_GetSYSCLKSource(void) |
||||
{ |
||||
return((CLK_Source_TypeDef)CLK->CMSR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief This function returns the frequencies of different on chip clocks. |
||||
* @param None |
||||
* @retval the master clock frequency |
||||
*/ |
||||
uint32_t CLK_GetClockFreq(void) |
||||
{ |
||||
uint32_t clockfrequency = 0; |
||||
CLK_Source_TypeDef clocksource = CLK_SOURCE_HSI; |
||||
uint8_t tmp = 0, presc = 0; |
||||
|
||||
/* Get CLK source. */ |
||||
clocksource = (CLK_Source_TypeDef)CLK->CMSR; |
||||
|
||||
if (clocksource == CLK_SOURCE_HSI) |
||||
{ |
||||
tmp = (uint8_t)(CLK->CKDIVR & CLK_CKDIVR_HSIDIV); |
||||
tmp = (uint8_t)(tmp >> 3); |
||||
presc = HSIDivFactor[tmp]; |
||||
clockfrequency = HSI_VALUE / presc; |
||||
} |
||||
else if ( clocksource == CLK_SOURCE_LSI) |
||||
{ |
||||
clockfrequency = LSI_VALUE; |
||||
} |
||||
else |
||||
{ |
||||
clockfrequency = HSE_VALUE; |
||||
} |
||||
|
||||
return((uint32_t)clockfrequency); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. |
||||
* @par Full description: |
||||
* @param CLK_HSICalibrationValue calibration trimming value. |
||||
* can be one of the values of @ref CLK_HSITrimValue_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSICalibrationValue) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_HSITRIMVALUE_OK(CLK_HSICalibrationValue)); |
||||
|
||||
/* Store the new value */ |
||||
CLK->HSITRIMR = (uint8_t)( (uint8_t)(CLK->HSITRIMR & (uint8_t)(~CLK_HSITRIMR_HSITRIM))|((uint8_t)CLK_HSICalibrationValue)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reset the SWBSY flag (SWICR Register) |
||||
* @par Full description: |
||||
* This function reset SWBSY flag in order to reset clock switch operations (target |
||||
* oscillator is broken, stabilization is longing too much, etc.). If at the same time \n |
||||
* software attempts to set SWEN and clear SWBSY, SWBSY action takes precedence. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void CLK_SYSCLKEmergencyClear(void) |
||||
{ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWBSY); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified CLK flag is set or not. |
||||
* @par Full description: |
||||
* @param CLK_FLAG Flag to check. |
||||
* can be one of the values of @ref CLK_Flag_TypeDef |
||||
* @retval FlagStatus, status of the checked flag |
||||
*/ |
||||
FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef CLK_FLAG) |
||||
{ |
||||
uint16_t statusreg = 0; |
||||
uint8_t tmpreg = 0; |
||||
FlagStatus bitstatus = RESET; |
||||
|
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_FLAG_OK(CLK_FLAG)); |
||||
|
||||
/* Get the CLK register index */ |
||||
statusreg = (uint16_t)((uint16_t)CLK_FLAG & (uint16_t)0xFF00); |
||||
|
||||
|
||||
if (statusreg == 0x0100) /* The flag to check is in ICKRregister */ |
||||
{ |
||||
tmpreg = CLK->ICKR; |
||||
} |
||||
else if (statusreg == 0x0200) /* The flag to check is in ECKRregister */ |
||||
{ |
||||
tmpreg = CLK->ECKR; |
||||
} |
||||
else if (statusreg == 0x0300) /* The flag to check is in SWIC register */ |
||||
{ |
||||
tmpreg = CLK->SWCR; |
||||
} |
||||
else if (statusreg == 0x0400) /* The flag to check is in CSS register */ |
||||
{ |
||||
tmpreg = CLK->CSSR; |
||||
} |
||||
else /* The flag to check is in CCO register */ |
||||
{ |
||||
tmpreg = CLK->CCOR; |
||||
} |
||||
|
||||
if ((tmpreg & (uint8_t)CLK_FLAG) != (uint8_t)RESET) |
||||
{ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = RESET; |
||||
} |
||||
|
||||
/* Return the flag status */ |
||||
return((FlagStatus)bitstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified CLK interrupt has is enabled or not. |
||||
* @param CLK_IT specifies the CLK interrupt. |
||||
* can be one of the values of @ref CLK_IT_TypeDef |
||||
* @retval ITStatus, new state of CLK_IT (SET or RESET). |
||||
*/ |
||||
ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT) |
||||
{ |
||||
ITStatus bitstatus = RESET; |
||||
|
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_IT_OK(CLK_IT)); |
||||
|
||||
if (CLK_IT == CLK_IT_SWIF) |
||||
{ |
||||
/* Check the status of the clock switch interrupt */ |
||||
if ((CLK->SWCR & (uint8_t)CLK_IT) == (uint8_t)0x0C) |
||||
{ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = RESET; |
||||
} |
||||
} |
||||
else /* CLK_IT == CLK_IT_CSSDIE */ |
||||
{ |
||||
/* Check the status of the security system detection interrupt */ |
||||
if ((CLK->CSSR & (uint8_t)CLK_IT) == (uint8_t)0x0C) |
||||
{ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = RESET; |
||||
} |
||||
} |
||||
|
||||
/* Return the CLK_IT status */ |
||||
return bitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the CLK’s interrupt pending bits. |
||||
* @param CLK_IT specifies the interrupt pending bits. |
||||
* can be one of the values of @ref CLK_IT_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT) |
||||
{ |
||||
/* check the parameters */ |
||||
assert_param(IS_CLK_IT_OK(CLK_IT)); |
||||
|
||||
if (CLK_IT == (uint8_t)CLK_IT_CSSD) |
||||
{ |
||||
/* Clear the status of the security system detection interrupt */ |
||||
CLK->CSSR &= (uint8_t)(~CLK_CSSR_CSSD); |
||||
} |
||||
else /* CLK_PendingBit == (uint8_t)CLK_IT_SWIF */ |
||||
{ |
||||
/* Clear the status of the clock switch interrupt */ |
||||
CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIF); |
||||
} |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,181 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_exti.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the EXTI peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_exti.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup EXTI_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the external interrupt control registers to their default reset value. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void EXTI_DeInit(void) |
||||
{ |
||||
EXTI->CR1 = EXTI_CR1_RESET_VALUE; |
||||
EXTI->CR2 = EXTI_CR2_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Set the external interrupt sensitivity of the selected port. |
||||
* @warning |
||||
* - The modification of external interrupt sensitivity is only possible when the interrupts are disabled. |
||||
* - The normal behavior is to disable the interrupts before calling this function, and re-enable them after. |
||||
* @param Port The port number to access. |
||||
* @param SensitivityValue The external interrupt sensitivity value to set. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Global interrupts must be disabled before calling this function. |
||||
*/ |
||||
void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_EXTI_PORT_OK(Port)); |
||||
assert_param(IS_EXTI_SENSITIVITY_OK(SensitivityValue)); |
||||
|
||||
/* Set external interrupt sensitivity */ |
||||
switch (Port) |
||||
{ |
||||
case EXTI_PORT_GPIOA: |
||||
EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PAIS); |
||||
EXTI->CR1 |= (uint8_t)(SensitivityValue); |
||||
break; |
||||
case EXTI_PORT_GPIOB: |
||||
EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PBIS); |
||||
EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 2); |
||||
break; |
||||
case EXTI_PORT_GPIOC: |
||||
EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PCIS); |
||||
EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 4); |
||||
break; |
||||
case EXTI_PORT_GPIOD: |
||||
EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PDIS); |
||||
EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 6); |
||||
break; |
||||
case EXTI_PORT_GPIOE: |
||||
EXTI->CR2 &= (uint8_t)(~EXTI_CR2_PEIS); |
||||
EXTI->CR2 |= (uint8_t)(SensitivityValue); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Set the TLI interrupt sensitivity. |
||||
* @param SensitivityValue The TLI interrupt sensitivity value. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* Global interrupts must be disabled before calling this function. |
||||
*/ |
||||
void EXTI_SetTLISensitivity(EXTI_TLISensitivity_TypeDef SensitivityValue) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_EXTI_TLISENSITIVITY_OK(SensitivityValue)); |
||||
|
||||
/* Set TLI interrupt sensitivity */ |
||||
EXTI->CR2 &= (uint8_t)(~EXTI_CR2_TLIS); |
||||
EXTI->CR2 |= (uint8_t)(SensitivityValue); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get the external interrupt sensitivity of the selected port. |
||||
* @param Port The port number to access. |
||||
* @retval EXTI_Sensitivity_TypeDef The external interrupt sensitivity of the selected port. |
||||
*/ |
||||
EXTI_Sensitivity_TypeDef EXTI_GetExtIntSensitivity(EXTI_Port_TypeDef Port) |
||||
{ |
||||
uint8_t value = 0; |
||||
|
||||
/* Check function parameters */ |
||||
assert_param(IS_EXTI_PORT_OK(Port)); |
||||
|
||||
switch (Port) |
||||
{ |
||||
case EXTI_PORT_GPIOA: |
||||
value = (uint8_t)(EXTI->CR1 & EXTI_CR1_PAIS); |
||||
break; |
||||
case EXTI_PORT_GPIOB: |
||||
value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PBIS) >> 2); |
||||
break; |
||||
case EXTI_PORT_GPIOC: |
||||
value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PCIS) >> 4); |
||||
break; |
||||
case EXTI_PORT_GPIOD: |
||||
value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PDIS) >> 6); |
||||
break; |
||||
case EXTI_PORT_GPIOE: |
||||
value = (uint8_t)(EXTI->CR2 & EXTI_CR2_PEIS); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
return((EXTI_Sensitivity_TypeDef)value); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Get the TLI interrupt sensitivity. |
||||
* @param None |
||||
* @retval EXTI_TLISensitivity_TypeDef The TLI interrupt sensitivity read. |
||||
*/ |
||||
EXTI_TLISensitivity_TypeDef EXTI_GetTLISensitivity(void) |
||||
{ |
||||
uint8_t value = 0; |
||||
|
||||
/* Get TLI interrupt sensitivity */ |
||||
value = (uint8_t)(EXTI->CR2 & EXTI_CR2_TLIS); |
||||
|
||||
return((EXTI_TLISensitivity_TypeDef)value); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,814 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_flash.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the FLASH peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_flash.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/**
|
||||
@code |
||||
This driver provides functions to configure and program the Flash memory of all |
||||
STM8S devices. |
||||
|
||||
It includes as well functions that can be either executed from RAM or not, and |
||||
other functions that must be executed from RAM otherwise useless. |
||||
|
||||
The table below lists the functions that can be executed from RAM. |
||||
|
||||
+--------------------------------------------------------------------------------| |
||||
| Functions prototypes | RAM execution | Comments | |
||||
---------------------------------------------------------------------------------| |
||||
| | Mandatory in case of block | Can be executed | |
||||
| FLASH_WaitForLastOperation | Operation: | from Flash in case | |
||||
| | - Block programming | of byte and word | |
||||
| | - Block erase | Operations | |
||||
|--------------------------------------------------------------------------------| |
||||
| FLASH_ProgramBlock | Exclusively | useless from Flash | |
||||
|--------------------------------------------------------------------------------| |
||||
| FLASH_EraseBlock | Exclusively | useless from Flash | |
||||
|--------------------------------------------------------------------------------| |
||||
|
||||
To be able to execute functions from RAM several steps have to be followed. |
||||
These steps may differ from one toolchain to another. |
||||
A detailed description is available below within this driver. |
||||
You can also refer to the FLASH examples provided within the |
||||
STM8S_StdPeriph_Lib package. |
||||
|
||||
@endcode |
||||
*/ |
||||
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
#define FLASH_CLEAR_BYTE ((uint8_t)0x00) |
||||
#define FLASH_SET_BYTE ((uint8_t)0xFF) |
||||
#define OPERATION_TIMEOUT ((uint16_t)0xFFFF) |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
|
||||
// SDCC patch: for passing args to inline ASM (SDCC doesn't support far pointers yet)
|
||||
#if defined (_SDCC_) |
||||
uint32_t asm_addr; // 16b/24b address
|
||||
uint8_t asm_val; // 1B data for r/w data
|
||||
#endif // _SDCC_
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
// SDCC patch: r/w for 16b/24b addresses (SDCC doesn't support far pointers yet)
|
||||
#if defined (_SDCC_) |
||||
void write_byte_address(uint16_t Address, uint8_t Data); // write single byte to 16b/24b address
|
||||
uint8_t read_byte_address(uint32_t Address); // read single byte from 16b/24b address
|
||||
#endif // _SDCC_
|
||||
|
||||
/* Private Constants ---------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup FLASH_Private_functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined (_SDCC_) |
||||
/**
|
||||
* @brief write single byte to address |
||||
* @note is required for SDCC, which doesn't yet support far pointers. |
||||
* For simplicity 16- and 24-bit pointers are treated identically. |
||||
* @param Address : Address of the byte to copy |
||||
* Data : Value to be copied |
||||
* @retval None |
||||
*/ |
||||
void write_byte_address(uint16_t Address, uint8_t Data) |
||||
{ |
||||
/* store address & data globally for assember */ |
||||
asm_addr = Address; |
||||
asm_val = Data; |
||||
|
||||
/* use inline assembler to write to 16b/24b address */ |
||||
__asm |
||||
ld a,_asm_val |
||||
ldf [_asm_addr+1].e,a |
||||
__endasm; |
||||
|
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief Reads any byte from flash memory |
||||
* @note is required for SDCC, which doesn't yet support far pointers. |
||||
* For simplicity 16- and 24-bit pointers are treated identically. |
||||
* @param Address : Address to read |
||||
* @retval Value of the byte |
||||
*/ |
||||
uint8_t read_byte_address(uint32_t Address) |
||||
{ |
||||
/* store address globally for assember */ |
||||
asm_addr = Address; |
||||
|
||||
/* use inline assembler to read from 16b/24b address */ |
||||
__asm |
||||
ldf a,[_asm_addr+1].e |
||||
ld _asm_val,a |
||||
__endasm; |
||||
|
||||
/* return read byte */ |
||||
return(asm_val); |
||||
|
||||
} |
||||
|
||||
#endif // _SDCC_
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
|
||||
/** @addtogroup FLASH_Public_functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Unlocks the program or data EEPROM memory |
||||
* @param FLASH_MemType : Memory type to unlock |
||||
* This parameter can be a value of @ref FLASH_MemType_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); |
||||
|
||||
/* Unlock program memory */ |
||||
if(FLASH_MemType == FLASH_MEMTYPE_PROG) |
||||
{ |
||||
FLASH->PUKR = FLASH_RASS_KEY1; |
||||
FLASH->PUKR = FLASH_RASS_KEY2; |
||||
} |
||||
/* Unlock data memory */ |
||||
else |
||||
{ |
||||
FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */ |
||||
FLASH->DUKR = FLASH_RASS_KEY1; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Locks the program or data EEPROM memory |
||||
* @param FLASH_MemType : Memory type |
||||
* This parameter can be a value of @ref FLASH_MemType_TypeDef |
||||
* @retval None |
||||
*/ |
||||
void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); |
||||
|
||||
/* Lock memory */ |
||||
FLASH->IAPSR &= (uint8_t)FLASH_MemType; |
||||
} |
||||
|
||||
/**
|
||||
* @brief DeInitializes the FLASH registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void FLASH_DeInit(void) |
||||
{ |
||||
FLASH->CR1 = FLASH_CR1_RESET_VALUE; |
||||
FLASH->CR2 = FLASH_CR2_RESET_VALUE; |
||||
FLASH->NCR2 = FLASH_NCR2_RESET_VALUE; |
||||
FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_DUL); |
||||
FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_PUL); |
||||
(void) FLASH->IAPSR; /* Reading of this register causes the clearing of status flags */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the Flash interrupt mode |
||||
* @param NewState : The new state of the flash interrupt mode |
||||
* This parameter can be a value of @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void FLASH_ITConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
FLASH->CR1 |= FLASH_CR1_IE; /* Enables the interrupt sources */ |
||||
} |
||||
else |
||||
{ |
||||
FLASH->CR1 &= (uint8_t)(~FLASH_CR1_IE); /* Disables the interrupt sources */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erases one byte in the program or data EEPROM memory |
||||
* @note PointerAttr define is declared in the stm8s.h file to select if
|
||||
* the pointer will be declared as near (2 bytes) or far (3 bytes). |
||||
* @param Address : Address of the byte to erase |
||||
* @retval None |
||||
*/ |
||||
void FLASH_EraseByte(uint32_t Address) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_FLASH_ADDRESS_OK(Address)); |
||||
|
||||
/* Erase byte */ |
||||
#ifndef _SDCC_ |
||||
*(PointerAttr uint8_t*) (MemoryAddressCast)Address = FLASH_CLEAR_BYTE;
|
||||
#else |
||||
write_byte_address(Address, FLASH_CLEAR_BYTE); // SDCC patch: required for far pointers
|
||||
#endif // _SDCC_
|
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Programs one byte in program or data EEPROM memory |
||||
* @note PointerAttr define is declared in the stm8s.h file to select if
|
||||
* the pointer will be declared as near (2 bytes) or far (3 bytes). |
||||
* @param Address : Address where the byte will be programmed |
||||
* @param Data : Value to be programmed |
||||
* @retval None |
||||
*/ |
||||
void FLASH_ProgramByte(uint32_t Address, uint8_t Data) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FLASH_ADDRESS_OK(Address)); |
||||
|
||||
/* Program byte */ |
||||
#ifndef _SDCC_ |
||||
*(PointerAttr uint8_t*) (MemoryAddressCast)Address = Data; |
||||
#else |
||||
write_byte_address(Address, Data); // SDCC patch: required for far pointers
|
||||
#endif // _SDCC_
|
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Reads any byte from flash memory |
||||
* @note PointerAttr define is declared in the stm8s.h file to select if
|
||||
* the pointer will be declared as near (2 bytes) or far (3 bytes). |
||||
* @param Address : Address to read |
||||
* @retval Value of the byte |
||||
*/ |
||||
uint8_t FLASH_ReadByte(uint32_t Address) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_FLASH_ADDRESS_OK(Address)); |
||||
|
||||
/* Read byte */ |
||||
#ifndef _SDCC_ |
||||
return(*(PointerAttr uint8_t *) (MemoryAddressCast)Address);
|
||||
#else |
||||
return(read_byte_address(Address)); // SDCC patch: required for far pointers
|
||||
#endif // _SDCC_
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Programs one word (4 bytes) in program or data EEPROM memory |
||||
* @note PointerAttr define is declared in the stm8s.h file to select if
|
||||
* the pointer will be declared as near (2 bytes) or far (3 bytes). |
||||
* @param Address : The address where the data will be programmed |
||||
* @param Data : Value to be programmed |
||||
* @retval None |
||||
*/ |
||||
void FLASH_ProgramWord(uint32_t Address, uint32_t Data) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FLASH_ADDRESS_OK(Address)); |
||||
|
||||
/* Enable Word Write Once */ |
||||
FLASH->CR2 |= FLASH_CR2_WPRG; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NWPRG); |
||||
|
||||
#ifndef _SDCC_ |
||||
/* Write one byte - from lowest address*/ |
||||
*((PointerAttr uint8_t*)(MemoryAddressCast)Address) = *((uint8_t*)(&Data)); |
||||
/* Write one byte*/ |
||||
*(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 1) = *((uint8_t*)(&Data)+1);
|
||||
/* Write one byte*/
|
||||
*(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 2) = *((uint8_t*)(&Data)+2);
|
||||
/* Write one byte - from higher address*/ |
||||
*(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 3) = *((uint8_t*)(&Data)+3);
|
||||
#else |
||||
write_byte_address(Address , *((uint8_t*)(&Data))); // SDCC patch: required for far pointers
|
||||
write_byte_address(Address + 1, *((uint8_t*)(&Data)+1)); |
||||
write_byte_address(Address + 2, *((uint8_t*)(&Data)+2)); |
||||
write_byte_address(Address + 3, *((uint8_t*)(&Data)+3)); |
||||
#endif // _SDCC_
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Programs option byte |
||||
* @param Address : option byte address to program |
||||
* @param Data : Value to write |
||||
* @retval None |
||||
*/ |
||||
void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address)); |
||||
|
||||
/* Enable write access to option bytes */ |
||||
FLASH->CR2 |= FLASH_CR2_OPT; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NOPT); |
||||
|
||||
/* check if the option byte to program is ROP*/ |
||||
if(Address == 0x4800) |
||||
{ |
||||
/* Program option byte*/ |
||||
*((NEAR uint8_t*)Address) = Data; |
||||
} |
||||
else |
||||
{ |
||||
/* Program option byte and his complement */ |
||||
*((NEAR uint8_t*)Address) = Data; |
||||
*((NEAR uint8_t*)((uint16_t)(Address + 1))) = (uint8_t)(~Data); |
||||
} |
||||
FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG); |
||||
|
||||
/* Disable write access to option bytes */ |
||||
FLASH->CR2 &= (uint8_t)(~FLASH_CR2_OPT); |
||||
FLASH->NCR2 |= FLASH_NCR2_NOPT; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erases option byte |
||||
* @param Address : Option byte address to erase |
||||
* @retval None |
||||
*/ |
||||
void FLASH_EraseOptionByte(uint16_t Address) |
||||
{ |
||||
/* Check parameter */ |
||||
//assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));
|
||||
|
||||
/* Enable write access to option bytes */ |
||||
FLASH->CR2 |= FLASH_CR2_OPT; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NOPT); |
||||
|
||||
/* check if the option byte to erase is ROP */ |
||||
if(Address == 0x4800) |
||||
{ |
||||
/* Erase option byte */ |
||||
*((NEAR uint8_t*)Address) = FLASH_CLEAR_BYTE; |
||||
} |
||||
else |
||||
{ |
||||
/* Erase option byte and his complement */ |
||||
*((NEAR uint8_t*)Address) = FLASH_CLEAR_BYTE; |
||||
*((NEAR uint8_t*)((uint16_t)(Address + (uint16_t)1 ))) = FLASH_SET_BYTE; |
||||
} |
||||
FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG); |
||||
|
||||
/* Disable write access to option bytes */ |
||||
FLASH->CR2 &= (uint8_t)(~FLASH_CR2_OPT); |
||||
FLASH->NCR2 |= FLASH_NCR2_NOPT; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reads one option byte |
||||
* @param Address option byte address to read. |
||||
* @retval Option byte read value + its complement |
||||
*/ |
||||
uint16_t FLASH_ReadOptionByte(uint16_t Address) |
||||
{ |
||||
uint8_t value_optbyte, value_optbyte_complement = 0; |
||||
uint16_t res_value = 0; |
||||
|
||||
/* Check parameter */ |
||||
assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address)); |
||||
|
||||
value_optbyte = *((NEAR uint8_t*)Address); /* Read option byte */ |
||||
value_optbyte_complement = *(((NEAR uint8_t*)Address) + 1); /* Read option byte complement */ |
||||
|
||||
/* Read-out protection option byte */ |
||||
if(Address == 0x4800)
|
||||
{ |
||||
res_value = value_optbyte; |
||||
} |
||||
else |
||||
{ |
||||
if(value_optbyte == (uint8_t)(~value_optbyte_complement)) |
||||
{ |
||||
res_value = (uint16_t)((uint16_t)value_optbyte << 8); |
||||
res_value = res_value | (uint16_t)value_optbyte_complement; |
||||
} |
||||
else |
||||
{ |
||||
res_value = FLASH_OPTIONBYTE_ERROR; |
||||
} |
||||
} |
||||
return(res_value); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Select the Flash behaviour in low power mode |
||||
* @param FLASH_LPMode Low power mode selection |
||||
* This parameter can be any of the @ref FLASH_LPMode_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void FLASH_SetLowPowerMode(FLASH_LPMode_TypeDef FLASH_LPMode) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_FLASH_LOW_POWER_MODE_OK(FLASH_LPMode)); |
||||
|
||||
/* Clears the two bits */ |
||||
FLASH->CR1 &= (uint8_t)(~(FLASH_CR1_HALT | FLASH_CR1_AHALT));
|
||||
|
||||
/* Sets the new mode */ |
||||
FLASH->CR1 |= (uint8_t)FLASH_LPMode;
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the fixed programming time |
||||
* @param FLASH_ProgTime Indicates the programming time to be fixed |
||||
* This parameter can be any of the @ref FLASH_ProgramTime_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void FLASH_SetProgrammingTime(FLASH_ProgramTime_TypeDef FLASH_ProgTime) |
||||
{ |
||||
/* Check parameter */ |
||||
assert_param(IS_FLASH_PROGRAM_TIME_OK(FLASH_ProgTime)); |
||||
|
||||
FLASH->CR1 &= (uint8_t)(~FLASH_CR1_FIX); |
||||
FLASH->CR1 |= (uint8_t)FLASH_ProgTime; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the Flash behaviour type in low power mode |
||||
* @param None |
||||
* @retval FLASH_LPMode_TypeDef Flash behaviour type in low power mode |
||||
*/ |
||||
FLASH_LPMode_TypeDef FLASH_GetLowPowerMode(void) |
||||
{ |
||||
return((FLASH_LPMode_TypeDef)(FLASH->CR1 & (uint8_t)(FLASH_CR1_HALT | FLASH_CR1_AHALT))); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the fixed programming time |
||||
* @param None |
||||
* @retval FLASH_ProgramTime_TypeDef Fixed programming time value |
||||
*/ |
||||
FLASH_ProgramTime_TypeDef FLASH_GetProgrammingTime(void) |
||||
{ |
||||
return((FLASH_ProgramTime_TypeDef)(FLASH->CR1 & FLASH_CR1_FIX)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the Boot memory size in bytes |
||||
* @param None |
||||
* @retval Boot memory size in bytes |
||||
*/ |
||||
uint32_t FLASH_GetBootSize(void) |
||||
{ |
||||
uint32_t temp = 0; |
||||
|
||||
/* Calculates the number of bytes */ |
||||
temp = (uint32_t)((uint32_t)FLASH->FPR * (uint32_t)512); |
||||
|
||||
/* Correction because size of 127.5 kb doesn't exist */ |
||||
if(FLASH->FPR == 0xFF) |
||||
{ |
||||
temp += 512; |
||||
} |
||||
|
||||
/* Return value */ |
||||
return(temp); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified SPI flag is set or not. |
||||
* @param FLASH_FLAG : Specifies the flag to check. |
||||
* This parameter can be any of the @ref FLASH_Flag_TypeDef enumeration. |
||||
* @retval FlagStatus : Indicates the state of FLASH_FLAG. |
||||
* This parameter can be any of the @ref FlagStatus enumeration. |
||||
* @note This function can clear the EOP, WR_PG_DIS flags in the IAPSR register. |
||||
*/ |
||||
FlagStatus FLASH_GetFlagStatus(FLASH_Flag_TypeDef FLASH_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
/* Check parameters */ |
||||
assert_param(IS_FLASH_FLAGS_OK(FLASH_FLAG)); |
||||
|
||||
/* Check the status of the specified FLASH flag */ |
||||
if((FLASH->IAPSR & (uint8_t)FLASH_FLAG) != (uint8_t)RESET) |
||||
{ |
||||
status = SET; /* FLASH_FLAG is set */ |
||||
} |
||||
else |
||||
{ |
||||
status = RESET; /* FLASH_FLAG is reset*/ |
||||
} |
||||
|
||||
/* Return the FLASH_FLAG status */ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
@code |
||||
All the functions defined below must be executed from RAM exclusively, except |
||||
for the FLASH_WaitForLastOperation function which can be executed from Flash. |
||||
|
||||
Steps of the execution from RAM differs from one toolchain to another: |
||||
- For Cosmic Compiler: |
||||
1- Define a segment FLASH_CODE by the mean of " #pragma section (FLASH_CODE)". |
||||
This segment is defined in the stm8s_flash.c file. |
||||
2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, |
||||
or define it in Cosmic compiler preprocessor to enable the FLASH_CODE segment |
||||
definition. |
||||
3- In STVD Select Project\Settings\Linker\Category "input" and in the RAM section |
||||
add the FLASH_CODE segment with "-ic" options. |
||||
4- In main.c file call the _fctcpy() function with first segment character as
|
||||
parameter "_fctcpy('F');" to load the declared moveable code segment |
||||
(FLASH_CODE) in RAM before execution. |
||||
5- By default the _fctcpy function is packaged in the Cosmic machine library, |
||||
so the function prototype "int _fctcopy(char name);" must be added in main.c |
||||
file. |
||||
|
||||
- For Raisonance Compiler |
||||
1- Use the inram keyword in the function declaration to specify that it can be |
||||
executed from RAM. |
||||
This is done within the stm8s_flash.c file, and it's conditioned by
|
||||
RAM_EXECUTION definition. |
||||
2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, or
|
||||
define it in Raisonance compiler preprocessor to enable the access for the
|
||||
inram functions. |
||||
3- An inram function code is copied from Flash to RAM by the C startup code.
|
||||
In some applications, the RAM area where the code was initially stored may be |
||||
erased or corrupted, so it may be desirable to perform the copy again.
|
||||
Depending on the application memory model, the memcpy() or fmemcpy() functions |
||||
should be used to perform the copy. |
||||
• In case your project uses the SMALL memory model (code smaller than 64K), |
||||
memcpy()function is recommended to perform the copy |
||||
• In case your project uses the LARGE memory model, functions can be
|
||||
everywhere in the 24-bits address space (not limited to the first 64KB of |
||||
code), In this case, the use of memcpy() function will not be appropriate, |
||||
you need to use the specific fmemcpy() function (which copies objects with |
||||
24-bit addresses). |
||||
- The linker automatically defines 2 symbols for each inram function: |
||||
• __address__functionname is a symbol that holds the Flash address
|
||||
where the given function code is stored. |
||||
• __size__functionname is a symbol that holds the function size in bytes. |
||||
And we already have the function address (which is itself a pointer) |
||||
4- In main.c file these two steps should be performed for each inram function: |
||||
• Import the "__address__functionname" and "__size__functionname" symbols |
||||
as global variables: |
||||
extern int __address__functionname; // Symbol holding the flash address
|
||||
extern int __size__functionname; // Symbol holding the function size
|
||||
• In case of SMALL memory model use, Call the memcpy() function to copy the |
||||
inram function to the RAM destination address: |
||||
memcpy(functionname, // RAM destination address
|
||||
(void*)&__address__functionname, // Flash source address
|
||||
(int)&__size__functionname); // Code size of the function
|
||||
• In case of LARGE memory model use, call the fmemcpy() function to copy
|
||||
the inram function to the RAM destination address: |
||||
memcpy(functionname, // RAM destination address
|
||||
(void @far*)&__address__functionname, // Flash source address
|
||||
(int)&__size__functionname); // Code size of the function
|
||||
|
||||
- For IAR Compiler: |
||||
1- Use the __ramfunc keyword in the function declaration to specify that it
|
||||
can be executed from RAM. |
||||
This is done within the stm8s_flash.c file, and it's conditioned by
|
||||
RAM_EXECUTION definition. |
||||
2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, or
|
||||
define it in IAR compiler preprocessor to enable the access for the
|
||||
__ramfunc functions. |
||||
|
||||
- Note:
|
||||
1- Ignore the IAR compiler warnings, these warnings don't impact the FLASH Program/Erase |
||||
operations. |
||||
The code performing the Flash Program/erase must be executed from RAM; the variables |
||||
initializations don't necessary require the execution from RAM, only CR2/NCR2 registers
|
||||
configuration and data programing must be executed from RAM. |
||||
2- These warnings depends on IAR compiler: as the code generation is made using many |
||||
runtime library functions to keep code size to a minimum. |
||||
3- It is recommended to use High Speed Optimization with IAR (-Ohs), in order
|
||||
to reduce the runtime library calls in the generated code. |
||||
|
||||
|
||||
|
||||
The FLASH examples given within the STM8S_StdPeriph_Lib package, details all
|
||||
the steps described above. |
||||
|
||||
@endcode |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief |
||||
******************************************************************************* |
||||
* Execution from RAM enable |
||||
******************************************************************************* |
||||
* |
||||
* To enable execution from RAM you can either uncomment the following define
|
||||
* in the stm8s.h file or define it in your toolchain compiler preprocessor |
||||
* - #define RAM_EXECUTION (1)
|
||||
*/ |
||||
|
||||
#if defined (_COSMIC_) && defined (RAM_EXECUTION) |
||||
#pragma section (FLASH_CODE) |
||||
#endif /* _COSMIC_ && RAM_EXECUTION */ |
||||
/**
|
||||
* @brief Wait for a Flash operation to complete. |
||||
* @note The call and execution of this function must be done from RAM in case |
||||
* of Block operation. |
||||
* @param FLASH_MemType : Memory type |
||||
* This parameter can be a value of @ref FLASH_MemType_TypeDef |
||||
* @retval FLASH status |
||||
*/ |
||||
IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType))
|
||||
{ |
||||
uint8_t flagstatus = 0x00; |
||||
uint16_t timeout = OPERATION_TIMEOUT; |
||||
|
||||
/* Wait until operation completion or write protection page occurred */ |
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ |
||||
defined(STM8S005) || defined(STM8AF52Ax) || defined(STM8AF62Ax) || defined(STM8AF626x)
|
||||
if(FLASH_MemType == FLASH_MEMTYPE_PROG) |
||||
{ |
||||
while((flagstatus == 0x00) && (timeout != 0x00)) |
||||
{ |
||||
flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP | |
||||
FLASH_IAPSR_WR_PG_DIS)); |
||||
timeout--; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
while((flagstatus == 0x00) && (timeout != 0x00)) |
||||
{ |
||||
flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF | |
||||
FLASH_IAPSR_WR_PG_DIS)); |
||||
timeout--; |
||||
} |
||||
} |
||||
#else /*STM8S103, STM8S903, STM8AF622x */ |
||||
while((flagstatus == 0x00) && (timeout != 0x00)) |
||||
{ |
||||
flagstatus = (uint8_t)(FLASH->IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); |
||||
timeout--; |
||||
} |
||||
#endif /* STM8S208, STM8S207, STM8S105, STM8AF52Ax, STM8AF62Ax, STM8AF262x */ |
||||
|
||||
if(timeout == 0x00 ) |
||||
{ |
||||
flagstatus = FLASH_STATUS_TIMEOUT; |
||||
} |
||||
|
||||
return((FLASH_Status_TypeDef)flagstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erases a block in the program or data memory. |
||||
* @note This function should be executed from RAM. |
||||
* @param FLASH_MemType : The type of memory to erase |
||||
* @param BlockNum : Indicates the block number to erase |
||||
* @retval None. |
||||
*/ |
||||
IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType)) |
||||
{ |
||||
uint32_t startaddress = 0; |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ |
||||
defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) |
||||
uint32_t PointerAttr *pwFlash; |
||||
#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax) |
||||
uint8_t PointerAttr *pwFlash; |
||||
#endif |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); |
||||
if(FLASH_MemType == FLASH_MEMTYPE_PROG) |
||||
{ |
||||
assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum)); |
||||
startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS; |
||||
} |
||||
else |
||||
{ |
||||
assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum)); |
||||
startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS; |
||||
} |
||||
|
||||
/* Point to the first block address */ |
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax) |
||||
pwFlash = (PointerAttr uint8_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)); |
||||
#elif defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ |
||||
defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) |
||||
pwFlash = (PointerAttr uint32_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)); |
||||
#endif /* STM8S208, STM8S207 */ |
||||
|
||||
/* Enable erase block mode */ |
||||
FLASH->CR2 |= FLASH_CR2_ERASE; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE); |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ |
||||
defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) |
||||
*pwFlash = (uint32_t)0; |
||||
#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || \ |
||||
defined (STM8AF52Ax) |
||||
*pwFlash = (uint8_t)0; |
||||
*(pwFlash + 1) = (uint8_t)0; |
||||
*(pwFlash + 2) = (uint8_t)0; |
||||
*(pwFlash + 3) = (uint8_t)0;
|
||||
#endif |
||||
} |
||||
|
||||
/**
|
||||
* @brief Programs a memory block |
||||
* @note This function should be executed from RAM. |
||||
* @param FLASH_MemType : The type of memory to program |
||||
* @param BlockNum : The block number |
||||
* @param FLASH_ProgMode : The programming mode. |
||||
* @param Buffer : Pointer to buffer containing source data. |
||||
* @retval None. |
||||
*/ |
||||
IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType,
|
||||
FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer)) |
||||
{ |
||||
uint16_t Count = 0; |
||||
uint32_t startaddress = 0; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); |
||||
assert_param(IS_FLASH_PROGRAM_MODE_OK(FLASH_ProgMode)); |
||||
if(FLASH_MemType == FLASH_MEMTYPE_PROG) |
||||
{ |
||||
assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum)); |
||||
startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS; |
||||
} |
||||
else |
||||
{ |
||||
assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum)); |
||||
startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS; |
||||
} |
||||
|
||||
/* Point to the first block address */ |
||||
startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE); |
||||
|
||||
/* Selection of Standard or Fast programming mode */ |
||||
if(FLASH_ProgMode == FLASH_PROGRAMMODE_STANDARD) |
||||
{ |
||||
/* Standard programming mode */ /*No need in standard mode */ |
||||
FLASH->CR2 |= FLASH_CR2_PRG; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NPRG); |
||||
} |
||||
else |
||||
{ |
||||
/* Fast programming mode */ |
||||
FLASH->CR2 |= FLASH_CR2_FPRG; |
||||
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NFPRG); |
||||
} |
||||
|
||||
/* Copy data bytes from RAM to FLASH memory */ |
||||
for(Count = 0; Count < FLASH_BLOCK_SIZE; Count++) |
||||
{ |
||||
#ifndef _SDCC_ |
||||
*((PointerAttr uint8_t*) (MemoryAddressCast)startaddress + Count) = ((uint8_t)(Buffer[Count])); |
||||
#else |
||||
write_byte_address(startaddress + Count, ((uint8_t)(Buffer[Count]))); // SDCC patch: required for far pointers
|
||||
#endif // _SDCC_
|
||||
} |
||||
} |
||||
|
||||
#if defined (_COSMIC_) && defined (RAM_EXECUTION) |
||||
/* End of FLASH_CODE section */ |
||||
#pragma section () |
||||
#endif /* _COSMIC_ && RAM_EXECUTION */ |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,249 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_gpio.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the GPIO peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_gpio.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/**
|
||||
* @addtogroup GPIO_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the GPIOx peripheral registers to their default reset values. |
||||
* @param GPIOx: Select the GPIO peripheral number (x = A to I). |
||||
* @retval None |
||||
*/ |
||||
void GPIO_DeInit(GPIO_TypeDef* GPIOx) |
||||
{ |
||||
GPIOx->ODR = GPIO_ODR_RESET_VALUE; /* Reset Output Data Register */ |
||||
GPIOx->DDR = GPIO_DDR_RESET_VALUE; /* Reset Data Direction Register */ |
||||
GPIOx->CR1 = GPIO_CR1_RESET_VALUE; /* Reset Control Register 1 */ |
||||
GPIOx->CR2 = GPIO_CR2_RESET_VALUE; /* Reset Control Register 2 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the GPIOx according to the specified parameters. |
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param GPIO_Pin : This parameter contains the pin number, it can be any value |
||||
* of the @ref GPIO_Pin_TypeDef enumeration. |
||||
* @param GPIO_Mode : This parameter can be a value of the |
||||
* @Ref GPIO_Mode_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
|
||||
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode) |
||||
{ |
||||
/*----------------------*/ |
||||
/* Check the parameters */ |
||||
/*----------------------*/ |
||||
|
||||
assert_param(IS_GPIO_MODE_OK(GPIO_Mode)); |
||||
assert_param(IS_GPIO_PIN_OK(GPIO_Pin)); |
||||
|
||||
/* Reset corresponding bit to GPIO_Pin in CR2 register */ |
||||
GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin)); |
||||
|
||||
/*-----------------------------*/ |
||||
/* Input/Output mode selection */ |
||||
/*-----------------------------*/ |
||||
|
||||
if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x80) != (uint8_t)0x00) /* Output mode */ |
||||
{ |
||||
if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x10) != (uint8_t)0x00) /* High level */ |
||||
{ |
||||
GPIOx->ODR |= (uint8_t)GPIO_Pin; |
||||
}
|
||||
else /* Low level */ |
||||
{ |
||||
GPIOx->ODR &= (uint8_t)(~(GPIO_Pin)); |
||||
} |
||||
/* Set Output mode */ |
||||
GPIOx->DDR |= (uint8_t)GPIO_Pin; |
||||
}
|
||||
else /* Input mode */ |
||||
{ |
||||
/* Set Input mode */ |
||||
GPIOx->DDR &= (uint8_t)(~(GPIO_Pin)); |
||||
} |
||||
|
||||
/*------------------------------------------------------------------------*/ |
||||
/* Pull-Up/Float (Input) or Push-Pull/Open-Drain (Output) modes selection */ |
||||
/*------------------------------------------------------------------------*/ |
||||
|
||||
if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x40) != (uint8_t)0x00) /* Pull-Up or Push-Pull */ |
||||
{ |
||||
GPIOx->CR1 |= (uint8_t)GPIO_Pin; |
||||
}
|
||||
else /* Float or Open-Drain */ |
||||
{ |
||||
GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin)); |
||||
} |
||||
|
||||
/*-----------------------------------------------------*/ |
||||
/* Interrupt (Input) or Slope (Output) modes selection */ |
||||
/*-----------------------------------------------------*/ |
||||
|
||||
if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x20) != (uint8_t)0x00) /* Interrupt or Slow slope */ |
||||
{ |
||||
GPIOx->CR2 |= (uint8_t)GPIO_Pin; |
||||
}
|
||||
else /* No external interrupt or No slope control */ |
||||
{ |
||||
GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Writes data to the specified GPIO data port. |
||||
* @note The port must be configured in output mode. |
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param GPIO_PortVal : Specifies the value to be written to the port output |
||||
* data register. |
||||
* @retval None |
||||
*/ |
||||
void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) |
||||
{ |
||||
GPIOx->ODR = PortVal; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Writes high level to the specified GPIO pins. |
||||
* @note The port must be configured in output mode.
|
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param PortPins : Specifies the pins to be turned high to the port output. |
||||
* data register. |
||||
* @retval None |
||||
*/ |
||||
void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) |
||||
{ |
||||
GPIOx->ODR |= (uint8_t)PortPins; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Writes low level to the specified GPIO pins. |
||||
* @note The port must be configured in output mode.
|
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param PortPins : Specifies the pins to be turned low to the port output. |
||||
* data register. |
||||
* @retval None |
||||
*/ |
||||
void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) |
||||
{ |
||||
GPIOx->ODR &= (uint8_t)(~PortPins); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Writes reverse level to the specified GPIO pins. |
||||
* @note The port must be configured in output mode. |
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param PortPins : Specifies the pins to be reversed to the port output. |
||||
* data register. |
||||
* @retval None |
||||
*/ |
||||
void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) |
||||
{ |
||||
GPIOx->ODR ^= (uint8_t)PortPins; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reads the specified GPIO output data port. |
||||
* @note The port must be configured in input mode.
|
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @retval GPIO output data port value. |
||||
*/ |
||||
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) |
||||
{ |
||||
return ((uint8_t)GPIOx->ODR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reads the specified GPIO input data port. |
||||
* @note The port must be configured in input mode.
|
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @retval GPIO input data port value. |
||||
*/ |
||||
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) |
||||
{ |
||||
return ((uint8_t)GPIOx->IDR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reads the specified GPIO input data pin. |
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param GPIO_Pin : Specifies the pin number. |
||||
* @retval BitStatus : GPIO input pin status. |
||||
*/ |
||||
BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin) |
||||
{ |
||||
return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the external pull-up on GPIOx pins. |
||||
* @param GPIOx : Select the GPIO peripheral number (x = A to I). |
||||
* @param GPIO_Pin : Specifies the pin number |
||||
* @param NewState : The new state of the pull up pin. |
||||
* @retval None |
||||
*/ |
||||
void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_GPIO_PIN_OK(GPIO_Pin)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) /* External Pull-Up Set*/ |
||||
{ |
||||
GPIOx->CR1 |= (uint8_t)GPIO_Pin; |
||||
} else /* External Pull-Up Reset*/ |
||||
{ |
||||
GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,893 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_i2c.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the I2C peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_i2c.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
|
||||
/** @defgroup I2C_Private_Defines
|
||||
* @{ |
||||
*/ |
||||
/* I2C register mask */ |
||||
#define REGISTER_Mask ((uint16_t)0x3000) |
||||
#define REGISTER_SR1_Index ((uint16_t)0x0100) |
||||
#define REGISTER_SR2_Index ((uint16_t)0x0200) |
||||
/* I2C Interrupt Enable mask */ |
||||
#define ITEN_Mask ((uint16_t)0x0700) |
||||
/* I2C FLAG mask */ |
||||
#define FLAG_Mask ((uint16_t)0x00FF) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
|
||||
/**
|
||||
* @addtogroup I2C_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the I2C peripheral registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void I2C_DeInit(void) |
||||
{ |
||||
I2C->CR1 = I2C_CR1_RESET_VALUE; |
||||
I2C->CR2 = I2C_CR2_RESET_VALUE; |
||||
I2C->FREQR = I2C_FREQR_RESET_VALUE; |
||||
I2C->OARL = I2C_OARL_RESET_VALUE; |
||||
I2C->OARH = I2C_OARH_RESET_VALUE; |
||||
I2C->ITR = I2C_ITR_RESET_VALUE; |
||||
I2C->CCRL = I2C_CCRL_RESET_VALUE; |
||||
I2C->CCRH = I2C_CCRH_RESET_VALUE; |
||||
I2C->TRISER = I2C_TRISER_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the I2C according to the specified parameters in standard |
||||
* or fast mode. |
||||
* @param OutputClockFrequencyHz : Specifies the output clock frequency in Hz. |
||||
* @param OwnAddress : Specifies the own address. |
||||
* @param I2C_DutyCycle : Specifies the duty cycle to apply in fast mode. |
||||
* This parameter can be any of the @ref I2C_DutyCycle_TypeDef enumeration. |
||||
* @note This parameter don't have impact when the OutputClockFrequency lower |
||||
* than 100KHz. |
||||
* @param Ack : Specifies the acknowledge mode to apply. |
||||
* This parameter can be any of the @ref I2C_Ack_TypeDef enumeration. |
||||
* @param AddMode : Specifies the acknowledge address to apply. |
||||
* This parameter can be any of the @ref I2C_AddMode_TypeDef enumeration. |
||||
* @param InputClockFrequencyMHz : Specifies the input clock frequency in MHz. |
||||
* @retval None |
||||
*/ |
||||
void I2C_Init(uint32_t OutputClockFrequencyHz, uint16_t OwnAddress,
|
||||
I2C_DutyCycle_TypeDef I2C_DutyCycle, I2C_Ack_TypeDef Ack,
|
||||
I2C_AddMode_TypeDef AddMode, uint8_t InputClockFrequencyMHz ) |
||||
{ |
||||
uint16_t result = 0x0004; |
||||
uint16_t tmpval = 0; |
||||
uint8_t tmpccrh = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_ACK_OK(Ack)); |
||||
assert_param(IS_I2C_ADDMODE_OK(AddMode)); |
||||
assert_param(IS_I2C_OWN_ADDRESS_OK(OwnAddress)); |
||||
assert_param(IS_I2C_DUTYCYCLE_OK(I2C_DutyCycle));
|
||||
assert_param(IS_I2C_INPUT_CLOCK_FREQ_OK(InputClockFrequencyMHz)); |
||||
assert_param(IS_I2C_OUTPUT_CLOCK_FREQ_OK(OutputClockFrequencyHz)); |
||||
|
||||
|
||||
/*------------------------- I2C FREQ Configuration ------------------------*/ |
||||
/* Clear frequency bits */ |
||||
I2C->FREQR &= (uint8_t)(~I2C_FREQR_FREQ); |
||||
/* Write new value */ |
||||
I2C->FREQR |= InputClockFrequencyMHz; |
||||
|
||||
/*--------------------------- I2C CCR Configuration ------------------------*/ |
||||
/* Disable I2C to configure TRISER */ |
||||
I2C->CR1 &= (uint8_t)(~I2C_CR1_PE); |
||||
|
||||
/* Clear CCRH & CCRL */ |
||||
I2C->CCRH &= (uint8_t)(~(I2C_CCRH_FS | I2C_CCRH_DUTY | I2C_CCRH_CCR)); |
||||
I2C->CCRL &= (uint8_t)(~I2C_CCRL_CCR); |
||||
|
||||
/* Detect Fast or Standard mode depending on the Output clock frequency selected */ |
||||
if (OutputClockFrequencyHz > I2C_MAX_STANDARD_FREQ) /* FAST MODE */ |
||||
{ |
||||
/* Set F/S bit for fast mode */ |
||||
tmpccrh = I2C_CCRH_FS; |
||||
|
||||
if (I2C_DutyCycle == I2C_DUTYCYCLE_2) |
||||
{ |
||||
/* Fast mode speed calculate: Tlow/Thigh = 2 */ |
||||
result = (uint16_t) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 3)); |
||||
} |
||||
else /* I2C_DUTYCYCLE_16_9 */ |
||||
{ |
||||
/* Fast mode speed calculate: Tlow/Thigh = 16/9 */ |
||||
result = (uint16_t) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 25)); |
||||
/* Set DUTY bit */ |
||||
tmpccrh |= I2C_CCRH_DUTY; |
||||
} |
||||
|
||||
/* Verify and correct CCR value if below minimum value */ |
||||
if (result < (uint16_t)0x01) |
||||
{ |
||||
/* Set the minimum allowed value */ |
||||
result = (uint16_t)0x0001; |
||||
} |
||||
|
||||
/* Set Maximum Rise Time: 300ns max in Fast Mode
|
||||
= [300ns/(1/InputClockFrequencyMHz.10e6)]+1 |
||||
= [(InputClockFrequencyMHz * 3)/10]+1 */ |
||||
tmpval = ((InputClockFrequencyMHz * 3) / 10) + 1; |
||||
I2C->TRISER = (uint8_t)tmpval; |
||||
|
||||
} |
||||
else /* STANDARD MODE */ |
||||
{ |
||||
|
||||
/* Calculate standard mode speed */ |
||||
result = (uint16_t)((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz << (uint8_t)1)); |
||||
|
||||
/* Verify and correct CCR value if below minimum value */ |
||||
if (result < (uint16_t)0x0004) |
||||
{ |
||||
/* Set the minimum allowed value */ |
||||
result = (uint16_t)0x0004; |
||||
} |
||||
|
||||
/* Set Maximum Rise Time: 1000ns max in Standard Mode
|
||||
= [1000ns/(1/InputClockFrequencyMHz.10e6)]+1 |
||||
= InputClockFrequencyMHz+1 */ |
||||
I2C->TRISER = (uint8_t)(InputClockFrequencyMHz + (uint8_t)1); |
||||
|
||||
} |
||||
|
||||
/* Write CCR with new calculated value */ |
||||
I2C->CCRL = (uint8_t)result; |
||||
I2C->CCRH = (uint8_t)((uint8_t)((uint8_t)(result >> 8) & I2C_CCRH_CCR) | tmpccrh); |
||||
|
||||
/* Enable I2C */ |
||||
I2C->CR1 |= I2C_CR1_PE; |
||||
|
||||
/* Configure I2C acknowledgement */ |
||||
I2C_AcknowledgeConfig(Ack); |
||||
|
||||
/*--------------------------- I2C OAR Configuration ------------------------*/ |
||||
I2C->OARL = (uint8_t)(OwnAddress); |
||||
I2C->OARH = (uint8_t)((uint8_t)(AddMode | I2C_OARH_ADDCONF) | |
||||
(uint8_t)((OwnAddress & (uint16_t)0x0300) >> (uint8_t)7)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the I2C peripheral. |
||||
* @param NewState : Indicate the new I2C peripheral state. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable I2C peripheral */ |
||||
I2C->CR1 |= I2C_CR1_PE; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable I2C peripheral */ |
||||
I2C->CR1 &= (uint8_t)(~I2C_CR1_PE); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the I2C General Call feature. |
||||
* @param NewState : State of the General Call feature. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_GeneralCallCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable General Call */ |
||||
I2C->CR1 |= I2C_CR1_ENGC; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable General Call */ |
||||
I2C->CR1 &= (uint8_t)(~I2C_CR1_ENGC); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Generates I2C communication START condition. |
||||
* @note CCR must be programmed, i.e. I2C_Init function must have been called |
||||
* with a valid I2C_ClockSpeed |
||||
* @param NewState : Enable or disable the start condition. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_GenerateSTART(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Generate a START condition */ |
||||
I2C->CR2 |= I2C_CR2_START; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the START condition generation */ |
||||
I2C->CR2 &= (uint8_t)(~I2C_CR2_START); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Generates I2C communication STOP condition. |
||||
* @param NewState : Enable or disable the stop condition. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_GenerateSTOP(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Generate a STOP condition */ |
||||
I2C->CR2 |= I2C_CR2_STOP; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the STOP condition generation */ |
||||
I2C->CR2 &= (uint8_t)(~I2C_CR2_STOP); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables I2C software reset. |
||||
* @param NewState : Specifies the new state of the I2C software reset. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_SoftwareResetCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Peripheral under reset */ |
||||
I2C->CR2 |= I2C_CR2_SWRST; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Peripheral not under reset */ |
||||
I2C->CR2 &= (uint8_t)(~I2C_CR2_SWRST); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the I2C clock stretching. |
||||
* @param NewState : Specifies the new state of the I2C Clock stretching. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
|
||||
void I2C_StretchClockCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Clock Stretching Enable */ |
||||
I2C->CR1 &= (uint8_t)(~I2C_CR1_NOSTRETCH); |
||||
|
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Clock Stretching Disable (Slave mode) */ |
||||
I2C->CR1 |= I2C_CR1_NOSTRETCH; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable or Disable the I2C acknowledge and position acknowledge feature. |
||||
* @note This function must be called before data reception start |
||||
* @param Ack : Specifies the acknowledge mode to apply. |
||||
* This parameter can be any of the @ref I2C_Ack_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_AcknowledgeConfig(I2C_Ack_TypeDef Ack) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_I2C_ACK_OK(Ack)); |
||||
|
||||
if (Ack == I2C_ACK_NONE) |
||||
{ |
||||
/* Disable the acknowledgement */ |
||||
I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK); |
||||
} |
||||
else |
||||
{ |
||||
/* Enable the acknowledgement */ |
||||
I2C->CR2 |= I2C_CR2_ACK; |
||||
|
||||
if (Ack == I2C_ACK_CURR) |
||||
{ |
||||
/* Configure (N)ACK on current byte */ |
||||
I2C->CR2 &= (uint8_t)(~I2C_CR2_POS); |
||||
} |
||||
else |
||||
{ |
||||
/* Configure (N)ACK on next byte */ |
||||
I2C->CR2 |= I2C_CR2_POS; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified I2C interrupt. |
||||
* @param ITName : Name of the interrupt to enable or disable. |
||||
* This parameter can be any of the @ref I2C_IT_TypeDef enumeration. |
||||
* @param NewState : State of the interrupt to apply. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_ITConfig(I2C_IT_TypeDef I2C_IT, FunctionalState NewState) |
||||
{ |
||||
/* Check functions parameters */ |
||||
assert_param(IS_I2C_INTERRUPT_OK(I2C_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the selected I2C interrupts */ |
||||
I2C->ITR |= (uint8_t)I2C_IT; |
||||
} |
||||
else /* NewState == DISABLE */ |
||||
{ |
||||
/* Disable the selected I2C interrupts */ |
||||
I2C->ITR &= (uint8_t)(~(uint8_t)I2C_IT); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the specified I2C fast mode duty cycle. |
||||
* @param I2C_DutyCycle : Specifies the duty cycle to apply. |
||||
* This parameter can be any of the @ref I2C_DutyCycle_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_FastModeDutyCycleConfig(I2C_DutyCycle_TypeDef I2C_DutyCycle) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_I2C_DUTYCYCLE_OK(I2C_DutyCycle)); |
||||
|
||||
if (I2C_DutyCycle == I2C_DUTYCYCLE_16_9) |
||||
{ |
||||
/* I2C fast mode Tlow/Thigh = 16/9 */ |
||||
I2C->CCRH |= I2C_CCRH_DUTY; |
||||
} |
||||
else /* I2C_DUTYCYCLE_2 */ |
||||
{ |
||||
/* I2C fast mode Tlow/Thigh = 2 */ |
||||
I2C->CCRH &= (uint8_t)(~I2C_CCRH_DUTY); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data. |
||||
* @param None |
||||
* @retval uint8_t : The value of the received byte data. |
||||
*/ |
||||
uint8_t I2C_ReceiveData(void) |
||||
{ |
||||
/* Return the data present in the DR register */ |
||||
return ((uint8_t)I2C->DR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits the 7-bit address (to select the) slave device. |
||||
* @param Address : Specifies the slave address which will be transmitted. |
||||
* @param Direction : Specifies whether the I2C device will be a Transmitter or a Receiver. |
||||
* This parameter can be any of the @ref I2C_Direction_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_I2C_ADDRESS_OK(Address)); |
||||
assert_param(IS_I2C_DIRECTION_OK(Direction)); |
||||
|
||||
/* Clear bit0 (direction) just in case */ |
||||
Address &= (uint8_t)0xFE; |
||||
|
||||
/* Send the Address + Direction */ |
||||
I2C->DR = (uint8_t)(Address | (uint8_t)Direction); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Send a byte by writing in the DR register. |
||||
* @param Data : Byte to be sent. |
||||
* @retval None |
||||
*/ |
||||
void I2C_SendData(uint8_t Data) |
||||
{ |
||||
/* Write in the DR register the data to be sent */ |
||||
I2C->DR = Data; |
||||
} |
||||
|
||||
/**
|
||||
* @brief |
||||
**************************************************************************************** |
||||
* |
||||
* I2C State Monitoring Functions |
||||
* |
||||
**************************************************************************************** |
||||
* This I2C driver provides three different ways for I2C state monitoring |
||||
* depending on the application requirements and constraints: |
||||
* |
||||
* |
||||
* 1) Basic state monitoring: |
||||
* Using I2C_CheckEvent() function: |
||||
* It compares the status registers (SR1, SR2 and SR3) content to a given event |
||||
* (can be the combination of one or more flags). |
||||
* It returns SUCCESS if the current status includes the given flags |
||||
* and returns ERROR if one or more flags are missing in the current status. |
||||
* - When to use: |
||||
* - This function is suitable for most applications as well as for startup |
||||
* activity since the events are fully described in the product reference manual |
||||
* (RM0016). |
||||
* - It is also suitable for users who need to define their own events. |
||||
* - Limitations: |
||||
* - If an error occurs (ie. error flags are set besides to the monitored flags), |
||||
* the I2C_CheckEvent() function may return SUCCESS despite the communication |
||||
* hold or corrupted real state. |
||||
* In this case, it is advised to use error interrupts to monitor the error |
||||
* events and handle them in the interrupt IRQ handler. |
||||
* |
||||
* @note |
||||
* For error management, it is advised to use the following functions: |
||||
* - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). |
||||
* - I2C_IRQHandler() which is called when the I2C interrupts occur. |
||||
* - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the |
||||
* I2C_IRQHandler() function in order to determine which error occurred. |
||||
* - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() |
||||
* and/or I2C_GenerateStop() in order to clear the error flag and |
||||
* source and return to correct communication status. |
||||
* |
||||
* |
||||
* 2) Advanced state monitoring: |
||||
* Using the function I2C_GetLastEvent() which returns the image of both SR1 |
||||
* & SR3 status registers in a single word (uint16_t) (Status Register 3 value |
||||
* is shifted left by 8 bits and concatenated to Status Register 1). |
||||
* - When to use: |
||||
* - This function is suitable for the same applications above but it allows to |
||||
* overcome the limitations of I2C_GetFlagStatus() function (see below). |
||||
* The returned value could be compared to events already defined in the |
||||
* library (stm8s_i2c.h) or to custom values defined by user. |
||||
* - This function is suitable when multiple flags are monitored at the same time. |
||||
* - At the opposite of I2C_CheckEvent() function, this function allows user to |
||||
* choose when an event is accepted (when all events flags are set and no |
||||
* other flags are set or just when the needed flags are set like |
||||
* I2C_CheckEvent() function). |
||||
* - Limitations: |
||||
* - User may need to define his own events. |
||||
* - Same remark concerning the error management is applicable for this |
||||
* function if user decides to check only regular communication flags (and |
||||
* ignores error flags). |
||||
* |
||||
* |
||||
* 3) Flag-based state monitoring: |
||||
* Using the function I2C_GetFlagStatus() which simply returns the status of |
||||
* one single flag (ie. I2C_FLAG_RXNE ...). |
||||
* - When to use: |
||||
* - This function could be used for specific applications or in debug phase. |
||||
* - It is suitable when only one flag checking is needed (most I2C events |
||||
* are monitored through multiple flags). |
||||
* - Limitations: |
||||
* - When calling this function, the Status register is accessed. Some flags are |
||||
* cleared when the status register is accessed. So checking the status |
||||
* of one Flag, may clear other ones. |
||||
* - Function may need to be called twice or more in order to monitor one |
||||
* single event. |
||||
* |
||||
* For detailed description of Events, please refer to section I2C_Events in |
||||
* stm8s_i2c.h file. |
||||
* |
||||
*/ |
||||
/**
|
||||
* |
||||
* 1) Basic state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Checks whether the last I2C Event is equal to the one passed |
||||
* as parameter. |
||||
* @param I2C_EVENT: specifies the event to be checked. |
||||
* This parameter can be one of the following values: |
||||
* @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 |
||||
* @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 |
||||
* @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 |
||||
* @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 |
||||
* @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2 |
||||
* @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 |
||||
* @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3 |
||||
* @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 |
||||
* @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 |
||||
* @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 |
||||
* @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 |
||||
* @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 |
||||
* @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 |
||||
* @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 |
||||
* @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 |
||||
* @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 |
||||
* |
||||
* @note: For detailed description of Events, please refer to section |
||||
* I2C_Events in stm8s_i2c.h file. |
||||
* |
||||
* @retval An ErrorStatus enumeration value: |
||||
* - SUCCESS: Last event is equal to the I2C_EVENT |
||||
* - ERROR: Last event is different from the I2C_EVENT |
||||
*/ |
||||
ErrorStatus I2C_CheckEvent(I2C_Event_TypeDef I2C_Event) |
||||
{ |
||||
__IO uint16_t lastevent = 0x00; |
||||
uint8_t flag1 = 0x00 ; |
||||
uint8_t flag2 = 0x00; |
||||
ErrorStatus status = ERROR; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_EVENT_OK(I2C_Event)); |
||||
|
||||
if (I2C_Event == I2C_EVENT_SLAVE_ACK_FAILURE) |
||||
{ |
||||
lastevent = I2C->SR2 & I2C_SR2_AF; |
||||
} |
||||
else |
||||
{ |
||||
flag1 = I2C->SR1; |
||||
flag2 = I2C->SR3; |
||||
lastevent = ((uint16_t)((uint16_t)flag2 << (uint16_t)8) | (uint16_t)flag1); |
||||
} |
||||
/* Check whether the last event is equal to I2C_EVENT */ |
||||
if (((uint16_t)lastevent & (uint16_t)I2C_Event) == (uint16_t)I2C_Event) |
||||
{ |
||||
/* SUCCESS: last event is equal to I2C_EVENT */ |
||||
status = SUCCESS; |
||||
} |
||||
else |
||||
{ |
||||
/* ERROR: last event is different from I2C_EVENT */ |
||||
status = ERROR; |
||||
} |
||||
|
||||
/* Return status */ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* |
||||
* 2) Advanced state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
/**
|
||||
* @brief Returns the last I2C Event. |
||||
* |
||||
* @note: For detailed description of Events, please refer to section |
||||
* I2C_Events in stm8s_i2c.h file. |
||||
* |
||||
* @retval The last event |
||||
* This parameter can be any of the @ref I2C_Event_TypeDef enumeration. |
||||
*/ |
||||
I2C_Event_TypeDef I2C_GetLastEvent(void) |
||||
{ |
||||
__IO uint16_t lastevent = 0; |
||||
uint16_t flag1 = 0; |
||||
uint16_t flag2 = 0; |
||||
|
||||
if ((I2C->SR2 & I2C_SR2_AF) != 0x00) |
||||
{ |
||||
lastevent = I2C_EVENT_SLAVE_ACK_FAILURE; |
||||
} |
||||
else |
||||
{ |
||||
/* Read the I2C status register */ |
||||
flag1 = I2C->SR1; |
||||
flag2 = I2C->SR3; |
||||
|
||||
/* Get the last event value from I2C status register */ |
||||
lastevent = ((uint16_t)((uint16_t)flag2 << 8) | (uint16_t)flag1); |
||||
} |
||||
/* Return status */ |
||||
return (I2C_Event_TypeDef)lastevent; |
||||
} |
||||
|
||||
/**
|
||||
* |
||||
* 3) Flag-based state monitoring |
||||
******************************************************************************* |
||||
*/ |
||||
/**
|
||||
* @brief Checks whether the specified I2C flag is set or not. |
||||
* @param I2C_FLAG: specifies the flag to check. |
||||
* This parameter can be one of the following values: |
||||
* @arg I2C_FLAG_GENERALCALL: General call header flag (Slave mode) |
||||
* @arg I2C_FLAG_TRANSMITTERRECEIVER: Transmitter/Receiver flag |
||||
* @arg I2C_FLAG_BUSBUSY: Bus busy flag |
||||
* @arg I2C_FLAG_MASTERSLAVE: Master/Slave flag |
||||
* @arg I2C_FLAG_WAKEUPFROMHALT: Wake up from HALT flag
|
||||
* @arg I2C_FLAG_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) |
||||
* @arg I2C_FLAG_ACKNOWLEDGEFAILURE: Acknowledge failure flag |
||||
* @arg I2C_FLAG_ARBITRATIONLOSS: Arbitration lost flag (Master mode) |
||||
* @arg I2C_FLAG_BUSERROR: Bus error flag |
||||
* @arg I2C_FLAG_TXEMPTY: Data register empty flag (Transmitter) |
||||
* @arg I2C_FLAG_RXNOTEMPTY: Data register not empty (Receiver) flag |
||||
* @arg I2C_FLAG_STOPDETECTION: Stop detection flag (Slave mode) |
||||
* @arg I2C_FLAG_HEADERSENT: 10-bit header sent flag (Master mode) |
||||
* @arg I2C_FLAG_TRANSFERFINISHED: Byte transfer finished flag |
||||
* @arg I2C_FLAG_ADDRESSSENTMATCHED: Address sent flag (Master mode) “ADSL” |
||||
* Address matched flag (Slave mode)”ENDAD” |
||||
* @arg I2C_FLAG_STARTDETECTION: Start bit flag (Master mode) |
||||
* @retval The new state of I2C_FLAG (SET or RESET). |
||||
*/ |
||||
FlagStatus I2C_GetFlagStatus(I2C_Flag_TypeDef I2C_Flag) |
||||
{ |
||||
uint8_t tempreg = 0; |
||||
uint8_t regindex = 0; |
||||
FlagStatus bitstatus = RESET; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_FLAG_OK(I2C_Flag)); |
||||
|
||||
/* Read flag register index */ |
||||
regindex = (uint8_t)((uint16_t)I2C_Flag >> 8); |
||||
/* Check SRx index */ |
||||
switch (regindex) |
||||
{ |
||||
/* Returns whether the status register to check is SR1 */ |
||||
case 0x01: |
||||
tempreg = (uint8_t)I2C->SR1; |
||||
break; |
||||
|
||||
/* Returns whether the status register to check is SR2 */ |
||||
case 0x02: |
||||
tempreg = (uint8_t)I2C->SR2; |
||||
break; |
||||
|
||||
/* Returns whether the status register to check is SR3 */ |
||||
case 0x03: |
||||
tempreg = (uint8_t)I2C->SR3; |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
|
||||
/* Check the status of the specified I2C flag */ |
||||
if ((tempreg & (uint8_t)I2C_Flag ) != 0) |
||||
{ |
||||
/* Flag is set */ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Flag is reset */ |
||||
bitstatus = RESET; |
||||
} |
||||
/* Return the flag status */ |
||||
return bitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear flags |
||||
* @param I2C_Flag : Specifies the flag to clear |
||||
* This parameter can be any combination of the following values: |
||||
* - I2C_FLAG_WAKEUPFROMHALT: Wakeup from Halt |
||||
* - I2C_FLAG_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) |
||||
* - I2C_FLAG_ACKNOWLEDGEFAILURE: Acknowledge failure flag |
||||
* - I2C_FLAG_ARBITRATIONLOSS: Arbitration lost flag (Master mode) |
||||
* - I2C_FLAG_BUSERROR: Bus error flag. |
||||
* @note Notes: |
||||
* - STOPF (STOP detection) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 register |
||||
* (I2C_GetFlagStatus()) followed by a write operation |
||||
* to I2C_CR2 register. |
||||
* - ADD10 (10-bit header sent) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 |
||||
* (I2C_GetFlagStatus()) followed by writing the |
||||
* second byte of the address in DR register. |
||||
* - BTF (Byte Transfer Finished) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 register |
||||
* (I2C_GetFlagStatus()) followed by a read/write to |
||||
* I2C_DR register (I2C_SendData()). |
||||
* - ADDR (Address sent) is cleared by software sequence: |
||||
* a read operation to I2C_SR1 register |
||||
* (I2C_GetFlagStatus()) followed by a read operation to |
||||
* I2C_SR3 register ((void)(I2C->SR3)). |
||||
* - SB (Start Bit) is cleared software sequence: a read |
||||
* operation to I2C_SR1 register (I2C_GetFlagStatus()) |
||||
* followed by a write operation to I2C_DR register |
||||
* (I2C_SendData()). |
||||
* @retval None |
||||
*/ |
||||
void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG) |
||||
{ |
||||
uint16_t flagpos = 0; |
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_CLEAR_FLAG_OK(I2C_FLAG)); |
||||
|
||||
/* Get the I2C flag position */ |
||||
flagpos = (uint16_t)I2C_FLAG & FLAG_Mask; |
||||
/* Clear the selected I2C flag */ |
||||
I2C->SR2 = (uint8_t)((uint16_t)(~flagpos)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified I2C interrupt has occurred or not. |
||||
* @param I2C_ITPendingBit: specifies the interrupt source to check. |
||||
* This parameter can be one of the following values: |
||||
* - I2C_ITPENDINGBIT_WAKEUPFROMHALT: Wakeup from Halt |
||||
* - I2C_ITPENDINGBIT_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) |
||||
* - I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE: Acknowledge failure flag |
||||
* - I2C_ITPENDINGBIT_ARBITRATIONLOSS: Arbitration lost flag (Master mode) |
||||
* - I2C_ITPENDINGBIT_BUSERROR: Bus error flag |
||||
* - I2C_ITPENDINGBIT_TXEMPTY: Data register empty flag (Transmitter) |
||||
* - I2C_ITPENDINGBIT_RXNOTEMPTY: Data register not empty (Receiver) flag |
||||
* - I2C_ITPENDINGBIT_STOPDETECTION: Stop detection flag (Slave mode) |
||||
* - I2C_ITPENDINGBIT_HEADERSENT: 10-bit header sent flag (Master mode) |
||||
* - I2C_ITPENDINGBIT_TRANSFERFINISHED: Byte transfer finished flag |
||||
* - I2C_ITPENDINGBIT_ADDRESSSENTMATCHED: Address sent flag (Master mode) “ADSL” |
||||
* Address matched flag (Slave mode)“ENDAD” |
||||
* - I2C_ITPENDINGBIT_STARTDETECTION: Start bit flag (Master mode) |
||||
* @retval The new state of I2C_ITPendingBit |
||||
* This parameter can be any of the @ref ITStatus enumeration. |
||||
*/ |
||||
ITStatus I2C_GetITStatus(I2C_ITPendingBit_TypeDef I2C_ITPendingBit) |
||||
{ |
||||
ITStatus bitstatus = RESET; |
||||
__IO uint8_t enablestatus = 0; |
||||
uint16_t tempregister = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_ITPENDINGBIT_OK(I2C_ITPendingBit)); |
||||
|
||||
tempregister = (uint8_t)( ((uint16_t)((uint16_t)I2C_ITPendingBit & ITEN_Mask)) >> 8); |
||||
|
||||
/* Check if the interrupt source is enabled or not */ |
||||
enablestatus = (uint8_t)(I2C->ITR & ( uint8_t)tempregister); |
||||
|
||||
if ((uint16_t)((uint16_t)I2C_ITPendingBit & REGISTER_Mask) == REGISTER_SR1_Index) |
||||
{ |
||||
/* Check the status of the specified I2C flag */ |
||||
if (((I2C->SR1 & (uint8_t)I2C_ITPendingBit) != RESET) && enablestatus) |
||||
{ |
||||
/* I2C_IT is set */ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* I2C_IT is reset */ |
||||
bitstatus = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Check the status of the specified I2C flag */ |
||||
if (((I2C->SR2 & (uint8_t)I2C_ITPendingBit) != RESET) && enablestatus) |
||||
{ |
||||
/* I2C_IT is set */ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* I2C_IT is reset */ |
||||
bitstatus = RESET; |
||||
} |
||||
} |
||||
/* Return the I2C_IT status */ |
||||
return bitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clear IT pending bit |
||||
* @param I2C_IT: specifies the interrupt pending bit to clear. |
||||
* This parameter can be any combination of the following values: |
||||
* - I2C_ITPENDINGBIT_WAKEUPFROMHALT: Wakeup from Halt |
||||
* - I2C_ITPENDINGBIT_OVERRUNUNDERRUN: Overrun/Underrun interrupt (Slave mode) |
||||
* - I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE: Acknowledge failure interrupt |
||||
* - I2C_ITPENDINGBIT_ARBITRATIONLOSS: Arbitration lost interrupt (Master mode) |
||||
* - I2C_ITPENDINGBIT_BUSERROR: Bus error interrupt |
||||
* |
||||
* Notes: |
||||
* - STOPF (STOP detection) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 register |
||||
* (I2C_GetITStatus()) followed by a write operation to |
||||
* I2C_CR2 register (I2C_AcknowledgeConfig() to configure |
||||
* the I2C peripheral Acknowledge). |
||||
* - ADD10 (10-bit header sent) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 |
||||
* (I2C_GetITStatus()) followed by writing the second |
||||
* byte of the address in I2C_DR register. |
||||
* - BTF (Byte Transfer Finished) is cleared by software |
||||
* sequence: a read operation to I2C_SR1 register |
||||
* (I2C_GetITStatus()) followed by a read/write to |
||||
* I2C_DR register (I2C_SendData()). |
||||
* - ADDR (Address sent) is cleared by software sequence: |
||||
* a read operation to I2C_SR1 register (I2C_GetITStatus()) |
||||
* followed by a read operation to I2C_SR3 register |
||||
* ((void)(I2C->SR3)). |
||||
* - SB (Start Bit) is cleared by software sequence: a |
||||
* read operation to I2C_SR1 register (I2C_GetITStatus()) |
||||
* followed by a write operation to I2C_DR register |
||||
* (I2C_SendData()). |
||||
* @retval None |
||||
*/ |
||||
void I2C_ClearITPendingBit(I2C_ITPendingBit_TypeDef I2C_ITPendingBit) |
||||
{ |
||||
uint16_t flagpos = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_I2C_CLEAR_ITPENDINGBIT_OK(I2C_ITPendingBit)); |
||||
|
||||
/* Get the I2C flag position */ |
||||
flagpos = (uint16_t)I2C_ITPendingBit & FLAG_Mask; |
||||
|
||||
/* Clear the selected I2C flag */ |
||||
I2C->SR2 = (uint8_t)((uint16_t)~flagpos); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,343 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_itc.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the ITC peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_itc.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ITC_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Utility function used to read CC register. |
||||
* @param None |
||||
* @retval CPU CC register value |
||||
*/ |
||||
uint8_t ITC_GetCPUCC(void) |
||||
{ |
||||
#ifdef _COSMIC_ |
||||
_asm("push cc"); |
||||
_asm("pop a"); |
||||
return; /* Ignore compiler warning, the returned value is in A register */ |
||||
#elif defined _RAISONANCE_ /* _RAISONANCE_ */ |
||||
return _getCC_(); |
||||
#else /* _IAR_ */ |
||||
asm("push cc"); |
||||
asm("pop a"); /* Ignore compiler warning, the returned value is in A register */ |
||||
#endif /* _COSMIC_*/ |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup ITC_Public_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the ITC registers to their default reset value. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void ITC_DeInit(void) |
||||
{ |
||||
ITC->ISPR1 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR2 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR3 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR4 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR5 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR6 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR7 = ITC_SPRX_RESET_VALUE; |
||||
ITC->ISPR8 = ITC_SPRX_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the interrupt software priority bits (I1, I0) value from CPU CC register. |
||||
* @param None |
||||
* @retval The interrupt software priority bits value. |
||||
*/ |
||||
uint8_t ITC_GetSoftIntStatus(void) |
||||
{ |
||||
return (uint8_t)(ITC_GetCPUCC() & CPU_CC_I1I0); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the software priority of the specified interrupt source. |
||||
* @param IrqNum : Specifies the peripheral interrupt source. |
||||
* @retval ITC_PriorityLevel_TypeDef : Specifies the software priority of the interrupt source. |
||||
*/ |
||||
ITC_PriorityLevel_TypeDef ITC_GetSoftwarePriority(ITC_Irq_TypeDef IrqNum) |
||||
{ |
||||
uint8_t Value = 0; |
||||
uint8_t Mask = 0; |
||||
|
||||
/* Check function parameters */ |
||||
assert_param(IS_ITC_IRQ_OK((uint8_t)IrqNum)); |
||||
|
||||
/* Define the mask corresponding to the bits position in the SPR register */ |
||||
Mask = (uint8_t)(0x03U << (((uint8_t)IrqNum % 4U) * 2U)); |
||||
|
||||
switch (IrqNum) |
||||
{ |
||||
case ITC_IRQ_TLI: /* TLI software priority can be read but has no meaning */ |
||||
case ITC_IRQ_AWU: |
||||
case ITC_IRQ_CLK: |
||||
case ITC_IRQ_PORTA: |
||||
Value = (uint8_t)(ITC->ISPR1 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
case ITC_IRQ_PORTB: |
||||
case ITC_IRQ_PORTC: |
||||
case ITC_IRQ_PORTD: |
||||
case ITC_IRQ_PORTE: |
||||
Value = (uint8_t)(ITC->ISPR2 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
#if defined(STM8S208) || defined(STM8AF52Ax) |
||||
case ITC_IRQ_CAN_RX: |
||||
case ITC_IRQ_CAN_TX: |
||||
#endif /*STM8S208 or STM8AF52Ax */ |
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
case ITC_IRQ_PORTF: |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
case ITC_IRQ_SPI: |
||||
case ITC_IRQ_TIM1_OVF: |
||||
Value = (uint8_t)(ITC->ISPR3 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
case ITC_IRQ_TIM1_CAPCOM: |
||||
#if defined (STM8S903) || defined (STM8AF622x) |
||||
case ITC_IRQ_TIM5_OVFTRI: |
||||
case ITC_IRQ_TIM5_CAPCOM: |
||||
#else |
||||
case ITC_IRQ_TIM2_OVF: |
||||
case ITC_IRQ_TIM2_CAPCOM: |
||||
#endif /* STM8S903 or STM8AF622x*/ |
||||
case ITC_IRQ_TIM3_OVF: |
||||
Value = (uint8_t)(ITC->ISPR4 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
case ITC_IRQ_TIM3_CAPCOM: |
||||
#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ |
||||
defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) |
||||
case ITC_IRQ_UART1_TX: |
||||
case ITC_IRQ_UART1_RX: |
||||
#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ |
||||
#if defined(STM8AF622x) |
||||
case ITC_IRQ_UART4_TX: |
||||
case ITC_IRQ_UART4_RX: |
||||
#endif /*STM8AF622x */ |
||||
case ITC_IRQ_I2C: |
||||
Value = (uint8_t)(ITC->ISPR5 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) |
||||
case ITC_IRQ_UART2_TX: |
||||
case ITC_IRQ_UART2_RX: |
||||
#endif /*STM8S105 or STM8AF626x*/ |
||||
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || \ |
||||
defined(STM8AF62Ax) |
||||
case ITC_IRQ_UART3_TX: |
||||
case ITC_IRQ_UART3_RX: |
||||
case ITC_IRQ_ADC2: |
||||
#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ |
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ |
||||
defined(STM8S903) || defined(STM8AF626x) || defined(STM8AF622x) |
||||
case ITC_IRQ_ADC1: |
||||
#endif /*STM8S105, STM8S005, STM8S103 or STM8S003 or STM8S903 or STM8AF626x or STM8AF622x */ |
||||
#if defined (STM8S903) || defined (STM8AF622x) |
||||
case ITC_IRQ_TIM6_OVFTRI: |
||||
#else |
||||
case ITC_IRQ_TIM4_OVF: |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
Value = (uint8_t)(ITC->ISPR6 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
case ITC_IRQ_EEPROM_EEC: |
||||
Value = (uint8_t)(ITC->ISPR7 & Mask); /* Read software priority */ |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
|
||||
Value >>= (uint8_t)(((uint8_t)IrqNum % 4u) * 2u); |
||||
|
||||
return((ITC_PriorityLevel_TypeDef)Value); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the software priority of the specified interrupt source. |
||||
* @note - The modification of the software priority is only possible when |
||||
* the interrupts are disabled. |
||||
* - The normal behavior is to disable the interrupt before calling |
||||
* this function, and re-enable it after. |
||||
* - The priority level 0 cannot be set (see product specification |
||||
* for more details). |
||||
* @param IrqNum : Specifies the peripheral interrupt source. |
||||
* @param PriorityValue : Specifies the software priority value to set, |
||||
* can be a value of @ref ITC_PriorityLevel_TypeDef . |
||||
* @retval None |
||||
*/ |
||||
void ITC_SetSoftwarePriority(ITC_Irq_TypeDef IrqNum, ITC_PriorityLevel_TypeDef PriorityValue) |
||||
{ |
||||
uint8_t Mask = 0; |
||||
uint8_t NewPriority = 0; |
||||
|
||||
/* Check function parameters */ |
||||
assert_param(IS_ITC_IRQ_OK((uint8_t)IrqNum)); |
||||
assert_param(IS_ITC_PRIORITY_OK(PriorityValue)); |
||||
|
||||
/* Check if interrupts are disabled */ |
||||
assert_param(IS_ITC_INTERRUPTS_DISABLED); |
||||
|
||||
/* Define the mask corresponding to the bits position in the SPR register */ |
||||
/* The mask is reversed in order to clear the 2 bits after more easily */ |
||||
Mask = (uint8_t)(~(uint8_t)(0x03U << (((uint8_t)IrqNum % 4U) * 2U))); |
||||
|
||||
/* Define the new priority to write */ |
||||
NewPriority = (uint8_t)((uint8_t)(PriorityValue) << (((uint8_t)IrqNum % 4U) * 2U)); |
||||
|
||||
switch (IrqNum) |
||||
{ |
||||
case ITC_IRQ_TLI: /* TLI software priority can be written but has no meaning */ |
||||
case ITC_IRQ_AWU: |
||||
case ITC_IRQ_CLK: |
||||
case ITC_IRQ_PORTA: |
||||
ITC->ISPR1 &= Mask; |
||||
ITC->ISPR1 |= NewPriority; |
||||
break; |
||||
|
||||
case ITC_IRQ_PORTB: |
||||
case ITC_IRQ_PORTC: |
||||
case ITC_IRQ_PORTD: |
||||
case ITC_IRQ_PORTE: |
||||
ITC->ISPR2 &= Mask; |
||||
ITC->ISPR2 |= NewPriority; |
||||
break; |
||||
|
||||
#if defined(STM8S208) || defined(STM8AF52Ax) |
||||
case ITC_IRQ_CAN_RX: |
||||
case ITC_IRQ_CAN_TX: |
||||
#endif /*STM8S208 or STM8AF52Ax */ |
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
case ITC_IRQ_PORTF: |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
case ITC_IRQ_SPI: |
||||
case ITC_IRQ_TIM1_OVF: |
||||
ITC->ISPR3 &= Mask; |
||||
ITC->ISPR3 |= NewPriority; |
||||
break; |
||||
|
||||
case ITC_IRQ_TIM1_CAPCOM: |
||||
#if defined(STM8S903) || defined(STM8AF622x) |
||||
case ITC_IRQ_TIM5_OVFTRI: |
||||
case ITC_IRQ_TIM5_CAPCOM: |
||||
#else |
||||
case ITC_IRQ_TIM2_OVF: |
||||
case ITC_IRQ_TIM2_CAPCOM: |
||||
#endif /*STM8S903 or STM8AF622x */ |
||||
case ITC_IRQ_TIM3_OVF: |
||||
ITC->ISPR4 &= Mask; |
||||
ITC->ISPR4 |= NewPriority; |
||||
break; |
||||
|
||||
case ITC_IRQ_TIM3_CAPCOM: |
||||
#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ |
||||
defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) |
||||
case ITC_IRQ_UART1_TX: |
||||
case ITC_IRQ_UART1_RX: |
||||
#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ |
||||
#if defined(STM8AF622x) |
||||
case ITC_IRQ_UART4_TX: |
||||
case ITC_IRQ_UART4_RX: |
||||
#endif /*STM8AF622x */ |
||||
case ITC_IRQ_I2C: |
||||
ITC->ISPR5 &= Mask; |
||||
ITC->ISPR5 |= NewPriority; |
||||
break; |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) |
||||
case ITC_IRQ_UART2_TX: |
||||
case ITC_IRQ_UART2_RX: |
||||
#endif /*STM8S105 or STM8AF626x */ |
||||
|
||||
#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || \ |
||||
defined(STM8AF62Ax) |
||||
case ITC_IRQ_UART3_TX: |
||||
case ITC_IRQ_UART3_RX: |
||||
case ITC_IRQ_ADC2: |
||||
#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ |
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ |
||||
defined(STM8S903) || defined(STM8AF626x) || defined (STM8AF622x) |
||||
case ITC_IRQ_ADC1: |
||||
#endif /*STM8S105, STM8S005, STM8S103 or STM8S003 or STM8S903 or STM8AF626x or STM8AF622x */ |
||||
|
||||
#if defined (STM8S903) || defined (STM8AF622x) |
||||
case ITC_IRQ_TIM6_OVFTRI: |
||||
#else |
||||
case ITC_IRQ_TIM4_OVF: |
||||
#endif /* STM8S903 or STM8AF622x */ |
||||
ITC->ISPR6 &= Mask; |
||||
ITC->ISPR6 |= NewPriority; |
||||
break; |
||||
|
||||
case ITC_IRQ_EEPROM_EEC: |
||||
ITC->ISPR7 &= Mask; |
||||
ITC->ISPR7 |= NewPriority; |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,113 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_iwdg.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the IWDG peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_iwdg.h" |
||||
|
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup IWDG_Public_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Enables or disables write access to Prescaler and Reload registers. |
||||
* @param IWDG_WriteAccess : New state of write access to Prescaler and Reload |
||||
* registers. This parameter can be a value of @ref IWDG_WriteAccess_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void IWDG_WriteAccessCmd(IWDG_WriteAccess_TypeDef IWDG_WriteAccess) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_IWDG_WRITEACCESS_MODE_OK(IWDG_WriteAccess)); |
||||
|
||||
IWDG->KR = (uint8_t)IWDG_WriteAccess; /* Write Access */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets IWDG Prescaler value. |
||||
* @note Write access should be enabled |
||||
* @param IWDG_Prescaler : Specifies the IWDG Prescaler value. |
||||
* This parameter can be a value of @ref IWDG_Prescaler_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void IWDG_SetPrescaler(IWDG_Prescaler_TypeDef IWDG_Prescaler) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_IWDG_PRESCALER_OK(IWDG_Prescaler)); |
||||
|
||||
IWDG->PR = (uint8_t)IWDG_Prescaler; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets IWDG Reload value. |
||||
* @note Write access should be enabled |
||||
* @param IWDG_Reload : Reload register value. |
||||
* This parameter must be a number between 0 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void IWDG_SetReload(uint8_t IWDG_Reload) |
||||
{ |
||||
IWDG->RLR = IWDG_Reload; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reloads IWDG counter |
||||
* @note Write access should be enabled |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void IWDG_ReloadCounter(void) |
||||
{ |
||||
IWDG->KR = IWDG_KEY_REFRESH; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables IWDG. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void IWDG_Enable(void) |
||||
{ |
||||
IWDG->KR = IWDG_KEY_ENABLE; |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,86 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_rst.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the RST peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
|
||||
#include "stm8s_rst.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private Constants ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
/**
|
||||
* @addtogroup RST_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
|
||||
/**
|
||||
* @brief Checks whether the specified RST flag is set or not. |
||||
* @param RST_Flag : specify the reset flag to check. |
||||
* This parameter can be a value of @ref RST_FLAG_TypeDef. |
||||
* @retval FlagStatus: status of the given RST flag. |
||||
*/ |
||||
FlagStatus RST_GetFlagStatus(RST_Flag_TypeDef RST_Flag) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_RST_FLAG_OK(RST_Flag)); |
||||
|
||||
/* Get flag status */ |
||||
return((FlagStatus)(((uint8_t)(RST->SR & RST_Flag) == (uint8_t)0x00) ? RESET : SET)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the specified RST flag. |
||||
* @param RST_Flag : specify the reset flag to clear. |
||||
* This parameter can be a value of @ref RST_FLAG_TypeDef. |
||||
* @retval None |
||||
*/ |
||||
void RST_ClearFlag(RST_Flag_TypeDef RST_Flag) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_RST_FLAG_OK(RST_Flag)); |
||||
|
||||
RST->SR = (uint8_t)RST_Flag; |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,435 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_spi.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the SPI peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_spi.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup SPI_Public_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the SPI peripheral registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SPI_DeInit(void) |
||||
{ |
||||
SPI->CR1 = SPI_CR1_RESET_VALUE; |
||||
SPI->CR2 = SPI_CR2_RESET_VALUE; |
||||
SPI->ICR = SPI_ICR_RESET_VALUE; |
||||
SPI->SR = SPI_SR_RESET_VALUE; |
||||
SPI->CRCPR = SPI_CRCPR_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the SPI according to the specified parameters. |
||||
* @param FirstBit : This parameter can be any of the
|
||||
* @ref SPI_FirstBit_TypeDef enumeration. |
||||
* @param BaudRatePrescaler : This parameter can be any of the
|
||||
* @ref SPI_BaudRatePrescaler_TypeDef enumeration. |
||||
* @param Mode : This parameter can be any of the
|
||||
* @ref SPI_Mode_TypeDef enumeration. |
||||
* @param ClockPolarity : This parameter can be any of the
|
||||
* @ref SPI_ClockPolarity_TypeDef enumeration. |
||||
* @param ClockPhase : This parameter can be any of the
|
||||
* @ref SPI_ClockPhase_TypeDef enumeration. |
||||
* @param Data_Direction : This parameter can be any of the
|
||||
* @ref SPI_DataDirection_TypeDef enumeration. |
||||
* @param Slave_Management : This parameter can be any of the
|
||||
* @ref SPI_NSS_TypeDef enumeration. |
||||
* @param CRCPolynomial : Configures the CRC polynomial. |
||||
* @retval None |
||||
*/ |
||||
void SPI_Init(SPI_FirstBit_TypeDef FirstBit, SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler, SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity, SPI_ClockPhase_TypeDef ClockPhase, SPI_DataDirection_TypeDef Data_Direction, SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial) |
||||
{ |
||||
/* Check structure elements */ |
||||
assert_param(IS_SPI_FIRSTBIT_OK(FirstBit)); |
||||
assert_param(IS_SPI_BAUDRATE_PRESCALER_OK(BaudRatePrescaler)); |
||||
assert_param(IS_SPI_MODE_OK(Mode)); |
||||
assert_param(IS_SPI_POLARITY_OK(ClockPolarity)); |
||||
assert_param(IS_SPI_PHASE_OK(ClockPhase)); |
||||
assert_param(IS_SPI_DATA_DIRECTION_OK(Data_Direction)); |
||||
assert_param(IS_SPI_SLAVEMANAGEMENT_OK(Slave_Management)); |
||||
assert_param(IS_SPI_CRC_POLYNOMIAL_OK(CRCPolynomial)); |
||||
|
||||
/* Frame Format, BaudRate, Clock Polarity and Phase configuration */ |
||||
SPI->CR1 = (uint8_t)((uint8_t)((uint8_t)FirstBit | BaudRatePrescaler) | |
||||
(uint8_t)((uint8_t)ClockPolarity | ClockPhase)); |
||||
|
||||
/* Data direction configuration: BDM, BDOE and RXONLY bits */ |
||||
SPI->CR2 = (uint8_t)((uint8_t)(Data_Direction) | (uint8_t)(Slave_Management)); |
||||
|
||||
if (Mode == SPI_MODE_MASTER) |
||||
{ |
||||
SPI->CR2 |= (uint8_t)SPI_CR2_SSI; |
||||
} |
||||
else |
||||
{ |
||||
SPI->CR2 &= (uint8_t)~(SPI_CR2_SSI); |
||||
} |
||||
|
||||
/* Master/Slave mode configuration */ |
||||
SPI->CR1 |= (uint8_t)(Mode); |
||||
|
||||
/* CRC configuration */ |
||||
SPI->CRCPR = (uint8_t)CRCPolynomial; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the SPI peripheral. |
||||
* @param NewState New state of the SPI peripheral. |
||||
* This parameter can be: ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void SPI_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
SPI->CR1 |= SPI_CR1_SPE; /* Enable the SPI peripheral*/ |
||||
} |
||||
else |
||||
{ |
||||
SPI->CR1 &= (uint8_t)(~SPI_CR1_SPE); /* Disable the SPI peripheral*/ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified interrupts. |
||||
* @param SPI_IT Specifies the SPI interrupts sources to be enabled or disabled. |
||||
* @param NewState: The new state of the specified SPI interrupts. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void SPI_ITConfig(SPI_IT_TypeDef SPI_IT, FunctionalState NewState) |
||||
{ |
||||
uint8_t itpos = 0; |
||||
/* Check function parameters */ |
||||
assert_param(IS_SPI_CONFIG_IT_OK(SPI_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Get the SPI IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)SPI_IT & (uint8_t)0x0F)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
SPI->ICR |= itpos; /* Enable interrupt*/ |
||||
} |
||||
else |
||||
{ |
||||
SPI->ICR &= (uint8_t)(~itpos); /* Disable interrupt*/ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits a Data through the SPI peripheral. |
||||
* @param Data : Byte to be transmitted. |
||||
* @retval None |
||||
*/ |
||||
void SPI_SendData(uint8_t Data) |
||||
{ |
||||
SPI->DR = Data; /* Write in the DR register the data to be sent*/ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the SPI peripheral. |
||||
* @param None |
||||
* @retval The value of the received data. |
||||
*/ |
||||
uint8_t SPI_ReceiveData(void) |
||||
{ |
||||
return ((uint8_t)SPI->DR); /* Return the data in the DR register*/ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures internally by software the NSS pin. |
||||
* @param NewState Indicates the new state of the SPI Software slave management. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void SPI_NSSInternalSoftwareCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
SPI->CR2 |= SPI_CR2_SSI; /* Set NSS pin internally by software*/ |
||||
} |
||||
else |
||||
{ |
||||
SPI->CR2 &= (uint8_t)(~SPI_CR2_SSI); /* Reset NSS pin internally by software*/ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables the transmit of the CRC value. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SPI_TransmitCRC(void) |
||||
{ |
||||
SPI->CR2 |= SPI_CR2_CRCNEXT; /* Enable the CRC transmission*/ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the CRC value calculation of the transferred bytes. |
||||
* @param NewState Indicates the new state of the SPI CRC value calculation. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void SPI_CalculateCRCCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
SPI->CR2 |= SPI_CR2_CRCEN; /* Enable the CRC calculation*/ |
||||
} |
||||
else |
||||
{ |
||||
SPI->CR2 &= (uint8_t)(~SPI_CR2_CRCEN); /* Disable the CRC calculation*/ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the transmit or the receive CRC register value. |
||||
* @param SPI_CRC Specifies the CRC register to be read. |
||||
* @retval The selected CRC register value. |
||||
*/ |
||||
uint8_t SPI_GetCRC(SPI_CRC_TypeDef SPI_CRC) |
||||
{ |
||||
uint8_t crcreg = 0; |
||||
|
||||
/* Check function parameters */ |
||||
assert_param(IS_SPI_CRC_OK(SPI_CRC)); |
||||
|
||||
if (SPI_CRC != SPI_CRC_RX) |
||||
{ |
||||
crcreg = SPI->TXCRCR; /* Get the Tx CRC register*/ |
||||
} |
||||
else |
||||
{ |
||||
crcreg = SPI->RXCRCR; /* Get the Rx CRC register*/ |
||||
} |
||||
|
||||
/* Return the selected CRC register status*/ |
||||
return crcreg; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Reset the Rx CRCR and Tx CRCR registers. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void SPI_ResetCRC(void) |
||||
{ |
||||
/* Rx CRCR & Tx CRCR registers are reset when CRCEN (hardware calculation)
|
||||
bit in SPI_CR2 is written to 1 (enable) */ |
||||
SPI_CalculateCRCCmd(ENABLE); |
||||
|
||||
/* Previous function disable the SPI */ |
||||
SPI_Cmd(ENABLE); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the CRC Polynomial register value. |
||||
* @param None |
||||
* @retval The CRC Polynomial register value. |
||||
*/ |
||||
uint8_t SPI_GetCRCPolynomial(void) |
||||
{ |
||||
return SPI->CRCPR; /* Return the CRC polynomial register */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the data transfer direction in bi-directional mode. |
||||
* @param SPI_Direction Specifies the data transfer direction in bi-directional mode. |
||||
* @retval None |
||||
*/ |
||||
void SPI_BiDirectionalLineConfig(SPI_Direction_TypeDef SPI_Direction) |
||||
{ |
||||
/* Check function parameters */ |
||||
assert_param(IS_SPI_DIRECTION_OK(SPI_Direction)); |
||||
|
||||
if (SPI_Direction != SPI_DIRECTION_RX) |
||||
{ |
||||
SPI->CR2 |= SPI_CR2_BDOE; /* Set the Tx only mode*/ |
||||
} |
||||
else |
||||
{ |
||||
SPI->CR2 &= (uint8_t)(~SPI_CR2_BDOE); /* Set the Rx only mode*/ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified SPI flag is set or not. |
||||
* @param SPI_FLAG : Specifies the flag to check. |
||||
* This parameter can be any of the @ref SPI_FLAG_TypeDef enumeration. |
||||
* @retval FlagStatus : Indicates the state of SPI_FLAG. |
||||
* This parameter can be any of the @ref FlagStatus enumeration. |
||||
*/ |
||||
|
||||
FlagStatus SPI_GetFlagStatus(SPI_Flag_TypeDef SPI_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
/* Check parameters */ |
||||
assert_param(IS_SPI_FLAGS_OK(SPI_FLAG)); |
||||
|
||||
/* Check the status of the specified SPI flag */ |
||||
if ((SPI->SR & (uint8_t)SPI_FLAG) != (uint8_t)RESET) |
||||
{ |
||||
status = SET; /* SPI_FLAG is set */ |
||||
} |
||||
else |
||||
{ |
||||
status = RESET; /* SPI_FLAG is reset*/ |
||||
} |
||||
|
||||
/* Return the SPI_FLAG status */ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the SPI flags. |
||||
* @param SPI_FLAG : Specifies the flag to clear. |
||||
* This parameter can be one of the following values: |
||||
* - SPI_FLAG_CRCERR |
||||
* - SPI_FLAG_WKUP |
||||
* @note - OVR (OverRun Error) interrupt pending bit is cleared by software |
||||
* sequence: |
||||
* a read operation to SPI_DR register (SPI_ReceiveData()) followed by |
||||
* a read operation to SPI_SR register (SPI_GetFlagStatus()). |
||||
* - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: |
||||
* a read/write operation to SPI_SR register (SPI_GetFlagStatus()) followed by |
||||
* a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). |
||||
* @retval None |
||||
*/ |
||||
void SPI_ClearFlag(SPI_Flag_TypeDef SPI_FLAG) |
||||
{ |
||||
assert_param(IS_SPI_CLEAR_FLAGS_OK(SPI_FLAG)); |
||||
/* Clear the flag bit */ |
||||
SPI->SR = (uint8_t)(~SPI_FLAG); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified interrupt has occurred or not. |
||||
* @param SPI_IT: Specifies the SPI interrupt pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - SPI_IT_CRCERR |
||||
* - SPI_IT_WKUP |
||||
* - SPI_IT_OVR |
||||
* - SPI_IT_MODF |
||||
* - SPI_IT_RXNE |
||||
* - SPI_IT_TXE |
||||
* @retval ITStatus : Indicates the state of the SPI_IT. |
||||
* This parameter can be any of the @ref ITStatus enumeration. |
||||
*/ |
||||
ITStatus SPI_GetITStatus(SPI_IT_TypeDef SPI_IT) |
||||
{ |
||||
ITStatus pendingbitstatus = RESET; |
||||
uint8_t itpos = 0; |
||||
uint8_t itmask1 = 0; |
||||
uint8_t itmask2 = 0; |
||||
uint8_t enablestatus = 0; |
||||
assert_param(IS_SPI_GET_IT_OK(SPI_IT)); |
||||
/* Get the SPI IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << ((uint8_t)SPI_IT & (uint8_t)0x0F)); |
||||
|
||||
/* Get the SPI IT mask */ |
||||
itmask1 = (uint8_t)((uint8_t)SPI_IT >> (uint8_t)4); |
||||
/* Set the IT mask */ |
||||
itmask2 = (uint8_t)((uint8_t)1 << itmask1); |
||||
/* Get the SPI_ITPENDINGBIT enable bit status */ |
||||
enablestatus = (uint8_t)((uint8_t)SPI->SR & itmask2); |
||||
/* Check the status of the specified SPI interrupt */ |
||||
if (((SPI->ICR & itpos) != RESET) && enablestatus) |
||||
{ |
||||
/* SPI_ITPENDINGBIT is set */ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* SPI_ITPENDINGBIT is reset */ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
/* Return the SPI_ITPENDINGBIT status */ |
||||
return pendingbitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the interrupt pending bits. |
||||
* @param SPI_IT: Specifies the interrupt pending bit to clear. |
||||
* This parameter can be one of the following values: |
||||
* - SPI_IT_CRCERR |
||||
* - SPI_IT_WKUP |
||||
* @note - OVR (OverRun Error) interrupt pending bit is cleared by software sequence: |
||||
* a read operation to SPI_DR register (SPI_ReceiveData()) followed by |
||||
* a read operation to SPI_SR register (SPI_GetITStatus()). |
||||
* - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: |
||||
* a read/write operation to SPI_SR register (SPI_GetITStatus()) followed by |
||||
* a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). |
||||
* @retval None |
||||
*/ |
||||
void SPI_ClearITPendingBit(SPI_IT_TypeDef SPI_IT) |
||||
{ |
||||
uint8_t itpos = 0; |
||||
assert_param(IS_SPI_CLEAR_IT_OK(SPI_IT)); |
||||
|
||||
/* Clear SPI_IT_CRCERR or SPI_IT_WKUP interrupt pending bits */ |
||||
|
||||
/* Get the SPI pending bit index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)(SPI_IT & (uint8_t)0xF0) >> 4)); |
||||
/* Clear the pending bit */ |
||||
SPI->SR = (uint8_t)(~itpos); |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,409 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim4.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the TIM4 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_tim4.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/**
|
||||
* @addtogroup TIM4_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the TIM4 peripheral registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void TIM4_DeInit(void) |
||||
{ |
||||
TIM4->CR1 = TIM4_CR1_RESET_VALUE; |
||||
TIM4->IER = TIM4_IER_RESET_VALUE; |
||||
TIM4->CNTR = TIM4_CNTR_RESET_VALUE; |
||||
TIM4->PSCR = TIM4_PSCR_RESET_VALUE; |
||||
TIM4->ARR = TIM4_ARR_RESET_VALUE; |
||||
TIM4->SR1 = TIM4_SR1_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the TIM4 Time Base Unit according to the specified parameters. |
||||
* @param TIM4_Prescaler specifies the Prescaler from TIM4_Prescaler_TypeDef. |
||||
* @param TIM4_Period specifies the Period value. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_TimeBaseInit(TIM4_Prescaler_TypeDef TIM4_Prescaler, uint8_t TIM4_Period) |
||||
{ |
||||
/* Check TIM4 prescaler value */ |
||||
assert_param(IS_TIM4_PRESCALER_OK(TIM4_Prescaler)); |
||||
/* Set the Prescaler value */ |
||||
TIM4->PSCR = (uint8_t)(TIM4_Prescaler); |
||||
/* Set the Autoreload value */ |
||||
TIM4->ARR = (uint8_t)(TIM4_Period); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the TIM4 peripheral. |
||||
* @param NewState new state of the TIM4 peripheral. This parameter can |
||||
* be ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* set or Reset the CEN Bit */ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
TIM4->CR1 |= TIM4_CR1_CEN; |
||||
} |
||||
else |
||||
{ |
||||
TIM4->CR1 &= (uint8_t)(~TIM4_CR1_CEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified TIM4 interrupts. |
||||
* @param NewState new state of the TIM4 peripheral. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @param TIM4_IT specifies the TIM4 interrupts sources to be enabled or disabled. |
||||
* This parameter can be any combination of the following values: |
||||
* - TIM4_IT_UPDATE: TIM4 update Interrupt source |
||||
* @param NewState new state of the TIM4 peripheral. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_ITConfig(TIM4_IT_TypeDef TIM4_IT, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_IT_OK(TIM4_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the Interrupt sources */ |
||||
TIM4->IER |= (uint8_t)TIM4_IT; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the Interrupt sources */ |
||||
TIM4->IER &= (uint8_t)(~TIM4_IT); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the TIM4 Update event. |
||||
* @param NewState new state of the TIM4 peripheral Preload register. This parameter can |
||||
* be ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_UpdateDisableConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Set or Reset the UDIS Bit */ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
TIM4->CR1 |= TIM4_CR1_UDIS; |
||||
} |
||||
else |
||||
{ |
||||
TIM4->CR1 &= (uint8_t)(~TIM4_CR1_UDIS); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM4 Update Request Interrupt source. |
||||
* @param TIM4_UpdateSource specifies the Update source. |
||||
* This parameter can be one of the following values |
||||
* - TIM4_UPDATESOURCE_REGULAR |
||||
* - TIM4_UPDATESOURCE_GLOBAL |
||||
* @retval None |
||||
*/ |
||||
void TIM4_UpdateRequestConfig(TIM4_UpdateSource_TypeDef TIM4_UpdateSource) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_UPDATE_SOURCE_OK(TIM4_UpdateSource)); |
||||
|
||||
/* Set or Reset the URS Bit */ |
||||
if (TIM4_UpdateSource != TIM4_UPDATESOURCE_GLOBAL) |
||||
{ |
||||
TIM4->CR1 |= TIM4_CR1_URS; |
||||
} |
||||
else |
||||
{ |
||||
TIM4->CR1 &= (uint8_t)(~TIM4_CR1_URS); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM4’s One Pulse Mode. |
||||
* @param TIM4_OPMode specifies the OPM Mode to be used. |
||||
* This parameter can be one of the following values |
||||
* - TIM4_OPMODE_SINGLE |
||||
* - TIM4_OPMODE_REPETITIVE |
||||
* @retval None |
||||
*/ |
||||
void TIM4_SelectOnePulseMode(TIM4_OPMode_TypeDef TIM4_OPMode) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_OPM_MODE_OK(TIM4_OPMode)); |
||||
|
||||
/* Set or Reset the OPM Bit */ |
||||
if (TIM4_OPMode != TIM4_OPMODE_REPETITIVE) |
||||
{ |
||||
TIM4->CR1 |= TIM4_CR1_OPM; |
||||
} |
||||
else |
||||
{ |
||||
TIM4->CR1 &= (uint8_t)(~TIM4_CR1_OPM); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the TIM4 Prescaler. |
||||
* @param Prescaler specifies the Prescaler Register value |
||||
* This parameter can be one of the following values |
||||
* - TIM4_PRESCALER_1 |
||||
* - TIM4_PRESCALER_2 |
||||
* - TIM4_PRESCALER_4 |
||||
* - TIM4_PRESCALER_8 |
||||
* - TIM4_PRESCALER_16 |
||||
* - TIM4_PRESCALER_32 |
||||
* - TIM4_PRESCALER_64 |
||||
* - TIM4_PRESCALER_128 |
||||
* @param TIM4_PSCReloadMode specifies the TIM4 Prescaler Reload mode. |
||||
* This parameter can be one of the following values |
||||
* - TIM4_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded |
||||
* immediately. |
||||
* - TIM4_PSCRELOADMODE_UPDATE: The Prescaler is loaded at |
||||
* the update event. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_PrescalerConfig(TIM4_Prescaler_TypeDef Prescaler, TIM4_PSCReloadMode_TypeDef TIM4_PSCReloadMode) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_PRESCALER_RELOAD_OK(TIM4_PSCReloadMode)); |
||||
assert_param(IS_TIM4_PRESCALER_OK(Prescaler)); |
||||
|
||||
/* Set the Prescaler value */ |
||||
TIM4->PSCR = (uint8_t)Prescaler; |
||||
|
||||
/* Set or reset the UG Bit */ |
||||
TIM4->EGR = (uint8_t)TIM4_PSCReloadMode; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables TIM4 peripheral Preload register on ARR. |
||||
* @param NewState new state of the TIM4 peripheral Preload register. |
||||
* This parameter can be ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_ARRPreloadConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Set or Reset the ARPE Bit */ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
TIM4->CR1 |= TIM4_CR1_ARPE; |
||||
} |
||||
else |
||||
{ |
||||
TIM4->CR1 &= (uint8_t)(~TIM4_CR1_ARPE); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the TIM4 event to be generated by software. |
||||
* @param TIM4_EventSource specifies the event source. |
||||
* This parameter can be one of the following values: |
||||
* - TIM4_EVENTSOURCE_UPDATE: TIM4 update Event source |
||||
* @retval None |
||||
*/ |
||||
void TIM4_GenerateEvent(TIM4_EventSource_TypeDef TIM4_EventSource) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_EVENT_SOURCE_OK(TIM4_EventSource)); |
||||
|
||||
/* Set the event sources */ |
||||
TIM4->EGR = (uint8_t)(TIM4_EventSource); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the TIM4 Counter Register value. |
||||
* @param Counter specifies the Counter register new value. |
||||
* This parameter is between 0x00 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_SetCounter(uint8_t Counter) |
||||
{ |
||||
/* Set the Counter Register value */ |
||||
TIM4->CNTR = (uint8_t)(Counter); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the TIM4 Autoreload Register value. |
||||
* @param Autoreload specifies the Autoreload register new value. |
||||
* This parameter is between 0x00 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void TIM4_SetAutoreload(uint8_t Autoreload) |
||||
{ |
||||
/* Set the Autoreload Register value */ |
||||
TIM4->ARR = (uint8_t)(Autoreload); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the TIM4 Counter value. |
||||
* @param None |
||||
* @retval Counter Register value. |
||||
*/ |
||||
uint8_t TIM4_GetCounter(void) |
||||
{ |
||||
/* Get the Counter Register value */ |
||||
return (uint8_t)(TIM4->CNTR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the TIM4 Prescaler value. |
||||
* @param None |
||||
* @retval Prescaler Register configuration value. |
||||
*/ |
||||
TIM4_Prescaler_TypeDef TIM4_GetPrescaler(void) |
||||
{ |
||||
/* Get the Prescaler Register value */ |
||||
return (TIM4_Prescaler_TypeDef)(TIM4->PSCR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified TIM4 flag is set or not. |
||||
* @param TIM4_FLAG specifies the flag to check. |
||||
* This parameter can be one of the following values: |
||||
* - TIM4_FLAG_UPDATE: TIM4 update Flag |
||||
* @retval FlagStatus The new state of TIM4_FLAG (SET or RESET). |
||||
*/ |
||||
FlagStatus TIM4_GetFlagStatus(TIM4_FLAG_TypeDef TIM4_FLAG) |
||||
{ |
||||
FlagStatus bitstatus = RESET; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_GET_FLAG_OK(TIM4_FLAG)); |
||||
|
||||
if ((TIM4->SR1 & (uint8_t)TIM4_FLAG) != 0) |
||||
{ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = RESET; |
||||
} |
||||
return ((FlagStatus)bitstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the TIM4’s pending flags. |
||||
* @param TIM4_FLAG specifies the flag to clear. |
||||
* This parameter can be one of the following values: |
||||
* - TIM4_FLAG_UPDATE: TIM4 update Flag |
||||
* @retval None. |
||||
*/ |
||||
void TIM4_ClearFlag(TIM4_FLAG_TypeDef TIM4_FLAG) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_GET_FLAG_OK(TIM4_FLAG)); |
||||
|
||||
/* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ |
||||
TIM4->SR1 = (uint8_t)(~TIM4_FLAG); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the TIM4 interrupt has occurred or not. |
||||
* @param TIM4_IT specifies the TIM4 interrupt source to check. |
||||
* This parameter can be one of the following values: |
||||
* - TIM4_IT_UPDATE: TIM4 update Interrupt source |
||||
* @retval ITStatus The new state of the TIM4_IT (SET or RESET). |
||||
*/ |
||||
ITStatus TIM4_GetITStatus(TIM4_IT_TypeDef TIM4_IT) |
||||
{ |
||||
ITStatus bitstatus = RESET; |
||||
|
||||
uint8_t itstatus = 0x0, itenable = 0x0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_IT_OK(TIM4_IT)); |
||||
|
||||
itstatus = (uint8_t)(TIM4->SR1 & (uint8_t)TIM4_IT); |
||||
|
||||
itenable = (uint8_t)(TIM4->IER & (uint8_t)TIM4_IT); |
||||
|
||||
if ((itstatus != (uint8_t)RESET ) && (itenable != (uint8_t)RESET )) |
||||
{ |
||||
bitstatus = (ITStatus)SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = (ITStatus)RESET; |
||||
} |
||||
return ((ITStatus)bitstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the TIM4's interrupt pending bits. |
||||
* @param TIM4_IT specifies the pending bit to clear. |
||||
* This parameter can be one of the following values: |
||||
* - TIM4_IT_UPDATE: TIM4 update Interrupt source |
||||
* @retval None. |
||||
*/ |
||||
void TIM4_ClearITPendingBit(TIM4_IT_TypeDef TIM4_IT) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM4_IT_OK(TIM4_IT)); |
||||
|
||||
/* Clear the IT pending Bit */ |
||||
TIM4->SR1 = (uint8_t)(~TIM4_IT); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,515 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm8s_tim6.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the TIM6 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_tim6.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
|
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/**
|
||||
* @addtogroup TIM6_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the TIM6 peripheral registers to their default reset values. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void TIM6_DeInit(void) |
||||
{ |
||||
TIM6->CR1 = TIM6_CR1_RESET_VALUE; |
||||
TIM6->CR2 = TIM6_CR2_RESET_VALUE; |
||||
TIM6->SMCR = TIM6_SMCR_RESET_VALUE; |
||||
TIM6->IER = TIM6_IER_RESET_VALUE; |
||||
TIM6->CNTR = TIM6_CNTR_RESET_VALUE; |
||||
TIM6->PSCR = TIM6_PSCR_RESET_VALUE; |
||||
TIM6->ARR = TIM6_ARR_RESET_VALUE; |
||||
TIM6->SR1 = TIM6_SR1_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the TIM6 Time Base Unit according to the specified |
||||
* parameters. |
||||
* @param TIM6_Prescaler : This parameter can be any of the @Ref TIM5_Prescaler_TypeDef enumeration. |
||||
* @param TIM6_Period : This parameter must be a value between 0x00 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_TimeBaseInit(TIM6_Prescaler_TypeDef TIM6_Prescaler, |
||||
uint8_t TIM6_Period) |
||||
{ |
||||
/* Check TIM6 prescaler value */ |
||||
assert_param(IS_TIM6_PRESCALER_OK(TIM6_Prescaler)); |
||||
/* Set the Autoreload value */ |
||||
TIM6->ARR = (uint8_t)(TIM6_Period); |
||||
/* Set the Prescaler value */ |
||||
TIM6->PSCR = (uint8_t)(TIM6_Prescaler); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the TIM6 peripheral. |
||||
* @param NewState : The new state of the TIM6 peripheral. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_Cmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* set or Reset the CEN Bit */ |
||||
if (NewState == ENABLE) |
||||
{ |
||||
TIM6->CR1 |= TIM6_CR1_CEN ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->CR1 &= (uint8_t)(~TIM6_CR1_CEN) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or Disables the TIM6 Update event. |
||||
* @param NewState : The new state of the TIM6 peripheral Preload register. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_UpdateDisableConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Set or Reset the UDIS Bit */ |
||||
if (NewState == ENABLE) |
||||
{ |
||||
TIM6->CR1 |= TIM6_CR1_UDIS ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->CR1 &= (uint8_t)(~TIM6_CR1_UDIS) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM6 Update Request Interrupt source. |
||||
* @param TIM6_UpdateSource : Specifies the Update source. |
||||
* This parameter can be one of the @ref TIM6_UpdateSource_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_UpdateRequestConfig(TIM6_UpdateSource_TypeDef TIM6_UpdateSource) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_UPDATE_SOURCE_OK(TIM6_UpdateSource)); |
||||
|
||||
/* Set or Reset the URS Bit */ |
||||
if (TIM6_UpdateSource == TIM6_UPDATESOURCE_REGULAR) |
||||
{ |
||||
TIM6->CR1 |= TIM6_CR1_URS ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->CR1 &= (uint8_t)(~TIM6_CR1_URS) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM6’s One Pulse Mode. |
||||
* @param TIM6_OPMode : Specifies the OPM Mode to be used. |
||||
* This parameter can be one of the @ref TIM6_OPMode_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SelectOnePulseMode(TIM6_OPMode_TypeDef TIM6_OPMode) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_OPM_MODE_OK(TIM6_OPMode)); |
||||
|
||||
/* Set or Reset the OPM Bit */ |
||||
if (TIM6_OPMode == TIM6_OPMODE_SINGLE) |
||||
{ |
||||
TIM6->CR1 |= TIM6_CR1_OPM ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->CR1 &= (uint8_t)(~TIM6_CR1_OPM) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the TIM6 Prescaler. |
||||
* @param Prescaler : Specifies the Prescaler Register value |
||||
* This parameter can be one of the @ref TIM6_Prescaler_TypeDef enumeration. |
||||
* @param TIM6_PSCReloadMode : Specifies the TIM6 Prescaler Reload mode. |
||||
* This parameter can be one of the @ref TIM6_PSCReloadMode_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_PrescalerConfig(TIM6_Prescaler_TypeDef Prescaler, |
||||
TIM6_PSCReloadMode_TypeDef TIM6_PSCReloadMode) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_PRESCALER_RELOAD_OK(TIM6_PSCReloadMode)); |
||||
assert_param(IS_TIM6_PRESCALER_OK(Prescaler)); |
||||
|
||||
/* Set the Prescaler value */ |
||||
TIM6->PSCR = (uint8_t)Prescaler; |
||||
|
||||
/* Set or reset the UG Bit */ |
||||
if (TIM6_PSCReloadMode == TIM6_PSCRELOADMODE_IMMEDIATE) |
||||
{ |
||||
TIM6->EGR |= TIM6_EGR_UG ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->EGR &= (uint8_t)(~TIM6_EGR_UG) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables TIM6 peripheral Preload register on ARR. |
||||
* @param NewState : The new state of the TIM6 peripheral Preload register. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_ARRPreloadConfig(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Set or Reset the ARPE Bit */ |
||||
if (NewState == ENABLE) |
||||
{ |
||||
TIM6->CR1 |= TIM6_CR1_ARPE ; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->CR1 &= (uint8_t)(~TIM6_CR1_ARPE) ; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the TIM6 Counter Register value. |
||||
* @param Counter : Specifies the Counter register new value. |
||||
* This parameter is between 0x00 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SetCounter(uint8_t Counter) |
||||
{ |
||||
/* Set the Counter Register value */ |
||||
TIM6->CNTR = (uint8_t)(Counter); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the TIM6 Autoreload Register value. |
||||
* @param Autoreload : Specifies the Autoreload register new value. |
||||
* This parameter is between 0x00 and 0xFF. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SetAutoreload(uint8_t Autoreload) |
||||
{ |
||||
/* Set the Autoreload Register value */ |
||||
TIM6->ARR = (uint8_t)(Autoreload); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the TIM6 Counter value. |
||||
* @param None |
||||
* @retval uint8_t: Counter Register value. |
||||
*/ |
||||
uint8_t TIM6_GetCounter(void) |
||||
{ |
||||
uint8_t tmpcntr=0; |
||||
tmpcntr = TIM6->CNTR; |
||||
/* Get the Counter Register value */ |
||||
return ((uint8_t)tmpcntr); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the TIM6 Prescaler value. |
||||
* @param None |
||||
* @retval TIM6_Prescaler_TypeDef : Prescaler Register configuration value. |
||||
*/ |
||||
TIM6_Prescaler_TypeDef TIM6_GetPrescaler(void) |
||||
{ |
||||
/* Get the Prescaler Register value */ |
||||
return ((TIM6_Prescaler_TypeDef)TIM6->PSCR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified TIM6 interrupts. |
||||
* @param TIM6_IT : Specifies the TIM6 interrupts sources to be enabled or disabled. |
||||
* This parameter can be any combination of the @ref TIM6_IT_TypeDef enumeration. |
||||
* @param NewState : The new state of the TIM6 peripheral. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
* @par Required preconditions: |
||||
* If QST option bit is enabled, the TIM6 Interrupt vector will be mapped on IRQ number 2 (irq0). |
||||
* Otherwise, it will be mapped on IRQ number 27 (irq25). |
||||
*/ |
||||
void TIM6_ITConfig(TIM6_IT_TypeDef TIM6_IT, FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_IT_OK(TIM6_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState == ENABLE) |
||||
{ |
||||
/* Enable the Interrupt sources */ |
||||
TIM6->IER |= (uint8_t)TIM6_IT; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the Interrupt sources */ |
||||
TIM6->IER &= (uint8_t)(~(uint8_t)TIM6_IT); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the TIM’s pending flags. |
||||
* @param TIM6_FLAG : Specifies the flag to clear. |
||||
* This parameter can be one of the @ref TIM6_FLAG_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_ClearFlag(TIM6_FLAG_TypeDef TIM6_FLAG) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_CLEAR_FLAG_OK((uint8_t)TIM6_FLAG)); |
||||
/* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ |
||||
TIM6->SR1 &= (uint8_t)(~((uint8_t)TIM6_FLAG)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the TIM6 interrupt has occurred or not. |
||||
* @param TIM6_IT : Specifies the TIM6 interrupt source to check. |
||||
* This parameter can be one of the @ref TIM6_IT_TypeDef enumeration. |
||||
* @retval ITStatus : The new state of the TIM6_IT. |
||||
* This parameter can be any of the @ref ITStatus enumeration. |
||||
*/ |
||||
ITStatus TIM6_GetITStatus(TIM6_IT_TypeDef TIM6_IT) |
||||
{ |
||||
ITStatus bitstatus = RESET; |
||||
uint8_t itStatus = 0, itEnable = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_GET_IT_OK(TIM6_IT)); |
||||
|
||||
itStatus = (uint8_t)(TIM6->SR1 & (uint8_t)TIM6_IT); |
||||
|
||||
itEnable = (uint8_t)(TIM6->IER & (uint8_t)TIM6_IT); |
||||
|
||||
if ((itStatus != (uint8_t)RESET ) && (itEnable != (uint8_t)RESET )) |
||||
{ |
||||
bitstatus = (ITStatus)SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = (ITStatus)RESET; |
||||
} |
||||
return ((ITStatus)bitstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the TIM6 event to be generated by software. |
||||
* @param TIM6_EventSource : Specifies the event source. |
||||
* This parameter can be one of the @ref TIM6_EventSource_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_GenerateEvent(TIM6_EventSource_TypeDef TIM6_EventSource) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_EVENT_SOURCE_OK((uint8_t)TIM6_EventSource)); |
||||
|
||||
/* Set the event sources */ |
||||
TIM6->EGR |= (uint8_t)TIM6_EventSource; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified TIM6 flag is set or not. |
||||
* @param TIM6_FLAG : Specifies the flag to check. |
||||
* This parameter can be one of the @ref TIM6_FLAG_TypeDef enumeration. |
||||
* @retval FlagStatus : The new state of TIM6_FLAG. |
||||
* This parameter can be any of the @ref FlagStatus enumeration. |
||||
*/ |
||||
FlagStatus TIM6_GetFlagStatus(TIM6_FLAG_TypeDef TIM6_FLAG) |
||||
{ |
||||
volatile FlagStatus bitstatus = RESET; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_GET_FLAG_OK(TIM6_FLAG)); |
||||
|
||||
if ((TIM6->SR1 & (uint8_t)TIM6_FLAG) != 0) |
||||
{ |
||||
bitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
bitstatus = RESET; |
||||
} |
||||
return ((FlagStatus)bitstatus); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the TIM6's interrupt pending bits. |
||||
* @param TIM6_IT : Specifies the pending bit to clear. |
||||
* This parameter can be one of the @ref TIM6_IT_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_ClearITPendingBit(TIM6_IT_TypeDef TIM6_IT) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_IT_OK(TIM6_IT)); |
||||
|
||||
/* Clear the IT pending Bit */ |
||||
TIM6->SR1 &= (uint8_t)(~(uint8_t)TIM6_IT); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM6 Trigger Output Mode. |
||||
* @param TIM6_TRGOSource : Specifies the Trigger Output source. |
||||
* This parameter can be one of the @ref TIM6_TRGOSource_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SelectOutputTrigger(TIM6_TRGOSource_TypeDef TIM6_TRGOSource) |
||||
{ |
||||
uint8_t tmpcr2 = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_TRGO_SOURCE_OK(TIM6_TRGOSource)); |
||||
|
||||
tmpcr2 = TIM6->CR2; |
||||
|
||||
/* Reset the MMS Bits */ |
||||
tmpcr2 &= (uint8_t)(~TIM6_CR2_MMS); |
||||
|
||||
/* Select the TRGO source */ |
||||
tmpcr2 |= (uint8_t)TIM6_TRGOSource; |
||||
|
||||
TIM6->CR2 = tmpcr2; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets or Resets the TIM6 Master/Slave Mode. |
||||
* @param NewState : The new state of the synchronization between TIM6 and its slaves (through TRGO). |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
|
||||
void TIM6_SelectMasterSlaveMode(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Set or Reset the MSM Bit */ |
||||
if (NewState == ENABLE) |
||||
{ |
||||
TIM6->SMCR |= TIM6_SMCR_MSM; |
||||
} |
||||
else |
||||
{ |
||||
TIM6->SMCR &= (uint8_t)(~TIM6_SMCR_MSM); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM6 Input Trigger source. |
||||
* @param TIM6_InputTriggerSource : Specifies Input Trigger source. |
||||
* This parameter can be one of the @ref TIM6_TS_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SelectInputTrigger(TIM6_TS_TypeDef TIM6_InputTriggerSource) |
||||
{ |
||||
uint8_t tmpsmcr = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_TRIGGER_SELECTION_OK(TIM6_InputTriggerSource)); |
||||
|
||||
tmpsmcr = TIM6->SMCR; |
||||
|
||||
/* Select the Trigger Source */ |
||||
tmpsmcr &= (uint8_t)(~TIM6_SMCR_TS); |
||||
tmpsmcr |= (uint8_t)TIM6_InputTriggerSource; |
||||
|
||||
TIM6->SMCR = (uint8_t)tmpsmcr; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables the TIM6 internal Clock. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void TIM6_InternalClockConfig(void) |
||||
{ |
||||
/* Disable slave mode to clock the prescaler directly with the internal clock */ |
||||
TIM6->SMCR &= (uint8_t)(~TIM6_SMCR_SMS); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the TIM6 Slave Mode. |
||||
* @param TIM6_SlaveMode : Specifies the TIM6 Slave Mode. |
||||
* This parameter can be one of the @ref TIM6_SlaveMode_TypeDef enumeration. |
||||
* @retval None |
||||
*/ |
||||
void TIM6_SelectSlaveMode(TIM6_SlaveMode_TypeDef TIM6_SlaveMode) |
||||
{ |
||||
uint8_t tmpsmcr = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_TIM6_SLAVE_MODE_OK(TIM6_SlaveMode)); |
||||
|
||||
tmpsmcr = TIM6->SMCR; |
||||
|
||||
/* Reset the SMS Bits */ |
||||
tmpsmcr &= (uint8_t)(~TIM6_SMCR_SMS); |
||||
|
||||
/* Select the Slave Mode */ |
||||
tmpsmcr |= (uint8_t)TIM6_SlaveMode; |
||||
|
||||
TIM6->SMCR = tmpsmcr; |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,800 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart1.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the UART1 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_uart1.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @}
|
||||
* @addtogroup UART1_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the UART peripheral. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UART1_DeInit(void) |
||||
{ |
||||
/* Clear the Idle Line Detected bit in the status register by a read
|
||||
to the UART1_SR register followed by a Read to the UART1_DR register */ |
||||
(void)UART1->SR; |
||||
(void)UART1->DR; |
||||
|
||||
UART1->BRR2 = UART1_BRR2_RESET_VALUE; /* Set UART1_BRR2 to reset value 0x00 */ |
||||
UART1->BRR1 = UART1_BRR1_RESET_VALUE; /* Set UART1_BRR1 to reset value 0x00 */ |
||||
|
||||
UART1->CR1 = UART1_CR1_RESET_VALUE; /* Set UART1_CR1 to reset value 0x00 */ |
||||
UART1->CR2 = UART1_CR2_RESET_VALUE; /* Set UART1_CR2 to reset value 0x00 */ |
||||
UART1->CR3 = UART1_CR3_RESET_VALUE; /* Set UART1_CR3 to reset value 0x00 */ |
||||
UART1->CR4 = UART1_CR4_RESET_VALUE; /* Set UART1_CR4 to reset value 0x00 */ |
||||
UART1->CR5 = UART1_CR5_RESET_VALUE; /* Set UART1_CR5 to reset value 0x00 */ |
||||
|
||||
UART1->GTR = UART1_GTR_RESET_VALUE; |
||||
UART1->PSCR = UART1_PSCR_RESET_VALUE; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the UART1 according to the specified parameters. |
||||
* @note Configure in Push Pull or Open Drain mode the Tx pin by setting the |
||||
* correct I/O Port register according the product package and line |
||||
* configuration |
||||
* @param BaudRate: The baudrate. |
||||
* @param WordLength : This parameter can be any of the
|
||||
* @ref UART1_WordLength_TypeDef enumeration. |
||||
* @param StopBits: This parameter can be any of the
|
||||
* @ref UART1_StopBits_TypeDef enumeration. |
||||
* @param Parity: This parameter can be any of the
|
||||
* @ref UART1_Parity_TypeDef enumeration. |
||||
* @param SyncMode: This parameter can be any of the
|
||||
* @ref UART1_SyncMode_TypeDef values. |
||||
* @param Mode: This parameter can be any of the @ref UART1_Mode_TypeDef values |
||||
* @retval None |
||||
*/ |
||||
void UART1_Init(uint32_t BaudRate, UART1_WordLength_TypeDef WordLength,
|
||||
UART1_StopBits_TypeDef StopBits, UART1_Parity_TypeDef Parity,
|
||||
UART1_SyncMode_TypeDef SyncMode, UART1_Mode_TypeDef Mode) |
||||
{ |
||||
uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART1_BAUDRATE_OK(BaudRate)); |
||||
assert_param(IS_UART1_WORDLENGTH_OK(WordLength)); |
||||
assert_param(IS_UART1_STOPBITS_OK(StopBits)); |
||||
assert_param(IS_UART1_PARITY_OK(Parity)); |
||||
assert_param(IS_UART1_MODE_OK((uint8_t)Mode)); |
||||
assert_param(IS_UART1_SYNCMODE_OK((uint8_t)SyncMode)); |
||||
|
||||
/* Clear the word length bit */ |
||||
UART1->CR1 &= (uint8_t)(~UART1_CR1_M);
|
||||
|
||||
/* Set the word length bit according to UART1_WordLength value */ |
||||
UART1->CR1 |= (uint8_t)WordLength; |
||||
|
||||
/* Clear the STOP bits */ |
||||
UART1->CR3 &= (uint8_t)(~UART1_CR3_STOP);
|
||||
/* Set the STOP bits number according to UART1_StopBits value */ |
||||
UART1->CR3 |= (uint8_t)StopBits;
|
||||
|
||||
/* Clear the Parity Control bit */ |
||||
UART1->CR1 &= (uint8_t)(~(UART1_CR1_PCEN | UART1_CR1_PS ));
|
||||
/* Set the Parity Control bit to UART1_Parity value */ |
||||
UART1->CR1 |= (uint8_t)Parity;
|
||||
|
||||
/* Clear the LSB mantissa of UART1DIV */ |
||||
UART1->BRR1 &= (uint8_t)(~UART1_BRR1_DIVM);
|
||||
/* Clear the MSB mantissa of UART1DIV */ |
||||
UART1->BRR2 &= (uint8_t)(~UART1_BRR2_DIVM);
|
||||
/* Clear the Fraction bits of UART1DIV */ |
||||
UART1->BRR2 &= (uint8_t)(~UART1_BRR2_DIVF);
|
||||
|
||||
/* Set the UART1 BaudRates in BRR1 and BRR2 registers according to UART1_BaudRate value */ |
||||
BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); |
||||
BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); |
||||
/* Set the fraction of UART1DIV */ |
||||
UART1->BRR2 |= (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) << 4) / 100) & (uint8_t)0x0F);
|
||||
/* Set the MSB mantissa of UART1DIV */ |
||||
UART1->BRR2 |= (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0);
|
||||
/* Set the LSB mantissa of UART1DIV */ |
||||
UART1->BRR1 |= (uint8_t)BaudRate_Mantissa;
|
||||
|
||||
/* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ |
||||
UART1->CR2 &= (uint8_t)~(UART1_CR2_TEN | UART1_CR2_REN);
|
||||
/* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART1->CR3 &= (uint8_t)~(UART1_CR3_CPOL | UART1_CR3_CPHA | UART1_CR3_LBCL);
|
||||
/* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART1->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART1_CR3_CPOL |
|
||||
UART1_CR3_CPHA | UART1_CR3_LBCL));
|
||||
|
||||
if ((uint8_t)(Mode & UART1_MODE_TX_ENABLE)) |
||||
{ |
||||
/* Set the Transmitter Enable bit */ |
||||
UART1->CR2 |= (uint8_t)UART1_CR2_TEN;
|
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Transmitter Disable bit */ |
||||
UART1->CR2 &= (uint8_t)(~UART1_CR2_TEN);
|
||||
} |
||||
if ((uint8_t)(Mode & UART1_MODE_RX_ENABLE)) |
||||
{ |
||||
/* Set the Receiver Enable bit */ |
||||
UART1->CR2 |= (uint8_t)UART1_CR2_REN;
|
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Receiver Disable bit */ |
||||
UART1->CR2 &= (uint8_t)(~UART1_CR2_REN);
|
||||
} |
||||
/* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock
|
||||
pulse bits according to UART1_Mode value */ |
||||
if ((uint8_t)(SyncMode & UART1_SYNCMODE_CLOCK_DISABLE)) |
||||
{ |
||||
/* Clear the Clock Enable bit */ |
||||
UART1->CR3 &= (uint8_t)(~UART1_CR3_CKEN);
|
||||
} |
||||
else |
||||
{ |
||||
UART1->CR3 |= (uint8_t)((uint8_t)SyncMode & UART1_CR3_CKEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable the UART1 peripheral. |
||||
* @param NewState : The new state of the UART Communication. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void UART1_Cmd(FunctionalState NewState) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* UART1 Enable */ |
||||
UART1->CR1 &= (uint8_t)(~UART1_CR1_UARTD);
|
||||
} |
||||
else |
||||
{ |
||||
/* UART Disable */ |
||||
UART1->CR1 |= UART1_CR1_UARTD;
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified USART interrupts. |
||||
* @param UART1_IT specifies the USART interrupt sources to be enabled or disabled. |
||||
* This parameter can be one of the following values: |
||||
* - UART1_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART1_IT_TC: Transmission complete interrupt |
||||
* - UART1_IT_RXNE_OR: Receive Data register not empty and Overrun interrupt |
||||
* - UART1_IT_IDLE: Idle line detection interrupt |
||||
* - USRT1_IT_ERR: Error interrupt |
||||
* @param NewState new state of the specified USART interrupts. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_ITConfig(UART1_IT_TypeDef UART1_IT, FunctionalState NewState) |
||||
{ |
||||
uint8_t uartreg = 0, itpos = 0x00; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART1_CONFIG_IT_OK(UART1_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Get the UART1 register index */ |
||||
uartreg = (uint8_t)((uint16_t)UART1_IT >> 0x08); |
||||
/* Get the UART1 IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART1_IT & (uint8_t)0x0F)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/**< Enable the Interrupt bits according to UART1_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART1->CR1 |= itpos; |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART1->CR2 |= itpos; |
||||
} |
||||
else |
||||
{ |
||||
UART1->CR4 |= itpos; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/**< Disable the interrupt bits according to UART1_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART1->CR1 &= (uint8_t)(~itpos); |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART1->CR2 &= (uint8_t)(~itpos); |
||||
} |
||||
else |
||||
{ |
||||
UART1->CR4 &= (uint8_t)(~itpos); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART’s Half Duplex communication. |
||||
* @param NewState new state of the UART Communication. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_HalfDuplexCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
UART1->CR5 |= UART1_CR5_HDSEL; /**< UART1 Half Duplex Enable */ |
||||
} |
||||
else |
||||
{ |
||||
UART1->CR5 &= (uint8_t)~UART1_CR5_HDSEL; /**< UART1 Half Duplex Disable */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the UART’s IrDA interface. |
||||
* @param UART1_IrDAMode specifies the IrDA mode. |
||||
* This parameter can be any of the @ref UART1_IrDAMode_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART1_IrDAConfig(UART1_IrDAMode_TypeDef UART1_IrDAMode) |
||||
{ |
||||
assert_param(IS_UART1_IRDAMODE_OK(UART1_IrDAMode)); |
||||
|
||||
if (UART1_IrDAMode != UART1_IRDAMODE_NORMAL) |
||||
{ |
||||
UART1->CR5 |= UART1_CR5_IRLP; |
||||
} |
||||
else |
||||
{ |
||||
UART1->CR5 &= ((uint8_t)~UART1_CR5_IRLP); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART’s IrDA interface. |
||||
* @param NewState new state of the IrDA mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_IrDACmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the IrDA mode by setting the IREN bit in the CR3 register */ |
||||
UART1->CR5 |= UART1_CR5_IREN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ |
||||
UART1->CR5 &= ((uint8_t)~UART1_CR5_IREN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the UART1 LIN Break detection length. |
||||
* @param UART1_LINBreakDetectionLength specifies the LIN break detection length. |
||||
* This parameter can be any of the |
||||
* @ref UART1_LINBreakDetectionLength_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART1_LINBreakDetectionConfig(UART1_LINBreakDetectionLength_TypeDef UART1_LINBreakDetectionLength) |
||||
{ |
||||
assert_param(IS_UART1_LINBREAKDETECTIONLENGTH_OK(UART1_LINBreakDetectionLength)); |
||||
|
||||
if (UART1_LINBreakDetectionLength != UART1_LINBREAKDETECTIONLENGTH_10BITS) |
||||
{ |
||||
UART1->CR4 |= UART1_CR4_LBDL; |
||||
} |
||||
else |
||||
{ |
||||
UART1->CR4 &= ((uint8_t)~UART1_CR4_LBDL); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART1’s LIN mode. |
||||
* @param NewState is new state of the UART1 LIN mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_LINCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the LIN mode by setting the LINE bit in the CR2 register */ |
||||
UART1->CR3 |= UART1_CR3_LINEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the LIN mode by clearing the LINE bit in the CR2 register */ |
||||
UART1->CR3 &= ((uint8_t)~UART1_CR3_LINEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART1 Smart Card mode. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SmartCardCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the SC mode by setting the SCEN bit in the CR5 register */ |
||||
UART1->CR5 |= UART1_CR5_SCEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the SC mode by clearing the SCEN bit in the CR5 register */ |
||||
UART1->CR5 &= ((uint8_t)(~UART1_CR5_SCEN)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables NACK transmission. |
||||
* @note This function is valid only for UART1 because is related to SmartCard mode. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SmartCardNACKCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the NACK transmission by setting the NACK bit in the CR5 register */ |
||||
UART1->CR5 |= UART1_CR5_NACK; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ |
||||
UART1->CR5 &= ((uint8_t)~(UART1_CR5_NACK)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the UART1 WakeUp method. |
||||
* @param UART1_WakeUp: specifies the UART1 wakeup method. |
||||
* This parameter can be any of the @ref UART1_WakeUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART1_WakeUpConfig(UART1_WakeUp_TypeDef UART1_WakeUp) |
||||
{ |
||||
assert_param(IS_UART1_WAKEUP_OK(UART1_WakeUp)); |
||||
|
||||
UART1->CR1 &= ((uint8_t)~UART1_CR1_WAKE); |
||||
UART1->CR1 |= (uint8_t)UART1_WakeUp; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Determines if the UART1 is in mute mode or not. |
||||
* @param NewState: new state of the UART1 mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART1_ReceiverWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the mute mode UART1 by setting the RWU bit in the CR2 register */ |
||||
UART1->CR2 |= UART1_CR2_RWU; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the mute mode UART1 by clearing the RWU bit in the CR1 register */ |
||||
UART1->CR2 &= ((uint8_t)~UART1_CR2_RWU); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART1 peripheral. |
||||
* @param None |
||||
* @retval The received data. |
||||
*/ |
||||
uint8_t UART1_ReceiveData8(void) |
||||
{ |
||||
return ((uint8_t)UART1->DR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART1 peripheral. |
||||
* @param None |
||||
* @retval The received data. |
||||
*/ |
||||
uint16_t UART1_ReceiveData9(void) |
||||
{ |
||||
uint16_t temp = 0; |
||||
|
||||
temp = (uint16_t)(((uint16_t)( (uint16_t)UART1->CR1 & (uint16_t)UART1_CR1_R8)) << 1); |
||||
return (uint16_t)( (((uint16_t) UART1->DR) | temp ) & ((uint16_t)0x01FF)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 8 bit data through the UART1 peripheral. |
||||
* @param Data: The data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SendData8(uint8_t Data) |
||||
{ |
||||
/* Transmit Data */ |
||||
UART1->DR = Data; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 9 bit data through the UART peripheral. |
||||
* @param Data : The data to transmit. |
||||
* This parameter should be lower than 0x1FF. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SendData9(uint16_t Data) |
||||
{ |
||||
/**< Clear the transmit data bit 8 [8] */ |
||||
UART1->CR1 &= ((uint8_t)~UART1_CR1_T8); |
||||
/**< Write the transmit data bit [8] */ |
||||
UART1->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART1_CR1_T8); |
||||
/**< Write the transmit data bit [0:7] */ |
||||
UART1->DR = (uint8_t)(Data); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits break characters. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UART1_SendBreak(void) |
||||
{ |
||||
UART1->CR2 |= UART1_CR2_SBK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the address of the UART1 node. |
||||
* @param UART1_Address: Indicates the address of the UART1 node. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SetAddress(uint8_t UART1_Address) |
||||
{ |
||||
/*assert_param for UART1_Address*/ |
||||
assert_param(IS_UART1_ADDRESS_OK(UART1_Address)); |
||||
|
||||
/* Clear the UART1 address */ |
||||
UART1->CR4 &= ((uint8_t)~UART1_CR4_ADD); |
||||
/* Set the UART1 address node */ |
||||
UART1->CR4 |= UART1_Address; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the specified UART guard time. |
||||
* @note SmartCard Mode should be Enabled |
||||
* @param UART1_GuardTime: specifies the guard time. |
||||
* @retval None |
||||
*/ |
||||
void UART1_SetGuardTime(uint8_t UART1_GuardTime) |
||||
{ |
||||
/* Set the UART1 guard time */ |
||||
UART1->GTR = UART1_GuardTime; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the system clock prescaler. |
||||
* @note IrDA Low Power mode or smartcard mode should be enabled |
||||
* @note This function is related to SmartCard and IrDa mode. |
||||
* @param UART1_Prescaler: specifies the prescaler clock. |
||||
* This parameter can be one of the following values: |
||||
* @par IrDA Low Power Mode |
||||
* The clock source is divided by the value given in the register (8 bits) |
||||
* - 0000 0000 Reserved |
||||
* - 0000 0001 divides the clock source by 1 |
||||
* - 0000 0010 divides the clock source by 2 |
||||
* - ... |
||||
* @par Smart Card Mode |
||||
* The clock source is divided by the value given in the register |
||||
* (5 significant bits) multiplied by 2 |
||||
* - 0 0000 Reserved |
||||
* - 0 0001 divides the clock source by 2 |
||||
* - 0 0010 divides the clock source by 4 |
||||
* - 0 0011 divides the clock source by 6 |
||||
* - ... |
||||
* @retval None |
||||
*/ |
||||
void UART1_SetPrescaler(uint8_t UART1_Prescaler) |
||||
{ |
||||
/* Load the UART1 prescaler value*/ |
||||
UART1->PSCR = UART1_Prescaler; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART1 flag is set or not. |
||||
* @param UART1_FLAG specifies the flag to check. |
||||
* This parameter can be any of the @ref UART1_Flag_TypeDef enumeration. |
||||
* @retval FlagStatus (SET or RESET) |
||||
*/ |
||||
FlagStatus UART1_GetFlagStatus(UART1_Flag_TypeDef UART1_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART1_FLAG_OK(UART1_FLAG)); |
||||
|
||||
|
||||
/* Check the status of the specified UART1 flag*/ |
||||
if (UART1_FLAG == UART1_FLAG_LBDF) |
||||
{ |
||||
if ((UART1->CR4 & (uint8_t)UART1_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART1_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART1_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if (UART1_FLAG == UART1_FLAG_SBK) |
||||
{ |
||||
if ((UART1->CR2 & (uint8_t)UART1_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART1_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART1_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if ((UART1->SR & (uint8_t)UART1_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART1_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART1_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
/* Return the UART1_FLAG status*/ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART1 flags. |
||||
* @param UART1_FLAG specifies the flag to clear |
||||
* This parameter can be any combination of the following values: |
||||
* - UART1_FLAG_LBDF: LIN Break detection flag. |
||||
* - UART1_FLAG_RXNE: Receive data register not empty flag. |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) flags are
|
||||
* cleared by software sequence: a read operation to UART1_SR register |
||||
* (UART1_GetFlagStatus())followed by a read operation to UART1_DR
|
||||
* register(UART1_ReceiveData8() or UART1_ReceiveData9()). |
||||
*
|
||||
* - RXNE flag can be also cleared by a read to the UART1_DR register |
||||
* (UART1_ReceiveData8()or UART1_ReceiveData9()). |
||||
*
|
||||
* - TC flag can be also cleared by software sequence: a read operation |
||||
* to UART1_SR register (UART1_GetFlagStatus()) followed by a write
|
||||
* operation to UART1_DR register (UART1_SendData8() or UART1_SendData9()). |
||||
*
|
||||
* - TXE flag is cleared only by a write to the UART1_DR register
|
||||
* (UART1_SendData8() or UART1_SendData9()). |
||||
*
|
||||
* - SBK flag is cleared during the stop bit of break. |
||||
* @retval None |
||||
*/ |
||||
void UART1_ClearFlag(UART1_Flag_TypeDef UART1_FLAG) |
||||
{ |
||||
assert_param(IS_UART1_CLEAR_FLAG_OK(UART1_FLAG)); |
||||
|
||||
/* Clear the Receive Register Not Empty flag */ |
||||
if (UART1_FLAG == UART1_FLAG_RXNE) |
||||
{ |
||||
UART1->SR = (uint8_t)~(UART1_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection flag */ |
||||
else |
||||
{ |
||||
UART1->CR4 &= (uint8_t)~(UART1_CR4_LBDF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART1 interrupt has occurred or not. |
||||
* @param UART1_IT: Specifies the UART1 interrupt pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - UART1_IT_LBDF: LIN Break detection interrupt |
||||
* - UART1_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART1_IT_TC: Transmission complete interrupt |
||||
* - UART1_IT_RXNE: Receive Data register not empty interrupt |
||||
* - UART1_IT_IDLE: Idle line detection interrupt |
||||
* - UART1_IT_OR: OverRun Error interrupt |
||||
* - UART1_IT_PE: Parity Error interrupt |
||||
* @retval The new state of UART1_IT (SET or RESET). |
||||
*/ |
||||
ITStatus UART1_GetITStatus(UART1_IT_TypeDef UART1_IT) |
||||
{ |
||||
ITStatus pendingbitstatus = RESET; |
||||
uint8_t itpos = 0; |
||||
uint8_t itmask1 = 0; |
||||
uint8_t itmask2 = 0; |
||||
uint8_t enablestatus = 0; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART1_GET_IT_OK(UART1_IT)); |
||||
|
||||
/* Get the UART1 IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART1_IT & (uint8_t)0x0F)); |
||||
/* Get the UART1 IT index */ |
||||
itmask1 = (uint8_t)((uint8_t)UART1_IT >> (uint8_t)4); |
||||
/* Set the IT mask*/ |
||||
itmask2 = (uint8_t)((uint8_t)1 << itmask1); |
||||
|
||||
|
||||
/* Check the status of the specified UART1 pending bit*/ |
||||
if (UART1_IT == UART1_IT_PE) |
||||
{ |
||||
/* Get the UART1_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART1->CR1 & itmask2); |
||||
/* Check the status of the specified UART1 interrupt*/ |
||||
|
||||
if (((UART1->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
|
||||
else if (UART1_IT == UART1_IT_LBDF) |
||||
{ |
||||
/* Get the UART1_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART1->CR4 & itmask2); |
||||
/* Check the status of the specified UART1 interrupt*/ |
||||
if (((UART1->CR4 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Get the UART1_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART1->CR2 & itmask2); |
||||
/* Check the status of the specified UART1 interrupt*/ |
||||
if (((UART1->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
|
||||
/* Return the UART1_IT status*/ |
||||
return pendingbitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART1 pending flags. |
||||
* @param UART1_IT specifies the pending bit to clear |
||||
* This parameter can be one of the following values: |
||||
* - UART1_IT_LBDF: LIN Break detection interrupt |
||||
* - UART1_IT_RXNE: Receive Data register not empty interrupt. |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) pending bits are
|
||||
* cleared by software sequence: a read operation to UART1_SR register |
||||
* (UART1_GetITStatus()) followed by a read operation to UART1_DR register |
||||
* (UART1_ReceiveData8() or UART1_ReceiveData9()). |
||||
*
|
||||
* - RXNE pending bit can be also cleared by a read to the UART1_DR register |
||||
* (UART1_ReceiveData8() or UART1_ReceiveData9()). |
||||
*
|
||||
* - TC (Transmit complete) pending bit can be cleared by software
|
||||
* sequence: a read operation to UART1_SR register (UART1_GetITStatus()) |
||||
* followed by a write operation to UART1_DR register (UART1_SendData8() |
||||
* or UART1_SendData9()). |
||||
*
|
||||
* - TXE pending bit is cleared only by a write to the UART1_DR register |
||||
* (UART1_SendData8() or UART1_SendData9()). |
||||
* @retval None |
||||
*/ |
||||
void UART1_ClearITPendingBit(UART1_IT_TypeDef UART1_IT) |
||||
{ |
||||
assert_param(IS_UART1_CLEAR_IT_OK(UART1_IT)); |
||||
|
||||
/* Clear the Receive Register Not Empty pending bit */ |
||||
if (UART1_IT == UART1_IT_RXNE) |
||||
{ |
||||
UART1->SR = (uint8_t)~(UART1_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection pending bit */ |
||||
else |
||||
{ |
||||
UART1->CR4 &= (uint8_t)~(UART1_CR4_LBDF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,882 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart2.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the UART2 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_uart2.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @}
|
||||
* @addtogroup UART2_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the UART peripheral. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
|
||||
void UART2_DeInit(void) |
||||
{ |
||||
/* Clear the Idle Line Detected bit in the status register by a read
|
||||
to the UART2_SR register followed by a Read to the UART2_DR register */ |
||||
(void) UART2->SR; |
||||
(void)UART2->DR; |
||||
|
||||
UART2->BRR2 = UART2_BRR2_RESET_VALUE; /* Set UART2_BRR2 to reset value 0x00 */ |
||||
UART2->BRR1 = UART2_BRR1_RESET_VALUE; /* Set UART2_BRR1 to reset value 0x00 */ |
||||
|
||||
UART2->CR1 = UART2_CR1_RESET_VALUE; /* Set UART2_CR1 to reset value 0x00 */ |
||||
UART2->CR2 = UART2_CR2_RESET_VALUE; /* Set UART2_CR2 to reset value 0x00 */ |
||||
UART2->CR3 = UART2_CR3_RESET_VALUE; /* Set UART2_CR3 to reset value 0x00 */ |
||||
UART2->CR4 = UART2_CR4_RESET_VALUE; /* Set UART2_CR4 to reset value 0x00 */ |
||||
UART2->CR5 = UART2_CR5_RESET_VALUE; /* Set UART2_CR5 to reset value 0x00 */ |
||||
UART2->CR6 = UART2_CR6_RESET_VALUE; /* Set UART2_CR6 to reset value 0x00 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the UART2 according to the specified parameters. |
||||
* @param BaudRate: The baudrate. |
||||
* @param WordLength : This parameter can be any of the
|
||||
* @ref UART2_WordLength_TypeDef enumeration. |
||||
* @param StopBits: This parameter can be any of the
|
||||
* @ref UART2_StopBits_TypeDef enumeration. |
||||
* @param Parity: This parameter can be any of the
|
||||
* @ref UART2_Parity_TypeDef enumeration. |
||||
* @param SyncMode: This parameter can be any of the
|
||||
* @ref UART2_SyncMode_TypeDef values. |
||||
* @param Mode: This parameter can be any of the @ref UART2_Mode_TypeDef values |
||||
* @retval None |
||||
*/ |
||||
void UART2_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength, UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity, UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode) |
||||
{ |
||||
uint8_t BRR2_1 = 0, BRR2_2 = 0; |
||||
uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART2_BAUDRATE_OK(BaudRate)); |
||||
assert_param(IS_UART2_WORDLENGTH_OK(WordLength)); |
||||
assert_param(IS_UART2_STOPBITS_OK(StopBits)); |
||||
assert_param(IS_UART2_PARITY_OK(Parity)); |
||||
assert_param(IS_UART2_MODE_OK((uint8_t)Mode)); |
||||
assert_param(IS_UART2_SYNCMODE_OK((uint8_t)SyncMode)); |
||||
|
||||
/* Clear the word length bit */ |
||||
UART2->CR1 &= (uint8_t)(~UART2_CR1_M); |
||||
/* Set the word length bit according to UART2_WordLength value */ |
||||
UART2->CR1 |= (uint8_t)WordLength;
|
||||
|
||||
/* Clear the STOP bits */ |
||||
UART2->CR3 &= (uint8_t)(~UART2_CR3_STOP); |
||||
/* Set the STOP bits number according to UART2_StopBits value */ |
||||
UART2->CR3 |= (uint8_t)StopBits;
|
||||
|
||||
/* Clear the Parity Control bit */ |
||||
UART2->CR1 &= (uint8_t)(~(UART2_CR1_PCEN | UART2_CR1_PS )); |
||||
/* Set the Parity Control bit to UART2_Parity value */ |
||||
UART2->CR1 |= (uint8_t)Parity; |
||||
|
||||
/* Clear the LSB mantissa of UART2DIV */ |
||||
UART2->BRR1 &= (uint8_t)(~UART2_BRR1_DIVM); |
||||
/* Clear the MSB mantissa of UART2DIV */ |
||||
UART2->BRR2 &= (uint8_t)(~UART2_BRR2_DIVM); |
||||
/* Clear the Fraction bits of UART2DIV */ |
||||
UART2->BRR2 &= (uint8_t)(~UART2_BRR2_DIVF); |
||||
|
||||
/* Set the UART2 BaudRates in BRR1 and BRR2 registers according to UART2_BaudRate value */ |
||||
BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); |
||||
BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); |
||||
|
||||
/* The fraction and MSB mantissa should be loaded in one step in the BRR2 register*/ |
||||
/* Set the fraction of UARTDIV */ |
||||
BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) |
||||
<< 4) / 100) & (uint8_t)0x0F);
|
||||
BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); |
||||
|
||||
UART2->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); |
||||
/* Set the LSB mantissa of UARTDIV */ |
||||
UART2->BRR1 = (uint8_t)BaudRate_Mantissa;
|
||||
|
||||
/* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ |
||||
UART2->CR2 &= (uint8_t)~(UART2_CR2_TEN | UART2_CR2_REN); |
||||
/* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART2->CR3 &= (uint8_t)~(UART2_CR3_CPOL | UART2_CR3_CPHA | UART2_CR3_LBCL); |
||||
/* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART2->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART2_CR3_CPOL | \
|
||||
UART2_CR3_CPHA | UART2_CR3_LBCL)); |
||||
|
||||
if ((uint8_t)(Mode & UART2_MODE_TX_ENABLE)) |
||||
{ |
||||
/* Set the Transmitter Enable bit */ |
||||
UART2->CR2 |= (uint8_t)UART2_CR2_TEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Transmitter Disable bit */ |
||||
UART2->CR2 &= (uint8_t)(~UART2_CR2_TEN); |
||||
} |
||||
if ((uint8_t)(Mode & UART2_MODE_RX_ENABLE)) |
||||
{ |
||||
/* Set the Receiver Enable bit */ |
||||
UART2->CR2 |= (uint8_t)UART2_CR2_REN; |
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Receiver Disable bit */ |
||||
UART2->CR2 &= (uint8_t)(~UART2_CR2_REN); |
||||
} |
||||
/* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock
|
||||
pulse bits according to UART2_Mode value */ |
||||
if ((uint8_t)(SyncMode & UART2_SYNCMODE_CLOCK_DISABLE)) |
||||
{ |
||||
/* Clear the Clock Enable bit */ |
||||
UART2->CR3 &= (uint8_t)(~UART2_CR3_CKEN);
|
||||
} |
||||
else |
||||
{ |
||||
UART2->CR3 |= (uint8_t)((uint8_t)SyncMode & UART2_CR3_CKEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable the UART2 peripheral. |
||||
* @param NewState : The new state of the UART Communication. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void UART2_Cmd(FunctionalState NewState) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* UART2 Enable */ |
||||
UART2->CR1 &= (uint8_t)(~UART2_CR1_UARTD); |
||||
} |
||||
else |
||||
{ |
||||
/* UART2 Disable */ |
||||
UART2->CR1 |= UART2_CR1_UARTD;
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified UART2 interrupts. |
||||
* @param UART2_IT specifies the UART2 interrupt sources to be enabled or disabled. |
||||
* This parameter can be one of the following values: |
||||
* - UART2_IT_LBDF: LIN Break detection interrupt |
||||
* - UART2_IT_LHDF: LIN Break detection interrupt |
||||
* - UART2_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART2_IT_TC: Transmission complete interrupt |
||||
* - UART2_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt |
||||
* - UART2_IT_IDLE: Idle line detection interrupt |
||||
* - UART2_IT_PE: Parity Error interrupt |
||||
* @param NewState new state of the specified UART2 interrupts. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState) |
||||
{ |
||||
uint8_t uartreg = 0, itpos = 0x00; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Get the UART2 register index */ |
||||
uartreg = (uint8_t)((uint16_t)UART2_IT >> 0x08); |
||||
|
||||
/* Get the UART2 IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART2_IT & (uint8_t)0x0F)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the Interrupt bits according to UART2_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART2->CR1 |= itpos; |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART2->CR2 |= itpos; |
||||
} |
||||
else if (uartreg == 0x03) |
||||
{ |
||||
UART2->CR4 |= itpos; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR6 |= itpos; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the interrupt bits according to UART2_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART2->CR1 &= (uint8_t)(~itpos); |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART2->CR2 &= (uint8_t)(~itpos); |
||||
} |
||||
else if (uartreg == 0x03) |
||||
{ |
||||
UART2->CR4 &= (uint8_t)(~itpos); |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR6 &= (uint8_t)(~itpos); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the UART2’s IrDA interface. |
||||
* @param UART2_IrDAMode specifies the IrDA mode. |
||||
* This parameter can be any of the @ref UART2_IrDAMode_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART2_IrDAConfig(UART2_IrDAMode_TypeDef UART2_IrDAMode) |
||||
{ |
||||
assert_param(IS_UART2_IRDAMODE_OK(UART2_IrDAMode)); |
||||
|
||||
if (UART2_IrDAMode != UART2_IRDAMODE_NORMAL) |
||||
{ |
||||
UART2->CR5 |= UART2_CR5_IRLP; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR5 &= ((uint8_t)~UART2_CR5_IRLP); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART2’s IrDA interface. |
||||
* @param NewState new state of the IrDA mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART2_IrDACmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the IrDA mode by setting the IREN bit in the CR3 register */ |
||||
UART2->CR5 |= UART2_CR5_IREN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ |
||||
UART2->CR5 &= ((uint8_t)~UART2_CR5_IREN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the UART2 LIN Break detection length. |
||||
* @param UART2_LINBreakDetectionLength specifies the LIN break detection length. |
||||
* This parameter can be any of the
|
||||
* @ref UART2_LINBreakDetectionLength_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART2_LINBreakDetectionConfig(UART2_LINBreakDetectionLength_TypeDef UART2_LINBreakDetectionLength) |
||||
{ |
||||
/* Check parameters */
|
||||
assert_param(IS_UART2_LINBREAKDETECTIONLENGTH_OK(UART2_LINBreakDetectionLength)); |
||||
|
||||
if (UART2_LINBreakDetectionLength != UART2_LINBREAKDETECTIONLENGTH_10BITS) |
||||
{ |
||||
UART2->CR4 |= UART2_CR4_LBDL; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR4 &= ((uint8_t)~UART2_CR4_LBDL); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the UART2 peripheral. |
||||
* @param UART2_Mode specifies the LIN mode. |
||||
* This parameter can be any of the @ref UART2_LinMode_TypeDef values. |
||||
* @param UART2_Autosync specifies the LIN automatic resynchronization mode. |
||||
* This parameter can be any of the @ref UART2_LinAutosync_TypeDef values. |
||||
* @param UART2_DivUp specifies the LIN divider update method. |
||||
* This parameter can be any of the @ref UART2_LinDivUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART2_LINConfig(UART2_LinMode_TypeDef UART2_Mode,
|
||||
UART2_LinAutosync_TypeDef UART2_Autosync,
|
||||
UART2_LinDivUp_TypeDef UART2_DivUp) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_UART2_SLAVE_OK(UART2_Mode)); |
||||
assert_param(IS_UART2_AUTOSYNC_OK(UART2_Autosync)); |
||||
assert_param(IS_UART2_DIVUP_OK(UART2_DivUp)); |
||||
|
||||
if (UART2_Mode != UART2_LIN_MODE_MASTER) |
||||
{ |
||||
UART2->CR6 |= UART2_CR6_LSLV; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR6 &= ((uint8_t)~UART2_CR6_LSLV); |
||||
} |
||||
|
||||
if (UART2_Autosync != UART2_LIN_AUTOSYNC_DISABLE) |
||||
{ |
||||
UART2->CR6 |= UART2_CR6_LASE ; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR6 &= ((uint8_t)~ UART2_CR6_LASE ); |
||||
} |
||||
|
||||
if (UART2_DivUp != UART2_LIN_DIVUP_LBRR1) |
||||
{ |
||||
UART2->CR6 |= UART2_CR6_LDUM; |
||||
} |
||||
else |
||||
{ |
||||
UART2->CR6 &= ((uint8_t)~ UART2_CR6_LDUM); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART2 LIN mode. |
||||
* @param NewState is new state of the UART2 LIN mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART2_LINCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the LIN mode by setting the LINE bit in the CR2 register */ |
||||
UART2->CR3 |= UART2_CR3_LINEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the LIN mode by clearing the LINE bit in the CR2 register */ |
||||
UART2->CR3 &= ((uint8_t)~UART2_CR3_LINEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART2 Smart Card mode. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SmartCardCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the SC mode by setting the SCEN bit in the CR5 register */ |
||||
UART2->CR5 |= UART2_CR5_SCEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the SC mode by clearing the SCEN bit in the CR5 register */ |
||||
UART2->CR5 &= ((uint8_t)(~UART2_CR5_SCEN)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables NACK transmission. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SmartCardNACKCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the NACK transmission by setting the NACK bit in the CR5 register */ |
||||
UART2->CR5 |= UART2_CR5_NACK; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ |
||||
UART2->CR5 &= ((uint8_t)~(UART2_CR5_NACK)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the UART2 WakeUp method. |
||||
* @param UART2_WakeUp: specifies the UART2 wakeup method. |
||||
* This parameter can be any of the @ref UART2_WakeUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART2_WakeUpConfig(UART2_WakeUp_TypeDef UART2_WakeUp) |
||||
{ |
||||
assert_param(IS_UART2_WAKEUP_OK(UART2_WakeUp)); |
||||
|
||||
UART2->CR1 &= ((uint8_t)~UART2_CR1_WAKE); |
||||
UART2->CR1 |= (uint8_t)UART2_WakeUp; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Determines if the UART2 is in mute mode or not. |
||||
* @param NewState: new state of the UART2 mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART2_ReceiverWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the mute mode UART2 by setting the RWU bit in the CR2 register */ |
||||
UART2->CR2 |= UART2_CR2_RWU; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the mute mode UART2 by clearing the RWU bit in the CR1 register */ |
||||
UART2->CR2 &= ((uint8_t)~UART2_CR2_RWU); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART2 peripheral. |
||||
* @param None |
||||
* @retval Received Data |
||||
*/ |
||||
uint8_t UART2_ReceiveData8(void) |
||||
{ |
||||
return ((uint8_t)UART2->DR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART2 peripheral. |
||||
* @param None
|
||||
* @retval Received Data |
||||
*/ |
||||
uint16_t UART2_ReceiveData9(void) |
||||
{ |
||||
uint16_t temp = 0; |
||||
|
||||
temp = ((uint16_t)(((uint16_t)((uint16_t)UART2->CR1 & (uint16_t)UART2_CR1_R8)) << 1)); |
||||
|
||||
return (uint16_t)((((uint16_t)UART2->DR) | temp) & ((uint16_t)0x01FF)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 8 bit data through the UART2 peripheral. |
||||
* @param Data: the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SendData8(uint8_t Data) |
||||
{ |
||||
/* Transmit Data */ |
||||
UART2->DR = Data; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 9 bit data through the UART2 peripheral. |
||||
* @param Data: the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SendData9(uint16_t Data) |
||||
{ |
||||
/* Clear the transmit data bit 8 */ |
||||
UART2->CR1 &= ((uint8_t)~UART2_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [8] */ |
||||
UART2->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART2_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [0:7] */ |
||||
UART2->DR = (uint8_t)(Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits break characters. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UART2_SendBreak(void) |
||||
{ |
||||
UART2->CR2 |= UART2_CR2_SBK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the address of the UART2 node. |
||||
* @param UART2_Address: Indicates the address of the UART2 node. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SetAddress(uint8_t UART2_Address) |
||||
{ |
||||
/*assert_param for x UART2_Address*/ |
||||
assert_param(IS_UART2_ADDRESS_OK(UART2_Address)); |
||||
|
||||
/* Clear the UART2 address */ |
||||
UART2->CR4 &= ((uint8_t)~UART2_CR4_ADD); |
||||
/* Set the UART2 address node */ |
||||
UART2->CR4 |= UART2_Address; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the specified UART2 guard time. |
||||
* @note SmartCard Mode should be Enabled
|
||||
* @param UART2_GuardTime: specifies the guard time. |
||||
* @retval None |
||||
*/ |
||||
void UART2_SetGuardTime(uint8_t UART2_GuardTime) |
||||
{ |
||||
/* Set the UART2 guard time */ |
||||
UART2->GTR = UART2_GuardTime; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the system clock prescaler. |
||||
* @note IrDA Low Power mode or smartcard mode should be enabled |
||||
* @note This function is related to SmartCard and IrDa mode. |
||||
* @param UART2_Prescaler: specifies the prescaler clock. |
||||
* This parameter can be one of the following values: |
||||
* @par IrDA Low Power Mode |
||||
* The clock source is divided by the value given in the register (8 bits) |
||||
* - 0000 0000 Reserved |
||||
* - 0000 0001 divides the clock source by 1 |
||||
* - 0000 0010 divides the clock source by 2 |
||||
* - ... |
||||
* @par Smart Card Mode |
||||
* The clock source is divided by the value given in the register |
||||
* (5 significant bits) multiped by 2 |
||||
* - 0 0000 Reserved |
||||
* - 0 0001 divides the clock source by 2 |
||||
* - 0 0010 divides the clock source by 4 |
||||
* - 0 0011 divides the clock source by 6 |
||||
* - ... |
||||
* @retval None |
||||
*/ |
||||
void UART2_SetPrescaler(uint8_t UART2_Prescaler) |
||||
{ |
||||
/* Load the UART2 prescaler value*/ |
||||
UART2->PSCR = UART2_Prescaler; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART2 flag is set or not. |
||||
* @param UART2_FLAG specifies the flag to check. |
||||
* This parameter can be any of the @ref UART2_Flag_TypeDef enumeration. |
||||
* @retval FlagStatus (SET or RESET) |
||||
*/ |
||||
FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART2_FLAG_OK(UART2_FLAG)); |
||||
|
||||
/* Check the status of the specified UART2 flag*/ |
||||
if (UART2_FLAG == UART2_FLAG_LBDF) |
||||
{ |
||||
if ((UART2->CR4 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART2_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART2_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if (UART2_FLAG == UART2_FLAG_SBK) |
||||
{ |
||||
if ((UART2->CR2 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART2_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART2_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if ((UART2_FLAG == UART2_FLAG_LHDF) || (UART2_FLAG == UART2_FLAG_LSF)) |
||||
{ |
||||
if ((UART2->CR6 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART2_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART2_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if ((UART2->SR & (uint8_t)UART2_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART2_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART2_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
|
||||
/* Return the UART2_FLAG status*/ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART2 flags. |
||||
* @param UART2_FLAG specifies the flag to clear |
||||
* This parameter can be any combination of the following values: |
||||
* - UART2_FLAG_LBDF: LIN Break detection flag. |
||||
* - UART2_FLAG_LHDF: LIN Header detection flag. |
||||
* - UART2_FLAG_LSF: LIN synchrone field flag. |
||||
* - UART2_FLAG_RXNE: Receive data register not empty flag. |
||||
* @note: |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) flags are cleared |
||||
* by software sequence: a read operation to UART2_SR register
|
||||
* (UART2_GetFlagStatus())followed by a read operation to UART2_DR
|
||||
* register(UART2_ReceiveData8() or UART2_ReceiveData9()). |
||||
*
|
||||
* - RXNE flag can be also cleared by a read to the UART2_DR register |
||||
* (UART2_ReceiveData8()or UART2_ReceiveData9()). |
||||
* |
||||
* - TC flag can be also cleared by software sequence: a read operation |
||||
* to UART2_SR register (UART2_GetFlagStatus()) followed by a write
|
||||
* operation to UART2_DR register (UART2_SendData8() or UART2_SendData9()). |
||||
*
|
||||
* - TXE flag is cleared only by a write to the UART2_DR register
|
||||
* (UART2_SendData8() or UART2_SendData9()). |
||||
*
|
||||
* - SBK flag is cleared during the stop bit of break. |
||||
* @retval None |
||||
*/ |
||||
void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG) |
||||
{ |
||||
assert_param(IS_UART2_CLEAR_FLAG_OK(UART2_FLAG)); |
||||
|
||||
/* Clear the Receive Register Not Empty flag */ |
||||
if (UART2_FLAG == UART2_FLAG_RXNE) |
||||
{ |
||||
UART2->SR = (uint8_t)~(UART2_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection flag */ |
||||
else if (UART2_FLAG == UART2_FLAG_LBDF) |
||||
{ |
||||
UART2->CR4 &= (uint8_t)(~UART2_CR4_LBDF); |
||||
} |
||||
/* Clear the LIN Header Detection Flag */ |
||||
else if (UART2_FLAG == UART2_FLAG_LHDF) |
||||
{ |
||||
UART2->CR6 &= (uint8_t)(~UART2_CR6_LHDF); |
||||
} |
||||
/* Clear the LIN Synch Field flag */ |
||||
else |
||||
{ |
||||
UART2->CR6 &= (uint8_t)(~UART2_CR6_LSF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART2 interrupt has occurred or not. |
||||
* @param UART2_IT: Specifies the UART2 interrupt pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - UART2_IT_LBDF: LIN Break detection interrupt |
||||
* - UART2_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART2_IT_TC: Transmission complete interrupt |
||||
* - UART2_IT_RXNE: Receive Data register not empty interrupt |
||||
* - UART2_IT_IDLE: Idle line detection interrupt |
||||
* - UART2_IT_OR: OverRun Error interrupt |
||||
* - UART2_IT_PE: Parity Error interrupt |
||||
* @retval The state of UART2_IT (SET or RESET). |
||||
*/ |
||||
ITStatus UART2_GetITStatus(UART2_IT_TypeDef UART2_IT) |
||||
{ |
||||
ITStatus pendingbitstatus = RESET; |
||||
uint8_t itpos = 0; |
||||
uint8_t itmask1 = 0; |
||||
uint8_t itmask2 = 0; |
||||
uint8_t enablestatus = 0; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART2_GET_IT_OK(UART2_IT)); |
||||
|
||||
/* Get the UART2 IT index*/ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART2_IT & (uint8_t)0x0F)); |
||||
/* Get the UART2 IT index*/ |
||||
itmask1 = (uint8_t)((uint8_t)UART2_IT >> (uint8_t)4); |
||||
/* Set the IT mask*/ |
||||
itmask2 = (uint8_t)((uint8_t)1 << itmask1); |
||||
|
||||
/* Check the status of the specified UART2 pending bit*/ |
||||
if (UART2_IT == UART2_IT_PE) |
||||
{ |
||||
/* Get the UART2_ITPENDINGBIT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART2->CR1 & itmask2); |
||||
/* Check the status of the specified UART2 interrupt*/ |
||||
|
||||
if (((UART2->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if (UART2_IT == UART2_IT_LBDF) |
||||
{ |
||||
/* Get the UART2_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART2->CR4 & itmask2); |
||||
/* Check the status of the specified UART2 interrupt*/ |
||||
if (((UART2->CR4 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if (UART2_IT == UART2_IT_LHDF) |
||||
{ |
||||
/* Get the UART2_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART2->CR6 & itmask2); |
||||
/* Check the status of the specified UART2 interrupt*/ |
||||
if (((UART2->CR6 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Get the UART2_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART2->CR2 & itmask2); |
||||
/* Check the status of the specified UART2 interrupt*/ |
||||
if (((UART2->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
/* Return the UART2_IT status*/ |
||||
return pendingbitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART2 pending flags. |
||||
* @param UART2_IT specifies the pending bit to clear |
||||
* This parameter can be one of the following values: |
||||
* - UART2_IT_LBDF: LIN Break detection interrupt |
||||
* - UART2_IT_LHDF: LIN Header detection interrupt |
||||
* - UART2_IT_RXNE: Receive Data register not empty interrupt. |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) pending bits are
|
||||
* cleared by software sequence: a read operation to UART2_SR register |
||||
* (UART2_GetITStatus()) followed by a read operation to UART2_DR register |
||||
* (UART2_ReceiveData8() or UART2_ReceiveData9()). |
||||
*
|
||||
* - RXNE pending bit can be also cleared by a read to the UART2_DR
|
||||
* register (UART2_ReceiveData8() or UART2_ReceiveData9()). |
||||
*
|
||||
* - TC (Transmit complete) pending bit can be cleared by software
|
||||
* sequence: a read operation to UART2_SR register
|
||||
* (UART2_GetITStatus()) followed by a write operation to UART2_DR
|
||||
* register (UART2_SendData8()or UART2_SendData9()). |
||||
*
|
||||
* - TXE pending bit is cleared only by a write to the UART2_DR register |
||||
* (UART2_SendData8() or UART2_SendData9()). |
||||
* @retval None |
||||
*/ |
||||
void UART2_ClearITPendingBit(UART2_IT_TypeDef UART2_IT) |
||||
{ |
||||
assert_param(IS_UART2_CLEAR_IT_OK(UART2_IT)); |
||||
|
||||
/* Clear the Receive Register Not Empty pending bit */ |
||||
if (UART2_IT == UART2_IT_RXNE) |
||||
{ |
||||
UART2->SR = (uint8_t)~(UART2_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection pending bit */ |
||||
else if (UART2_IT == UART2_IT_LBDF) |
||||
{ |
||||
UART2->CR4 &= (uint8_t)~(UART2_CR4_LBDF); |
||||
} |
||||
/* Clear the LIN Header Detection pending bit */ |
||||
else |
||||
{ |
||||
UART2->CR6 &= (uint8_t)(~UART2_CR6_LHDF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,737 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart3.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the uart3 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_uart3.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @}
|
||||
* @addtogroup UART3_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the UART peripheral. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
|
||||
void UART3_DeInit(void) |
||||
{ |
||||
/* Clear the Idle Line Detected bit in the status rerister by a read
|
||||
to the UART3_SR register followed by a Read to the UART3_DR register */ |
||||
(void) UART3->SR; |
||||
(void) UART3->DR; |
||||
|
||||
UART3->BRR2 = UART3_BRR2_RESET_VALUE; /*Set UART3_BRR2 to reset value 0x00 */ |
||||
UART3->BRR1 = UART3_BRR1_RESET_VALUE; /*Set UART3_BRR1 to reset value 0x00 */ |
||||
|
||||
UART3->CR1 = UART3_CR1_RESET_VALUE; /*Set UART3_CR1 to reset value 0x00 */ |
||||
UART3->CR2 = UART3_CR2_RESET_VALUE; /*Set UART3_CR2 to reset value 0x00 */ |
||||
UART3->CR3 = UART3_CR3_RESET_VALUE; /*Set UART3_CR3 to reset value 0x00 */ |
||||
UART3->CR4 = UART3_CR4_RESET_VALUE; /*Set UART3_CR4 to reset value 0x00 */ |
||||
UART3->CR6 = UART3_CR6_RESET_VALUE; /*Set UART3_CR6 to reset value 0x00 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the UART3 according to the specified parameters. |
||||
* @param BaudRate: The baudrate. |
||||
* @param WordLength : This parameter can be any of
|
||||
* the @ref UART3_WordLength_TypeDef enumeration. |
||||
* @param StopBits: This parameter can be any of the
|
||||
* @ref UART3_StopBits_TypeDef enumeration. |
||||
* @param Parity: This parameter can be any of the
|
||||
* @ref UART3_Parity_TypeDef enumeration. |
||||
* @param Mode: This parameter can be any of the @ref UART3_Mode_TypeDef values |
||||
* @retval None |
||||
*/ |
||||
void UART3_Init(uint32_t BaudRate, UART3_WordLength_TypeDef WordLength,
|
||||
UART3_StopBits_TypeDef StopBits, UART3_Parity_TypeDef Parity,
|
||||
UART3_Mode_TypeDef Mode) |
||||
{ |
||||
uint8_t BRR2_1 = 0, BRR2_2 = 0; |
||||
uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_WORDLENGTH_OK(WordLength)); |
||||
assert_param(IS_UART3_STOPBITS_OK(StopBits)); |
||||
assert_param(IS_UART3_PARITY_OK(Parity)); |
||||
assert_param(IS_UART3_BAUDRATE_OK(BaudRate)); |
||||
assert_param(IS_UART3_MODE_OK((uint8_t)Mode)); |
||||
|
||||
/* Clear the word length bit */ |
||||
UART3->CR1 &= (uint8_t)(~UART3_CR1_M);
|
||||
/* Set the word length bit according to UART3_WordLength value */ |
||||
UART3->CR1 |= (uint8_t)WordLength;
|
||||
|
||||
/* Clear the STOP bits */ |
||||
UART3->CR3 &= (uint8_t)(~UART3_CR3_STOP);
|
||||
/* Set the STOP bits number according to UART3_StopBits value */ |
||||
UART3->CR3 |= (uint8_t)StopBits;
|
||||
|
||||
/* Clear the Parity Control bit */ |
||||
UART3->CR1 &= (uint8_t)(~(UART3_CR1_PCEN | UART3_CR1_PS));
|
||||
/* Set the Parity Control bit to UART3_Parity value */ |
||||
UART3->CR1 |= (uint8_t)Parity;
|
||||
|
||||
/* Clear the LSB mantissa of UART3DIV */ |
||||
UART3->BRR1 &= (uint8_t)(~UART3_BRR1_DIVM);
|
||||
/* Clear the MSB mantissa of UART3DIV */ |
||||
UART3->BRR2 &= (uint8_t)(~UART3_BRR2_DIVM);
|
||||
/* Clear the Fraction bits of UART3DIV */ |
||||
UART3->BRR2 &= (uint8_t)(~UART3_BRR2_DIVF);
|
||||
|
||||
/* Set the UART3 BaudRates in BRR1 and BRR2 registers according to UART3_BaudRate value */ |
||||
BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); |
||||
BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); |
||||
/* The fraction and MSB mantissa should be loaded in one step in the BRR2 register */ |
||||
/* Set the fraction of UART3DIV */ |
||||
BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) |
||||
<< 4) / 100) & (uint8_t)0x0F);
|
||||
BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); |
||||
|
||||
UART3->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); |
||||
/* Set the LSB mantissa of UART3DIV */ |
||||
UART3->BRR1 = (uint8_t)BaudRate_Mantissa;
|
||||
|
||||
if ((uint8_t)(Mode & UART3_MODE_TX_ENABLE)) |
||||
{ |
||||
/* Set the Transmitter Enable bit */ |
||||
UART3->CR2 |= UART3_CR2_TEN;
|
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Transmitter Disable bit */ |
||||
UART3->CR2 &= (uint8_t)(~UART3_CR2_TEN);
|
||||
} |
||||
if ((uint8_t)(Mode & UART3_MODE_RX_ENABLE)) |
||||
{ |
||||
/* Set the Receiver Enable bit */ |
||||
UART3->CR2 |= UART3_CR2_REN;
|
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Receiver Disable bit */ |
||||
UART3->CR2 &= (uint8_t)(~UART3_CR2_REN);
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable the UART1 peripheral. |
||||
* @param NewState : The new state of the UART Communication. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void UART3_Cmd(FunctionalState NewState) |
||||
{ |
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* UART3 Enable */ |
||||
UART3->CR1 &= (uint8_t)(~UART3_CR1_UARTD);
|
||||
} |
||||
else |
||||
{ |
||||
/* UART3 Disable */ |
||||
UART3->CR1 |= UART3_CR1_UARTD;
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified UART3 interrupts. |
||||
* @param UART3_IT specifies the UART3 interrupt sources to be enabled or disabled. |
||||
* This parameter can be one of the following values: |
||||
* - UART3_IT_LBDF: LIN Break detection interrupt |
||||
* - UART3_IT_LHDF: LIN Break detection interrupt |
||||
* - UART3_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART3_IT_TC: Transmission complete interrupt |
||||
* - UART3_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt |
||||
* - UART3_IT_IDLE: Idle line detection interrupt |
||||
* - UART3_IT_PE: Parity Error interrupt |
||||
* @param NewState new state of the specified UART3 interrupts. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART3_ITConfig(UART3_IT_TypeDef UART3_IT, FunctionalState NewState) |
||||
{ |
||||
uint8_t uartreg = 0, itpos = 0x00; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_CONFIG_IT_OK(UART3_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Get the UART3 register index */ |
||||
uartreg = (uint8_t)((uint16_t)UART3_IT >> 0x08); |
||||
|
||||
/* Get the UART3 IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART3_IT & (uint8_t)0x0F)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the Interrupt bits according to UART3_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART3->CR1 |= itpos; |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART3->CR2 |= itpos; |
||||
} |
||||
else if (uartreg == 0x03) |
||||
{ |
||||
UART3->CR4 |= itpos; |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR6 |= itpos; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the interrupt bits according to UART3_IT mask */ |
||||
if (uartreg == 0x01) |
||||
{ |
||||
UART3->CR1 &= (uint8_t)(~itpos); |
||||
} |
||||
else if (uartreg == 0x02) |
||||
{ |
||||
UART3->CR2 &= (uint8_t)(~itpos); |
||||
} |
||||
else if (uartreg == 0x03) |
||||
{ |
||||
UART3->CR4 &= (uint8_t)(~itpos); |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR6 &= (uint8_t)(~itpos); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the UART3 LIN Break detection length. |
||||
* @param UART3_LINBreakDetectionLength specifies the LIN break detection length. |
||||
* This parameter can be any of the
|
||||
* @ref UART3_LINBreakDetectionLength_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART3_LINBreakDetectionConfig(UART3_LINBreakDetectionLength_TypeDef UART3_LINBreakDetectionLength) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_LINBREAKDETECTIONLENGTH_OK(UART3_LINBreakDetectionLength)); |
||||
|
||||
if (UART3_LINBreakDetectionLength != UART3_LINBREAKDETECTIONLENGTH_10BITS) |
||||
{ |
||||
UART3->CR4 |= UART3_CR4_LBDL; |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR4 &= ((uint8_t)~UART3_CR4_LBDL); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the UART3 peripheral. |
||||
* @param UART3_Mode specifies the LIN mode. |
||||
* This parameter can be any of the @ref UART3_LinMode_TypeDef values. |
||||
* @param UART3_Autosync specifies the LIN automatic resynchronization mode. |
||||
* This parameter can be any of the @ref UART3_LinAutosync_TypeDef values. |
||||
* @param UART3_DivUp specifies the LIN divider update method. |
||||
* This parameter can be any of the @ref UART3_LinDivUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART3_LINConfig(UART3_LinMode_TypeDef UART3_Mode, |
||||
UART3_LinAutosync_TypeDef UART3_Autosync,
|
||||
UART3_LinDivUp_TypeDef UART3_DivUp) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_SLAVE_OK(UART3_Mode)); |
||||
assert_param(IS_UART3_AUTOSYNC_OK(UART3_Autosync)); |
||||
assert_param(IS_UART3_DIVUP_OK(UART3_DivUp)); |
||||
|
||||
if (UART3_Mode != UART3_LIN_MODE_MASTER) |
||||
{ |
||||
UART3->CR6 |= UART3_CR6_LSLV; |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR6 &= ((uint8_t)~UART3_CR6_LSLV); |
||||
} |
||||
|
||||
if (UART3_Autosync != UART3_LIN_AUTOSYNC_DISABLE) |
||||
{ |
||||
UART3->CR6 |= UART3_CR6_LASE ; |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR6 &= ((uint8_t)~ UART3_CR6_LASE ); |
||||
} |
||||
|
||||
if (UART3_DivUp != UART3_LIN_DIVUP_LBRR1) |
||||
{ |
||||
UART3->CR6 |= UART3_CR6_LDUM; |
||||
} |
||||
else |
||||
{ |
||||
UART3->CR6 &= ((uint8_t)~ UART3_CR6_LDUM); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART3 LIN mode. |
||||
* @param NewState is new state of the UART3 LIN mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART3_LINCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the LIN mode by setting the LINE bit in the CR2 register */ |
||||
UART3->CR3 |= UART3_CR3_LINEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the LIN mode by clearing the LINE bit in the CR2 register */ |
||||
UART3->CR3 &= ((uint8_t)~UART3_CR3_LINEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the UART3 WakeUp method. |
||||
* @param UART3_WakeUp: specifies the UART3 wakeup method. |
||||
* This parameter can be any of the @ref UART3_WakeUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART3_WakeUpConfig(UART3_WakeUp_TypeDef UART3_WakeUp) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_WAKEUP_OK(UART3_WakeUp)); |
||||
|
||||
UART3->CR1 &= ((uint8_t)~UART3_CR1_WAKE); |
||||
UART3->CR1 |= (uint8_t)UART3_WakeUp; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Determines if the UART3 is in mute mode or not. |
||||
* @param NewState: new state of the UART3 mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART3_ReceiverWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
/* Enable the mute mode UART3 by setting the RWU bit in the CR2 register */ |
||||
UART3->CR2 |= UART3_CR2_RWU; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the mute mode UART3 by clearing the RWU bit in the CR1 register */ |
||||
UART3->CR2 &= ((uint8_t)~UART3_CR2_RWU); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART3 peripheral. |
||||
* @param None |
||||
* @retval Received Data |
||||
*/ |
||||
uint8_t UART3_ReceiveData8(void) |
||||
{ |
||||
return ((uint8_t)UART3->DR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART3 peripheral. |
||||
* @param None |
||||
* @retval Received Data |
||||
*/ |
||||
uint16_t UART3_ReceiveData9(void) |
||||
{ |
||||
uint16_t temp = 0; |
||||
|
||||
temp = (uint16_t)(((uint16_t)((uint16_t)UART3->CR1 & (uint16_t)UART3_CR1_R8)) << 1); |
||||
return (uint16_t)((((uint16_t)UART3->DR) | temp) & ((uint16_t)0x01FF)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 8 bit data through the UART3 peripheral. |
||||
* @param Data the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART3_SendData8(uint8_t Data) |
||||
{ |
||||
/* Transmit Data */ |
||||
UART3->DR = Data; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 9 bit data through the UART3 peripheral. |
||||
* @param Data: the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART3_SendData9(uint16_t Data) |
||||
{ |
||||
/* Clear the transmit data bit 8 */ |
||||
UART3->CR1 &= ((uint8_t)~UART3_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [8] */ |
||||
UART3->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART3_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [0:7] */ |
||||
UART3->DR = (uint8_t)(Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits break characters. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UART3_SendBreak(void) |
||||
{ |
||||
UART3->CR2 |= UART3_CR2_SBK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the address of the UART3 node. |
||||
* @param UART3_Address: Indicates the address of the UART3 node. |
||||
* @retval None |
||||
*/ |
||||
void UART3_SetAddress(uint8_t UART3_Address) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_ADDRESS_OK(UART3_Address)); |
||||
|
||||
/* Clear the UART3 address */ |
||||
UART3->CR4 &= ((uint8_t)~UART3_CR4_ADD); |
||||
/* Set the UART3 address node */ |
||||
UART3->CR4 |= UART3_Address; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART3 flag is set or not. |
||||
* @param UART3_FLAG specifies the flag to check. |
||||
* This parameter can be any of the @ref UART3_Flag_TypeDef enumeration. |
||||
* @retval FlagStatus (SET or RESET) |
||||
*/ |
||||
FlagStatus UART3_GetFlagStatus(UART3_Flag_TypeDef UART3_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART3_FLAG_OK(UART3_FLAG)); |
||||
|
||||
/* Check the status of the specified UART3 flag*/ |
||||
if (UART3_FLAG == UART3_FLAG_LBDF) |
||||
{ |
||||
if ((UART3->CR4 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART3_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART3_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if (UART3_FLAG == UART3_FLAG_SBK) |
||||
{ |
||||
if ((UART3->CR2 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART3_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART3_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if ((UART3_FLAG == UART3_FLAG_LHDF) || (UART3_FLAG == UART3_FLAG_LSF)) |
||||
{ |
||||
if ((UART3->CR6 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART3_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART3_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if ((UART3->SR & (uint8_t)UART3_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART3_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART3_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
|
||||
/* Return the UART3_FLAG status*/ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART3 flags. |
||||
* @param UART3_FLAG specifies the flag to clear |
||||
* This parameter can be any combination of the following values: |
||||
* - UART3_FLAG_LBDF: LIN Break detection flag. |
||||
* - UART3_FLAG_LHDF: LIN Header detection flag. |
||||
* - UART3_FLAG_LSF: LIN synchrone field flag. |
||||
* - UART3_FLAG_RXNE: Receive data register not empty flag. |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NF (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) flags are cleared |
||||
* by software sequence: a read operation to UART3_SR register
|
||||
* (UART3_GetFlagStatus())followed by a read operation to UART3_DR
|
||||
* register(UART3_ReceiveData8() or UART3_ReceiveData9()). |
||||
*
|
||||
* - RXNE flag can be also cleared by a read to the UART3_DR register |
||||
* (UART3_ReceiveData8()or UART3_ReceiveData9()). |
||||
*
|
||||
* - TC flag can be also cleared by software sequence: a read operation |
||||
* to UART3_SR register (UART3_GetFlagStatus()) followed by a write
|
||||
* operation to UART3_DR register (UART3_SendData8() or UART3_SendData9()). |
||||
*
|
||||
* - TXE flag is cleared only by a write to the UART3_DR register
|
||||
* (UART3_SendData8() or UART3_SendData9()). |
||||
*
|
||||
* - SBK flag is cleared during the stop bit of break. |
||||
* @retval None |
||||
*/ |
||||
void UART3_ClearFlag(UART3_Flag_TypeDef UART3_FLAG) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_CLEAR_FLAG_OK(UART3_FLAG)); |
||||
|
||||
/*Clear the Receive Register Not Empty flag */ |
||||
if (UART3_FLAG == UART3_FLAG_RXNE) |
||||
{ |
||||
UART3->SR = (uint8_t)~(UART3_SR_RXNE); |
||||
} |
||||
/*Clear the LIN Break Detection flag */ |
||||
else if (UART3_FLAG == UART3_FLAG_LBDF) |
||||
{ |
||||
UART3->CR4 &= (uint8_t)(~UART3_CR4_LBDF); |
||||
} |
||||
/*Clear the LIN Header Detection Flag */ |
||||
else if (UART3_FLAG == UART3_FLAG_LHDF) |
||||
{ |
||||
UART3->CR6 &= (uint8_t)(~UART3_CR6_LHDF); |
||||
} |
||||
/*Clear the LIN Synch Field flag */ |
||||
else |
||||
{ |
||||
UART3->CR6 &= (uint8_t)(~UART3_CR6_LSF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART3 interrupt has occurred or not. |
||||
* @param UART3_IT: Specifies the UART3 interrupt pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - UART3_IT_LBDF: LIN Break detection interrupt |
||||
* - UART3_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART3_IT_TC: Transmission complete interrupt |
||||
* - UART3_IT_RXNE: Receive Data register not empty interrupt |
||||
* - UART3_IT_IDLE: Idle line detection interrupt |
||||
* - UART3_IT_OR: OverRun Error interrupt |
||||
* - UART3_IT_PE: Parity Error interrupt |
||||
* @retval The state of UART3_IT (SET or RESET). |
||||
*/ |
||||
ITStatus UART3_GetITStatus(UART3_IT_TypeDef UART3_IT) |
||||
{ |
||||
ITStatus pendingbitstatus = RESET; |
||||
uint8_t itpos = 0; |
||||
uint8_t itmask1 = 0; |
||||
uint8_t itmask2 = 0; |
||||
uint8_t enablestatus = 0; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART3_GET_IT_OK(UART3_IT)); |
||||
|
||||
/* Get the UART3 IT index*/ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART3_IT & (uint8_t)0x0F)); |
||||
/* Get the UART3 IT index*/ |
||||
itmask1 = (uint8_t)((uint8_t)UART3_IT >> (uint8_t)4); |
||||
/* Set the IT mask*/ |
||||
itmask2 = (uint8_t)((uint8_t)1 << itmask1); |
||||
|
||||
/* Check the status of the specified UART3 pending bit*/ |
||||
if (UART3_IT == UART3_IT_PE) |
||||
{ |
||||
/* Get the UART3_ITPENDINGBIT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART3->CR1 & itmask2); |
||||
/* Check the status of the specified UART3 interrupt*/ |
||||
|
||||
if (((UART3->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if (UART3_IT == UART3_IT_LBDF) |
||||
{ |
||||
/* Get the UART3_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART3->CR4 & itmask2); |
||||
/* Check the status of the specified UART3 interrupt*/ |
||||
if (((UART3->CR4 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if (UART3_IT == UART3_IT_LHDF) |
||||
{ |
||||
/* Get the UART3_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART3->CR6 & itmask2); |
||||
/* Check the status of the specified UART3 interrupt*/ |
||||
if (((UART3->CR6 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Get the UART3_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART3->CR2 & itmask2); |
||||
/* Check the status of the specified UART3 interrupt*/ |
||||
if (((UART3->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
/* Return the UART3_IT status*/ |
||||
return pendingbitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART3 pending flags. |
||||
* @param UART3_IT specifies the pending bit to clear |
||||
* This parameter can be one of the following values: |
||||
* - UART3_IT_LBDF: LIN Break detection interrupt |
||||
* - UART3_IT_LHDF: LIN Header detection interrupt |
||||
* - UART3_IT_RXNE: Receive Data register not empty interrupt. |
||||
* |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NF (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) pending bits are
|
||||
* cleared by software sequence: a read operation to UART3_SR register |
||||
* (UART3_GetITStatus()) followed by a read operation to UART3_DR register
|
||||
* (UART3_ReceiveData8() or UART3_ReceiveData9()). |
||||
*
|
||||
* - RXNE pending bit can be also cleared by a read to the UART3_DR register |
||||
* (UART3_ReceiveData8() or UART3_ReceiveData9() ). |
||||
*
|
||||
* - TC (Transmit complete) pending bit can be cleared by software
|
||||
* sequence: a read operation to UART3_SR register (UART3_GetITStatus()) |
||||
* followed by a write operation to UART3_DR register
|
||||
* (UART3_SendData8()or UART3_SendData9()). |
||||
*
|
||||
* - TXE pending bit is cleared only by a write to the UART3_DR register |
||||
* (UART3_SendData8() or UART3_SendData9()). |
||||
* @retval None |
||||
*/ |
||||
void UART3_ClearITPendingBit(UART3_IT_TypeDef UART3_IT) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_UART3_CLEAR_IT_OK(UART3_IT)); |
||||
|
||||
/*Clear the Receive Register Not Empty pending bit */ |
||||
if (UART3_IT == UART3_IT_RXNE) |
||||
{ |
||||
UART3->SR = (uint8_t)~(UART3_SR_RXNE); |
||||
} |
||||
/*Clear the LIN Break Detection pending bit */ |
||||
else if (UART3_IT == UART3_IT_LBDF) |
||||
{ |
||||
UART3->CR4 &= (uint8_t)~(UART3_CR4_LBDF); |
||||
} |
||||
/*Clear the LIN Header Detection pending bit */ |
||||
else |
||||
{ |
||||
UART3->CR6 &= (uint8_t)(~UART3_CR6_LHDF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,902 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_uart4.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the UART4 peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_uart4.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/* Public functions ----------------------------------------------------------*/ |
||||
|
||||
/** @}
|
||||
* @addtogroup UART4_Public_Functions |
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Deinitializes the UART peripheral. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
|
||||
void UART4_DeInit(void) |
||||
{ |
||||
/* Clear the Idle Line Detected bit in the status register by a read
|
||||
to the UART4_SR register followed by a Read to the UART4_DR register */ |
||||
(void)UART4->SR; |
||||
(void)UART4->DR; |
||||
|
||||
UART4->BRR2 = UART4_BRR2_RESET_VALUE; /* Set UART4_BRR2 to reset value 0x00 */ |
||||
UART4->BRR1 = UART4_BRR1_RESET_VALUE; /* Set UART4_BRR1 to reset value 0x00 */ |
||||
|
||||
UART4->CR1 = UART4_CR1_RESET_VALUE; /* Set UART4_CR1 to reset value 0x00 */ |
||||
UART4->CR2 = UART4_CR2_RESET_VALUE; /* Set UART4_CR2 to reset value 0x00 */ |
||||
UART4->CR3 = UART4_CR3_RESET_VALUE; /* Set UART4_CR3 to reset value 0x00 */ |
||||
UART4->CR4 = UART4_CR4_RESET_VALUE; /* Set UART4_CR4 to reset value 0x00 */ |
||||
UART4->CR5 = UART4_CR5_RESET_VALUE; /* Set UART4_CR5 to reset value 0x00 */ |
||||
UART4->CR6 = UART4_CR6_RESET_VALUE; /* Set UART4_CR6 to reset value 0x00 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Initializes the UART4 according to the specified parameters. |
||||
* @param BaudRate: The baudrate. |
||||
* @param WordLength : This parameter can be any of the
|
||||
* @ref UART4_WordLength_TypeDef enumeration. |
||||
* @param StopBits: This parameter can be any of the
|
||||
* @ref UART4_StopBits_TypeDef enumeration. |
||||
* @param Parity: This parameter can be any of the
|
||||
* @ref UART4_Parity_TypeDef enumeration. |
||||
* @param SyncMode: This parameter can be any of the
|
||||
* @ref UART4_SyncMode_TypeDef values. |
||||
* @param Mode: This parameter can be any of the @ref UART4_Mode_TypeDef values |
||||
* @retval None |
||||
*/ |
||||
void UART4_Init(uint32_t BaudRate, UART4_WordLength_TypeDef WordLength, UART4_StopBits_TypeDef StopBits, UART4_Parity_TypeDef Parity, UART4_SyncMode_TypeDef SyncMode, UART4_Mode_TypeDef Mode) |
||||
{ |
||||
uint8_t BRR2_1 = 0, BRR2_2 = 0; |
||||
uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART4_BAUDRATE_OK(BaudRate)); |
||||
assert_param(IS_UART4_WORDLENGTH_OK(WordLength)); |
||||
assert_param(IS_UART4_STOPBITS_OK(StopBits)); |
||||
assert_param(IS_UART4_PARITY_OK(Parity)); |
||||
assert_param(IS_UART4_MODE_OK((uint8_t)Mode)); |
||||
assert_param(IS_UART4_SYNCMODE_OK((uint8_t)SyncMode)); |
||||
|
||||
/* Clear the word length bit */ |
||||
UART4->CR1 &= (uint8_t)(~UART4_CR1_M); |
||||
/* Set the word length bit according to UART4_WordLength value */ |
||||
UART4->CR1 |= (uint8_t)WordLength;
|
||||
|
||||
/* Clear the STOP bits */ |
||||
UART4->CR3 &= (uint8_t)(~UART4_CR3_STOP); |
||||
/* Set the STOP bits number according to UART4_StopBits value */ |
||||
UART4->CR3 |= (uint8_t)StopBits;
|
||||
|
||||
/* Clear the Parity Control bit */ |
||||
UART4->CR1 &= (uint8_t)(~(UART4_CR1_PCEN | UART4_CR1_PS )); |
||||
/* Set the Parity Control bit to UART4_Parity value */ |
||||
UART4->CR1 |= (uint8_t)Parity; |
||||
|
||||
/* Clear the LSB mantissa of UART4DIV */ |
||||
UART4->BRR1 &= (uint8_t)(~UART4_BRR1_DIVM); |
||||
/* Clear the MSB mantissa of UART4DIV */ |
||||
UART4->BRR2 &= (uint8_t)(~UART4_BRR2_DIVM); |
||||
/* Clear the Fraction bits of UART4DIV */ |
||||
UART4->BRR2 &= (uint8_t)(~UART4_BRR2_DIVF); |
||||
|
||||
/* Set the UART4 BaudRates in BRR1 and BRR2 registers according to UART4_BaudRate value */ |
||||
BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); |
||||
BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); |
||||
|
||||
/* The fraction and MSB mantissa should be loaded in one step in the BRR2 register*/ |
||||
/* Set the fraction of UARTDIV */ |
||||
BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) |
||||
<< 4) / 100) & (uint8_t)0x0F);
|
||||
BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); |
||||
|
||||
UART4->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); |
||||
/* Set the LSB mantissa of UARTDIV */ |
||||
UART4->BRR1 = (uint8_t)BaudRate_Mantissa;
|
||||
|
||||
/* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ |
||||
UART4->CR2 &= (uint8_t)~(UART4_CR2_TEN | UART4_CR2_REN); |
||||
/* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART4->CR3 &= (uint8_t)~(UART4_CR3_CPOL | UART4_CR3_CPHA | UART4_CR3_LBCL); |
||||
/* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ |
||||
UART4->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART4_CR3_CPOL | \
|
||||
UART4_CR3_CPHA | UART4_CR3_LBCL)); |
||||
|
||||
if((uint8_t)(Mode & UART4_MODE_TX_ENABLE)) |
||||
{ |
||||
/* Set the Transmitter Enable bit */ |
||||
UART4->CR2 |= (uint8_t)UART4_CR2_TEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Transmitter Disable bit */ |
||||
UART4->CR2 &= (uint8_t)(~UART4_CR2_TEN); |
||||
} |
||||
if((uint8_t)(Mode & UART4_MODE_RX_ENABLE)) |
||||
{ |
||||
/* Set the Receiver Enable bit */ |
||||
UART4->CR2 |= (uint8_t)UART4_CR2_REN; |
||||
} |
||||
else |
||||
{ |
||||
/* Clear the Receiver Disable bit */ |
||||
UART4->CR2 &= (uint8_t)(~UART4_CR2_REN); |
||||
} |
||||
/* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock
|
||||
pulse bits according to UART4_Mode value */ |
||||
if((uint8_t)(SyncMode & UART4_SYNCMODE_CLOCK_DISABLE)) |
||||
{ |
||||
/* Clear the Clock Enable bit */ |
||||
UART4->CR3 &= (uint8_t)(~UART4_CR3_CKEN);
|
||||
} |
||||
else |
||||
{ |
||||
UART4->CR3 |= (uint8_t)((uint8_t)SyncMode & UART4_CR3_CKEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enable the UART4 peripheral. |
||||
* @param NewState : The new state of the UART Communication. |
||||
* This parameter can be any of the @ref FunctionalState enumeration. |
||||
* @retval None |
||||
*/ |
||||
void UART4_Cmd(FunctionalState NewState) |
||||
{ |
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* UART4 Enable */ |
||||
UART4->CR1 &= (uint8_t)(~UART4_CR1_UARTD); |
||||
} |
||||
else |
||||
{ |
||||
/* UART4 Disable */ |
||||
UART4->CR1 |= UART4_CR1_UARTD;
|
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the specified UART4 interrupts. |
||||
* @param UART4_IT specifies the UART4 interrupt sources to be enabled or disabled. |
||||
* This parameter can be one of the following values: |
||||
* - UART4_IT_LBDF: LIN Break detection interrupt |
||||
* - UART4_IT_LHDF: LIN Break detection interrupt |
||||
* - UART4_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART4_IT_TC: Transmission complete interrupt |
||||
* - UART4_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt |
||||
* - UART4_IT_IDLE: Idle line detection interrupt |
||||
* - UART4_IT_PE: Parity Error interrupt |
||||
* @param NewState new state of the specified UART4 interrupts. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART4_ITConfig(UART4_IT_TypeDef UART4_IT, FunctionalState NewState) |
||||
{ |
||||
uint8_t uartreg = 0, itpos = 0x00; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_UART4_CONFIG_IT_OK(UART4_IT)); |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
/* Get the UART4 register index */ |
||||
uartreg = (uint8_t)((uint16_t)UART4_IT >> 0x08); |
||||
|
||||
/* Get the UART4 IT index */ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART4_IT & (uint8_t)0x0F)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the Interrupt bits according to UART4_IT mask */ |
||||
if(uartreg == 0x01) |
||||
{ |
||||
UART4->CR1 |= itpos; |
||||
} |
||||
else if(uartreg == 0x02) |
||||
{ |
||||
UART4->CR2 |= itpos; |
||||
} |
||||
else if(uartreg == 0x03) |
||||
{ |
||||
UART4->CR4 |= itpos; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR6 |= itpos; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the interrupt bits according to UART4_IT mask */ |
||||
if(uartreg == 0x01) |
||||
{ |
||||
UART4->CR1 &= (uint8_t)(~itpos); |
||||
} |
||||
else if(uartreg == 0x02) |
||||
{ |
||||
UART4->CR2 &= (uint8_t)(~itpos); |
||||
} |
||||
else if(uartreg == 0x03) |
||||
{ |
||||
UART4->CR4 &= (uint8_t)(~itpos); |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR6 &= (uint8_t)(~itpos); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART’s Half Duplex communication. |
||||
* @param NewState new state of the UART Communication. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART4_HalfDuplexCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if (NewState != DISABLE) |
||||
{ |
||||
UART4->CR5 |= UART4_CR5_HDSEL; /**< UART4 Half Duplex Enable */ |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR5 &= (uint8_t)~UART4_CR5_HDSEL; /**< UART4 Half Duplex Disable */ |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configures the UART4’s IrDA interface. |
||||
* @param UART4_IrDAMode specifies the IrDA mode. |
||||
* This parameter can be any of the @ref UART4_IrDAMode_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART4_IrDAConfig(UART4_IrDAMode_TypeDef UART4_IrDAMode) |
||||
{ |
||||
assert_param(IS_UART4_IRDAMODE_OK(UART4_IrDAMode)); |
||||
|
||||
if(UART4_IrDAMode != UART4_IRDAMODE_NORMAL) |
||||
{ |
||||
UART4->CR5 |= UART4_CR5_IRLP; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR5 &= ((uint8_t)~UART4_CR5_IRLP); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART4’s IrDA interface. |
||||
* @param NewState new state of the IrDA mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART4_IrDACmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the IrDA mode by setting the IREN bit in the CR3 register */ |
||||
UART4->CR5 |= UART4_CR5_IREN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ |
||||
UART4->CR5 &= ((uint8_t)~UART4_CR5_IREN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the UART4 LIN Break detection length. |
||||
* @param UART4_LINBreakDetectionLength specifies the LIN break detection length. |
||||
* This parameter can be any of the
|
||||
* @ref UART4_LINBreakDetectionLength_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART4_LINBreakDetectionConfig(UART4_LINBreakDetectionLength_TypeDef UART4_LINBreakDetectionLength) |
||||
{ |
||||
/* Check parameters */
|
||||
assert_param(IS_UART4_LINBREAKDETECTIONLENGTH_OK(UART4_LINBreakDetectionLength)); |
||||
|
||||
if(UART4_LINBreakDetectionLength != UART4_LINBREAKDETECTIONLENGTH_10BITS) |
||||
{ |
||||
UART4->CR4 |= UART4_CR4_LBDL; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR4 &= ((uint8_t)~UART4_CR4_LBDL); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Configure the UART4 peripheral. |
||||
* @param UART4_Mode specifies the LIN mode. |
||||
* This parameter can be any of the @ref UART4_LinMode_TypeDef values. |
||||
* @param UART4_Autosync specifies the LIN automatic resynchronization mode. |
||||
* This parameter can be any of the @ref UART4_LinAutosync_TypeDef values. |
||||
* @param UART4_DivUp specifies the LIN divider update method. |
||||
* This parameter can be any of the @ref UART4_LinDivUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART4_LINConfig(UART4_LinMode_TypeDef UART4_Mode,
|
||||
UART4_LinAutosync_TypeDef UART4_Autosync,
|
||||
UART4_LinDivUp_TypeDef UART4_DivUp) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_UART4_SLAVE_OK(UART4_Mode)); |
||||
assert_param(IS_UART4_AUTOSYNC_OK(UART4_Autosync)); |
||||
assert_param(IS_UART4_DIVUP_OK(UART4_DivUp)); |
||||
|
||||
if(UART4_Mode != UART4_LIN_MODE_MASTER) |
||||
{ |
||||
UART4->CR6 |= UART4_CR6_LSLV; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR6 &= ((uint8_t)~UART4_CR6_LSLV); |
||||
} |
||||
|
||||
if(UART4_Autosync != UART4_LIN_AUTOSYNC_DISABLE) |
||||
{ |
||||
UART4->CR6 |= UART4_CR6_LASE ; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR6 &= ((uint8_t)~ UART4_CR6_LASE ); |
||||
} |
||||
|
||||
if(UART4_DivUp != UART4_LIN_DIVUP_LBRR1) |
||||
{ |
||||
UART4->CR6 |= UART4_CR6_LDUM; |
||||
} |
||||
else |
||||
{ |
||||
UART4->CR6 &= ((uint8_t)~ UART4_CR6_LDUM); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART4 LIN mode. |
||||
* @param NewState is new state of the UART4 LIN mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART4_LINCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the LIN mode by setting the LINE bit in the CR2 register */ |
||||
UART4->CR3 |= UART4_CR3_LINEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the LIN mode by clearing the LINE bit in the CR2 register */ |
||||
UART4->CR3 &= ((uint8_t)~UART4_CR3_LINEN); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables the UART4 Smart Card mode. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SmartCardCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the SC mode by setting the SCEN bit in the CR5 register */ |
||||
UART4->CR5 |= UART4_CR5_SCEN; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the SC mode by clearing the SCEN bit in the CR5 register */ |
||||
UART4->CR5 &= ((uint8_t)(~UART4_CR5_SCEN)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Enables or disables NACK transmission. |
||||
* @param NewState: new state of the Smart Card mode. |
||||
* This parameter can be: ENABLE or DISABLE. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SmartCardNACKCmd(FunctionalState NewState) |
||||
{ |
||||
/* Check parameters */ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the NACK transmission by setting the NACK bit in the CR5 register */ |
||||
UART4->CR5 |= UART4_CR5_NACK; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ |
||||
UART4->CR5 &= ((uint8_t)~(UART4_CR5_NACK)); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Selects the UART4 WakeUp method. |
||||
* @param UART4_WakeUp: specifies the UART4 wakeup method. |
||||
* This parameter can be any of the @ref UART4_WakeUp_TypeDef values. |
||||
* @retval None |
||||
*/ |
||||
void UART4_WakeUpConfig(UART4_WakeUp_TypeDef UART4_WakeUp) |
||||
{ |
||||
assert_param(IS_UART4_WAKEUP_OK(UART4_WakeUp)); |
||||
|
||||
UART4->CR1 &= ((uint8_t)~UART4_CR1_WAKE); |
||||
UART4->CR1 |= (uint8_t)UART4_WakeUp; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Determines if the UART4 is in mute mode or not. |
||||
* @param NewState: new state of the UART4 mode. |
||||
* This parameter can be ENABLE or DISABLE |
||||
* @retval None |
||||
*/ |
||||
void UART4_ReceiverWakeUpCmd(FunctionalState NewState) |
||||
{ |
||||
assert_param(IS_FUNCTIONALSTATE_OK(NewState)); |
||||
|
||||
if(NewState != DISABLE) |
||||
{ |
||||
/* Enable the mute mode UART4 by setting the RWU bit in the CR2 register */ |
||||
UART4->CR2 |= UART4_CR2_RWU; |
||||
} |
||||
else |
||||
{ |
||||
/* Disable the mute mode UART4 by clearing the RWU bit in the CR1 register */ |
||||
UART4->CR2 &= ((uint8_t)~UART4_CR2_RWU); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART4 peripheral. |
||||
* @param None |
||||
* @retval Received Data |
||||
*/ |
||||
uint8_t UART4_ReceiveData8(void) |
||||
{ |
||||
return ((uint8_t)UART4->DR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Returns the most recent received data by the UART4 peripheral. |
||||
* @param None
|
||||
* @retval Received Data |
||||
*/ |
||||
uint16_t UART4_ReceiveData9(void) |
||||
{ |
||||
uint16_t temp = 0; |
||||
|
||||
temp = ((uint16_t)(((uint16_t)((uint16_t)UART4->CR1 & (uint16_t)UART4_CR1_R8)) << 1)); |
||||
|
||||
return (uint16_t)((((uint16_t)UART4->DR) | temp) & ((uint16_t)0x01FF)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 8 bit data through the UART4 peripheral. |
||||
* @param Data: the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SendData8(uint8_t Data) |
||||
{ |
||||
/* Transmit Data */ |
||||
UART4->DR = Data; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits 9 bit data through the UART4 peripheral. |
||||
* @param Data: the data to transmit. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SendData9(uint16_t Data) |
||||
{ |
||||
/* Clear the transmit data bit 8 */ |
||||
UART4->CR1 &= ((uint8_t)~UART4_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [8] */ |
||||
UART4->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART4_CR1_T8);
|
||||
|
||||
/* Write the transmit data bit [0:7] */ |
||||
UART4->DR = (uint8_t)(Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Transmits break characters. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void UART4_SendBreak(void) |
||||
{ |
||||
UART4->CR2 |= UART4_CR2_SBK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the address of the UART4 node. |
||||
* @param UART4_Address: Indicates the address of the UART4 node. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SetAddress(uint8_t UART4_Address) |
||||
{ |
||||
/*assert_param for x UART4_Address*/ |
||||
assert_param(IS_UART4_ADDRESS_OK(UART4_Address)); |
||||
|
||||
/* Clear the UART4 address */ |
||||
UART4->CR4 &= ((uint8_t)~UART4_CR4_ADD); |
||||
/* Set the UART4 address node */ |
||||
UART4->CR4 |= UART4_Address; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the specified UART4 guard time. |
||||
* @note SmartCard Mode should be Enabled
|
||||
* @param UART4_GuardTime: specifies the guard time. |
||||
* @retval None |
||||
*/ |
||||
void UART4_SetGuardTime(uint8_t UART4_GuardTime) |
||||
{ |
||||
/* Set the UART4 guard time */ |
||||
UART4->GTR = UART4_GuardTime; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the system clock prescaler. |
||||
* @note IrDA Low Power mode or smartcard mode should be enabled |
||||
* @note This function is related to SmartCard and IrDa mode. |
||||
* @param UART4_Prescaler: specifies the prescaler clock. |
||||
* This parameter can be one of the following values: |
||||
* @par IrDA Low Power Mode |
||||
* The clock source is divided by the value given in the register (8 bits) |
||||
* - 0000 0000 Reserved |
||||
* - 0000 0001 divides the clock source by 1 |
||||
* - 0000 0010 divides the clock source by 2 |
||||
* - ... |
||||
* @par Smart Card Mode |
||||
* The clock source is divided by the value given in the register |
||||
* (5 significant bits) multiplied by 2 |
||||
* - 0 0000 Reserved |
||||
* - 0 0001 divides the clock source by 2 |
||||
* - 0 0010 divides the clock source by 4 |
||||
* - 0 0011 divides the clock source by 6 |
||||
* - ... |
||||
* @retval None |
||||
*/ |
||||
void UART4_SetPrescaler(uint8_t UART4_Prescaler) |
||||
{ |
||||
/* Load the UART4 prescaler value*/ |
||||
UART4->PSCR = UART4_Prescaler; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART4 flag is set or not. |
||||
* @param UART4_FLAG specifies the flag to check. |
||||
* This parameter can be any of the @ref UART4_Flag_TypeDef enumeration. |
||||
* @retval FlagStatus (SET or RESET) |
||||
*/ |
||||
FlagStatus UART4_GetFlagStatus(UART4_Flag_TypeDef UART4_FLAG) |
||||
{ |
||||
FlagStatus status = RESET; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART4_FLAG_OK(UART4_FLAG)); |
||||
|
||||
/* Check the status of the specified UART4 flag*/ |
||||
if(UART4_FLAG == UART4_FLAG_LBDF) |
||||
{ |
||||
if((UART4->CR4 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART4_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART4_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if(UART4_FLAG == UART4_FLAG_SBK) |
||||
{ |
||||
if((UART4->CR2 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART4_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART4_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else if((UART4_FLAG == UART4_FLAG_LHDF) || (UART4_FLAG == UART4_FLAG_LSF)) |
||||
{ |
||||
if((UART4->CR6 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART4_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART4_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if((UART4->SR & (uint8_t)UART4_FLAG) != (uint8_t)0x00) |
||||
{ |
||||
/* UART4_FLAG is set*/ |
||||
status = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* UART4_FLAG is reset*/ |
||||
status = RESET; |
||||
} |
||||
} |
||||
|
||||
/* Return the UART4_FLAG status*/ |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART4 flags. |
||||
* @param UART4_FLAG specifies the flag to clear |
||||
* This parameter can be any combination of the following values: |
||||
* - UART4_FLAG_LBDF: LIN Break detection flag. |
||||
* - UART4_FLAG_LHDF: LIN Header detection flag. |
||||
* - UART4_FLAG_LSF: LIN synchrone field flag. |
||||
* - UART4_FLAG_RXNE: Receive data register not empty flag. |
||||
* @note: |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) flags are cleared |
||||
* by software sequence: a read operation to UART4_SR register
|
||||
* (UART4_GetFlagStatus())followed by a read operation to UART4_DR
|
||||
* register(UART4_ReceiveData8() or UART4_ReceiveData9()). |
||||
*
|
||||
* - RXNE flag can be also cleared by a read to the UART4_DR register |
||||
* (UART4_ReceiveData8()or UART4_ReceiveData9()). |
||||
* |
||||
* - TC flag can be also cleared by software sequence: a read operation |
||||
* to UART4_SR register (UART4_GetFlagStatus()) followed by a write
|
||||
* operation to UART4_DR register (UART4_SendData8() or UART4_SendData9()). |
||||
*
|
||||
* - TXE flag is cleared only by a write to the UART4_DR register
|
||||
* (UART4_SendData8() or UART4_SendData9()). |
||||
*
|
||||
* - SBK flag is cleared during the stop bit of break. |
||||
* @retval None |
||||
*/ |
||||
void UART4_ClearFlag(UART4_Flag_TypeDef UART4_FLAG) |
||||
{ |
||||
assert_param(IS_UART4_CLEAR_FLAG_OK(UART4_FLAG)); |
||||
|
||||
/* Clear the Receive Register Not Empty flag */ |
||||
if(UART4_FLAG == UART4_FLAG_RXNE) |
||||
{ |
||||
UART4->SR = (uint8_t)~(UART4_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection flag */ |
||||
else if(UART4_FLAG == UART4_FLAG_LBDF) |
||||
{ |
||||
UART4->CR4 &= (uint8_t)(~UART4_CR4_LBDF); |
||||
} |
||||
/* Clear the LIN Header Detection Flag */ |
||||
else if(UART4_FLAG == UART4_FLAG_LHDF) |
||||
{ |
||||
UART4->CR6 &= (uint8_t)(~UART4_CR6_LHDF); |
||||
} |
||||
/* Clear the LIN Synch Field flag */ |
||||
else |
||||
{ |
||||
UART4->CR6 &= (uint8_t)(~UART4_CR6_LSF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief Checks whether the specified UART4 interrupt has occurred or not. |
||||
* @param UART4_IT: Specifies the UART4 interrupt pending bit to check. |
||||
* This parameter can be one of the following values: |
||||
* - UART4_IT_LBDF: LIN Break detection interrupt |
||||
* - UART4_IT_TXE: Transmit Data Register empty interrupt |
||||
* - UART4_IT_TC: Transmission complete interrupt |
||||
* - UART4_IT_RXNE: Receive Data register not empty interrupt |
||||
* - UART4_IT_IDLE: Idle line detection interrupt |
||||
* - UART4_IT_OR: OverRun Error interrupt |
||||
* - UART4_IT_PE: Parity Error interrupt |
||||
* @retval The state of UART4_IT (SET or RESET). |
||||
*/ |
||||
ITStatus UART4_GetITStatus(UART4_IT_TypeDef UART4_IT) |
||||
{ |
||||
ITStatus pendingbitstatus = RESET; |
||||
uint8_t itpos = 0; |
||||
uint8_t itmask1 = 0; |
||||
uint8_t itmask2 = 0; |
||||
uint8_t enablestatus = 0; |
||||
|
||||
/* Check parameters */ |
||||
assert_param(IS_UART4_GET_IT_OK(UART4_IT)); |
||||
|
||||
/* Get the UART4 IT index*/ |
||||
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART4_IT & (uint8_t)0x0F)); |
||||
/* Get the UART4 IT index*/ |
||||
itmask1 = (uint8_t)((uint8_t)UART4_IT >> (uint8_t)4); |
||||
/* Set the IT mask*/ |
||||
itmask2 = (uint8_t)((uint8_t)1 << itmask1); |
||||
|
||||
/* Check the status of the specified UART4 pending bit*/ |
||||
if(UART4_IT == UART4_IT_PE) |
||||
{ |
||||
/* Get the UART4_ITPENDINGBIT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART4->CR1 & itmask2); |
||||
/* Check the status of the specified UART4 interrupt*/ |
||||
|
||||
if(((UART4->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if(UART4_IT == UART4_IT_LBDF) |
||||
{ |
||||
/* Get the UART4_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART4->CR4 & itmask2); |
||||
/* Check the status of the specified UART4 interrupt*/ |
||||
if(((UART4->CR4 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else if(UART4_IT == UART4_IT_LHDF) |
||||
{ |
||||
/* Get the UART4_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART4->CR6 & itmask2); |
||||
/* Check the status of the specified UART4 interrupt*/ |
||||
if(((UART4->CR6 & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Get the UART4_IT enable bit status*/ |
||||
enablestatus = (uint8_t)((uint8_t)UART4->CR2 & itmask2); |
||||
/* Check the status of the specified UART4 interrupt*/ |
||||
if(((UART4->SR & itpos) != (uint8_t)0x00) && enablestatus) |
||||
{ |
||||
/* Interrupt occurred*/ |
||||
pendingbitstatus = SET; |
||||
} |
||||
else |
||||
{ |
||||
/* Interrupt not occurred*/ |
||||
pendingbitstatus = RESET; |
||||
} |
||||
} |
||||
/* Return the UART4_IT status*/ |
||||
return pendingbitstatus; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Clears the UART4 pending flags. |
||||
* @param UART4_IT specifies the pending bit to clear |
||||
* This parameter can be one of the following values: |
||||
* - UART4_IT_LBDF: LIN Break detection interrupt |
||||
* - UART4_IT_LHDF: LIN Header detection interrupt |
||||
* - UART4_IT_RXNE: Receive Data register not empty interrupt. |
||||
* @note |
||||
* - PE (Parity error), FE (Framing error), NE (Noise error),
|
||||
* OR (OverRun error) and IDLE (Idle line detected) pending bits are
|
||||
* cleared by software sequence: a read operation to UART4_SR register |
||||
* (UART4_GetITStatus()) followed by a read operation to UART4_DR register |
||||
* (UART4_ReceiveData8() or UART4_ReceiveData9()). |
||||
*
|
||||
* - RXNE pending bit can be also cleared by a read to the UART4_DR
|
||||
* register (UART4_ReceiveData8() or UART4_ReceiveData9()). |
||||
*
|
||||
* - TC (Transmit complete) pending bit can be cleared by software
|
||||
* sequence: a read operation to UART4_SR register
|
||||
* (UART4_GetITStatus()) followed by a write operation to UART4_DR
|
||||
* register (UART4_SendData8()or UART4_SendData9()). |
||||
*
|
||||
* - TXE pending bit is cleared only by a write to the UART4_DR register |
||||
* (UART4_SendData8() or UART4_SendData9()). |
||||
* @retval None |
||||
*/ |
||||
void UART4_ClearITPendingBit(UART4_IT_TypeDef UART4_IT) |
||||
{ |
||||
assert_param(IS_UART4_CLEAR_IT_OK(UART4_IT)); |
||||
|
||||
/* Clear the Receive Register Not Empty pending bit */ |
||||
if(UART4_IT == UART4_IT_RXNE) |
||||
{ |
||||
UART4->SR = (uint8_t)~(UART4_SR_RXNE); |
||||
} |
||||
/* Clear the LIN Break Detection pending bit */ |
||||
else if(UART4_IT == UART4_IT_LBDF) |
||||
{ |
||||
UART4->CR4 &= (uint8_t)~(UART4_CR4_LBDF); |
||||
} |
||||
/* Clear the LIN Header Detection pending bit */ |
||||
else |
||||
{ |
||||
UART4->CR6 &= (uint8_t)(~UART4_CR6_LHDF); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,125 @@ |
||||
/**
|
||||
******************************************************************************** |
||||
* @file stm8s_wwdg.c |
||||
* @author MCD Application Team |
||||
* @version V2.2.0 |
||||
* @date 30-September-2014 |
||||
* @brief This file contains all the functions for the WWDG peripheral. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> |
||||
* |
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
|
||||
* |
||||
* 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s_wwdg.h" |
||||
|
||||
/** @addtogroup STM8S_StdPeriph_Driver
|
||||
* @{ |
||||
*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
#define BIT_MASK ((uint8_t)0x7F) |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/** @addtogroup WWDG_Public_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Initializes the WWDG peripheral. |
||||
* This function set Window Register = WindowValue, Counter Register |
||||
* according to Counter and \b ENABLE \b WWDG |
||||
* @param Counter : WWDG counter value |
||||
* @param WindowValue : specifies the WWDG Window Register, range is 0x00 to 0x7F. |
||||
* @retval None |
||||
*/ |
||||
void WWDG_Init(uint8_t Counter, uint8_t WindowValue) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue)); |
||||
|
||||
WWDG->WR = WWDG_WR_RESET_VALUE; |
||||
WWDG->CR = (uint8_t)((uint8_t)(WWDG_CR_WDGA | WWDG_CR_T6) | (uint8_t)Counter); |
||||
WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Refreshes the WWDG peripheral. |
||||
* @param Counter : WWDG Counter Value |
||||
* This parameter must be a number between 0x40 and 0x7F. |
||||
* @retval None |
||||
*/ |
||||
void WWDG_SetCounter(uint8_t Counter) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_WWDG_COUNTERVALUE_OK(Counter)); |
||||
|
||||
/* Write to T[6:0] bits to configure the counter value, no need to do
|
||||
a read-modify-write; writing a 0 to WDGA bit does nothing */ |
||||
WWDG->CR = (uint8_t)(Counter & (uint8_t)BIT_MASK); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Gets the WWDG Counter Value. |
||||
* This value could be used to check if WWDG is in the window, where |
||||
* refresh is allowed. |
||||
* @param None |
||||
* @retval WWDG Counter Value |
||||
*/ |
||||
uint8_t WWDG_GetCounter(void) |
||||
{ |
||||
return(WWDG->CR); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Generates immediate WWDG RESET. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
void WWDG_SWReset(void) |
||||
{ |
||||
WWDG->CR = WWDG_CR_WDGA; /* Activate WWDG, with clearing T6 */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Sets the WWDG window value. |
||||
* @param WindowValue: specifies the window value to be compared to the |
||||
* downcounter. |
||||
* This parameter value must be lower than 0x80. |
||||
* @retval None |
||||
*/ |
||||
void WWDG_SetWindowValue(uint8_t WindowValue) |
||||
{ |
||||
/* Check the parameters */ |
||||
assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue)); |
||||
|
||||
WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue)); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,74 @@ |
||||
#######
|
||||
# makefile for STM8S_StdPeriph_Lib and SDCC compiler
|
||||
#
|
||||
# Customized by MightyPork 1/2017
|
||||
#
|
||||
# usage:
|
||||
# 1. if SDCC not in PATH set path -> CC_ROOT
|
||||
# 2. set correct STM8 device -> DEVICE
|
||||
# 3. set project paths -> PRJ_ROOT, PRJ_SRC_DIR, PRJ_INC_DIR
|
||||
# 4. set SPL root path -> SPL_ROOT
|
||||
# 5. include required SPL modules -> SPL_SOURCE
|
||||
#
|
||||
#######
|
||||
|
||||
# STM8 device (default is STM8 discovery board)
|
||||
DEVICE=STM8S103
|
||||
DEVICE_FLASH=stm8s103f3
|
||||
|
||||
# set compiler path & parameters
|
||||
CC_ROOT =
|
||||
CC = sdcc
|
||||
CFLAGS = -mstm8 -lstm8
|
||||
# --opt-code-size
|
||||
# -DUSE_FULL_ASSERT=1
|
||||
|
||||
# required for some examples for STM8S EVAL board
|
||||
#CFLAGS += -DUSE_STM8_128_EVAL
|
||||
|
||||
# set output folder and target name
|
||||
OUTPUT_DIR = ./Build
|
||||
TARGET = $(OUTPUT_DIR)/$(DEVICE).hex
|
||||
|
||||
# set project folder and files (all *.c)
|
||||
PRJ_ROOT = .
|
||||
PRJ_SRC_DIR = $(PRJ_ROOT)/User
|
||||
PRJ_INC_DIR = $(PRJ_ROOT)/User
|
||||
# all project sources included by default
|
||||
PRJ_SOURCE = $(notdir $(wildcard $(PRJ_SRC_DIR)/*.c))
|
||||
PRJ_OBJECTS := $(addprefix $(OUTPUT_DIR)/, $(PRJ_SOURCE:.c=.rel))
|
||||
|
||||
# set SPL paths
|
||||
#SPL_SRC_DIR = /usr/share/sdcc/lib/src/stm8/
|
||||
#SPL_INC_DIR = /usr/share/sdcc/include/stm8/
|
||||
|
||||
SPL_SRC_DIR = Libraries/SPL/src/
|
||||
SPL_INC_DIR = Libraries/SPL/inc/
|
||||
# add all library sources used here
|
||||
SPL_SOURCE = stm8s_gpio.c stm8s_uart1.c stm8s_clk.c
|
||||
SPL_OBJECTS := $(addprefix $(OUTPUT_DIR)/, $(SPL_SOURCE:.c=.rel))
|
||||
|
||||
# collect all include folders
|
||||
INCLUDE = -I$(PRJ_SRC_DIR) -I$(SPL_INC_DIR)
|
||||
|
||||
# collect all source directories
|
||||
VPATH=$(PRJ_SRC_DIR):$(SPL_SRC_DIR)
|
||||
|
||||
.PHONY: clean |
||||
|
||||
all: $(TARGET) |
||||
|
||||
$(OUTPUT_DIR)/%.rel: %.c |
||||
$(CC) $(CFLAGS) -D$(DEVICE) $(INCLUDE) -c $?
|
||||
|
||||
$(OUTPUT_DIR)/%.rel: %.c |
||||
$(CC) $(CFLAGS) -D$(DEVICE) $(INCLUDE) -c $? -o $@
|
||||
|
||||
$(TARGET): $(PRJ_OBJECTS) $(SPL_OBJECTS) |
||||
$(CC) $(CFLAGS) -o $(TARGET) $^
|
||||
|
||||
flash: $(TARGET) |
||||
stm8flash -c stlinkv2 -p $(DEVICE_FLASH) -s flash -w $(TARGET)
|
||||
|
||||
clean: |
||||
rm $(OUTPUT_DIR)/*
|
@ -0,0 +1,10 @@ |
||||
This is a template SDCC project for the STM8S103F3 development boards. |
||||
|
||||
As is, running 'make' should produce a `STM8S103.hex` file |
||||
in './STM8S103' and `make flash` should upload it to your STM8 board. |
||||
|
||||
The main.c is a simple blinky. There's tons of excessive comments in |
||||
the files, blame ST for that. They're copied from the SPL template |
||||
project. Clean as you see fit. |
||||
|
||||
NB. You may need to adjust paths to SPL folders in the Makefile. |
@ -0,0 +1,320 @@ |
||||
#include <stdio.h> |
||||
#include "stm8s.h" |
||||
|
||||
void Delay(uint16_t nCount); |
||||
|
||||
void CLK_DisableDiv8(void); |
||||
|
||||
typedef enum { |
||||
BLACK, RED, GREEN, YELLOW, BLUE, PURPLE, CYAN, WHITE, |
||||
BLACK2, RED2, GREEN2, YELLOW2, BLUE2, PURPLE2, CYAN2, WHITE2 |
||||
} Color; |
||||
|
||||
typedef enum { |
||||
CLEAR_TO_CURSOR = 0, |
||||
CLEAR_FROM_CURSOR = 1, |
||||
CLEAR_ALL = 2, |
||||
} ClearMode; |
||||
|
||||
inline void sendcharsafe(char c) |
||||
{ |
||||
while((UART1->SR & UART1_SR_TXE) == 0) {} |
||||
UART1->DR = (uint8_t)c; |
||||
} |
||||
|
||||
void UART1_SendStr(const char *str) |
||||
{ |
||||
char c; |
||||
while((c = *str++)) { |
||||
while((UART1->SR & UART1_SR_TXE) == 0) {} |
||||
UART1->DR = (uint8_t)c; |
||||
} |
||||
} |
||||
|
||||
void A_Fg(Color c) |
||||
{ |
||||
int ci = c; |
||||
char buf[10]; |
||||
if(ci > 7) { |
||||
ci += (90-8); |
||||
} else { |
||||
ci += 30; |
||||
} |
||||
sprintf(buf, "\033[%dm", ci); |
||||
UART1_SendStr(buf); |
||||
} |
||||
|
||||
void A_Bg(Color c) |
||||
{ |
||||
int ci = c; |
||||
char buf[10]; |
||||
if(ci > 7) { |
||||
ci += (100-8); |
||||
} else { |
||||
ci += 40; |
||||
} |
||||
sprintf(buf, "\033[%dm", ci); |
||||
UART1_SendStr(buf); |
||||
} |
||||
|
||||
void A_GoTo(u8 y, u8 x) |
||||
{ |
||||
char buf[10]; |
||||
sprintf(buf, "\033[%d;%dH", y, x); |
||||
UART1_SendStr(buf); |
||||
} |
||||
|
||||
inline void A_Str(const char *str) |
||||
{ |
||||
UART1_SendStr(str); |
||||
} |
||||
|
||||
inline void A_Char(const char c) |
||||
{ |
||||
sendcharsafe(c); |
||||
} |
||||
|
||||
inline void A_ClearScreen(ClearMode mode) |
||||
{ |
||||
char buf[10]; |
||||
sprintf(buf, "\033[%dJ", mode); |
||||
UART1_SendStr(buf); |
||||
} |
||||
|
||||
inline void A_ClearLine(ClearMode mode) |
||||
{ |
||||
char buf[10]; |
||||
sprintf(buf, "\033[%dK", mode); |
||||
UART1_SendStr(buf); |
||||
} |
||||
|
||||
inline void A_Reset(void) |
||||
{ |
||||
UART1_SendStr("\033c"); |
||||
} |
||||
|
||||
inline void A_FgBg(Color fg, Color bg) |
||||
{ |
||||
A_Fg(fg); |
||||
A_Bg(bg); |
||||
} |
||||
|
||||
inline void A_ShowCursor(int yes) |
||||
{ |
||||
if (yes) |
||||
UART1_SendStr("\033[?25h"); |
||||
else |
||||
UART1_SendStr("\033[?25l"); |
||||
} |
||||
|
||||
void LED_DISPL(void) { |
||||
A_GoTo(10,0); |
||||
A_FgBg(WHITE,BLACK); |
||||
A_ClearLine(CLEAR_ALL); |
||||
|
||||
if (GPIOB->ODR & GPIO_PIN_4) { |
||||
A_Fg(BLACK2); |
||||
} else { |
||||
A_Fg(GREEN2); |
||||
} |
||||
A_Str("[LED]"); |
||||
} |
||||
|
||||
int timecounter = 0; |
||||
|
||||
volatile int esp_is_ready = 0; |
||||
|
||||
void TIME_DISP(void) { |
||||
char buf[100]; |
||||
// time counter
|
||||
A_GoTo(4,8); |
||||
A_Bg(BLUE); |
||||
A_ClearLine(CLEAR_FROM_CURSOR); |
||||
A_Fg(YELLOW2); |
||||
|
||||
sprintf(buf, "t = %d", timecounter); |
||||
A_Str(buf); |
||||
A_Fg(BLACK); |
||||
} |
||||
|
||||
void main(void) |
||||
{ |
||||
//char buf[100];
|
||||
int16_t j,k,l; |
||||
|
||||
CLK_DisableDiv8(); |
||||
|
||||
// LED
|
||||
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); |
||||
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); |
||||
|
||||
UART1_Init |
||||
( |
||||
115200, |
||||
UART1_WORDLENGTH_8D, |
||||
UART1_STOPBITS_1, |
||||
UART1_PARITY_NO, |
||||
UART1_SYNCMODE_CLOCK_DISABLE, |
||||
UART1_MODE_TXRX_ENABLE |
||||
); |
||||
|
||||
UART1->CR2 |= UART1_CR2_RIEN; |
||||
//UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
|
||||
enableInterrupts(); |
||||
|
||||
esp_is_ready = 0; |
||||
while(!esp_is_ready) { |
||||
GPIOB->ODR ^= GPIO_PIN_4; |
||||
UART1_SendStr("\033[5n"); |
||||
Delay(200); |
||||
} |
||||
GPIOB->ODR |=GPIO_PIN_4; |
||||
|
||||
A_Reset(); |
||||
A_ShowCursor(0); |
||||
|
||||
A_FgBg(WHITE2, BLUE); |
||||
A_ClearScreen(CLEAR_ALL); |
||||
|
||||
A_GoTo(2, 8); |
||||
A_Fg(CYAN2); |
||||
A_Str("STM8"); |
||||
A_Fg(WHITE2); |
||||
A_Str(" Hello!"); |
||||
|
||||
A_Bg(BLACK); |
||||
for(j=7;j<10;j++) { |
||||
A_GoTo(j, 0); |
||||
A_ClearLine(CLEAR_ALL); |
||||
} |
||||
|
||||
LED_DISPL(); |
||||
|
||||
Delay(10); |
||||
|
||||
timecounter = 0; |
||||
while (1) { |
||||
GPIOB->ODR ^= GPIO_PIN_5; |
||||
|
||||
TIME_DISP(); |
||||
|
||||
// Animated line
|
||||
j=(timecounter%52)-26; |
||||
k=j+26; |
||||
if(j<0)j=0; |
||||
if(k>=26)k=25; |
||||
A_GoTo(8, 1+j); |
||||
A_Bg(BLACK); |
||||
A_ClearLine(CLEAR_ALL); |
||||
A_Bg(WHITE2); |
||||
for(l=0;l<=k-j;l++) { |
||||
A_Char(' '); |
||||
} |
||||
|
||||
timecounter++; |
||||
Delay(2000); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* Disable HSI div/8 |
||||
*/ |
||||
void CLK_DisableDiv8() |
||||
{ |
||||
// --- Disable the x8 divider ---
|
||||
/* Clear High speed internal clock prescaler */ |
||||
CLK->CKDIVR &= (uint8_t) (~CLK_CKDIVR_HSIDIV); |
||||
/* Set High speed internal clock prescaler */ |
||||
CLK->CKDIVR |= (uint8_t) CLK_PRESCALER_HSIDIV1; |
||||
} |
||||
|
||||
#define MOUSE_IN(y,x,y1,y2,x1,x2) ((y)>=(y1)&&(y)<=(y2)&&(x)>=(x1)&&(x)<=(x2)) |
||||
|
||||
void handleRxChar(char c) { |
||||
static int i1, i2; |
||||
static int state; |
||||
|
||||
if (state==0) { |
||||
if (c == 1) { |
||||
// hard button
|
||||
GPIOB->ODR ^= GPIO_PIN_4; |
||||
LED_DISPL(); |
||||
} |
||||
else if (c == '\033') { |
||||
state = 1; |
||||
i1 = 0; |
||||
i2 = 0; |
||||
} |
||||
} |
||||
else if (state==1) { |
||||
if (c == '[') { |
||||
state = 2; |
||||
} |
||||
else { |
||||
state = 0; |
||||
} |
||||
} |
||||
else if (state==2) { |
||||
if (c >= '0' && c <= '9') { |
||||
i1 = i1*10+c-'0'; |
||||
} |
||||
else if (c == ';') { |
||||
state = 3; |
||||
} |
||||
else if (c == 'n') { |
||||
if (i1==0) { |
||||
esp_is_ready = 1; |
||||
state = 0; |
||||
} |
||||
} |
||||
else { |
||||
state = 0; |
||||
} |
||||
} |
||||
else if (state==3) { |
||||
if (c >= '0' && c <= '9') { |
||||
i2 = i2*10+c-'0'; |
||||
} |
||||
else if (c == 'M') { |
||||
// MOUSE
|
||||
|
||||
if (MOUSE_IN(i1, i2, 10, 10, 1, 5)) { |
||||
GPIOB->ODR ^= GPIO_PIN_4; |
||||
LED_DISPL(); |
||||
} |
||||
|
||||
if (MOUSE_IN(i1, i2, 4, 4, 8, 20)) { |
||||
timecounter=0; |
||||
TIME_DISP(); |
||||
|
||||
} |
||||
state = 0; |
||||
} |
||||
else { |
||||
// other, fail
|
||||
state = 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* A delay |
||||
*/ |
||||
void Delay(uint16_t nCount) |
||||
{ |
||||
uint8_t i; |
||||
for (; nCount != 0; nCount--) { |
||||
for (i = 255; i != 0; i--) {} |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* @brief UART1 RX Interrupt routine. |
||||
* @param None |
||||
* @retval None |
||||
*/ |
||||
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) |
||||
{ |
||||
handleRxChar(UART1->DR); |
||||
return; |
||||
} |
@ -0,0 +1,29 @@ |
||||
/**
|
||||
* STM8 SPL config |
||||
*/ |
||||
|
||||
#ifndef __STM8S_CONF_H |
||||
#define __STM8S_CONF_H |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm8s.h" |
||||
|
||||
#include "stm8s_adc1.h" |
||||
#include "stm8s_awu.h" |
||||
#include "stm8s_beep.h" |
||||
#include "stm8s_clk.h" |
||||
#include "stm8s_exti.h" |
||||
#include "stm8s_flash.h" |
||||
#include "stm8s_gpio.h" |
||||
#include "stm8s_i2c.h" |
||||
#include "stm8s_itc.h" |
||||
#include "stm8s_iwdg.h" |
||||
#include "stm8s_rst.h" |
||||
#include "stm8s_spi.h" |
||||
#include "stm8s_tim1.h" |
||||
#include "stm8s_tim2.h" |
||||
#include "stm8s_tim4.h" |
||||
#include "stm8s_uart1.h" |
||||
#include "stm8s_wwdg.h" |
||||
|
||||
#endif /* __STM8S_CONF_H */ |
Loading…
Reference in new issue