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