diff --git a/Datasheets/RoboMaster GM6020 Brushless DC Motor User Guide.pdf b/Datasheets/RoboMaster GM6020 Brushless DC Motor User Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ff5b71e5132f678db41ad7e1593d9269f8e5d16 Binary files /dev/null and b/Datasheets/RoboMaster GM6020 Brushless DC Motor User Guide.pdf differ diff --git a/Standard_robot/BSP b/Standard_robot/BSP index 59eb0b220f53250dd186e39a8169e51af4370773..4bb6bbb21f61e56e42b63a921e65b79f56a41566 160000 --- a/Standard_robot/BSP +++ b/Standard_robot/BSP @@ -1 +1 @@ -Subproject commit 59eb0b220f53250dd186e39a8169e51af4370773 +Subproject commit 4bb6bbb21f61e56e42b63a921e65b79f56a41566 diff --git a/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h b/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h new file mode 100644 index 0000000000000000000000000000000000000000..0611a6521a342766bdc80a2ba1d9a7c7834af073 --- /dev/null +++ b/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h @@ -0,0 +1,848 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_can.h + * @author MCD Application Team + * @brief Header file of CAN HAL module. + ****************************************************************************** + * @attention + * + * <h2><center>© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.</center></h2> + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_CAN_H +#define STM32F4xx_HAL_CAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +#if defined (CAN1) +/** @addtogroup CAN + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup CAN_Exported_Types CAN Exported Types + * @{ + */ +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_CAN_STATE_RESET = 0x00U, /*!< CAN not yet initialized or disabled */ + HAL_CAN_STATE_READY = 0x01U, /*!< CAN initialized and ready for use */ + HAL_CAN_STATE_LISTENING = 0x02U, /*!< CAN receive process is ongoing */ + HAL_CAN_STATE_SLEEP_PENDING = 0x03U, /*!< CAN sleep request is pending */ + HAL_CAN_STATE_SLEEP_ACTIVE = 0x04U, /*!< CAN sleep mode is active */ + HAL_CAN_STATE_ERROR = 0x05U /*!< CAN error state */ + +} HAL_CAN_StateTypeDef; + +/** + * @brief CAN init structure definition + */ +typedef struct +{ + uint32_t Prescaler; /*!< Specifies the length of a time quantum. + This parameter must be a number between Min_Data = 1 and Max_Data = 1024. */ + + uint32_t Mode; /*!< Specifies the CAN operating mode. + This parameter can be a value of @ref CAN_operating_mode */ + + uint32_t SyncJumpWidth; /*!< Specifies the maximum number of time quanta the CAN hardware + is allowed to lengthen or shorten a bit to perform resynchronization. + This parameter can be a value of @ref CAN_synchronisation_jump_width */ + + uint32_t TimeSeg1; /*!< Specifies the number of time quanta in Bit Segment 1. + This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */ + + uint32_t TimeSeg2; /*!< Specifies the number of time quanta in Bit Segment 2. + This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ + + FunctionalState TimeTriggeredMode; /*!< Enable or disable the time triggered communication mode. + This parameter can be set to ENABLE or DISABLE. */ + + FunctionalState AutoBusOff; /*!< Enable or disable the automatic bus-off management. + This parameter can be set to ENABLE or DISABLE. */ + + FunctionalState AutoWakeUp; /*!< Enable or disable the automatic wake-up mode. + This parameter can be set to ENABLE or DISABLE. */ + + FunctionalState AutoRetransmission; /*!< Enable or disable the non-automatic retransmission mode. + This parameter can be set to ENABLE or DISABLE. */ + + FunctionalState ReceiveFifoLocked; /*!< Enable or disable the Receive FIFO Locked mode. + This parameter can be set to ENABLE or DISABLE. */ + + FunctionalState TransmitFifoPriority;/*!< Enable or disable the transmit FIFO priority. + This parameter can be set to ENABLE or DISABLE. */ + +} CAN_InitTypeDef; + +/** + * @brief CAN filter configuration structure definition + */ +typedef struct +{ + uint32_t FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit + configuration, first one for a 16-bit configuration). + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit + configuration, second one for a 16-bit configuration). + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, + according to the mode (MSBs for a 32-bit configuration, + first one for a 16-bit configuration). + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, + according to the mode (LSBs for a 32-bit configuration, + second one for a 16-bit configuration). + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1U) which will be assigned to the filter. + This parameter can be a value of @ref CAN_filter_FIFO */ + + uint32_t FilterBank; /*!< Specifies the filter bank which will be initialized. + For single CAN instance(14 dedicated filter banks), + this parameter must be a number between Min_Data = 0 and Max_Data = 13. + For dual CAN instances(28 filter banks shared), + this parameter must be a number between Min_Data = 0 and Max_Data = 27. */ + + uint32_t FilterMode; /*!< Specifies the filter mode to be initialized. + This parameter can be a value of @ref CAN_filter_mode */ + + uint32_t FilterScale; /*!< Specifies the filter scale. + This parameter can be a value of @ref CAN_filter_scale */ + + uint32_t FilterActivation; /*!< Enable or disable the filter. + This parameter can be a value of @ref CAN_filter_activation */ + + uint32_t SlaveStartFilterBank; /*!< Select the start filter bank for the slave CAN instance. + For single CAN instances, this parameter is meaningless. + For dual CAN instances, all filter banks with lower index are assigned to master + CAN instance, whereas all filter banks with greater index are assigned to slave + CAN instance. + This parameter must be a number between Min_Data = 0 and Max_Data = 27. */ + +} CAN_FilterTypeDef; + +/** + * @brief CAN Tx message header structure definition + */ +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF. */ + + uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. + This parameter can be a value of @ref CAN_identifier_type */ + + uint32_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. + This parameter can be a value of @ref CAN_remote_transmission_request */ + + uint32_t DLC; /*!< Specifies the length of the frame that will be transmitted. + This parameter must be a number between Min_Data = 0 and Max_Data = 8. */ + + FunctionalState TransmitGlobalTime; /*!< Specifies whether the timestamp counter value captured on start + of frame transmission, is sent in DATA6 and DATA7 replacing pData[6] and pData[7]. + @note: Time Triggered Communication Mode must be enabled. + @note: DLC must be programmed as 8 bytes, in order these 2 bytes are sent. + This parameter can be set to ENABLE or DISABLE. */ + +} CAN_TxHeaderTypeDef; + +/** + * @brief CAN Rx message header structure definition + */ +typedef struct +{ + uint32_t StdId; /*!< Specifies the standard identifier. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF. */ + + uint32_t ExtId; /*!< Specifies the extended identifier. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF. */ + + uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. + This parameter can be a value of @ref CAN_identifier_type */ + + uint32_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. + This parameter can be a value of @ref CAN_remote_transmission_request */ + + uint32_t DLC; /*!< Specifies the length of the frame that will be transmitted. + This parameter must be a number between Min_Data = 0 and Max_Data = 8. */ + + uint32_t Timestamp; /*!< Specifies the timestamp counter value captured on start of frame reception. + @note: Time Triggered Communication Mode must be enabled. + This parameter must be a number between Min_Data = 0 and Max_Data = 0xFFFF. */ + + uint32_t FilterMatchIndex; /*!< Specifies the index of matching acceptance filter element. + This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF. */ + +} CAN_RxHeaderTypeDef; + +/** + * @brief CAN handle Structure definition + */ +typedef struct __CAN_HandleTypeDef +{ + CAN_TypeDef *Instance; /*!< Register base address */ + + CAN_InitTypeDef Init; /*!< CAN required parameters */ + + __IO HAL_CAN_StateTypeDef State; /*!< CAN communication state */ + + __IO uint32_t ErrorCode; /*!< CAN Error code. + This parameter can be a value of @ref CAN_Error_Code */ + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + void (* TxMailbox0CompleteCallback)(struct __CAN_HandleTypeDef *hcan);/*!< CAN Tx Mailbox 0 complete callback */ + void (* TxMailbox1CompleteCallback)(struct __CAN_HandleTypeDef *hcan);/*!< CAN Tx Mailbox 1 complete callback */ + void (* TxMailbox2CompleteCallback)(struct __CAN_HandleTypeDef *hcan);/*!< CAN Tx Mailbox 2 complete callback */ + void (* TxMailbox0AbortCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Tx Mailbox 0 abort callback */ + void (* TxMailbox1AbortCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Tx Mailbox 1 abort callback */ + void (* TxMailbox2AbortCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Tx Mailbox 2 abort callback */ + void (* RxFifo0MsgPendingCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Rx FIFO 0 msg pending callback */ + void (* RxFifo0FullCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Rx FIFO 0 full callback */ + void (* RxFifo1MsgPendingCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Rx FIFO 1 msg pending callback */ + void (* RxFifo1FullCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Rx FIFO 1 full callback */ + void (* SleepCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Sleep callback */ + void (* WakeUpFromRxMsgCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Wake Up from Rx msg callback */ + void (* ErrorCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Error callback */ + + void (* MspInitCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Msp Init callback */ + void (* MspDeInitCallback)(struct __CAN_HandleTypeDef *hcan); /*!< CAN Msp DeInit callback */ + +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ +} CAN_HandleTypeDef; + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +/** + * @brief HAL CAN common Callback ID enumeration definition + */ +typedef enum +{ + HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID = 0x00U, /*!< CAN Tx Mailbox 0 complete callback ID */ + HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID = 0x01U, /*!< CAN Tx Mailbox 1 complete callback ID */ + HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID = 0x02U, /*!< CAN Tx Mailbox 2 complete callback ID */ + HAL_CAN_TX_MAILBOX0_ABORT_CB_ID = 0x03U, /*!< CAN Tx Mailbox 0 abort callback ID */ + HAL_CAN_TX_MAILBOX1_ABORT_CB_ID = 0x04U, /*!< CAN Tx Mailbox 1 abort callback ID */ + HAL_CAN_TX_MAILBOX2_ABORT_CB_ID = 0x05U, /*!< CAN Tx Mailbox 2 abort callback ID */ + HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID = 0x06U, /*!< CAN Rx FIFO 0 message pending callback ID */ + HAL_CAN_RX_FIFO0_FULL_CB_ID = 0x07U, /*!< CAN Rx FIFO 0 full callback ID */ + HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID = 0x08U, /*!< CAN Rx FIFO 1 message pending callback ID */ + HAL_CAN_RX_FIFO1_FULL_CB_ID = 0x09U, /*!< CAN Rx FIFO 1 full callback ID */ + HAL_CAN_SLEEP_CB_ID = 0x0AU, /*!< CAN Sleep callback ID */ + HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID = 0x0BU, /*!< CAN Wake Up fropm Rx msg callback ID */ + HAL_CAN_ERROR_CB_ID = 0x0CU, /*!< CAN Error callback ID */ + + HAL_CAN_MSPINIT_CB_ID = 0x0DU, /*!< CAN MspInit callback ID */ + HAL_CAN_MSPDEINIT_CB_ID = 0x0EU, /*!< CAN MspDeInit callback ID */ + +} HAL_CAN_CallbackIDTypeDef; + +/** + * @brief HAL CAN Callback pointer definition + */ +typedef void (*pCAN_CallbackTypeDef)(CAN_HandleTypeDef *hcan); /*!< pointer to a CAN callback function */ + +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CAN_Exported_Constants CAN Exported Constants + * @{ + */ + +/** @defgroup CAN_Error_Code CAN Error Code + * @{ + */ +#define HAL_CAN_ERROR_NONE (0x00000000U) /*!< No error */ +#define HAL_CAN_ERROR_EWG (0x00000001U) /*!< Protocol Error Warning */ +#define HAL_CAN_ERROR_EPV (0x00000002U) /*!< Error Passive */ +#define HAL_CAN_ERROR_BOF (0x00000004U) /*!< Bus-off error */ +#define HAL_CAN_ERROR_STF (0x00000008U) /*!< Stuff error */ +#define HAL_CAN_ERROR_FOR (0x00000010U) /*!< Form error */ +#define HAL_CAN_ERROR_ACK (0x00000020U) /*!< Acknowledgment error */ +#define HAL_CAN_ERROR_BR (0x00000040U) /*!< Bit recessive error */ +#define HAL_CAN_ERROR_BD (0x00000080U) /*!< Bit dominant error */ +#define HAL_CAN_ERROR_CRC (0x00000100U) /*!< CRC error */ +#define HAL_CAN_ERROR_RX_FOV0 (0x00000200U) /*!< Rx FIFO0 overrun error */ +#define HAL_CAN_ERROR_RX_FOV1 (0x00000400U) /*!< Rx FIFO1 overrun error */ +#define HAL_CAN_ERROR_TX_ALST0 (0x00000800U) /*!< TxMailbox 0 transmit failure due to arbitration lost */ +#define HAL_CAN_ERROR_TX_TERR0 (0x00001000U) /*!< TxMailbox 1 transmit failure due to tranmit error */ +#define HAL_CAN_ERROR_TX_ALST1 (0x00002000U) /*!< TxMailbox 0 transmit failure due to arbitration lost */ +#define HAL_CAN_ERROR_TX_TERR1 (0x00004000U) /*!< TxMailbox 1 transmit failure due to tranmit error */ +#define HAL_CAN_ERROR_TX_ALST2 (0x00008000U) /*!< TxMailbox 0 transmit failure due to arbitration lost */ +#define HAL_CAN_ERROR_TX_TERR2 (0x00010000U) /*!< TxMailbox 1 transmit failure due to tranmit error */ +#define HAL_CAN_ERROR_TIMEOUT (0x00020000U) /*!< Timeout error */ +#define HAL_CAN_ERROR_NOT_INITIALIZED (0x00040000U) /*!< Peripheral not initialized */ +#define HAL_CAN_ERROR_NOT_READY (0x00080000U) /*!< Peripheral not ready */ +#define HAL_CAN_ERROR_NOT_STARTED (0x00100000U) /*!< Peripheral not started */ +#define HAL_CAN_ERROR_PARAM (0x00200000U) /*!< Parameter error */ + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +#define HAL_CAN_ERROR_INVALID_CALLBACK (0x00400000U) /*!< Invalid Callback error */ +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +#define HAL_CAN_ERROR_INTERNAL (0x00800000U) /*!< Internal error */ + +/** + * @} + */ + +/** @defgroup CAN_InitStatus CAN InitStatus + * @{ + */ +#define CAN_INITSTATUS_FAILED (0x00000000U) /*!< CAN initialization failed */ +#define CAN_INITSTATUS_SUCCESS (0x00000001U) /*!< CAN initialization OK */ +/** + * @} + */ + +/** @defgroup CAN_operating_mode CAN Operating Mode + * @{ + */ +#define CAN_MODE_NORMAL (0x00000000U) /*!< Normal mode */ +#define CAN_MODE_LOOPBACK ((uint32_t)CAN_BTR_LBKM) /*!< Loopback mode */ +#define CAN_MODE_SILENT ((uint32_t)CAN_BTR_SILM) /*!< Silent mode */ +#define CAN_MODE_SILENT_LOOPBACK ((uint32_t)(CAN_BTR_LBKM | CAN_BTR_SILM)) /*!< Loopback combined with silent mode */ +/** + * @} + */ + + +/** @defgroup CAN_synchronisation_jump_width CAN Synchronization Jump Width + * @{ + */ +#define CAN_SJW_1TQ (0x00000000U) /*!< 1 time quantum */ +#define CAN_SJW_2TQ ((uint32_t)CAN_BTR_SJW_0) /*!< 2 time quantum */ +#define CAN_SJW_3TQ ((uint32_t)CAN_BTR_SJW_1) /*!< 3 time quantum */ +#define CAN_SJW_4TQ ((uint32_t)CAN_BTR_SJW) /*!< 4 time quantum */ +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_1 CAN Time Quantum in Bit Segment 1 + * @{ + */ +#define CAN_BS1_1TQ (0x00000000U) /*!< 1 time quantum */ +#define CAN_BS1_2TQ ((uint32_t)CAN_BTR_TS1_0) /*!< 2 time quantum */ +#define CAN_BS1_3TQ ((uint32_t)CAN_BTR_TS1_1) /*!< 3 time quantum */ +#define CAN_BS1_4TQ ((uint32_t)(CAN_BTR_TS1_1 | CAN_BTR_TS1_0)) /*!< 4 time quantum */ +#define CAN_BS1_5TQ ((uint32_t)CAN_BTR_TS1_2) /*!< 5 time quantum */ +#define CAN_BS1_6TQ ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_0)) /*!< 6 time quantum */ +#define CAN_BS1_7TQ ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_1)) /*!< 7 time quantum */ +#define CAN_BS1_8TQ ((uint32_t)(CAN_BTR_TS1_2 | CAN_BTR_TS1_1 | CAN_BTR_TS1_0)) /*!< 8 time quantum */ +#define CAN_BS1_9TQ ((uint32_t)CAN_BTR_TS1_3) /*!< 9 time quantum */ +#define CAN_BS1_10TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_0)) /*!< 10 time quantum */ +#define CAN_BS1_11TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_1)) /*!< 11 time quantum */ +#define CAN_BS1_12TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_1 | CAN_BTR_TS1_0)) /*!< 12 time quantum */ +#define CAN_BS1_13TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2)) /*!< 13 time quantum */ +#define CAN_BS1_14TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2 | CAN_BTR_TS1_0)) /*!< 14 time quantum */ +#define CAN_BS1_15TQ ((uint32_t)(CAN_BTR_TS1_3 | CAN_BTR_TS1_2 | CAN_BTR_TS1_1)) /*!< 15 time quantum */ +#define CAN_BS1_16TQ ((uint32_t)CAN_BTR_TS1) /*!< 16 time quantum */ +/** + * @} + */ + +/** @defgroup CAN_time_quantum_in_bit_segment_2 CAN Time Quantum in Bit Segment 2 + * @{ + */ +#define CAN_BS2_1TQ (0x00000000U) /*!< 1 time quantum */ +#define CAN_BS2_2TQ ((uint32_t)CAN_BTR_TS2_0) /*!< 2 time quantum */ +#define CAN_BS2_3TQ ((uint32_t)CAN_BTR_TS2_1) /*!< 3 time quantum */ +#define CAN_BS2_4TQ ((uint32_t)(CAN_BTR_TS2_1 | CAN_BTR_TS2_0)) /*!< 4 time quantum */ +#define CAN_BS2_5TQ ((uint32_t)CAN_BTR_TS2_2) /*!< 5 time quantum */ +#define CAN_BS2_6TQ ((uint32_t)(CAN_BTR_TS2_2 | CAN_BTR_TS2_0)) /*!< 6 time quantum */ +#define CAN_BS2_7TQ ((uint32_t)(CAN_BTR_TS2_2 | CAN_BTR_TS2_1)) /*!< 7 time quantum */ +#define CAN_BS2_8TQ ((uint32_t)CAN_BTR_TS2) /*!< 8 time quantum */ +/** + * @} + */ + +/** @defgroup CAN_filter_mode CAN Filter Mode + * @{ + */ +#define CAN_FILTERMODE_IDMASK (0x00000000U) /*!< Identifier mask mode */ +#define CAN_FILTERMODE_IDLIST (0x00000001U) /*!< Identifier list mode */ +/** + * @} + */ + +/** @defgroup CAN_filter_scale CAN Filter Scale + * @{ + */ +#define CAN_FILTERSCALE_16BIT (0x00000000U) /*!< Two 16-bit filters */ +#define CAN_FILTERSCALE_32BIT (0x00000001U) /*!< One 32-bit filter */ +/** + * @} + */ + +/** @defgroup CAN_filter_activation CAN Filter Activation + * @{ + */ +#define CAN_FILTER_DISABLE (0x00000000U) /*!< Disable filter */ +#define CAN_FILTER_ENABLE (0x00000001U) /*!< Enable filter */ +/** + * @} + */ + +/** @defgroup CAN_filter_FIFO CAN Filter FIFO + * @{ + */ +#define CAN_FILTER_FIFO0 (0x00000000U) /*!< Filter FIFO 0 assignment for filter x */ +#define CAN_FILTER_FIFO1 (0x00000001U) /*!< Filter FIFO 1 assignment for filter x */ +/** + * @} + */ + +/** @defgroup CAN_identifier_type CAN Identifier Type + * @{ + */ +#define CAN_ID_STD (0x00000000U) /*!< Standard Id */ +#define CAN_ID_EXT (0x00000004U) /*!< Extended Id */ +/** + * @} + */ + +/** @defgroup CAN_remote_transmission_request CAN Remote Transmission Request + * @{ + */ +#define CAN_RTR_DATA (0x00000000U) /*!< Data frame */ +#define CAN_RTR_REMOTE (0x00000002U) /*!< Remote frame */ +/** + * @} + */ + +/** @defgroup CAN_receive_FIFO_number CAN Receive FIFO Number + * @{ + */ +#define CAN_RX_FIFO0 (0x00000000U) /*!< CAN receive FIFO 0 */ +#define CAN_RX_FIFO1 (0x00000001U) /*!< CAN receive FIFO 1 */ +/** + * @} + */ + +/** @defgroup CAN_Tx_Mailboxes CAN Tx Mailboxes + * @{ + */ +#define CAN_TX_MAILBOX0 (0x00000001U) /*!< Tx Mailbox 0 */ +#define CAN_TX_MAILBOX1 (0x00000002U) /*!< Tx Mailbox 1 */ +#define CAN_TX_MAILBOX2 (0x00000004U) /*!< Tx Mailbox 2 */ +/** + * @} + */ + +/** @defgroup CAN_flags CAN Flags + * @{ + */ +/* Transmit Flags */ +#define CAN_FLAG_RQCP0 (0x00000500U) /*!< Request complete MailBox 0 flag */ +#define CAN_FLAG_TXOK0 (0x00000501U) /*!< Transmission OK MailBox 0 flag */ +#define CAN_FLAG_ALST0 (0x00000502U) /*!< Arbitration Lost MailBox 0 flag */ +#define CAN_FLAG_TERR0 (0x00000503U) /*!< Transmission error MailBox 0 flag */ +#define CAN_FLAG_RQCP1 (0x00000508U) /*!< Request complete MailBox1 flag */ +#define CAN_FLAG_TXOK1 (0x00000509U) /*!< Transmission OK MailBox 1 flag */ +#define CAN_FLAG_ALST1 (0x0000050AU) /*!< Arbitration Lost MailBox 1 flag */ +#define CAN_FLAG_TERR1 (0x0000050BU) /*!< Transmission error MailBox 1 flag */ +#define CAN_FLAG_RQCP2 (0x00000510U) /*!< Request complete MailBox2 flag */ +#define CAN_FLAG_TXOK2 (0x00000511U) /*!< Transmission OK MailBox 2 flag */ +#define CAN_FLAG_ALST2 (0x00000512U) /*!< Arbitration Lost MailBox 2 flag */ +#define CAN_FLAG_TERR2 (0x00000513U) /*!< Transmission error MailBox 2 flag */ +#define CAN_FLAG_TME0 (0x0000051AU) /*!< Transmit mailbox 0 empty flag */ +#define CAN_FLAG_TME1 (0x0000051BU) /*!< Transmit mailbox 1 empty flag */ +#define CAN_FLAG_TME2 (0x0000051CU) /*!< Transmit mailbox 2 empty flag */ +#define CAN_FLAG_LOW0 (0x0000051DU) /*!< Lowest priority mailbox 0 flag */ +#define CAN_FLAG_LOW1 (0x0000051EU) /*!< Lowest priority mailbox 1 flag */ +#define CAN_FLAG_LOW2 (0x0000051FU) /*!< Lowest priority mailbox 2 flag */ + +/* Receive Flags */ +#define CAN_FLAG_FF0 (0x00000203U) /*!< RX FIFO 0 Full flag */ +#define CAN_FLAG_FOV0 (0x00000204U) /*!< RX FIFO 0 Overrun flag */ +#define CAN_FLAG_FF1 (0x00000403U) /*!< RX FIFO 1 Full flag */ +#define CAN_FLAG_FOV1 (0x00000404U) /*!< RX FIFO 1 Overrun flag */ + +/* Operating Mode Flags */ +#define CAN_FLAG_INAK (0x00000100U) /*!< Initialization acknowledge flag */ +#define CAN_FLAG_SLAK (0x00000101U) /*!< Sleep acknowledge flag */ +#define CAN_FLAG_ERRI (0x00000102U) /*!< Error flag */ +#define CAN_FLAG_WKU (0x00000103U) /*!< Wake up interrupt flag */ +#define CAN_FLAG_SLAKI (0x00000104U) /*!< Sleep acknowledge interrupt flag */ + +/* Error Flags */ +#define CAN_FLAG_EWG (0x00000300U) /*!< Error warning flag */ +#define CAN_FLAG_EPV (0x00000301U) /*!< Error passive flag */ +#define CAN_FLAG_BOF (0x00000302U) /*!< Bus-Off flag */ +/** + * @} + */ + + +/** @defgroup CAN_Interrupts CAN Interrupts + * @{ + */ +/* Transmit Interrupt */ +#define CAN_IT_TX_MAILBOX_EMPTY ((uint32_t)CAN_IER_TMEIE) /*!< Transmit mailbox empty interrupt */ + +/* Receive Interrupts */ +#define CAN_IT_RX_FIFO0_MSG_PENDING ((uint32_t)CAN_IER_FMPIE0) /*!< FIFO 0 message pending interrupt */ +#define CAN_IT_RX_FIFO0_FULL ((uint32_t)CAN_IER_FFIE0) /*!< FIFO 0 full interrupt */ +#define CAN_IT_RX_FIFO0_OVERRUN ((uint32_t)CAN_IER_FOVIE0) /*!< FIFO 0 overrun interrupt */ +#define CAN_IT_RX_FIFO1_MSG_PENDING ((uint32_t)CAN_IER_FMPIE1) /*!< FIFO 1 message pending interrupt */ +#define CAN_IT_RX_FIFO1_FULL ((uint32_t)CAN_IER_FFIE1) /*!< FIFO 1 full interrupt */ +#define CAN_IT_RX_FIFO1_OVERRUN ((uint32_t)CAN_IER_FOVIE1) /*!< FIFO 1 overrun interrupt */ + +/* Operating Mode Interrupts */ +#define CAN_IT_WAKEUP ((uint32_t)CAN_IER_WKUIE) /*!< Wake-up interrupt */ +#define CAN_IT_SLEEP_ACK ((uint32_t)CAN_IER_SLKIE) /*!< Sleep acknowledge interrupt */ + +/* Error Interrupts */ +#define CAN_IT_ERROR_WARNING ((uint32_t)CAN_IER_EWGIE) /*!< Error warning interrupt */ +#define CAN_IT_ERROR_PASSIVE ((uint32_t)CAN_IER_EPVIE) /*!< Error passive interrupt */ +#define CAN_IT_BUSOFF ((uint32_t)CAN_IER_BOFIE) /*!< Bus-off interrupt */ +#define CAN_IT_LAST_ERROR_CODE ((uint32_t)CAN_IER_LECIE) /*!< Last error code interrupt */ +#define CAN_IT_ERROR ((uint32_t)CAN_IER_ERRIE) /*!< Error Interrupt */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup CAN_Exported_Macros CAN Exported Macros + * @{ + */ + +/** @brief Reset CAN handle state + * @param __HANDLE__ CAN handle. + * @retval None + */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +#define __HAL_CAN_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->State = HAL_CAN_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_CAN_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CAN_STATE_RESET) +#endif /*USE_HAL_CAN_REGISTER_CALLBACKS */ + +/** + * @brief Enable the specified CAN interrupts. + * @param __HANDLE__ CAN handle. + * @param __INTERRUPT__ CAN Interrupt sources to enable. + * This parameter can be any combination of @arg CAN_Interrupts + * @retval None + */ +#define __HAL_CAN_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IER) |= (__INTERRUPT__)) + +/** + * @brief Disable the specified CAN interrupts. + * @param __HANDLE__ CAN handle. + * @param __INTERRUPT__ CAN Interrupt sources to disable. + * This parameter can be any combination of @arg CAN_Interrupts + * @retval None + */ +#define __HAL_CAN_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IER) &= ~(__INTERRUPT__)) + +/** @brief Check if the specified CAN interrupt source is enabled or disabled. + * @param __HANDLE__ specifies the CAN Handle. + * @param __INTERRUPT__ specifies the CAN interrupt source to check. + * This parameter can be a value of @arg CAN_Interrupts + * @retval The state of __IT__ (TRUE or FALSE). + */ +#define __HAL_CAN_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IER) & (__INTERRUPT__)) + +/** @brief Check whether the specified CAN flag is set or not. + * @param __HANDLE__ specifies the CAN Handle. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of @arg CAN_flags + * @retval The state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_CAN_GET_FLAG(__HANDLE__, __FLAG__) \ + ((((__FLAG__) >> 8U) == 5U)? ((((__HANDLE__)->Instance->TSR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 2U)? ((((__HANDLE__)->Instance->RF0R) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 4U)? ((((__HANDLE__)->Instance->RF1R) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 1U)? ((((__HANDLE__)->Instance->MSR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 3U)? ((((__HANDLE__)->Instance->ESR) & (1U << ((__FLAG__) & CAN_FLAG_MASK))) == (1U << ((__FLAG__) & CAN_FLAG_MASK))): 0U) + +/** @brief Clear the specified CAN pending flag. + * @param __HANDLE__ specifies the CAN Handle. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg CAN_FLAG_RQCP0: Request complete MailBox 0 Flag + * @arg CAN_FLAG_TXOK0: Transmission OK MailBox 0 Flag + * @arg CAN_FLAG_ALST0: Arbitration Lost MailBox 0 Flag + * @arg CAN_FLAG_TERR0: Transmission error MailBox 0 Flag + * @arg CAN_FLAG_RQCP1: Request complete MailBox 1 Flag + * @arg CAN_FLAG_TXOK1: Transmission OK MailBox 1 Flag + * @arg CAN_FLAG_ALST1: Arbitration Lost MailBox 1 Flag + * @arg CAN_FLAG_TERR1: Transmission error MailBox 1 Flag + * @arg CAN_FLAG_RQCP2: Request complete MailBox 2 Flag + * @arg CAN_FLAG_TXOK2: Transmission OK MailBox 2 Flag + * @arg CAN_FLAG_ALST2: Arbitration Lost MailBox 2 Flag + * @arg CAN_FLAG_TERR2: Transmission error MailBox 2 Flag + * @arg CAN_FLAG_FF0: RX FIFO 0 Full Flag + * @arg CAN_FLAG_FOV0: RX FIFO 0 Overrun Flag + * @arg CAN_FLAG_FF1: RX FIFO 1 Full Flag + * @arg CAN_FLAG_FOV1: RX FIFO 1 Overrun Flag + * @arg CAN_FLAG_WKUI: Wake up Interrupt Flag + * @arg CAN_FLAG_SLAKI: Sleep acknowledge Interrupt Flag + * @retval None + */ +#define __HAL_CAN_CLEAR_FLAG(__HANDLE__, __FLAG__) \ + ((((__FLAG__) >> 8U) == 5U)? (((__HANDLE__)->Instance->TSR) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 2U)? (((__HANDLE__)->Instance->RF0R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 4U)? (((__HANDLE__)->Instance->RF1R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 1U)? (((__HANDLE__)->Instance->MSR) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): 0U) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CAN_Exported_Functions CAN Exported Functions + * @{ + */ + +/** @addtogroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * @{ + */ + +/* Initialization and de-initialization functions *****************************/ +HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan); +void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan); +void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan); + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +/* Callbacks Register/UnRegister functions ***********************************/ +HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID, void (* pCallback)(CAN_HandleTypeDef *_hcan)); +HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID); + +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ +/** + * @} + */ + +/** @addtogroup CAN_Exported_Functions_Group2 Configuration functions + * @brief Configuration functions + * @{ + */ + +/* Configuration functions ****************************************************/ +HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig); + +/** + * @} + */ + +/** @addtogroup CAN_Exported_Functions_Group3 Control functions + * @brief Control functions + * @{ + */ + +/* Control functions **********************************************************/ +HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan); +uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox); +HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes); +uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan); +uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes); +uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox); +HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]); +uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo); + +/** + * @} + */ + +/** @addtogroup CAN_Exported_Functions_Group4 Interrupts management + * @brief Interrupts management + * @{ + */ +/* Interrupts management ******************************************************/ +HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs); +HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs); +void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan); + +/** + * @} + */ + +/** @addtogroup CAN_Exported_Functions_Group5 Callback functions + * @brief Callback functions + * @{ + */ +/* Callbacks functions ********************************************************/ + +void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan); +void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan); + +/** + * @} + */ + +/** @addtogroup CAN_Exported_Functions_Group6 Peripheral State and Error functions + * @brief CAN Peripheral State functions + * @{ + */ +/* Peripheral State and Error functions ***************************************/ +HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan); +uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan); +HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan); + +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/** @defgroup CAN_Private_Types CAN Private Types + * @{ + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup CAN_Private_Variables CAN Private Variables + * @{ + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup CAN_Private_Constants CAN Private Constants + * @{ + */ +#define CAN_FLAG_MASK (0x000000FFU) +/** + * @} + */ + +/* Private Macros -----------------------------------------------------------*/ +/** @defgroup CAN_Private_Macros CAN Private Macros + * @{ + */ + +#define IS_CAN_MODE(MODE) (((MODE) == CAN_MODE_NORMAL) || \ + ((MODE) == CAN_MODE_LOOPBACK)|| \ + ((MODE) == CAN_MODE_SILENT) || \ + ((MODE) == CAN_MODE_SILENT_LOOPBACK)) +#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1TQ) || ((SJW) == CAN_SJW_2TQ) || \ + ((SJW) == CAN_SJW_3TQ) || ((SJW) == CAN_SJW_4TQ)) +#define IS_CAN_BS1(BS1) (((BS1) == CAN_BS1_1TQ) || ((BS1) == CAN_BS1_2TQ) || \ + ((BS1) == CAN_BS1_3TQ) || ((BS1) == CAN_BS1_4TQ) || \ + ((BS1) == CAN_BS1_5TQ) || ((BS1) == CAN_BS1_6TQ) || \ + ((BS1) == CAN_BS1_7TQ) || ((BS1) == CAN_BS1_8TQ) || \ + ((BS1) == CAN_BS1_9TQ) || ((BS1) == CAN_BS1_10TQ)|| \ + ((BS1) == CAN_BS1_11TQ)|| ((BS1) == CAN_BS1_12TQ)|| \ + ((BS1) == CAN_BS1_13TQ)|| ((BS1) == CAN_BS1_14TQ)|| \ + ((BS1) == CAN_BS1_15TQ)|| ((BS1) == CAN_BS1_16TQ)) +#define IS_CAN_BS2(BS2) (((BS2) == CAN_BS2_1TQ) || ((BS2) == CAN_BS2_2TQ) || \ + ((BS2) == CAN_BS2_3TQ) || ((BS2) == CAN_BS2_4TQ) || \ + ((BS2) == CAN_BS2_5TQ) || ((BS2) == CAN_BS2_6TQ) || \ + ((BS2) == CAN_BS2_7TQ) || ((BS2) == CAN_BS2_8TQ)) +#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1U) && ((PRESCALER) <= 1024U)) +#define IS_CAN_FILTER_ID_HALFWORD(HALFWORD) ((HALFWORD) <= 0xFFFFU) +#define IS_CAN_FILTER_BANK_DUAL(BANK) ((BANK) <= 27U) +#define IS_CAN_FILTER_BANK_SINGLE(BANK) ((BANK) <= 13U) +#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FILTERMODE_IDMASK) || \ + ((MODE) == CAN_FILTERMODE_IDLIST)) +#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FILTERSCALE_16BIT) || \ + ((SCALE) == CAN_FILTERSCALE_32BIT)) +#define IS_CAN_FILTER_ACTIVATION(ACTIVATION) (((ACTIVATION) == CAN_FILTER_DISABLE) || \ + ((ACTIVATION) == CAN_FILTER_ENABLE)) +#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FILTER_FIFO0) || \ + ((FIFO) == CAN_FILTER_FIFO1)) +#define IS_CAN_TX_MAILBOX(TRANSMITMAILBOX) (((TRANSMITMAILBOX) == CAN_TX_MAILBOX0 ) || \ + ((TRANSMITMAILBOX) == CAN_TX_MAILBOX1 ) || \ + ((TRANSMITMAILBOX) == CAN_TX_MAILBOX2 )) +#define IS_CAN_TX_MAILBOX_LIST(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= (CAN_TX_MAILBOX0 | CAN_TX_MAILBOX1 | CAN_TX_MAILBOX2)) +#define IS_CAN_STDID(STDID) ((STDID) <= 0x7FFU) +#define IS_CAN_EXTID(EXTID) ((EXTID) <= 0x1FFFFFFFU) +#define IS_CAN_DLC(DLC) ((DLC) <= 8U) +#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_ID_STD) || \ + ((IDTYPE) == CAN_ID_EXT)) +#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_DATA) || ((RTR) == CAN_RTR_REMOTE)) +#define IS_CAN_RX_FIFO(FIFO) (((FIFO) == CAN_RX_FIFO0) || ((FIFO) == CAN_RX_FIFO1)) +#define IS_CAN_IT(IT) ((IT) <= (CAN_IT_TX_MAILBOX_EMPTY | CAN_IT_RX_FIFO0_MSG_PENDING | \ + CAN_IT_RX_FIFO0_FULL | CAN_IT_RX_FIFO0_OVERRUN | \ + CAN_IT_RX_FIFO1_MSG_PENDING | CAN_IT_RX_FIFO1_FULL | \ + CAN_IT_RX_FIFO1_OVERRUN | CAN_IT_WAKEUP | \ + CAN_IT_SLEEP_ACK | CAN_IT_ERROR_WARNING | \ + CAN_IT_ERROR_PASSIVE | CAN_IT_BUSOFF | \ + CAN_IT_LAST_ERROR_CODE | CAN_IT_ERROR)) + +/** + * @} + */ +/* End of private macros -----------------------------------------------------*/ + +/** + * @} + */ + + +#endif /* CAN1 */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_CAN_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c b/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c new file mode 100644 index 0000000000000000000000000000000000000000..009a4473fd032c93d10f46f7c6b5a30c64c34cc7 --- /dev/null +++ b/Standard_robot/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c @@ -0,0 +1,2464 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_can.c + * @author MCD Application Team + * @brief CAN HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Controller Area Network (CAN) peripheral: + * + Initialization and de-initialization functions + * + Configuration functions + * + Control functions + * + Interrupts management + * + Callbacks functions + * + Peripheral State and Error functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the CAN low level resources by implementing the + HAL_CAN_MspInit(): + (++) Enable the CAN interface clock using __HAL_RCC_CANx_CLK_ENABLE() + (++) Configure CAN pins + (+++) Enable the clock for the CAN GPIOs + (+++) Configure CAN pins as alternate function open-drain + (++) In case of using interrupts (e.g. HAL_CAN_ActivateNotification()) + (+++) Configure the CAN interrupt priority using + HAL_NVIC_SetPriority() + (+++) Enable the CAN IRQ handler using HAL_NVIC_EnableIRQ() + (+++) In CAN IRQ handler, call HAL_CAN_IRQHandler() + + (#) Initialize the CAN peripheral using HAL_CAN_Init() function. This + function resorts to HAL_CAN_MspInit() for low-level initialization. + + (#) Configure the reception filters using the following configuration + functions: + (++) HAL_CAN_ConfigFilter() + + (#) Start the CAN module using HAL_CAN_Start() function. At this level + the node is active on the bus: it receive messages, and can send + messages. + + (#) To manage messages transmission, the following Tx control functions + can be used: + (++) HAL_CAN_AddTxMessage() to request transmission of a new + message. + (++) HAL_CAN_AbortTxRequest() to abort transmission of a pending + message. + (++) HAL_CAN_GetTxMailboxesFreeLevel() to get the number of free Tx + mailboxes. + (++) HAL_CAN_IsTxMessagePending() to check if a message is pending + in a Tx mailbox. + (++) HAL_CAN_GetTxTimestamp() to get the timestamp of Tx message + sent, if time triggered communication mode is enabled. + + (#) When a message is received into the CAN Rx FIFOs, it can be retrieved + using the HAL_CAN_GetRxMessage() function. The function + HAL_CAN_GetRxFifoFillLevel() allows to know how many Rx message are + stored in the Rx Fifo. + + (#) Calling the HAL_CAN_Stop() function stops the CAN module. + + (#) The deinitialization is achieved with HAL_CAN_DeInit() function. + + + *** Polling mode operation *** + ============================== + [..] + (#) Reception: + (++) Monitor reception of message using HAL_CAN_GetRxFifoFillLevel() + until at least one message is received. + (++) Then get the message using HAL_CAN_GetRxMessage(). + + (#) Transmission: + (++) Monitor the Tx mailboxes availability until at least one Tx + mailbox is free, using HAL_CAN_GetTxMailboxesFreeLevel(). + (++) Then request transmission of a message using + HAL_CAN_AddTxMessage(). + + + *** Interrupt mode operation *** + ================================ + [..] + (#) Notifications are activated using HAL_CAN_ActivateNotification() + function. Then, the process can be controlled through the + available user callbacks: HAL_CAN_xxxCallback(), using same APIs + HAL_CAN_GetRxMessage() and HAL_CAN_AddTxMessage(). + + (#) Notifications can be deactivated using + HAL_CAN_DeactivateNotification() function. + + (#) Special care should be taken for CAN_IT_RX_FIFO0_MSG_PENDING and + CAN_IT_RX_FIFO1_MSG_PENDING notifications. These notifications trig + the callbacks HAL_CAN_RxFIFO0MsgPendingCallback() and + HAL_CAN_RxFIFO1MsgPendingCallback(). User has two possible options + here. + (++) Directly get the Rx message in the callback, using + HAL_CAN_GetRxMessage(). + (++) Or deactivate the notification in the callback without + getting the Rx message. The Rx message can then be got later + using HAL_CAN_GetRxMessage(). Once the Rx message have been + read, the notification can be activated again. + + + *** Sleep mode *** + ================== + [..] + (#) The CAN peripheral can be put in sleep mode (low power), using + HAL_CAN_RequestSleep(). The sleep mode will be entered as soon as the + current CAN activity (transmission or reception of a CAN frame) will + be completed. + + (#) A notification can be activated to be informed when the sleep mode + will be entered. + + (#) It can be checked if the sleep mode is entered using + HAL_CAN_IsSleepActive(). + Note that the CAN state (accessible from the API HAL_CAN_GetState()) + is HAL_CAN_STATE_SLEEP_PENDING as soon as the sleep mode request is + submitted (the sleep mode is not yet entered), and become + HAL_CAN_STATE_SLEEP_ACTIVE when the sleep mode is effective. + + (#) The wake-up from sleep mode can be trigged by two ways: + (++) Using HAL_CAN_WakeUp(). When returning from this function, + the sleep mode is exited (if return status is HAL_OK). + (++) When a start of Rx CAN frame is detected by the CAN peripheral, + if automatic wake up mode is enabled. + + *** Callback registration *** + ============================================= + + The compilation define USE_HAL_CAN_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + Use Function @ref HAL_CAN_RegisterCallback() to register an interrupt callback. + + Function @ref HAL_CAN_RegisterCallback() allows to register following callbacks: + (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + (+) SleepCallback : Sleep Callback. + (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + (+) ErrorCallback : Error Callback. + (+) MspInitCallback : CAN MspInit. + (+) MspDeInitCallback : CAN MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + Use function @ref HAL_CAN_UnRegisterCallback() to reset a callback to the default + weak function. + @ref HAL_CAN_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + (+) SleepCallback : Sleep Callback. + (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + (+) ErrorCallback : Error Callback. + (+) MspInitCallback : CAN MspInit. + (+) MspDeInitCallback : CAN MspDeInit. + + By default, after the @ref HAL_CAN_Init() and when the state is HAL_CAN_STATE_RESET, + all callbacks are set to the corresponding weak functions: + example @ref HAL_CAN_ErrorCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak function in the @ref HAL_CAN_Init()/ @ref HAL_CAN_DeInit() only when + these callbacks are null (not registered beforehand). + if not, MspInit or MspDeInit are not null, the @ref HAL_CAN_Init()/ @ref HAL_CAN_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) + + Callbacks can be registered/unregistered in HAL_CAN_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_CAN_STATE_READY or HAL_CAN_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using @ref HAL_CAN_RegisterCallback() before calling @ref HAL_CAN_DeInit() + or @ref HAL_CAN_Init() function. + + When The compilation define USE_HAL_CAN_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.</center></h2> + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +#if defined(CAN1) + +/** @defgroup CAN CAN + * @brief CAN driver modules + * @{ + */ + +#ifdef HAL_CAN_MODULE_ENABLED + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #error "The CAN driver cannot be used with its legacy, Please enable only one CAN module at once" +#endif + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup CAN_Private_Constants CAN Private Constants + * @{ + */ +#define CAN_TIMEOUT_VALUE 10U +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CAN_Exported_Functions CAN Exported Functions + * @{ + */ + +/** @defgroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_Init : Initialize and configure the CAN. + (+) HAL_CAN_DeInit : De-initialize the CAN. + (+) HAL_CAN_MspInit : Initialize the CAN MSP. + (+) HAL_CAN_MspDeInit : DeInitialize the CAN MSP. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + /* Check CAN handle */ + if (hcan == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TimeTriggeredMode)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoBusOff)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoWakeUp)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoRetransmission)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ReceiveFifoLocked)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TransmitFifoPriority)); + assert_param(IS_CAN_MODE(hcan->Init.Mode)); + assert_param(IS_CAN_SJW(hcan->Init.SyncJumpWidth)); + assert_param(IS_CAN_BS1(hcan->Init.TimeSeg1)); + assert_param(IS_CAN_BS2(hcan->Init.TimeSeg2)); + assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler)); + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + if (hcan->State == HAL_CAN_STATE_RESET) + { + /* Reset callbacks to legacy functions */ + hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; /* Legacy weak RxFifo0MsgPendingCallback */ + hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; /* Legacy weak RxFifo0FullCallback */ + hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; /* Legacy weak RxFifo1MsgPendingCallback */ + hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; /* Legacy weak RxFifo1FullCallback */ + hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; /* Legacy weak TxMailbox0CompleteCallback */ + hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; /* Legacy weak TxMailbox1CompleteCallback */ + hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; /* Legacy weak TxMailbox2CompleteCallback */ + hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; /* Legacy weak TxMailbox0AbortCallback */ + hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; /* Legacy weak TxMailbox1AbortCallback */ + hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; /* Legacy weak TxMailbox2AbortCallback */ + hcan->SleepCallback = HAL_CAN_SleepCallback; /* Legacy weak SleepCallback */ + hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; /* Legacy weak WakeUpFromRxMsgCallback */ + hcan->ErrorCallback = HAL_CAN_ErrorCallback; /* Legacy weak ErrorCallback */ + + if (hcan->MspInitCallback == NULL) + { + hcan->MspInitCallback = HAL_CAN_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware: CLOCK, NVIC */ + hcan->MspInitCallback(hcan); + } + +#else + if (hcan->State == HAL_CAN_STATE_RESET) + { + /* Init the low level hardware: CLOCK, NVIC */ + HAL_CAN_MspInit(hcan); + } +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + + /* Exit from sleep mode */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check Sleep mode leave acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Request initialisation */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait initialisation acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Set the time triggered communication mode */ + if (hcan->Init.TimeTriggeredMode == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + } + + /* Set the automatic bus-off management */ + if (hcan->Init.AutoBusOff == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + } + + /* Set the automatic wake-up mode */ + if (hcan->Init.AutoWakeUp == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + } + + /* Set the automatic retransmission */ + if (hcan->Init.AutoRetransmission == ENABLE) + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART); + } + else + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_NART); + } + + /* Set the receive FIFO locked mode */ + if (hcan->Init.ReceiveFifoLocked == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + } + + /* Set the transmit FIFO priority */ + if (hcan->Init.TransmitFifoPriority == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + } + + /* Set the bit timing register */ + WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | + hcan->Init.SyncJumpWidth | + hcan->Init.TimeSeg1 | + hcan->Init.TimeSeg2 | + (hcan->Init.Prescaler - 1U))); + + /* Initialize the error code */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Initialize the CAN state */ + hcan->State = HAL_CAN_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Deinitializes the CAN peripheral registers to their default + * reset values. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan) +{ + /* Check CAN handle */ + if (hcan == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + + /* Stop the CAN module */ + (void)HAL_CAN_Stop(hcan); + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + if (hcan->MspDeInitCallback == NULL) + { + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: CLOCK, NVIC */ + hcan->MspDeInitCallback(hcan); + +#else + /* DeInit the low level hardware: CLOCK, NVIC */ + HAL_CAN_MspDeInit(hcan); +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + + /* Reset the CAN peripheral */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET); + + /* Reset the CAN ErrorCode */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_RESET; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Initializes the CAN MSP. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the CAN MSP. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_MspDeInit could be implemented in the user file + */ +} + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +/** + * @brief Register a CAN CallBack. + * To be used instead of the weak predefined callback + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for CAN module + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CALLBACK_CB_ID Tx Mailbox 0 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CALLBACK_CB_ID Tx Mailbox 1 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CALLBACK_CB_ID Tx Mailbox 2 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CALLBACK_CB_ID Tx Mailbox 0 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CALLBACK_CB_ID Tx Mailbox 1 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CALLBACK_CB_ID Tx Mailbox 2 Abort callback ID + * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CALLBACK_CB_ID Rx Fifo 0 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO0_FULL_CALLBACK_CB_ID Rx Fifo 0 full callback ID + * @arg @ref HAL_CAN_RX_FIFO1_MSGPENDING_CALLBACK_CB_ID Rx Fifo 1 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO1_FULL_CALLBACK_CB_ID Rx Fifo 1 full callback ID + * @arg @ref HAL_CAN_SLEEP_CALLBACK_CB_ID Sleep callback ID + * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CALLBACK_CB_ID Wake Up from Rx message callback ID + * @arg @ref HAL_CAN_ERROR_CALLBACK_CB_ID Error callback ID + * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID, void (* pCallback)(CAN_HandleTypeDef *_hcan)) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + if (hcan->State == HAL_CAN_STATE_READY) + { + switch (CallbackID) + { + case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + hcan->TxMailbox0CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + hcan->TxMailbox1CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + hcan->TxMailbox2CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + hcan->TxMailbox0AbortCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + hcan->TxMailbox1AbortCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + hcan->TxMailbox2AbortCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + hcan->RxFifo0MsgPendingCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO0_FULL_CB_ID : + hcan->RxFifo0FullCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + hcan->RxFifo1MsgPendingCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO1_FULL_CB_ID : + hcan->RxFifo1FullCallback = pCallback; + break; + + case HAL_CAN_SLEEP_CB_ID : + hcan->SleepCallback = pCallback; + break; + + case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + hcan->WakeUpFromRxMsgCallback = pCallback; + break; + + case HAL_CAN_ERROR_CB_ID : + hcan->ErrorCallback = pCallback; + break; + + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = pCallback; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hcan->State == HAL_CAN_STATE_RESET) + { + switch (CallbackID) + { + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = pCallback; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Unregister a CAN CallBack. + * CAN callabck is redirected to the weak predefined callback + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for CAN module + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CALLBACK_CB_ID Tx Mailbox 0 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CALLBACK_CB_ID Tx Mailbox 1 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CALLBACK_CB_ID Tx Mailbox 2 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CALLBACK_CB_ID Tx Mailbox 0 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CALLBACK_CB_ID Tx Mailbox 1 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CALLBACK_CB_ID Tx Mailbox 2 Abort callback ID + * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CALLBACK_CB_ID Rx Fifo 0 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO0_FULL_CALLBACK_CB_ID Rx Fifo 0 full callback ID + * @arg @ref HAL_CAN_RX_FIFO1_MSGPENDING_CALLBACK_CB_ID Rx Fifo 1 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO1_FULL_CALLBACK_CB_ID Rx Fifo 1 full callback ID + * @arg @ref HAL_CAN_SLEEP_CALLBACK_CB_ID Sleep callback ID + * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CALLBACK_CB_ID Wake Up from Rx message callback ID + * @arg @ref HAL_CAN_ERROR_CALLBACK_CB_ID Error callback ID + * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (hcan->State == HAL_CAN_STATE_READY) + { + switch (CallbackID) + { + case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; + break; + + case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; + break; + + case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; + break; + + case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; + break; + + case HAL_CAN_RX_FIFO0_FULL_CB_ID : + hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; + break; + + case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; + break; + + case HAL_CAN_RX_FIFO1_FULL_CB_ID : + hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; + break; + + case HAL_CAN_SLEEP_CB_ID : + hcan->SleepCallback = HAL_CAN_SleepCallback; + break; + + case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; + break; + + case HAL_CAN_ERROR_CB_ID : + hcan->ErrorCallback = HAL_CAN_ErrorCallback; + break; + + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = HAL_CAN_MspInit; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hcan->State == HAL_CAN_STATE_RESET) + { + switch (CallbackID) + { + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = HAL_CAN_MspInit; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group2 Configuration functions + * @brief Configuration functions. + * +@verbatim + ============================================================================== + ##### Configuration functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_ConfigFilter : Configure the CAN reception filters + +@endverbatim + * @{ + */ + +/** + * @brief Configures the CAN reception filter according to the specified + * parameters in the CAN_FilterInitStruct. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param sFilterConfig pointer to a CAN_FilterTypeDef structure that + * contains the filter configuration information. + * @retval None + */ +HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig) +{ + uint32_t filternbrbitpos; + CAN_TypeDef *can_ip = hcan->Instance; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check the parameters */ + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdHigh)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdLow)); + assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); + assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale)); + assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment)); + assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation)); + +#if defined(CAN3) + /* Check the CAN instance */ + if (hcan->Instance == CAN3) + { + /* CAN3 is single instance with 14 dedicated filters banks */ + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank)); + } + else + { + /* CAN1 and CAN2 are dual instances with 28 common filters banks */ + /* Select master instance to access the filter banks */ + can_ip = CAN1; + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank)); + assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank)); + } +#elif defined(CAN2) + /* CAN1 and CAN2 are dual instances with 28 common filters banks */ + /* Select master instance to access the filter banks */ + can_ip = CAN1; + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank)); + assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank)); +#else + /* CAN1 is single instance with 14 dedicated filters banks */ + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank)); +#endif + + /* Initialisation mode for the filter */ + SET_BIT(can_ip->FMR, CAN_FMR_FINIT); + +#if defined(CAN3) + /* Check the CAN instance */ + if (can_ip == CAN1) + { + /* Select the start filter number of CAN2 slave instance */ + CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB); + SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos); + } + +#elif defined(CAN2) + /* Select the start filter number of CAN2 slave instance */ + CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB); + SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos); + +#endif + /* Convert filter number into bit position */ + filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU); + + /* Filter Deactivation */ + CLEAR_BIT(can_ip->FA1R, filternbrbitpos); + + /* Filter Scale */ + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT) + { + /* 16-bit scale for the filter */ + CLEAR_BIT(can_ip->FS1R, filternbrbitpos); + + /* First 16-bit identifier and First 16-bit mask */ + /* Or First 16-bit identifier and Second 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + + /* Second 16-bit identifier and Second 16-bit mask */ + /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh); + } + + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT) + { + /* 32-bit scale for the filter */ + SET_BIT(can_ip->FS1R, filternbrbitpos); + + /* 32-bit identifier or First 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + + /* 32-bit mask or Second 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow); + } + + /* Filter Mode */ + if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK) + { + /* Id/Mask mode for the filter*/ + CLEAR_BIT(can_ip->FM1R, filternbrbitpos); + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /* Identifier list mode for the filter*/ + SET_BIT(can_ip->FM1R, filternbrbitpos); + } + + /* Filter FIFO assignment */ + if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0) + { + /* FIFO 0 assignation for the filter */ + CLEAR_BIT(can_ip->FFA1R, filternbrbitpos); + } + else + { + /* FIFO 1 assignation for the filter */ + SET_BIT(can_ip->FFA1R, filternbrbitpos); + } + + /* Filter activation */ + if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE) + { + SET_BIT(can_ip->FA1R, filternbrbitpos); + } + + /* Leave the initialisation mode for the filter */ + CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group3 Control functions + * @brief Control functions + * +@verbatim + ============================================================================== + ##### Control functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_Start : Start the CAN module + (+) HAL_CAN_Stop : Stop the CAN module + (+) HAL_CAN_RequestSleep : Request sleep mode entry. + (+) HAL_CAN_WakeUp : Wake up from sleep mode. + (+) HAL_CAN_IsSleepActive : Check is sleep mode is active. + (+) HAL_CAN_AddTxMessage : Add a message to the Tx mailboxes + and activate the corresponding + transmission request + (+) HAL_CAN_AbortTxRequest : Abort transmission request + (+) HAL_CAN_GetTxMailboxesFreeLevel : Return Tx mailboxes free level + (+) HAL_CAN_IsTxMessagePending : Check if a transmission request is + pending on the selected Tx mailbox + (+) HAL_CAN_GetRxMessage : Get a CAN frame from the Rx FIFO + (+) HAL_CAN_GetRxFifoFillLevel : Return Rx FIFO fill level + +@endverbatim + * @{ + */ + +/** + * @brief Start the CAN module. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + if (hcan->State == HAL_CAN_STATE_READY) + { + /* Change CAN peripheral state */ + hcan->State = HAL_CAN_STATE_LISTENING; + + /* Request leave initialisation */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait the acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U) + { + /* Check for the Timeout */ + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Reset the CAN ErrorCode */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY; + + return HAL_ERROR; + } +} + +/** + * @brief Stop the CAN module and enable access to configuration registers. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + if (hcan->State == HAL_CAN_STATE_LISTENING) + { + /* Request initialisation */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait the acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + { + /* Check for the Timeout */ + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Exit from sleep mode */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Change CAN peripheral state */ + hcan->State = HAL_CAN_STATE_READY; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED; + + return HAL_ERROR; + } +} + +/** + * @brief Request the sleep mode (low power) entry. + * When returning from this function, Sleep mode will be entered + * as soon as the current CAN activity (transmission or reception + * of a CAN frame) has been completed. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status. + */ +HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Request Sleep mode */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + /* Return function status */ + return HAL_ERROR; + } +} + +/** + * @brief Wake up from sleep mode. + * When returning with HAL_OK status from this function, Sleep mode + * is exited. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status. + */ +HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan) +{ + __IO uint32_t count = 0; + uint32_t timeout = 1000000U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Wake up request */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Wait sleep mode is exited */ + do + { + /* Increment counter */ + count++; + + /* Check if timeout is reached */ + if (count > timeout) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + return HAL_ERROR; + } + } + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Check is sleep mode is active. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval Status + * - 0 : Sleep mode is not active. + * - 1 : Sleep mode is active. + */ +uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan) +{ + uint32_t status = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Sleep mode */ + if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + status = 1U; + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Add a message to the first free Tx mailbox and activate the + * corresponding transmission request. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param pHeader pointer to a CAN_TxHeaderTypeDef structure. + * @param aData array containing the payload of the Tx frame. + * @param pTxMailbox pointer to a variable where the function will return + * the TxMailbox used to store the Tx message. + * This parameter can be a value of @arg CAN_Tx_Mailboxes. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox) +{ + uint32_t transmitmailbox; + HAL_CAN_StateTypeDef state = hcan->State; + uint32_t tsr = READ_REG(hcan->Instance->TSR); + + /* Check the parameters */ + assert_param(IS_CAN_IDTYPE(pHeader->IDE)); + assert_param(IS_CAN_RTR(pHeader->RTR)); + assert_param(IS_CAN_DLC(pHeader->DLC)); + if (pHeader->IDE == CAN_ID_STD) + { + assert_param(IS_CAN_STDID(pHeader->StdId)); + } + else + { + assert_param(IS_CAN_EXTID(pHeader->ExtId)); + } + assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check that all the Tx mailboxes are not full */ + if (((tsr & CAN_TSR_TME0) != 0U) || + ((tsr & CAN_TSR_TME1) != 0U) || + ((tsr & CAN_TSR_TME2) != 0U)) + { + /* Select an empty transmit mailbox */ + transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; + + /* Check transmit mailbox value */ + if (transmitmailbox > 2U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL; + + return HAL_ERROR; + } + + /* Store the Tx mailbox */ + *pTxMailbox = (uint32_t)1 << transmitmailbox; + + /* Set up the Id */ + if (pHeader->IDE == CAN_ID_STD) + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) | + pHeader->RTR); + } + else + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + pHeader->IDE | + pHeader->RTR); + } + + /* Set up the DLC */ + hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC); + + /* Set up the Transmit Global Time mode */ + if (pHeader->TransmitGlobalTime == ENABLE) + { + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT); + } + + /* Set up the data field */ + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, + ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) | + ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) | + ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) | + ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos)); + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, + ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) | + ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) | + ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) | + ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos)); + + /* Request transmission */ + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Abort transmission requests + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailboxes List of the Tx Mailboxes to abort. + * This parameter can be any combination of @arg CAN_Tx_Mailboxes. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Tx Mailbox 0 */ + if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U) + { + /* Add cancellation request for Tx Mailbox 0 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0); + } + + /* Check Tx Mailbox 1 */ + if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U) + { + /* Add cancellation request for Tx Mailbox 1 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); + } + + /* Check Tx Mailbox 2 */ + if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U) + { + /* Add cancellation request for Tx Mailbox 2 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); + } + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Return Tx Mailboxes free level: number of free Tx Mailboxes. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval Number of free Tx Mailboxes. + */ +uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan) +{ + uint32_t freelevel = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Tx Mailbox 0 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U) + { + freelevel++; + } + + /* Check Tx Mailbox 1 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U) + { + freelevel++; + } + + /* Check Tx Mailbox 2 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U) + { + freelevel++; + } + } + + /* Return Tx Mailboxes free level */ + return freelevel; +} + +/** + * @brief Check if a transmission request is pending on the selected Tx + * Mailboxes. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailboxes List of Tx Mailboxes to check. + * This parameter can be any combination of @arg CAN_Tx_Mailboxes. + * @retval Status + * - 0 : No pending transmission request on any selected Tx Mailboxes. + * - 1 : Pending transmission request on at least one of the selected + * Tx Mailbox. + */ +uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +{ + uint32_t status = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check pending transmission request on the selected Tx Mailboxes */ + if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_Pos)) + { + status = 1U; + } + } + + /* Return status */ + return status; +} + +/** + * @brief Return timestamp of Tx message sent, if time triggered communication + mode is enabled. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailbox Tx Mailbox where the timestamp of message sent will be + * read. + * This parameter can be one value of @arg CAN_Tx_Mailboxes. + * @retval Timestamp of message sent from Tx Mailbox. + */ +uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox) +{ + uint32_t timestamp = 0U; + uint32_t transmitmailbox; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX(TxMailbox)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Select the Tx mailbox */ + transmitmailbox = POSITION_VAL(TxMailbox); + + /* Get timestamp */ + timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TIME_Pos; + } + + /* Return the timestamp */ + return timestamp; +} + +/** + * @brief Get an CAN frame from the Rx FIFO zone into the message RAM. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param RxFifo Fifo number of the received message to be read. + * This parameter can be a value of @arg CAN_receive_FIFO_number. + * @param pHeader pointer to a CAN_RxHeaderTypeDef structure where the header + * of the Rx frame will be stored. + * @param aData array where the payload of the Rx frame will be stored. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + assert_param(IS_CAN_RX_FIFO(RxFifo)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check the Rx FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + { + /* Check that the Rx FIFO 0 is not empty */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Check that the Rx FIFO 1 is not empty */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + + /* Get the header */ + pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR; + if (pHeader->IDE == CAN_ID_STD) + { + pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos; + } + else + { + pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; + } + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); + pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; + pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; + pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; + + /* Get the data */ + aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA0_Pos); + aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA1_Pos); + aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA2_Pos); + aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA3_Pos); + aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA4_Pos); + aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA5_Pos); + aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA6_Pos); + aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA7_Pos); + + /* Release the FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + { + /* Release RX FIFO 0 */ + SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0); + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Release RX FIFO 1 */ + SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1); + } + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Return Rx FIFO fill level. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param RxFifo Rx FIFO. + * This parameter can be a value of @arg CAN_receive_FIFO_number. + * @retval Number of messages available in Rx FIFO. + */ +uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo) +{ + uint32_t filllevel = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_RX_FIFO(RxFifo)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + if (RxFifo == CAN_RX_FIFO0) + { + filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0; + } + else /* RxFifo == CAN_RX_FIFO1 */ + { + filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1; + } + } + + /* Return Rx FIFO fill level */ + return filllevel; +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group4 Interrupts management + * @brief Interrupts management + * +@verbatim + ============================================================================== + ##### Interrupts management ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_ActivateNotification : Enable interrupts + (+) HAL_CAN_DeactivateNotification : Disable interrupts + (+) HAL_CAN_IRQHandler : Handles CAN interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Enable interrupts. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param ActiveITs indicates which interrupts will be enabled. + * This parameter can be any combination of @arg CAN_Interrupts. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_IT(ActiveITs)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Enable the selected interrupts */ + __HAL_CAN_ENABLE_IT(hcan, ActiveITs); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Disable interrupts. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param InactiveITs indicates which interrupts will be disabled. + * This parameter can be any combination of @arg CAN_Interrupts. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_IT(InactiveITs)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Disable the selected interrupts */ + __HAL_CAN_DISABLE_IT(hcan, InactiveITs); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Handles CAN interrupt request + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan) +{ + uint32_t errorcode = HAL_CAN_ERROR_NONE; + uint32_t interrupts = READ_REG(hcan->Instance->IER); + uint32_t msrflags = READ_REG(hcan->Instance->MSR); + uint32_t tsrflags = READ_REG(hcan->Instance->TSR); + uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); + uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); + uint32_t esrflags = READ_REG(hcan->Instance->ESR); + + /* Transmit Mailbox empty interrupt management *****************************/ + if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U) + { + /* Transmit Mailbox 0 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP0) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK0,ALST0,TERR0 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0); + + if ((tsrflags & CAN_TSR_TXOK0) != 0U) + { + /* Transmission Mailbox 0 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST0) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST0; + } + else if ((tsrflags & CAN_TSR_TERR0) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR0; + } + else + { + /* Transmission Mailbox 0 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + + /* Transmit Mailbox 1 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP1) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK1,ALST1,TERR1 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1); + + if ((tsrflags & CAN_TSR_TXOK1) != 0U) + { + /* Transmission Mailbox 1 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST1) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST1; + } + else if ((tsrflags & CAN_TSR_TERR1) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR1; + } + else + { + /* Transmission Mailbox 1 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + + /* Transmit Mailbox 2 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP2) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK2,ALST2,TERR2 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2); + + if ((tsrflags & CAN_TSR_TXOK2) != 0U) + { + /* Transmission Mailbox 2 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST2) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST2; + } + else if ((tsrflags & CAN_TSR_TERR2) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR2; + } + else + { + /* Transmission Mailbox 2 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + } + + /* Receive FIFO 0 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U) + { + if ((rf0rflags & CAN_RF0R_FOVR0) != 0U) + { + /* Set CAN error code to Rx Fifo 0 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV0; + + /* Clear FIFO0 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0); + } + } + + /* Receive FIFO 0 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U) + { + if ((rf0rflags & CAN_RF0R_FULL0) != 0U) + { + /* Clear FIFO 0 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0); + + /* Receive FIFO 0 full Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0FullCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 0 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U) + { + /* Check if message is still pending */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U) + { + /* Receive FIFO 0 mesage pending Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0MsgPendingCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U) + { + if ((rf1rflags & CAN_RF1R_FOVR1) != 0U) + { + /* Set CAN error code to Rx Fifo 1 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV1; + + /* Clear FIFO1 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1); + } + } + + /* Receive FIFO 1 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U) + { + if ((rf1rflags & CAN_RF1R_FULL1) != 0U) + { + /* Clear FIFO 1 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1); + + /* Receive FIFO 1 full Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1FullCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U) + { + /* Check if message is still pending */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U) + { + /* Receive FIFO 1 mesage pending Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1MsgPendingCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Sleep interrupt management *********************************************/ + if ((interrupts & CAN_IT_SLEEP_ACK) != 0U) + { + if ((msrflags & CAN_MSR_SLAKI) != 0U) + { + /* Clear Sleep interrupt Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI); + + /* Sleep Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->SleepCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_SleepCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* WakeUp interrupt management *********************************************/ + if ((interrupts & CAN_IT_WAKEUP) != 0U) + { + if ((msrflags & CAN_MSR_WKUI) != 0U) + { + /* Clear WakeUp Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU); + + /* WakeUp Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->WakeUpFromRxMsgCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_WakeUpFromRxMsgCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Error interrupts management *********************************************/ + if ((interrupts & CAN_IT_ERROR) != 0U) + { + if ((msrflags & CAN_MSR_ERRI) != 0U) + { + /* Check Error Warning Flag */ + if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) && + ((esrflags & CAN_ESR_EWGF) != 0U)) + { + /* Set CAN error code to Error Warning */ + errorcode |= HAL_CAN_ERROR_EWG; + + /* No need for clear of Error Warning Flag as read-only */ + } + + /* Check Error Passive Flag */ + if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) && + ((esrflags & CAN_ESR_EPVF) != 0U)) + { + /* Set CAN error code to Error Passive */ + errorcode |= HAL_CAN_ERROR_EPV; + + /* No need for clear of Error Passive Flag as read-only */ + } + + /* Check Bus-off Flag */ + if (((interrupts & CAN_IT_BUSOFF) != 0U) && + ((esrflags & CAN_ESR_BOFF) != 0U)) + { + /* Set CAN error code to Bus-Off */ + errorcode |= HAL_CAN_ERROR_BOF; + + /* No need for clear of Error Bus-Off as read-only */ + } + + /* Check Last Error Code Flag */ + if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) && + ((esrflags & CAN_ESR_LEC) != 0U)) + { + switch (esrflags & CAN_ESR_LEC) + { + case (CAN_ESR_LEC_0): + /* Set CAN error code to Stuff error */ + errorcode |= HAL_CAN_ERROR_STF; + break; + case (CAN_ESR_LEC_1): + /* Set CAN error code to Form error */ + errorcode |= HAL_CAN_ERROR_FOR; + break; + case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0): + /* Set CAN error code to Acknowledgement error */ + errorcode |= HAL_CAN_ERROR_ACK; + break; + case (CAN_ESR_LEC_2): + /* Set CAN error code to Bit recessive error */ + errorcode |= HAL_CAN_ERROR_BR; + break; + case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0): + /* Set CAN error code to Bit Dominant error */ + errorcode |= HAL_CAN_ERROR_BD; + break; + case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1): + /* Set CAN error code to CRC error */ + errorcode |= HAL_CAN_ERROR_CRC; + break; + default: + break; + } + + /* Clear Last error code Flag */ + CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC); + } + } + + /* Clear ERRI Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI); + } + + /* Call the Error call Back in case of Errors */ + if (errorcode != HAL_CAN_ERROR_NONE) + { + /* Update error code in handle */ + hcan->ErrorCode |= errorcode; + + /* Call Error callback function */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->ErrorCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_ErrorCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group5 Callback functions + * @brief CAN Callback functions + * +@verbatim + ============================================================================== + ##### Callback functions ##### + ============================================================================== + [..] + This subsection provides the following callback functions: + (+) HAL_CAN_TxMailbox0CompleteCallback + (+) HAL_CAN_TxMailbox1CompleteCallback + (+) HAL_CAN_TxMailbox2CompleteCallback + (+) HAL_CAN_TxMailbox0AbortCallback + (+) HAL_CAN_TxMailbox1AbortCallback + (+) HAL_CAN_TxMailbox2AbortCallback + (+) HAL_CAN_RxFifo0MsgPendingCallback + (+) HAL_CAN_RxFifo0FullCallback + (+) HAL_CAN_RxFifo1MsgPendingCallback + (+) HAL_CAN_RxFifo1FullCallback + (+) HAL_CAN_SleepCallback + (+) HAL_CAN_WakeUpFromRxMsgCallback + (+) HAL_CAN_ErrorCallback + +@endverbatim + * @{ + */ + +/** + * @brief Transmission Mailbox 0 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 1 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 2 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 0 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 1 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 2 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 0 message pending callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo0MsgPendingCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 0 full callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo0FullCallback could be implemented in the user + file + */ +} + +/** + * @brief Rx FIFO 1 message pending callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1MsgPendingCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 1 full callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1FullCallback could be implemented in the user + file + */ +} + +/** + * @brief Sleep callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_SleepCallback could be implemented in the user file + */ +} + +/** + * @brief WakeUp from Rx message callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_WakeUpFromRxMsgCallback could be implemented in the + user file + */ +} + +/** + * @brief Error CAN callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_ErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group6 Peripheral State and Error functions + * @brief CAN Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Error functions ##### + ============================================================================== + [..] + This subsection provides functions allowing to : + (+) HAL_CAN_GetState() : Return the CAN state. + (+) HAL_CAN_GetError() : Return the CAN error codes if any. + (+) HAL_CAN_ResetError(): Reset the CAN error codes if any. + +@endverbatim + * @{ + */ + +/** + * @brief Return the CAN state. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL state + */ +HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check sleep mode acknowledge flag */ + if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + /* Sleep mode is active */ + state = HAL_CAN_STATE_SLEEP_ACTIVE; + } + /* Check sleep mode request flag */ + else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U) + { + /* Sleep mode request is pending */ + state = HAL_CAN_STATE_SLEEP_PENDING; + } + else + { + /* Neither sleep mode request nor sleep mode acknowledge */ + } + } + + /* Return CAN state */ + return state; +} + +/** + * @brief Return the CAN error code. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval CAN Error Code + */ +uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan) +{ + /* Return CAN error code */ + return hcan->ErrorCode; +} + +/** + * @brief Reset the CAN error code. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Reset CAN error code */ + hcan->ErrorCode = 0U; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + status = HAL_ERROR; + } + + /* Return the status */ + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CAN_MODULE_ENABLED */ + +/** + * @} + */ + +#endif /* CAN1 */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Standard_robot/Inc/can.h b/Standard_robot/Inc/can.h new file mode 100644 index 0000000000000000000000000000000000000000..8e586fd26015883575faf25e3eb0929b94ecd4c3 --- /dev/null +++ b/Standard_robot/Inc/can.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * File Name : CAN.h + * Description : This file provides code for the configuration + * of the CAN instances. + ****************************************************************************** + * @attention + * + * <h2><center>© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.</center></h2> + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __can_H +#define __can_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern CAN_HandleTypeDef hcan1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_CAN1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ can_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Standard_robot/Inc/main.h b/Standard_robot/Inc/main.h index e64a2287fa0c5736498ea1caca0adfb88391713d..3eaffd9977089e1731d19971c5254e6c47fff0f0 100644 --- a/Standard_robot/Inc/main.h +++ b/Standard_robot/Inc/main.h @@ -61,6 +61,8 @@ void Error_Handler(void); /* Private defines -----------------------------------------------------------*/ #define OLED_DC_Pin GPIO_PIN_9 #define OLED_DC_GPIO_Port GPIOB +#define Z_Pin GPIO_PIN_2 +#define Z_GPIO_Port GPIOI #define POWER1_CTRL_Pin GPIO_PIN_2 #define POWER1_CTRL_GPIO_Port GPIOH #define POWER2_CTRL_Pin GPIO_PIN_3 diff --git a/Standard_robot/Inc/tim.h b/Standard_robot/Inc/tim.h new file mode 100644 index 0000000000000000000000000000000000000000..b573a6b215d8f66ee99f4e10b8e6b4ca309592f4 --- /dev/null +++ b/Standard_robot/Inc/tim.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * File Name : TIM.h + * Description : This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + * <h2><center>© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.</center></h2> + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __tim_H +#define __tim_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern TIM_HandleTypeDef htim1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM1_Init(void); + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ tim_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Standard_robot/MDK-ARM/Standard_robot.uvguix.charl b/Standard_robot/MDK-ARM/Standard_robot.uvguix.charl index 0c49e0193cf95bb1584cf0205960a9265e9a3411..1af8b016c891c53007fd9e81d09bde5a77f2259f 100644 --- a/Standard_robot/MDK-ARM/Standard_robot.uvguix.charl +++ b/Standard_robot/MDK-ARM/Standard_robot.uvguix.charl @@ -6,7 +6,7 @@ <Header>### uVision Project, (C) Keil Software</Header> <PrjGuiSettings> - <LastAddFilePath>D:\charl\Documents\Git\RM-Controle\Standard_robot\BSP\Driver</LastAddFilePath> + <LastAddFilePath>D:\charl\Documents\Git\RM-Controle\Standard_robot\BSP\Device</LastAddFilePath> </PrjGuiSettings> <ViewPool/> @@ -93,8 +93,8 @@ <flags>2</flags> <showCmd>3</showCmd> <MinPosition> - <xPos>-1</xPos> - <yPos>-1</yPos> + <xPos>-32000</xPos> + <yPos>-32000</yPos> </MinPosition> <MaxPosition> <xPos>-1</xPos> @@ -110,8 +110,8 @@ <MDIClientArea> <RegID>0</RegID> <MDITabState> - <Len>720</Len> - <Data>0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000600000005000000010000003C443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C5372635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF47443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4472697665725C6273705F6F6C65642E63000000000A6273705F6F6C65642E6300000000FFDC7800FFFFFFFF47443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4472697665725C6273705F6F6C65642E68000000000A6273705F6F6C65642E6800000000BECEA100FFFFFFFF43443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4465766963655C6F6C65642E6300000000066F6C65642E6300000000F0A0A100FFFFFFFF43443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4465766963655C6F6C65642E6800000000066F6C65642E6800000000BCA8E100FFFFFFFF3C443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C496E635C6D61696E2E6800000000066D61696E2E68000000009CC1B600FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000AF00000066000000580500008E020000</Data> + <Len>820</Len> + <Data>0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000700000000000000010000003C443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C5372635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF44443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4465766963655C6D6F746F722E6300000000076D6F746F722E6300000000FFDC7800FFFFFFFF44443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4465766963655C6D6F746F722E6800000000076D6F746F722E6800000000BECEA100FFFFFFFF46443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4472697665725C6273705F63616E2E6300000000096273705F63616E2E6300000000F0A0A100FFFFFFFF46443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C4472697665725C6273705F63616E2E6800000000096273705F63616E2E6800000000BCA8E100FFFFFFFF45443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C416C676F726974686D5C7069642E6300000000057069642E63000000009CC1B600FFFFFFFF45443A5C636861726C5C446F63756D656E74735C4769745C524D2D436F6E74726F6C655C5374616E646172645F726F626F745C4253505C416C676F726974686D5C7069642E6800000000057069642E6800000000F7B88600FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F3000000660000005805000091020000</Data> </MDITabState> </MDIClientArea> <ViewEx> @@ -150,7 +150,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000066000000A80000005E020000</Data> + <Data>0300000066000000EC00000061020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -170,7 +170,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000066000000A80000005E020000</Data> + <Data>0300000066000000EC00000061020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -450,7 +450,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000066000000A80000005E020000</Data> + <Data>0300000066000000EC00000061020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -470,7 +470,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000066000000A80000005E020000</Data> + <Data>0300000066000000EC00000061020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -490,7 +490,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>000000008F0200005805000048030000</Data> + <Data>00000000920200005805000048030000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -530,7 +530,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000092020000EF030000D7020000</Data> + <Data>0300000095020000EF030000DA020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -1170,7 +1170,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>000000008F020000F2030000F0020000</Data> + <Data>0000000092020000F2030000F3020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -1190,7 +1190,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000092020000EF030000D7020000</Data> + <Data>0300000095020000EF030000DA020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -1250,7 +1250,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000092020000EF030000D7020000</Data> + <Data>0300000095020000EF030000DA020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -1270,7 +1270,7 @@ <RecentRowIndex>0</RecentRowIndex> <RectRecentDocked> <Len>16</Len> - <Data>0300000092020000EF030000D7020000</Data> + <Data>0300000095020000EF030000DA020000</Data> </RectRecentDocked> <RectRecentFloat> <Len>16</Len> @@ -1799,14 +1799,14 @@ </Window> <DockMan> <Len>3312</Len> - <Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAF000000C4000000F2030000C8000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000A4000000BB0000009D02000030010000AF0000004F000000F2030000C40000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F00000047030000BD010000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A4000000BB0000004F01000066010000470300004F000000F2030000BD01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFAB0000004F000000AF00000077020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000A4000000BB0000004F01000066010000000000004F000000AB000000770200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000A9010000F2030000AD01000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000A4000000BB0000004F0100006601000000000000AD010000F20300003602000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF9010000AD010000FD0100003602000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000077020000580500007B0200000100000001000010040000000100000085FDFFFF73000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000A4000000BB0000009D02000030010000000000007B02000058050000480300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000</Data> + <Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAF000000C4000000F2030000C8000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000A4000000BB0000009D02000030010000AF0000004F000000F2030000C40000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F00000047030000BD010000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A4000000BB0000004F01000066010000470300004F000000F2030000BD01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFEF0000004F000000F30000007A0200000100000002000010040000000100000057FFFFFFA4040000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000A4000000BB0000004F01000066010000000000004F000000EF0000007A0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000A9010000F2030000AD01000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000A4000000BB0000004F0100006601000000000000AD010000F20300003602000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF9010000AD010000FD0100003602000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000007A020000580500007E02000001000000010000100400000001000000E2FDFFFFD0000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000A4000000BB0000009D02000030010000000000007E02000058050000480300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000</Data> </DockMan> <ToolBar> <RegID>59392</RegID> <Name>File</Name> <Buttons> <Len>2606</Len> - <Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000574696D6528960000000000000005000574696D6528085F5F434C49424E530D63757272656E745F73746174650A49525148616E646C65720341534D0000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000</Data> + <Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000574696D6528960000000000000005000574696D6528085F5F434C49424E530D63757272656E745F73746174650A49525148616E646C65720341534D0000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000</Data> </Buttons> <OriginalItems> <Len>1423</Len> @@ -1822,7 +1822,7 @@ <Name>Build</Name> <Buttons> <Len>988</Len> - <Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000E5374616E646172645F726F626F74960000000000000001000E5374616E646172645F726F626F74000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000</Data> + <Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000E5374616E646172645F726F626F74960000000000000001000E5374616E646172645F726F626F74000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000</Data> </Buttons> <OriginalItems> <Len>583</Len> @@ -1862,57 +1862,66 @@ <ActiveMDIGroup>0</ActiveMDIGroup> <MDIGroup> <Size>100</Size> - <ActiveTab>5</ActiveTab> + <ActiveTab>0</ActiveTab> <Doc> <Name>../Src/main.c</Name> - <ColumnNumber>0</ColumnNumber> - <TopLine>176</TopLine> - <CurrentLine>259</CurrentLine> + <ColumnNumber>30</ColumnNumber> + <TopLine>134</TopLine> + <CurrentLine>148</CurrentLine> <Folding>1</Folding> - <ContractedFolders>205,246,251,258</ContractedFolders> + <ContractedFolders>188,229,234,241</ContractedFolders> <PaneID>0</PaneID> </Doc> <Doc> - <Name>..\BSP\Driver\bsp_oled.c</Name> - <ColumnNumber>1</ColumnNumber> - <TopLine>158</TopLine> - <CurrentLine>263</CurrentLine> + <Name>..\BSP\Device\motor.c</Name> + <ColumnNumber>8</ColumnNumber> + <TopLine>13</TopLine> + <CurrentLine>25</CurrentLine> <Folding>1</Folding> - <ContractedFolders>17,33,50,67,81,87,94,107,128,153,171,179,222,230,309,317,366,393</ContractedFolders> + <ContractedFolders></ContractedFolders> <PaneID>0</PaneID> </Doc> <Doc> - <Name>..\BSP\Driver\bsp_oled.h</Name> - <ColumnNumber>92</ColumnNumber> - <TopLine>3</TopLine> - <CurrentLine>4</CurrentLine> + <Name>..\BSP\Device\motor.h</Name> + <ColumnNumber>24</ColumnNumber> + <TopLine>42</TopLine> + <CurrentLine>46</CurrentLine> <Folding>1</Folding> <ContractedFolders></ContractedFolders> <PaneID>0</PaneID> </Doc> <Doc> - <Name>..\BSP\Device\oled.c</Name> + <Name>..\BSP\Driver\bsp_can.c</Name> <ColumnNumber>0</ColumnNumber> - <TopLine>1</TopLine> - <CurrentLine>6</CurrentLine> + <TopLine>26</TopLine> + <CurrentLine>69</CurrentLine> <Folding>1</Folding> - <ContractedFolders>6,32</ContractedFolders> + <ContractedFolders>30,49,88,95</ContractedFolders> <PaneID>0</PaneID> </Doc> <Doc> - <Name>../BSP/Device/oled.h</Name> - <ColumnNumber>47</ColumnNumber> - <TopLine>1</TopLine> - <CurrentLine>28</CurrentLine> + <Name>..\BSP\Driver\bsp_can.h</Name> + <ColumnNumber>0</ColumnNumber> + <TopLine>16</TopLine> + <CurrentLine>20</CurrentLine> <Folding>1</Folding> <ContractedFolders></ContractedFolders> <PaneID>0</PaneID> </Doc> <Doc> - <Name>../Inc/main.h</Name> - <ColumnNumber>0</ColumnNumber> - <TopLine>1</TopLine> - <CurrentLine>20</CurrentLine> + <Name>..\BSP\Algorithm\pid.c</Name> + <ColumnNumber>40</ColumnNumber> + <TopLine>8</TopLine> + <CurrentLine>47</CurrentLine> + <Folding>1</Folding> + <ContractedFolders></ContractedFolders> + <PaneID>0</PaneID> + </Doc> + <Doc> + <Name>../BSP/Algorithm/pid.h</Name> + <ColumnNumber>13</ColumnNumber> + <TopLine>21</TopLine> + <CurrentLine>39</CurrentLine> <Folding>1</Folding> <ContractedFolders></ContractedFolders> <PaneID>0</PaneID> diff --git a/Standard_robot/MDK-ARM/Standard_robot.uvoptx b/Standard_robot/MDK-ARM/Standard_robot.uvoptx index 3c8374c59db11036c544798bcfa9c73ac1a812fa..2bb4092e93a36ada6b68ac05eb4f3b991ec51a3f 100644 --- a/Standard_robot/MDK-ARM/Standard_robot.uvoptx +++ b/Standard_robot/MDK-ARM/Standard_robot.uvoptx @@ -128,7 +128,24 @@ <Name>-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32F427IIHx$CMSIS\Flash\STM32F4xx_2048.FLM)</Name> </SetRegEntry> </TargetDriverDllRegistry> - <Breakpoint/> + <Breakpoint> + <Bp> + <Number>0</Number> + <Type>0</Type> + <LineNumber>150</LineNumber> + <EnabledFlag>1</EnabledFlag> + <Address>0</Address> + <ByteObject>0</ByteObject> + <HtxType>0</HtxType> + <ManyObjects>0</ManyObjects> + <SizeOfObject>0</SizeOfObject> + <BreakByAccess>0</BreakByAccess> + <BreakIfRCount>0</BreakIfRCount> + <Filename>../Src/main.c</Filename> + <ExecCommand></ExecCommand> + <Expression></Expression> + </Bp> + </Breakpoint> <Tracepoint> <THDelay>0</THDelay> </Tracepoint> @@ -203,7 +220,7 @@ <Group> <GroupName>Application/User</GroupName> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -211,7 +228,7 @@ <GroupNumber>2</GroupNumber> <FileNumber>2</FileNumber> <FileType>1</FileType> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <bDave2>0</bDave2> <PathWithFileName>../Src/main.c</PathWithFileName> @@ -407,7 +424,7 @@ <Group> <GroupName>Device</GroupName> - <tvExp>0</tvExp> + <tvExp>1</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -423,6 +440,18 @@ <RteFlg>0</RteFlg> <bShared>0</bShared> </File> + <File> + <GroupNumber>5</GroupNumber> + <FileNumber>18</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <bDave2>0</bDave2> + <PathWithFileName>..\BSP\Device\motor.c</PathWithFileName> + <FilenameWithoutPath>motor.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> </Group> <Group> @@ -433,9 +462,9 @@ <RteFlg>0</RteFlg> <File> <GroupNumber>6</GroupNumber> - <FileNumber>18</FileNumber> + <FileNumber>19</FileNumber> <FileType>1</FileType> - <tvExp>0</tvExp> + <tvExp>1</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <bDave2>0</bDave2> <PathWithFileName>..\BSP\Algorithm\pid.c</PathWithFileName> @@ -453,7 +482,7 @@ <RteFlg>0</RteFlg> <File> <GroupNumber>7</GroupNumber> - <FileNumber>19</FileNumber> + <FileNumber>20</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -465,7 +494,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>20</FileNumber> + <FileNumber>21</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -477,7 +506,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>21</FileNumber> + <FileNumber>22</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -489,7 +518,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>22</FileNumber> + <FileNumber>23</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -501,7 +530,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>23</FileNumber> + <FileNumber>24</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -513,7 +542,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>24</FileNumber> + <FileNumber>25</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -525,7 +554,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>25</FileNumber> + <FileNumber>26</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -537,7 +566,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>26</FileNumber> + <FileNumber>27</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -549,7 +578,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>27</FileNumber> + <FileNumber>28</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -561,7 +590,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>28</FileNumber> + <FileNumber>29</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -573,7 +602,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>29</FileNumber> + <FileNumber>30</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -585,7 +614,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>30</FileNumber> + <FileNumber>31</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -597,7 +626,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>31</FileNumber> + <FileNumber>32</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -609,7 +638,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>32</FileNumber> + <FileNumber>33</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -621,7 +650,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>33</FileNumber> + <FileNumber>34</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -633,7 +662,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>34</FileNumber> + <FileNumber>35</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -645,7 +674,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>35</FileNumber> + <FileNumber>36</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -657,7 +686,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>36</FileNumber> + <FileNumber>37</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -669,7 +698,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>37</FileNumber> + <FileNumber>38</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> @@ -681,7 +710,7 @@ </File> <File> <GroupNumber>7</GroupNumber> - <FileNumber>38</FileNumber> + <FileNumber>39</FileNumber> <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> diff --git a/Standard_robot/MDK-ARM/Standard_robot.uvprojx b/Standard_robot/MDK-ARM/Standard_robot.uvprojx index 2e6d7087dbada03b5a36374b75fd81a43a261f4e..508c54ea5c67e1316d0f5b6aa10bd44d1b3f12e8 100644 --- a/Standard_robot/MDK-ARM/Standard_robot.uvprojx +++ b/Standard_robot/MDK-ARM/Standard_robot.uvprojx @@ -338,7 +338,7 @@ <MiscControls></MiscControls> <Define>USE_HAL_DRIVER,STM32F427xx,USE_HAL_DRIVER,STM32F427xx</Define> <Undefine></Undefine> - <IncludePath>../Inc; ../Drivers/STM32F4xx_HAL_Driver/Inc; ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy; ../Drivers/CMSIS/Device/ST/STM32F4xx/Include; ../Drivers/CMSIS/Include; ../BSP/Algorithm; ../BSP/Controller; ../BSP/Device; ../BSP/Driver; ../BSP/Modules</IncludePath> + <IncludePath>../Inc; ../Drivers/STM32F4xx_HAL_Driver/Inc; ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy; ../Drivers/CMSIS/Device/ST/STM32F4xx/Include; ../Drivers/CMSIS/Include; ../BSP/Algorithm; ../BSP/Controller; ../BSP/Device; ../BSP/Driver; ../BSP/Modules</IncludePath> </VariousControls> </Cads> <Aads> @@ -556,6 +556,11 @@ <FileType>1</FileType> <FilePath>..\BSP\Device\oled.c</FilePath> </File> + <File> + <FileName>motor.c</FileName> + <FileType>1</FileType> + <FilePath>..\BSP\Device\motor.c</FilePath> + </File> </Files> </Group> <Group> diff --git a/Standard_robot/MDK-ARM/Standard_robot/Standard_robot.hex b/Standard_robot/MDK-ARM/Standard_robot/Standard_robot.hex index 6b6a86fbc4babf73abba950e69d695eab754c11a..2fa347e3265a1fbbf38f7564396e8b6910e58548 100644 --- a/Standard_robot/MDK-ARM/Standard_robot/Standard_robot.hex +++ b/Standard_robot/MDK-ARM/Standard_robot/Standard_robot.hex @@ -1,8 +1,8 @@ :020000040800F2 -:10000000880B0020C10100083F2A0008A92600082B -:100010003D2A000871080008813000080000000037 -:10002000000000000000000000000000312B00086C -:100030001509000800000000412A0008332B0008C1 +:10000000900A0020C1010008BB280008F92400085C +:10001000B928000871080008FD2E00080000000043 +:10002000000000000000000000000000AD290008F2 +:100030001509000800000000BD280008AF290008CD :10004000DB010008DB010008DB010008DB01000820 :10005000DB010008DB010008DB010008DB01000810 :10006000DB010008DB010008DB010008DB01000800 @@ -12,7 +12,7 @@ :1000A000DB010008DB010008DB010008DB010008C0 :1000B000DB010008DB010008DB010008DB010008B0 :1000C000DB010008DB010008DB010008DB010008A0 -:1000D000DB01000875300008DB010008DB010008C7 +:1000D000DB010008F12E0008DB010008DB0100084D :1000E000DB010008DB010008DB010008DB01000880 :1000F000DB010008DB010008DB010008DB01000870 :10010000DB010008DB010008DB010008DB0100085F @@ -26,9 +26,9 @@ :10018000DB010008DB010008DB010008DB010008DF :10019000DB010008DB010008DB010008DB010008CF :1001A0000000000000000000DB010008DFF80CD0B8 -:1001B00000F048FA00480047093A0008880B002080 +:1001B00000F048FA004800476D390008900A002016 :1001C0000648804706480047FEE7FEE7FEE7FEE7F1 -:1001D000FEE7FEE7FEE7FEE7FEE7FEE7BD2B0008D1 +:1001D000FEE7FEE7FEE7FEE7FEE7FEE7392A000856 :1001E000AD0100082DE9F05F0546002092469B46D0 :1001F00088460646814640241BE02846414647463D :10020000224600F057F853465A46C01A914110D37F @@ -101,7 +101,7 @@ :100630001C464FF00043524263EB0403994208BF4B :10064000904230BD064C074D06E0E06840F00103E3 :1006500094E8070098471034AC42F6D3FFF7AAFDA0 -:10066000784A0008984A0008202A06DBCB17203A6F +:100660005447000874470008202A06DBCB17203ABD :1006700041FA02F043EAE07306E041FA02F3D040A7 :10068000C2F12002914008431946704710B5141E6C :1006900073F1000408DA401C41F1000192185B413B @@ -134,11 +134,11 @@ :100840008A6890F8303042EA43228A6001688A68F8 :1008500022F480628A6001688A68406942EA8020E6 :10086000886010BD0023014000E0FFFF0000F0FFA2 -:10087000FEE70000014800F098BB0000D001002016 -:10088000014800F092BB0000D0010020014800F0B8 -:10089000E5BD0000D002002001681823CAB2103A5A +:10087000FEE70000014800F0CCBA0000F8000020BC +:10088000014800F0C6BA0000F8000020014800F05E +:100890000DBD0000F801002001681823CAB2103A0B :1008A000B2FBF3F2054B6FF30901032A9B5CC365AE -:1008B00000D9091D8165084670470000704A00088C +:1008B00000D9091D81650846704700004A470008B5 :1008C00010B5014600208B698A6A4FF0C07453B19D :1008D000B3F5005F15D072B1012A0CD0022A0AD0FC :1008E000032A09D104E01AB1012A06D0022A03D151 @@ -166,1034 +166,983 @@ :100A4000A9420CD10B490C4A0968B1FBF2F101EB48 :100A50008101490000E0491E00910029FBD180F886 :100A60003C40002078BD00000023014000200140F0 -:100A7000120000100800002040420F000068C06C07 -:100A8000704770B504004FF0000503D0206C0026BD -:100A900010B107E0012070BD204600F01DF866642B -:100AA00084F83C60206CC00610D4206C20F4885080 -:100AB00040F0020020642046FFF746FE6664206C8A -:100AC00020F0020040F00100206400E0012584F8DD -:100AD0003C60284670BD000010B586B00446142165 -:100AE0006846FFF7B7FB1149206888421CD11048BF -:100AF0000021026842F480720260006800F4807095 -:100B000005900B481438026842F001020260006848 -:100B100000F001000590402000900320CDE9010184 -:100B20006946044800F0E6FD06B010BD0020014013 -:100B300044380240000002402DE9F04104460068BC -:100B40000D4681684FF0000749050BD58068C00548 -:100B500008D5206C40F02000206484F83C7001200F -:100B6000BDE8F08100F0BAFE06460FE0681C0DD02B -:100B700025B100F0B3FE801BA84207D9206C40F0DD -:100B80000400206484F83C700320E9E720680068D2 -:100B90008007EBD521686FF012000860206C40F4EC -:100BA000007020642068816811F0405F13D1217EBD -:100BB00089B9C16A11F4700F02D0806840050AD467 -:100BC000206C20F480702064206CC00403D4206C5E -:100BD00040F0010020640020C2E7000018B50021A9 -:100BE000009190F83C20012A07D0012280F83C2097 -:100BF00002689368DB0702D011E0022018BD9368F9 -:100C000043F0010393602A4A2A4B1268B2FBF3F2C5 -:100C100002EB420200E0521E0092002AFBD1026861 -:100C20009368DB0741D0036C40F20164A34343F4B3 -:100C30008073036453685B0505D5036C23F400538C -:100C400043F480530364036CDB0404D5436C23F04A -:100C50000603436400E0416480F83C1016496FF0DD -:100C60002203136049680068CA06144906D0884206 -:100C70001BD1816811F0405F13D016E08842F8D094 -:100C80000F4A904203D1D1F80423D206F1D00D4A85 -:100C900090420AD1D1F8041301F01F011029E8D3C2 -:100CA00003E0816841F080418160002018BD0000B0 -:100CB0000800002040420F000023014000200140B6 -:100CC000002101400022014090F82020012A07D095 -:100CD000022A05D0416A41F4802141620120704717 -:100CE000006842690A43426100207047F0B590F8FD -:100CF00020500468A468012D05D0022D03D0416A5C -:100D000041F4802153E014F0406F01D1E5004BD550 -:100D1000C4F30164022C03D9416A41F4000146E0A6 -:100D20000125A5401D608D684FF4C0739DB1CE684C -:100D300035434E6845EAC605066803EB0417F551CE -:100D40004FF4C275076805EB04150E697E51097DE5 -:100D5000012905D009E00E88CD6845EA4655EBE744 -:100D600001684E5946F480764E511179D2F80550FB -:100D70004FF4C67641EA0525016806EB04168D514D -:100D80001178D2F801204FF4C47541EA02210268BB -:100D900005EB04155151006803EB0411425842F071 -:100DA000010242500020F0BD416A41F4001141624D -:100DB0000120F0BD10B590F82020012A07D0022AAA -:100DC00005D0416A41F480214162012010BD3B48B9 -:100DD000D0F8002242F00102C0F80022D0F8002230 -:100DE00022F47C52C0F80022D0F800224B6A42EA7A -:100DF0000322C0F800220A7D02F01F0301229A405C -:100E0000D0F81C329343C0F81C32CB69B3B9D0F888 -:100E10000C329343C0F80C328C894B6864F31F4347 -:100E20004C6900EBC404C4F840320C890B6864F3CD -:100E30001F434C6900EBC404C4F84432CB69012B56 -:100E400016D1D0F80C321343C0F80C320C884B6822 -:100E500064F31F434C6900EBC404C4F840320C89AE -:100E6000CB6864F31F434C6900EBC404C4F84432FC -:100E70008B69002BD0F804320ED01343C0F8043233 -:100E80000B69002BD0F8143208D01343C0F8143289 -:100E9000096A012904D008E09343EFE79343F5E79B -:100EA000D0F81C121143C0F81C12D0F8001221F027 -:100EB0000101C0F80012002010BD000000640040D5 -:100EC000704730B590F82040012C05D0022C03D09B -:100ED000416A41F480215DE00468002955D024690D -:100EE000A40754D04FF4D874056804EB01142D59AD -:100EF00015F00405956005682D594ED0ED08556034 -:100F000005682C5904F00204D4604FF4DA740568C3 -:100F100004EB01142D5905F00F05156105682D59D5 -:100F2000C5F30725956105682C59240C54614FF4CD -:100F3000DC72046802EB0112A4581C700468A45807 -:100F4000240A5C700468A458240C9C700468A2589D -:100F5000120EDA704FF4DE72046802EB0112A4582C -:100F60001C710468A458240A5C710468A458240CF9 -:100F70009C710468A258120EDA71006881B101698F -:100F800041F020010161002030BDE468A8E7416A1A -:100F900041F400114162012030BD6D0D1560AFE7D5 -:100FA000C16841F02001C160EDE72DE9F05F054621 -:100FB000006800244669D0F804908768D0F80CB027 -:100FC000D0F810A0D0F81880F10748D0F90714D055 -:100FD00001218160B80703D5284600F026FA0CE00D -:100FE000780702D54FF4006407E0380702D54FF4C4 -:100FF000805402E0284600F017FAF80516D5296853 -:101000004FF480708860B80503D5284600F00FFAC9 -:101010000CE0780502D544F4005407E0380502D509 -:1010200044F4804402E0284600F000FAF80316D5A4 -:1010300029684FF480308860B80303D5284600F053 -:10104000F8F90CE0780302D544F4004407E03803D3 -:1010500002D544F4803402E0284600F0E9F9300774 -:1010600007D55FEACB6004D52968102044F40074EA -:10107000C86070074FF0080707D55FEA0B7004D50A -:101080002868C760284600F05FF9B00706D52868D1 -:10109000C068800702D0284600F058F9700607D5CE -:1010A0005FEACA6004D52968102044F480640861AE -:1010B000B00607D55FEA0A7004D52868076128469C -:1010C00000F082F9F00606D528680069800702D092 -:1010D000284600F07AF9B00308D55FEAC96005D563 -:1010E000296810204860284600F070F9F00307D501 -:1010F0005FEA097004D528684760284600F09AF92D -:10110000300446D55FEA497040D5F00504D55FEA62 -:10111000C87001D044F00104B00504D55FEA8870BE -:1011200001D544F00204700504D55FEA487001D58A -:1011300044F00404300529D518F0700F26D008F0CB -:101140007000402815D006DC102809D020280AD0CD -:10115000302816D10AE050280ED0602811D10EE0B8 -:1011600044F008040DE044F010040AE044F02004C8 -:1011700007E044F0400404E044F0800401E044F45B -:1011800080742868816921F07001816129680420D8 -:101190004860002C05D0686A204368622846FFF743 -:1011A0008FFEBDE8F09F70B5040003D094F82000D6 -:1011B00010B104E0012070BD204600F081F82068E5 -:1011C000016821F00201016000F088FB0546052658 -:1011D00004E000F083FB401B0A2811D82068406817 -:1011E0008007F6D42068016841F00101016000F039 -:1011F00075FB05460BE000F071FB401B0A2806D981 -:10120000606A40F40030606284F82060D2E72068B1 -:101210004068C007EFD0207E0128206801683DD0DB -:1012200021F080010160607E01282068016838D0CB -:1012300021F040010160A07E01282068016833D0C0 -:1012400021F020010160E07E0128206801682ED095 -:1012500041F010010160207F01282068016829D039 -:1012600021F008010160607F01282068016824D016 -:1012700021F004010160D4E902010843D4E9041219 -:10128000114308436168491E08432168C861002072 -:101290006062012084F82000002070BD41F08001D0 -:1012A000C0E741F04001C5E741F02001CAE721F065 -:1012B0001001CFE741F00801D4E741F00401D9E77C -:1012C00010B586B0044614216846FEF7C3FF1B49DB -:1012D000206888422FD11A480021026842F000722B -:1012E0000260006800F00070059015481038026830 -:1012F00042F0080202600068022200F00800059037 -:101300000320CDE90210CDE90002092004906946CE -:101310000C4800F0EFF900221146132000F04CFBBE -:10132000132000F03BFB00221146142000F044FB88 -:10133000142000F033FB06B010BD00000064004034 -:1013400040380240000C02407047000000B51A4AC5 -:10135000016889B0914204D107AB6A460021FFF7CA -:10136000B0FD00991548A1F20121072917D2028882 -:10137000C9B2521C01EB410302801149BDF81C2087 -:1013800001EB830152BA8A80BDF81E2052BACA808E -:10139000BDF8202052BA0A819DF822208A72018865 -:1013A000B1F5FA7F06D1002101800648016881F479 -:1013B0008041016009B000BD006400400C000020C5 -:1013C0003007002014140240704770477047000037 -:1013D00070B5044690F82000012804D0606A40F4FB -:1013E0000020606218E0022084F820002068016874 -:1013F00021F00101016000F071FA05460EE000BF26 -:1014000000F06CFA401B0A2808D9606A40F40030EA -:101410006062052084F82000012070BD20684068CB -:10142000C007EDD1606270BD70477047704770476C -:1014300070477047704790F83510022903D080211B -:10144000416501207047052180F83510006801686A -:1014500021F0010101600020704700002DE9F843F0 -:1014600004464FF00009CDF8009063484FF4165140 -:10147000A56D0068B0FBF1F72E6894F85C100820A9 -:1014800000FA01F131420FD021680A6852070BD5EA -:101490000A6822F004020A6094F85C108840A86090 -:1014A000606D40F00100606594F85C104FF0010839 -:1014B00008FA01F0304208D021684969090604D5CC -:1014C000A860606D40F00200606594F85C10042034 -:1014D0008840304208D021680968890704D5A8608F -:1014E000606D40F00400606594F85C101020884046 -:1014F000304218D021680968090714D5A86020680F -:101500000168490304D50068000308D5A16C07E011 -:101510000168C90503D4016821F008010160216C4C -:1015200009B12046884794F85C102020884030425A -:1015300031D021680968C9062DD5A86094F8350016 -:1015400005282068016806D0490347D500680003D4 -:101550001DD4616C1CE021F0160101602068416916 -:1015600021F080014161206C08B9A06C20B1206895 -:10157000016821F00801016094F85C103F20884068 -:10158000A86084F8349084F83580216D1FE0E16B09 -:1015900009B120468847606D00282BD0606DC007D8 -:1015A00014D0052084F835002068016821F001017D -:1015B00001600098401C0090B84203D82068006881 -:1015C000C007F6D184F8349084F83580E16C0029A6 -:1015D00010D001B02046BDE8F04308470168C905B6 -:1015E000D5D4016821F01001016084F8349084F8AA -:1015F0003580CCE7BDE8F883080000202DE9F041F4 -:10160000044600F06BF906465CB1002584F83450BE -:10161000022084F835002068016821F00101016092 -:101620000DE00120BDE8F08100F058F9801B05288D -:1016300005D920206065032084F83500F2E7206892 -:101640000068C007F0D12268116820480140D4E941 -:1016500001031843D4E9033633431843636918433D -:10166000A3691843E3691843236A18430843616A6E -:10167000042903D1D4E90B131943084310602068EF -:101680004069666A20F0070130460E4301270428AE -:101690000CD1A06A0643E06A40B12046FFF710F97A -:1016A00020B14020606584F83570BAE72068466153 -:1016B0002046FFF7F1F894F85C203F2191408160CB -:1016C000656584F835700020ACE700003F8010F0BD -:1016D00070B5044600F002F90546601C02D00448CB -:1016E0000078044400F0FAF8401BA042FAD370BD21 -:1016F000100000202DE9F84F00224FF001080325CB -:101700004FF00F0E0B6808FA02F42340A3426ED18B -:101710004E68012E05D0022E03D0112E01D0122EBC -:1017200012D186684FEA420C05FA0CF7BE43CF6827 -:1017300007FA0CF7374387604668A6430C79C4F371 -:101740000014944034434460C668570005FA07FC0F -:101750008C6826EA0C06BC403443C4604C68022CFA -:1017600001D0122C13D1D40800EB8404A346D4F882 -:10177000209054074FEAD46A0EFA0AF629EA0609BD -:101780000E6906FA0AF646EA0906CBF820600468F4 -:101790000E7924EA0C0406F00306BE4026430660D8 -:1017A0004C68E4006FD53B4C266846F480462660C2 -:1017B000246822F0030604F480440094364C344438 -:1017C000A446D4F808489607360F0EFA06F7BC432D -:1017D000324FB84201D100272EE0314FB84201D13B -:1017E000012729E02F4FB84202D1022724E04AE026 -:1017F0002D4FB84201D103271EE02C4FB84201D132 -:10180000042719E02A4FB84201D1052714E0294FD7 -:10181000B84201D106270FE0274FB84201D1072770 -:101820000AE0264FB84201D1082705E0244FB8420C -:1018300001D1092700E00A27B7402743CCF80878F0 -:10184000204E34684F689C43FF0300D51C4334602E -:101850001C4E361D34684F689C43BF0300D51C43A3 -:101860003460184E083634684F689C43FF0200D538 -:101870001C433460134E0C3634684F689C43BF02DF -:1018800000D51C433460521C102AFFF43BAFBDE866 -:10189000F88F000044380240003001400000024050 -:1018A0000004024000080240000C02400010024008 -:1018B0000014024000180240001C024000200240B8 -:1018C00000240240003C01400069084000D0012093 -:1018D00070470AB1816170470904FBE701488068DD -:1018E000704700001000002002488168027811440F -:1018F00081607047100000200B4810B5016841F46A -:1019000000710160016841F480610160016841F487 -:1019100080710160032000F06FF8002000F006F8ED -:1019200000F024F8002010BD003C024070B50D4DC1 -:1019300004464FF47A712878B1FBF0F00A4909683F -:10194000B1FBF0F000F03AFC48B9102C07D20022AD -:101950002146501E00F030F800206C6070BD012060 -:1019600070BD000010000020080000200A4808B5E3 -:10197000016841F480410160006800F480400090FB -:101980000548001F016841F080510160006800F0C7 -:101990008050009008BD000044380240002809DB58 -:1019A00000F01F02012191404009800000F1E02079 -:1019B000C0F8001170470000F0B40E4B1B680C46D5 -:1019C000C3F30223C3F10705042D00D90425191D13 -:1019D000072901D2002300E0DB1E012606FA05F1EB -:1019E000491E214099409E40761E16403143F0BC6E -:1019F00001F05ABB0CED00E0064900F00702086850 -:101A00004FF6FF03184040EA0220034A10430860E3 -:101A1000704700000CED00E00000FA052DE9F047EA -:101A20000E46050065D0DFF81481D8F80000F7B243 -:101A300000F00F00B04207D288F80070D8F800001C -:101A400000F00F00B04254D128683D4C810712D5F8 -:101A5000400703D5206840F4E05020602878000754 -:101A600003D5206840F4604020602068A96820F019 -:101A7000F000084320602878C0072DD030496868FE -:101A80000839012812D0022813D0032811D0096880 -:101A9000890700292DDA216821F003010143216023 -:101AA000FFF71CFF814641F2883A0EE0096889037E -:101AB000EFE709688901ECE7FFF710FFA0EB0901E8 -:101AC000514502D90320BDE8F0872068696800F01D -:101AD0000C00B0EB810FEFD1D8F80010404601F0B8 -:101AE0000F01B14207D90770006800F00F00B04243 -:101AF00001D00120E7E72878400705D52068E9688C -:101B000020F4E050084320602878000706D52068BC -:101B1000296920F4604040EAC100206000F038F8F4 -:101B20002168084AC1F30311515CC84006490860A6 -:101B300006480068FFF7FAFE0020C4E7003C0240B8 -:101B400008380240E441000808000020140000208A -:101B50000448054900680968044AC1F38221515CC0 -:101B6000C84070470800002008380240F4410008CF -:101B70000448054900680968044AC1F34231515CD0 -:101B8000C84070470800002008380240F4410008AF -:101B9000154810B5006810F00C02144813D0144911 -:101BA000042A0FD0082A0ED10F4C241F2268236864 -:101BB00002F03F025B0207D52068C0F38810A0FB4B -:101BC000010106E0084610BD2168C1F38811A1FBA0 -:101BD00000010023FEF706FB2168C1F30141491C07 -:101BE0004900B0FBF1F010BD083802400024F400B9 -:101BF000001BB7002DE9F84F040076D02078DFF8FD -:101C000038A3CE4DC00749D0DAF800105046C1F3D2 -:101C10008101012908D00068C0F3810002280AD19F -:101C2000281D0068400206D52868800336D5606804 -:101C30000028E2D032E06068B0F5803F10D0B0F507 -:101C4000A02F286810D020F480302860286820F465 -:101C5000802028606068A0B1FFF740FE06460CE0D7 -:101C6000286840F48030F4E740F480202860F7E7EB -:101C7000FFF734FE801B642873D828688003F7D5EB -:101C80000CE0FFF72BFE064605E000BFFFF726FE3F -:101C9000801B6428F0D828688003F7D42078DFF808 -:101CA000A08280074FF000093ED5DAF800105046B8 -:101CB00011F00C0F09D00068C0F3810002280BD18D -:101CC0009D48001F0068400206D42868800715D58B -:101CD000E068012809D111E0E068B8B10120C8F836 -:101CE0000000FFF7FBFD064605E020E1FFF7F6FDEB -:101CF000801B0228C0D828688007F7D5286821698A -:101D000020F0F80040EAC10028600DE0C8F800901B -:101D1000FFF7E4FD064604E0FFF7E0FD801B022824 -:101D20001FD828688007F7D42078000722D5824E74 -:101D3000844861696C3671B101210160FFF7CEFD05 -:101D4000074604E0FFF7CAFDC01B022809D8306827 -:101D50008007F7D50EE0C0F80090FFF7BFFD0746FB -:101D600005E082E0FFF7BAFDC01B02287DD830688D -:101D70008007F7D42078400768D5DFF8BCB100278A -:101D80000BF1380BDBF80000C0000BD4DBF80010BF -:101D900041F08051CBF80010DBF80000012700F083 -:101DA00080500090684E3068C00510D4306840F410 -:101DB00080703060FFF792FD009005E0FFF78EFD28 -:101DC0000099401A022850D83068C005F6D55A4EFE -:101DD000A068683601280FD00528306810D020F0A0 -:101DE00001003060306820F004003060A068B8B1B5 -:101DF000FFF774FD00900FE0306840F00100F4E759 -:101E000040F004003060F7E7FFF768FD0099411AE1 -:101E100041F28830814266D830688007F4D50EE000 -:101E2000FFF75CFD009007E0FFF758FD0099411AAD -:101E300041F28830814256D830688007F4D42FB1FF -:101E4000DBF8001021F08051CBF80010A069D0B36E -:101E5000DAF800205146C2F38102022A4AD0022851 -:101E6000484607D0C8F8600000E03CE0FFF736FDC8 -:101E700004463BE04746C8F86000FFF72FFD0646E2 -:101E800005E000BFFFF72AFD801B02282BD8286839 -:101E90008001F7D4D4E907010843A16A2B4A490815 -:101EA00002EB0141626A41EA8211084394F82C1066 -:101EB00040EA01612048001F016001203866FFF7F9 -:101EC0000DFD044605E034E0FFF708FD001B022885 -:101ED00009D828688001F7D52BE000BFFFF7FEFC8A -:101EE000001B022802D90320BDE8F88F2868800172 -:101EF000F4D41EE00128F7D00868E26900F48001FC -:101F0000914214D1226A00F03F0191420FD147F66D -:101F1000C071626A0140914209D1A26A00F4403165 -:101F2000914204D1E16A00F07060884201D0012042 -:101F3000DAE70020D8E70000083802400038024005 -:101F400000004742800E4742007000400000FFFF43 -:101F500070B5040005D00025A56294F8510010B1B9 -:101F600006E0012070BD84F85050204600F030F8A3 -:101F7000022084F851002068016821F040010160CE -:101F8000D4E901010843D4E903121143084361690C -:101F90000843218B01F400710843E1690843216A79 -:101FA0000843A16A084321680860A069042101EA86 -:101FB0001040616A0843216848602068C16921F4C3 -:101FC0000061C1616565012084F85100002070BD89 -:101FD000F0B587B0044614216846FEF73BF91C496A -:101FE0002068884232D11B480024016841F48051A6 -:101FF0000160006800F480500590164814380168AC -:1020000041F002010160016801F0020105910168DF -:1020100041F0010101600068022500F00100059017 -:102020001820CDE9000502AA0326052782E8D00082 -:1020300069460948FFF75EFB8020CDE9000502AA4A -:10204000694682E8D0000548FFF754FB07B0F0BDB1 -:1020500000300140443802400004024000000240C9 -:102060002DE9F84F044690F8500000271D4616460B -:10207000894601280DD04FF0010B84F850B0FFF7CE -:102080002DFC804694F85100BA46012804D002275E -:102090008EE00220BDE8F88FB9F1000F7DD0002E50 -:1020A0007BD0032084F85100C4F854A0C4F83090C9 -:1020B000A686E686C4F838A0A4F83CA0A4F83EA002 -:1020C000C4F844A0C4F840A0A068B0F5004F04D103 -:1020D0002068016841F48041016020680168490678 -:1020E00003D4016841F040010160E068B0F5006F81 -:1020F000606803D030B3012E24D040E008B1012E37 -:102100001CD1206B21680088C86006E020688168C7 -:10211000890709D5216B0988C160206B801C206369 -:10212000E08E401EE08609E0FFF7D8FBA0EB080038 -:10213000A84202D3681C01D031E07DB3E08E0028B4 -:10214000E4D11FE0206B21680078087306E0206866 -:102150008168890709D5216B09780173206B401CC0 -:102160002063E08E401EE08609E0FFF7B7FBA0EB9E -:102170000800A84202D3681C01D010E075B1E08EBF -:102180000028E4D142462946204600F05BFC08B115 -:1021900020206065A06820B107E008E0FFE7032782 -:1021A00006E02068C16880680090606D00B101277A -:1021B00084F851B084F850A038466BE710B5401E43 -:1021C000B0F1807F01D3012010BD4FF0E0246061A9 -:1021D0000F21601700F068FF0020A0610720206138 -:1021E000002010BD10B590F83C20012A22D0012219 -:1021F00080F83C20CA688C6822F4407222434C6804 -:1022000022F4806222430C6822F4006222430C69AB -:1022100022F4805222434C6922F400522243C969BD -:10222000002322F480420A4301684A6480F83C306B -:10223000002010BD022010BD70B590F83C20012A8E -:1022400032D0012480F83C40022280F83D2003680F -:102250005A689D6822F070060A6832435A60134B30 -:1022600002689A4214D0B2F1804F11D0104B9A42BA -:102270000ED0104B9A420BD00F4B9A4208D00F4B06 -:102280009A4205D00E4B9A4202D00E4B9A4204D18C -:10229000496825F080031943916080F83D40002192 -:1022A00080F83C10084670BD022070BD000001405F -:1022B0000004004000080040000C00400004014001 -:1022C000004001400018004070B586B0044614215B -:1022D0006846FDF7BFFF18492068884229D1174892 -:1022E0000024016841F001010160016801F0010171 -:1022F0000591016841F0100101600068022500F0BD -:10230000100005904FF440700090CDE90154012673 -:10231000CDE9034669460A48FFF7ECF94FF4C0409F -:102320000090CDE90154CDE9034669460548FFF721 -:10233000E1F906B070BD00000000014030380240F5 -:10234000000002400010024070B5044690F83C00C6 -:102350000D4601280DD0012684F83C60022084F847 -:102360003D0042B1042A18D0082A2AD00C2A4DD1A7 -:1023700039E0022070BD206800F092FC206881697D -:1023800041F0080181612068816921F004018161C7 -:10239000206881692A69114311E0206800F0B0FCCF -:1023A0002068816941F4006181612068816921F4BC -:1023B00080618161206881692A6941EA0221816125 -:1023C00024E0206800F0D2FC2068C16941F00801D7 -:1023D000C1612068C16921F00401C1612068C1693F -:1023E0002A69114311E0206800F0F4FC2068C169FB -:1023F00041F40061C1612068C16921F48061C1615B -:102400002068C1692A6941EA0221C16184F83D60FE -:10241000002084F83C0070BD10B5040003D094F88F -:102420003D0010B107E0012010BD002084F83C0001 -:10243000204600F00DF8022084F83D00211D2068A0 -:1024400000F0CAFB012084F83D00002010BD000010 -:1024500008B500680649884208D10648016841F07D -:1024600001010160006800F00100009008BD00005B -:1024700000000140443802407047000070B5026817 -:1024800004461068D168536910F00F0F52D003F062 -:10249000010501F490762E435FD0C20705D0CA052E -:1024A00003D5E26B42F00102E263420705D5DA0789 -:1024B00003D0E26B42F00202E263820705D5DA073D -:1024C00003D0E26B42F00402E263020707D501F099 -:1024D00020022A4303D0E26B42F00802E263E26B7F -:1024E000002A33D0800604D5880602D5204600F0A5 -:1024F000AFFC20684069E16BC0F38010090700D48D -:1025000028B3204600F096FC2068416949061AD598 -:10251000416921F040014161606BA0B11B49016537 -:10252000606BFEF788FF002810D0606B016DBDE87E -:1025300070400847830610D58B060ED52046BDE8AF -:10254000704000F085BC2046FFF796FF70BD204626 -:10255000FFF792FF0020E06370BD030606D50B066F -:1025600004D52046BDE8704000F052BD4006F3D5CA -:102570004806F1D5D168204621F04001D1602021E4 -:1025800084F8391000F08FF870BD0000252E000887 -:1025900070B5040004D094F83900002510B106E0AD -:1025A000012070BD84F83850204600F023F8242024 -:1025B00084F839002068C16821F40051C1602046C8 -:1025C00000F092FC2068016921F4904101612068CB -:1025D000416921F02A0141612068C16841F400513C -:1025E000C160E563202084F8390084F83A000020B7 -:1025F00070BD000070B586B0064614216846FDF730 -:1026000029FE23493068884240D1224800250168CC -:1026100041F010010160006800F0100005901D48B5 -:102620001438016841F0020101600068694600F059 -:1026300002000590C02000900220CDE90105032092 -:102640000390072004901448FFF754F8144C1348E3 -:1026500020604FF0006060604020C4E90205000186 -:10266000C4E90405A561E561256220466562FEF7BF -:10267000C5FF08B1FEF74FF934630022114625204B -:10268000A663FFF799F92520FFF788F906B070BD1A -:10269000001001404438024000040240B864024087 -:1026A000D002002070477047FEE700007FB500248D -:1026B00015480094019402941249039401604FF468 -:1026C0008031C0E901140461047680F820400F498C -:1026D000C0E90A140125C561C46080F83040456135 -:1026E000FEF7CFF908B1FEF716F90620CDE900058F -:1026F000694602940448FEF70FF9002801D0FEF75E -:102700000AF97FBD00200140880100200100000F70 -:10271000104810B50E4901600321416000214FF4BB -:1027200000228160C0E903124FF440124261017639 -:10273000012242768176C17601774177FEF733FD3B -:10274000002803D0BDE81040FEF7E5B810BD00003A -:1027500000640040D0010020094808B5016841F438 -:10276000800101600068002200F4800000901146A2 -:102770004620FFF721F9BDE808404620FFF70EB9D3 -:10278000303802402DE9F04F87B014216846FDF73C -:1027900061FD4F480024016841F0020101600168B9 -:1027A00001F002010591016841F001010160016839 -:1027B00001F001010591016841F008010160016823 -:1027C00001F008010591016841F080010160016894 -:1027D00001F080010591016841F04001016001684C -:1027E00001F040010591016841F0100101600168AC -:1027F00001F010010591016841F0200101600068BD -:10280000DFF8D09000F020004FF4C0650590002262 -:1028100029464846FFF75DF8DFF8BCA000222C21CE -:102820005046FFF756F8DFF8B4B04FF48076002238 -:1028300031465846FFF74DF8F70000223946284840 -:10284000FFF747F84FF48048002241462548FFF73C -:1028500040F800950125CDE90154694648460394A6 -:10286000FEF748FF2C200090CDE901546946504600 -:102870000394FEF73FFF1020CDE90004694650465F -:102880000294FEF737FF0096CDE901546946584699 -:102890000394FEF72FFF0420CDE900046946484663 -:1028A0000294FEF727FF0097CDE9015469460C48D2 -:1028B0000394FEF71FFFCDF80080CDE9015469466F -:1028C00008480394FEF716FF07B0BDE8F08F00003C -:1028D0003038024000040240001C02400018024050 -:1028E0000010024000140240104810B50E4901606B -:1028F0004FF48271416000218160C1604FF4007229 -:102900000161C0E905122822C0E907214162816204 -:102910000A21C162FFF71CFB002803D0BDE810406C -:10292000FDF7F9BF10BD000000300140F8010020A4 -:1029300010B592B000240F941C2168461094FDF746 -:1029400089FC202107A8FDF785FC2D482B49016053 -:10295000A721C0E9011444F62061C0E903144461D1 -:102960008461FFF759FD08B1FDF7D5FF0F940FA95A -:1029700023481094FFF760FC08B1FDF7CCFF6020FE -:1029800000904FF47A70CDE9010403940494059407 -:10299000002269461A480694FFF7D6FC08B1FDF7F5 -:1029A000BAFF042269461648FFF7CEFC08B1FDF7CE -:1029B000B2FF082269461248FFF7C6FC08B1FDF7CE -:1029C000AAFF0C2269460E48FFF7BEFC08B1FDF7CE -:1029D000A2FF0794089409944FF400500A94CDE99B -:1029E0000B4007A906480E94FFF7FCFB08B1FDF762 -:1029F00092FF0348FFF768FC12B010BD00000140D1 -:102A0000500200200C4810B50A4901604FF4E13132 -:102A10004160002181600C22C160C0E90412816123 -:102A2000C161FFF7B5FD002803D0BDE81040FDF7F8 -:102A300072BF10BD0010014090020020FEE77047F9 -:102A40007047000038B504461248134B0068B0FBCD -:102A5000F3F04FF47A73584300906068B0F5827FCA -:102A60000DD10B46009200228021204600F016F87E -:102A700070B1606D40F020006065032038BD0098A3 -:102A800030B1401E009020688068C0430006F6D533 -:102A9000002038BD0800002000366E012DE9F0410D -:102AA0001D4617460E460446DDF8188008E0681CEF -:102AB00006D0FEF713FFA0EB0800A8420BD255B1D9 -:102AC0002068806836EA000030D00020B842EED19D -:102AD0000020BDE8F0812068416821F0E0014160FC -:102AE0006068B0F5827F0BD1A068B0F5004F02D0CE -:102AF000B0F5806F04D12068016821F040010160C9 -:102B0000A06AB0F5005F09D12068016821F4005186 -:102B100001602068016841F400510160012084F8DF -:102B20005100002084F850000320D2E70120CDE7B7 -:102B30007047FEF7D9BE000030B593B0302168462B -:102B4000FDF788FB14210CA8FDF784FB194800252C -:102B5000016841F080510160006800F080501190E0 -:102B60001548016841F4404101600068022400F406 -:102B70004040119001200090000401908001CDE9B7 -:102B8000064006200890A820CDE9090404200B90F7 -:102B90006846FFF72FF80CA90F2081E831004FF4A9 -:102BA000A0500F90E002109005210CA8FEF736FF10 -:102BB00013B030BD40380240007000400548016845 -:102BC00041F47001016003494FF0006080390860F2 -:102BD0007047000088ED00E0F0B50268254C264DF6 -:102BE000264E274F274B4FF0804CA04209D060451E -:102BF00007D0A84205D0B04203D0B84201D09842D5 -:102C000004D122F0700E4A6842EA0E02A0421BD0A4 -:102C1000604519D0A84217D0B04215D0B84213D0A1 -:102C2000984211D0184DA8420ED0184DA8420BD092 -:102C3000174DA84208D0174DA84205D0164DA842FE -:102C400002D0164DA84203D122F44075CA682A4327 -:102C50004D6922F080022A4302608A68C2620A68D3 -:102C60008262A04201D0984201D109690163012129 -:102C70004161F0BD00000140000400400008004038 -:102C8000000C0040000401400040014000440140AD -:102C90000048014000180040001C00400020004097 -:102CA000F0B5026A22F001020262036A4268846996 -:102CB000124E24F073050C682C4323F002058B6838 -:102CC0002B430D4DA84201D0B04205D123F0080797 -:102CD000CB683B4323F00403A84201D0B04205D1A6 -:102CE0004D6922F4407215438A692A434260846127 -:102CF000496841630362F0BD0000014000040140E7 -:102D0000F0B5026A22F010020262026A4368846926 -:102D10000D6824F4E64444EA05248D6822F020027C -:102D200042EA05120F4D104EA84201D0B04206D122 -:102D3000CF6822F0800242EA071222F04002A84245 -:102D400001D0B04207D14D6923F4406343EA8503C3 -:102D50008D6943EA85034360846149688163026247 -:102D6000F0BD00000000014000040140F0B5026A1F -:102D700022F480720262026A4368C46922F400721B -:102D800024F073050C68124E2C438D6842EA05222C -:102D90000E4DA84201D0B04206D1CF6822F40062A5 -:102DA00042EA072222F48062A84201D0B04207D151 -:102DB0004D6923F4405343EA05138D6943EA051333 -:102DC0004360C4614968C1630262F0BD0000014014 -:102DD0000004014030B5026A22F480520262046AA3 -:102DE0004268C3690D6823F4E64343EA05238D680E -:102DF00024F4005444EA0534084DA84202D0084D9A -:102E0000A84204D14D6922F4804242EA8512426010 -:102E1000C36149680164046230BD000000000140E4 -:102E20000004014010B5806B0021C185C184FFF70B -:102E300023FB10BD0168CA6822F49072CA60016861 -:102E40004A6922F001024A61202180F83A10704755 -:102E500010B590F83A10222901D0022010BD8168E7 -:102E6000B1F5805F11D00169002901681FD0496860 -:102E700001F07F03816A4A1C82620B70C18D491E7A -:102E80000904090CC18518D02BE00269816A002A67 -:102E90000268526805D0D2B20A80816A491C8162F8 -:102EA000ECE7C2F308020A80816A891CF7E74A68E6 -:102EB000816A4B1C83620A70E0E70168CA6822F0ED -:102EC0002002CA600168CA6822F48072CA60016880 -:102ED0004A6922F001024A61202180F83A10FFF786 -:102EE000E1FB002010BD00002DE9F0410446006820 -:102EF0000169E26821F44051114301612169A06830 -:102F0000E26908436169114308432168CA6849F2CC -:102F10000C639A430243CA6020684169A26921F4A4 -:102F2000407111434161E069192764253226B0F5EB -:102F3000004F354A354920684FF0000806D08842D6 -:102F400001D0904236D1FEF713FE35E0884201D021 -:102F5000904202D1FEF70CFE01E0FEF7F9FD616838 -:102F60004A18A0FB070148EB0803FDF73BF90146AF -:102F7000B0FBF5F00201B1FBF5F06FF01803584318 -:102F800001EB800006EBC000B0FBF5F000F0F800AC -:102F900002EB4002B1FBF5F0584301EB800006EB79 -:102FA000C000B0FBF5F000F0070021681044886015 -:102FB000BDE8F081FEF7CCFD61688B0F8A00A0FBB5 -:102FC0000701FDF70FF90146B0FBF5F06FF01802AD -:102FD000504301EB800006EB0010B0FBF5F000F071 -:102FE000F002B1FBF5F002EB0012B1FBF5F06FF06F -:102FF0001803584301EB800006EB0010B0FBF5F01E -:1030000000F00F00D1E70000001401400010014063 -:1030100090F83910212901D0022070478168B1F55C -:10302000805F016A0BD04A1C026202680978516015 -:10303000C18C491E0904090CC1840ED017E009880F -:103040000268C1F30801516001690029016A02D0D8 -:10305000491C0162ECE7891CFBE70168CA6822F0A1 -:103060008002CA600068C16841F04001C160002070 -:10307000704700000148FFF701BA000090020020ED -:10308000FEE7000037B514460846064B6A4621465F -:1030900000F0ECF804466946002000F07EFC204673 -:1030A0003EBD00009B3900080907090E002804DB1B -:1030B00000F1E02080F80014704700F00F0000F1EC -:1030C000E02080F8141D704702E008C8121F08C1F4 -:1030D000002AFAD170477047002001E001C1121F99 -:1030E000002AFBD1704700002DE9FF5F82B000216C -:1030F000DDE90430020DDDF840B0034318D044F69A -:103100001050A2F2FF3242431514119801281FD02B -:10311000A5EB0B00401C5FEA000A4FF000064E4F83 -:10312000DFF83891B046504615D5CAF1000413E0D7 -:10313000119801244AA3012801D16FEA0B010298DA -:10314000119AC0E90031C0E9024206B0BDE8F09F23 -:10315000CBF10000DFE704460021404A491842EB6A -:103160000450CDE9001012E0E00707D032463B469C -:1031700040464946FDF755F98046894632463B466A -:1031800010461946FDF74DF906460F466410002C0F -:10319000EAD1DDE90401DDE90023BAF1000F06DA26 -:1031A000FDF73FF942464B46FDF73BF905E0FDF7D9 -:1031B000AAF942464B46FDF7A6F904460E46002200 -:1031C000284BFDF727FA03D84FF0FF30014607E000 -:1031D0000022254B20463146FDF77CF8FDF702FA28 -:1031E000102409E0002C0ADB0A220023FCF7FAFF76 -:1031F000039B30321A55641E50EA0102F2D1641C5E -:10320000039AC4F111031444119A012A03D0012234 -:1032100008430DD10AE0084304D000204FF0110B01 -:10322000119072E7A3EB0B056D1E0DE05B4504DD0D -:103230004FF0000205F1010504E003DA4FF000024F -:10324000A5F10105002AECD002981199C0E90231DC -:10325000C0E9004579E70000000014400000F03F9D -:10326000300000000000F0430000E03F2DE9FF4F78 -:1032700095B09B468946064600250FE2252877D162 -:1032800000242746F84A0121059400E0044316F87B -:10329000013F203B01FA03F01042F7D130782A2891 -:1032A00011D06FF02F033078A0F13002092A16D820 -:1032B000059A44F0020402EB820203EB420210443E -:1032C000761C0590EFE759F8042B0592002A03DAE3 -:1032D000504244F40054059044F00204761C3078C7 -:1032E0002E2816D116F8010F44F004042A280DD018 -:1032F0006FF02F023078A0F13003092B09D807EBCB -:10330000870302EB4303C718761CF3E759F8047BE5 -:10331000761C30786C280FD006DC4C2817D0682833 -:103320000DD06A2814D104E0742810D07A280FD167 -:103330000DE044F400140AE044F4801401E044F485 -:1033400040147278824202D104F58014761C761CF7 -:10335000307866280BD013DC582877D009DC002899 -:1033600075D04528F6D04628F4D047281AD19DE1DB -:1033700018E0632835D0642879D0652812D195E10A -:10338000702873D008DC6728F1D069286FD06E28C8 -:103390000DD06F2806D1B5E073282CD0752875D0D4 -:1033A000782874D05A46179990476D1C75E1C4F37C -:1033B0000250022809D003280DD0D9F800100428A3 -:1033C0000DD00D6009F1040967E1D9F80010EA1782 -:1033D000C1E90052F6E7D9F800100D80F2E70D7050 -:1033E000F0E719F8041B8DF8001000208DF801009B -:1033F000EA46012003E059F804AB4FF0FF306107C3 -:103400004FF0000102D40DE008F101018846B942F5 -:103410000FDA8045F8DB1AF808100029F4D108E02B -:1034200008F1010188468142FADB1AF808100029E8 -:10343000F6D105985B46A0EB080721463846179A57 -:1034400000F094FA284400EB080507E04DE029E17C -:103450000DE01AF8010B5A4617999047B8F1010888 -:10346000F7D25B4621463846179A13E142E00A221A -:103470000092C4F302524FF0000A022A08D059F811 -:1034800004CB032A4FEAEC710AD00DE029E02AE0D0 -:1034900009F1070121F00702F2E802C1914609E0B3 -:1034A0000FFA8CFC4FEAEC71042A03D14FFA8CFC22 -:1034B0004FEAEC71002907DA0A460021DCF1000C22 -:1034C00061EB02012D2202E0220504D52B228DF8AA -:1034D0000420012203E0E20701D02022F7E7904612 -:1034E00059E00A2102E010220DE010214FF0000AFD -:1034F00000910BE010224FF0000A44F0040408276A -:10350000009203E008224FF0000A0092C4F3025236 -:10351000022A05D059F804CB0021032A08D009E07B -:1035200009F1070121F00702F2E802C1914605E026 -:103530001FFA8CFC042A01D10CF0FF0C4FF000089C -:10354000220728D5702806D0009B83F0100353EA89 -:103550000A0305D00EE040228DF80420012208E085 -:103560005CEA010206D030228DF804208DF80500B7 -:1035700002229046009B83F0080353EA0A030AD113 -:103580005CEA010201D1620705D530228DF80420E2 -:103590004FF001087F1E582804D034A003900EA8D5 -:1035A00002900DE036A0F9E753466046009AFCF71A -:1035B00019FE84460398825C0298401E02900270B5 -:1035C0005CEA0100F0D1029806A9081A00F1200A6D -:1035D000600702D524F4803400E00127574502DD5E -:1035E000A7EB0A0000E0002000EB0A01009005981C -:1035F0004144401A0590E00306D45B462146179AE1 -:10360000059800F0B3F90544002706E001A85A46E2 -:10361000C05D179990476D1C7F1C4745F6DBE003A2 -:103620000CD55B462146179A059800F09FF9054492 -:1036300004E030205A46179990476D1C0099481EA7 -:1036400000900029F5DC08E0029802995A460078BB -:10365000491C0291179990476D1CBAF10001AAF11B -:10366000010AF1DC65E10000092801003031323344 -:1036700034353637383961626364656600000000AE -:103680003031323334353637383941424344454698 -:103690000000000000F058F90544761C307800283E -:1036A0007FF4ECAD19B02846BDE8F08F620700D476 -:1036B000062709F1070222F0070CFCE80223E14685 -:1036C00003F000485FEA080C02D00FF2702C0DE006 -:1036D0005FEA045C02D50FF2682C07E05FEAC47C65 -:1036E00002D00FF2602C01E0AFF2700C4FF0FF3807 -:1036F00023F00043CDF850C065280CD006DC4528E7 -:1037000009D046281DD047283DD13DE0662818D075 -:1037100067287ED138E00021112F01DB112000E065 -:10372000781CCDE9000106A90EA8FFF7DDFCDDE954 -:103730000F010E9A03910021009207F1010A0491F2 -:103740004DE04FF000400097CDE9011006A90EA80A -:10375000FFF7CAFCDDE90F0203920E9B11990022CC -:10376000DDF80CA00093049211B9791C00EB010A5A -:10377000B7EB0A0004D4C0F1FF3007F1010A04904E -:10378000AAEB0700019044E0012F00DA0127002195 -:10379000112F01DD112000E03846CDE9000106A916 -:1037A0000EA8FFF7A1FCDDE90F010E9A039100219D -:1037B00004910092BA4621070CD40399514500DACE -:1037C0008A46BAF1010F05DD009AAAF10101515CA8 -:1037D000302908D0B84202DA10F1040F06DA0121CC -:1037E000CDE9011015E0AAF10101E9E7002805DCA7 -:1037F000049901440491AAEB000102E0411C5145E7 -:1038000000DD8A460499401A401C01904FF00040A8 -:103810000290200704D40198504501DBCDF80480C4 -:1038200000208DF84F0002980DF14F07B0F1004FC6 -:1038300025D02B200E9002984FF0020800280CDAB9 -:10384000404202902D200E9007E00A210298FCF7DA -:103850000CFD3031029007F8011DB8F10001A8F10C -:103860000108F2DC02980028EFD1791E0E9808704A -:10387000307800F0200040F0450007F8020D12A853 -:10388000C01B00F107081498007800B1012000EB7C -:103890000A01019801EBE07105984144401A401E6D -:1038A0000590E00306D45B462146179A059800F080 -:1038B0005DF805441498007818B15A461799904756 -:1038C0006D1CE00324D55B462146179A059800F04D -:1038D0004DF805441CE00498002807DBDDE90301EE -:1038E000884203DD0098405C179901E01799302069 -:1038F0005A469047049805F10105401C0490019830 -:10390000401E019004D12E205A46179990476D1CF5 -:10391000BAF10001AAF1010ADDDC05E017F8010B9C -:103920005A46179990476D1CB8F10001A8F101089B -:10393000F4DC5B462146179A0598ABE62D000000A3 -:103940002B000000200000002DE9F0410446002576 -:103950001E461746880404D405E039462020B047A7 -:103960006D1C641EF9D52846BDE8F0812DE9F041B3 -:10397000044600251E469046C80301D5302700E0C6 -:103980002027880404D505E041463846B0476D1C21 -:10399000641EF9D52846BDE8F0810A68531C0B6007 -:1039A0001070704700B58BB000210122CDE90612DE -:1039B0000591009101910291039104910E21CDE9AD -:1039C00008216946FDF7F6F90448FDF701FD0221DB -:1039D0000248FDF779F90BB000BD0000D0010020CE -:1039E00010B5074C0421607820700648FDF76CFF85 -:1039F000607010B92078012800D0002010BD0000B0 -:103A00000E000020000402402DED048B82B0FDF773 -:103A100073FFFFF791F8FEF7B5FEFEF79DFEFEF788 -:103A2000F1FFFEF743FEFEF75FFFFEF771FEFEF7C4 -:103A30007FFF01223C217248FDF74BFF00F0C0F9E7 -:103A4000002000F079F900F0F7F800F0AFFA00225A -:103A50004FF480716B48FDF73CFF4FF4FA70FDF7AF -:103A600037FE002000F068F900F0A0FA6648FFF782 -:103A700099FF0024DFED658A9FED658A654D00BFE3 -:103A800004EB8400F0EE681A00EBC40005EB800044 -:103A9000B0EE612AB0EE001AF0EE480AB0EE000A6D -:103AA00000F06FFB641CE4B2032CE9D30424DFEDC7 -:103AB0005A8A9FED5A9A9FED5A8A00BF04EB840000 -:103AC000F0EE681A00EBC40005EB8000B0EE612A4E -:103AD000B0EE481AF0EE080AB0EE490A00F051FBC9 -:103AE000641CE4B2072CE9D3DFF83881DFF838B181 -:103AF000F3EE048AA9464FF0000A0121084600F0BF -:103B0000F1F9B8F800004446401C00B2A8F80000E3 -:103B1000FA2806D14548A4F800A0416981F4006163 -:103B20004161FFF75DFF70B194ED010ADFED400ADE -:103B3000404930EE200A10EE100A84ED010A884256 -:103B400001DD84ED018AA04600254E464FEA0B04B4 -:103B500005EB450004EB8007B7F9060000EE100AFC -:103B600005EB850000EBC500F8EEC00A98ED010AF0 -:103B700006EB800020EE280A00F0B2FABDEEC00A83 -:103B80006D1CEDB210EE100A032D7880E0D3B14623 -:103B90000425464605EB450004EB8007B7F906000F -:103BA00000EE100A05EB850000EBC501F8EEC00A37 -:103BB00009EB810096ED010A00F092FABDEEC00A11 -:103BC0006D1CEDB210EE100A072D7880E2D3B4F927 -:103BD00026000090B4F91A30B4F90E20B4F902109E -:103BE000002000F0D1FACDF800A0B4F94A30B4F9C1 -:103BF0003E20B4F93210012000F0C6FA7DE7000043 -:103C0000001C024000180240D001002000007A464B -:103C10000AD7A33B1C0000200060EA4600002042B7 -:103C200000000000000000203007002000100240CB -:103C300000007042000034432DE9F047002000F0FE -:103C40007BF8DFF8549000245FF0000609EBC60013 -:103C500000EBD400002507784FFA86F8380604EB0D -:103C6000050041B201D5012200E00022404600F0EB -:103C700083F878066D1C070EEDB2082DEED3761C86 -:103C8000F6B2802EE2D30834E4B2402CDCD3BDE897 -:103C9000F04700F08BB900007046000810B50748E7 -:103CA000FCF79CFF64210548FCF746FF0348FCF73E -:103CB000E5FE00EE100AB8EE400A10BD88010020B3 -:103CC00010B5FFF7EBFFBDEEC00A10EE100AD0F5FD -:103CD0004D6100D54942802901DC002010BDA0F2D1 -:103CE0004F31494200D54942802901DC012010BDF5 -:103CF000A0F2C261494200D54942802901DC02207C -:103D000010BDA0F69911494200D54942802901DC35 -:103D1000032010BD414200D54942802901DC042026 -:103D200010BDA0F6FA70404200D54042802801DC68 -:103D3000052010BD062010BDF0B500210D4BFF265B -:103D40000C46002201280FD003EBC20580B16F5C46 -:103D5000C7F1FF076F54521CD2B2802AF2D9491C16 -:103D6000C9B20829EDD3F0BD03EBC2056E54F2E7EA -:103D70006C54F0E73003002070B5802817D200297A -:103D800015DB3F2913DCCB1701EB5375C5F3C703D4 -:103D900025F007050124094E491B8C4006EBC000A5 -:103DA000012A05D0C15C022A05D0A143C15470BDCF -:103DB000C15C2143FAE76140F8E7000030030020CE -:103DC00070B5474D4FF48064002221462846FDF728 -:103DD00080FD4FF4FA70FDF77BFC01222146284656 -:103DE000FDF777FD0021AE2000F064F900210846C0 -:103DF00000F060F90021102000F05CF90021402063 -:103E000000F058F90021812000F054F90021CF2062 -:103E100000F050F90021A12000F04CF90021C82049 -:103E200000F048F90021A62000F044F90021A82064 -:103E300000F040F900213F2000F03CF90021D320A0 -:103E400000F038F90021084600F034F90021D520AF -:103E500000F030F90021802000F02CF90021D92059 -:103E600000F028F90021F12000F024F90021DA20E7 -:103E700000F020F90021122000F01CF90021DB20C5 -:103E800000F018F90021402000F014F90021202052 -:103E900000F010F90021022000F00CF900218D2023 -:103EA00000F008F90021142000F004F90021A420FA -:103EB00000F000F90021A62000F0FCF80021AF205E -:103EC00000F0F8F80021AF2000F0F4F80020FFF730 -:103ED00033FFBDE870400021084600F081B80000C3 -:103EE0000004024070B505460C460020FFF724FF91 -:103EF000FFF7E6FE07280CD2DFE800F004060F11FA -:103F0000131517000AA200E00BA22146284600F074 -:103F100029F8BDE8704000F049B809A2F5E70AA207 -:103F2000F3E70AA2F1E70BA2EFE70CA2EDE700002E -:103F3000444F574E000000004C454654000000001E -:103F40005249474854000000555000005052455314 -:103F50005345440053544154494300004552524F85 -:103F6000520000000FB430B5A1B00C4605468021C8 -:103F70006846FCF76FF9042D13D8142C11D8002CC7 -:103F80000FD027AA68462699FFF77CF8C4F11500E0 -:103F9000C0B200210DF800106A462146284600F004 -:103FA00071F821B030BC5DF814FB000070B50B4E09 -:103FB00000242146002000F013F8002506EBC50080 -:103FC0000121005D00F076F86D1CEDB2802DF5D377 -:103FD000641CE4B2082CECD370BD00003003002058 -:103FE00010B5801CC4B2B031C8B2002100F062F834 -:103FF000102040EA1410002100F05CF804F0F000FA -:10400000BDE81040002100F055B800002DE9F04F48 -:1040100001EB410100EB400049068006040E203A06 -:104020004FEA1169D0B2164900EB4000A0460025C6 -:1040300001EB800B00261BF805704FFA89FA380651 -:1040400001D5012200E0002261B25046FFF794FE44 -:104050007806641C070EE4B2A4EB08000C2809D013 -:10406000761CF6B2082EEAD36D1CEDB20C2DE1D30E -:10407000BDE8F08F09F10100444600F0FF09F3E7C5 -:10408000FC410008F0B517460C46064600250CE03A -:1040900021463046FFF7BAFF641CE4B2142C02D963 -:1040A0000024761CF6B26D1CEDB27A5D002AEFD1C9 -:1040B000F0BD000013B508484FF4007309B10122A8 -:1040C00000E000221946FDF704FC0A23012269469C -:1040D0000248FDF7C5FF1CBD00040240F8010020A6 -:1040E00080ED050AC0ED060A90ED071A70EE600A31 -:1040F00080ED081AC0ED070A90ED000A20EE202A94 -:1041000080ED092A90ED0A0AD0ED011A01EEA00A0D -:1041100080ED0A0AD0ED021A11EEA01A80ED0B1AFA -:10412000D0ED030AF1EE601AB4EEE10AF1EE10FAF6 -:1041300002D8B0EE610A06E0B4EEE00AF1EE10FA41 -:1041400001DBB0EE600A80ED0A0A32EE000A30EEC2 -:10415000010A80ED0C0AD0ED040AB1EE601AB4EE4B -:10416000C10AF1EE10FA02D8B0EE410A06E0B4EE50 -:10417000E00AF1EE10FA01DBB0EE600A80ED0C0A05 -:10418000704780EC050A704710B588B00A9C18B3D8 -:1041900040F2FF1002900020049005900820069045 -:1041A000080A8DF800008DF80110100A8DF8020041 -:1041B000180A8DF804008DF80530200A8DF80600E5 -:1041C0008DF803208DF8074001236A4602A90448B0 -:1041D000FCF78CFD08B010BD4FF40070DAE700006A -:1041E000D0010020000000000000000001020304D4 -:1041F0000607080900000000010203040000000097 -:104200000000000000000000000000003F4000002F -:1042100000000000000030004000300040000000BE -:1042200009000BC03D000BC03D00090018C0244030 -:104230007FE0224031800000180024C01B000D8068 -:104240003240018003801C4027401C800740004012 -:1042500010006000000000000000000000000000EE -:1042600000001F80204040200000402020401F8090 -:1042700000000000090006001F8006000900000081 -:10428000040004003F8004000400000000100060EF -:10429000000000000000000004000400040004000E -:1042A00004000000000000400000000000000000CA -:1042B000002001C006003800400000001F802040A0 -:1042C000204020401F800000000010403FC0004000 -:1042D0000000000018C02140224024401840000087 -:1042E00010802040244024401B80000002000D006C -:1042F00011003FC0014000003C8024402440244085 -:10430000238000001F8024402440344003800000AC -:104310003000200027C03800200000001B8024400F -:10432000244024401B8000001C0022C02240224068 -:104330001F80000000000000084000000000000096 -:104340000000000004600000000000000000040005 -:104350000A001100208040400900090009000900FE -:104360000900000000004040208011000A00040005 -:104370001800200023402400180000001F80204067 -:10438000274029401F400000004007C039000F00AF -:1043900001C0004020403FC0244024401B8000005A -:1043A0001F802040204020403080000020403FC03F -:1043B000204020401F80000020403FC024402E406D -:1043C00030C0000020403FC024402E0030000000DC -:1043D0000F001080204022403380020020403FC068 -:1043E000040004003FC02040204020403FC0204047 -:1043F000204000000060202020203FC0200020003E -:1044000020403FC024400B0030C0204020403FC02F -:1044100020400040004000C03FC03C0003C03C00C2 -:104420003FC0000020403FC00C4023003FC02000A0 -:104430001F802040204020401F80000020403FC0BF -:1044400024402400180000001F802140214020E06B -:104450001FA0000020403FC02440260019C000409B -:1044600018C0244024402240318000003000204009 -:104470003FC020403000000020003F80004000404E -:104480003F80200020003E0001C0070038002000CF -:10449000380007C03C0007C038000000204039C089 -:1044A000060039C0204000002000384007C03840D6 -:1044B00020000000304021C02640384020C00000CD -:1044C000000000007FE0402040200000000070005D -:1044D0000C000380004000000000402040207FE0EE -:1044E000000000000000200040002000000000004C -:1044F000001000100010001000100010000000005C -:10450000400000000000000000000280054005405F -:1045100003C0004020003FC004400440038000006E -:1045200000000380044004400640000000000380B7 -:10453000044024403FC00040000003800540054087 -:1045400003400000000004401FC02440244020001D -:10455000000002E0055005500650042020403FC0F6 -:104560000440040003C000400000044027C0004095 -:104570000000000000100010041027E00000000000 -:1045800020403FC00140070004C0044020402040BC -:104590003FC000400040000007C0040007C0040006 -:1045A00003C00000044007C00440040003C00040F2 -:1045B000000003800440044003800000041007F062 -:1045C00004500440038000000000038004400450B5 -:1045D00007F00010044007C002400400040000007F -:1045E000000006400540054004C000000000040033 -:1045F0001F80044000400000040007800040044089 -:1046000007C000400400070004C001800600040049 -:10461000060001C0070001C006000000044006C0FB -:10462000010006C0044000000410071004E00180EF -:10463000060004000000044005C0064004400000DD -:104640000000000004007BE04020000000000000AB -:104650000000FFF000000000000040207BE00400AC -:1046600000000000400080004000200020004000CA -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B0000000000000000006000000000000001ED6 -:1046C00000000000000000DE00000000000000D834 -:1046D00000000000000000D800000000000000D82A -:1046E00000000000000000DE00000000000000FEEE -:1046F00000000000000000F6000000000000007252 -:104700000000000000000000000000000000007C2D -:1047100000000000000000FE00000000000000C6D5 -:1047200000000000000000C600000000000000C6FD -:1047300000000000000000FE000000000000007CFF -:104740000000000000000000000000000000001E4B -:1047500000000000000000DE00000000000000D6A5 -:1047600000000000000000D600000000000000D69D -:1047700000000000000000D600000000000000DE85 -:1047800040000000000000FE600000000010006C0F -:1047900070000000003000007800000000F0007C95 -:1047A0007C00000007F000FE7E0000003FF000C625 -:1047B0007F000001FFF000C67F80000FFFF000C601 -:1047C0007FC0007FFFF000FE7FE003FFFFF0007C72 -:1047D0007FF03FFFFFF000027FF83FFFFFF0000691 -:1047E0007FFC3FFFFFF0001E7FFE3FFFFFF000BC9D -:1047F0007FFF3FFFFFF000E07FFFBFFFFF8000F87B -:104800007FFFFFFFFC00003E7FFFFFFFE000000E88 -:104810007FFFFFFF000000B87FFFFFF8000000E00F -:104820007FFFFFF0000000FE7FFFFFF00000001E92 -:104830007FFFFFF0000000027FFFFFF0000000009C -:104840007FEFFFF0020000067FE7FFF00200000E9E -:104850007FE3FFF00200001C7FE1FFF8030000BAD5 -:104860007FE0FFFC030000F67FE07FFE038000E6B0 -:104870007FE03FFF038000F67FE03FFF83C0003E04 -:104880007FE03FFFC3C0000E7FE03FFFE3E0000298 -:104890007FE03FFFF3E000007FE03FFFFBF000021E -:1048A0007FE03FFFFFF000667FE03FFFFFF800F68C -:1048B0007FE03FFFFFF800D67FE03FFFFFFC00D620 -:1048C0007FF07FFFFFFC00D67FF8FFF7FFFE00D6EA -:1048D0007FFFFFF3FFFE00DE3FFFFFE1FFFF008CE5 -:1048E0003FFFFFE0FFCF00401FFFFFC07FC780C03A -:1048F0001FFFFFC03FC380C00FFFFF801FC1C0FE6E -:1049000007FFFF000FC0C0FE03FFFE0007C060C02E -:1049100001FFFC0003C020C0007FF00001C0008642 -:10492000000F800000C0001600000000004000D60C -:1049300000000000000000D600000000000000D6CB -:1049400000000000000000D600000000000000D6BB -:1049500000000000000000D000000000000000C0C7 -:104960000000000000000006000000000000001E23 -:1049700000000000000000DE00000000000000D881 -:1049800000000000000000D800000000000000D877 -:1049900000000000000000DE00000000000000DE5B -:1049A00000000000000000F600000000000000729F -:1049B0000000000000000000000000000000006295 -:1049C00000000000000000F600000000000000F6FB -:1049D00000000000000000D600000000000000D62B -:1049E00000000000000000D600000000000000DE13 -:1049F000000000000000008C00000000000000002B -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000006101600061016984A000800000020D4 -:104A80001C000000C8300008B44A00081C000020C8 -:104A90006C0B0000D830000800000000000000008F -:104AA0000024F400000000000100000010000000DD -:044AB0000000000002 +:100A7000120000100400002040420F0070B5040076 +:100A80004FF0000503D0206C002610B107E00120D4 +:100A900070BD204600F01CF8666484F83C60206C51 +:100AA000C00610D4206C20F4885040F0020020646E +:100AB0002046FFF749FE6664206C20F0020040F0FB +:100AC0000100206400E0012584F83C60284670BDE8 +:100AD00010B586B0044614216846FFF7BBFB1149E8 +:100AE000206888421CD110480021026842F48072BC +:100AF0000260006800F4807005900B4814380268AA +:100B000042F001020260006800F001000590402000 +:100B100000900320CDE901016946044800F012FD70 +:100B200006B010BD002001404438024000000240E1 +:100B300090F82020012A07D0022A05D0416A41F40A +:100B40008021416201207047006842690A43426186 +:100B500000207047F0B590F820500468A468012D7B +:100B600005D0022D03D0416A41F4802153E014F0F6 +:100B7000406F01D1E5004BD5C4F30164022C03D9C9 +:100B8000416A41F4000146E00125A5401D608D68E1 +:100B90004FF4C0739DB1CE6835434E6845EAC60533 +:100BA000066803EB0417F5514FF4C275076805EBAF +:100BB00004150E697E51097D012905D009E00E88D2 +:100BC000CD6845EA4655EBE701684E5946F4807614 +:100BD0004E511179D2F805504FF4C67641EA0525F9 +:100BE000016806EB04168D511178D2F801204FF4FC +:100BF000C47541EA0221026805EB041551510068F1 +:100C000003EB0411425842F0010242500020F0BDB3 +:100C1000416A41F4001141620120F0BD10B590F825 +:100C20002020012A07D0022A05D0416A41F4802100 +:100C30004162012010BD3B48D0F8002242F0010281 +:100C4000C0F80022D0F8002222F47C52C0F8002222 +:100C5000D0F800224B6A42EA0322C0F800220A7D43 +:100C600002F01F0301229A40D0F81C329343C0F8CF +:100C70001C32CB69B3B9D0F80C329343C0F80C32B4 +:100C80008C894B6864F31F434C6900EBC404C4F8BF +:100C900040320C890B6864F31F434C6900EBC404B9 +:100CA000C4F84432CB69012B16D1D0F80C3213436F +:100CB000C0F80C320C884B6864F31F434C6900EB9E +:100CC000C404C4F840320C89CB6864F31F434C69F8 +:100CD00000EBC404C4F844328B69002BD0F8043212 +:100CE0000ED01343C0F804320B69002BD0F8143235 +:100CF00008D01343C0F81432096A012904D008E06F +:100D00009343EFE79343F5E7D0F81C121143C0F883 +:100D10001C12D0F8001221F00101C0F800120020CE +:100D200010BD000000640040704730B590F82040CE +:100D3000012C05D0022C03D0416A41F480215DE0F2 +:100D40000468002955D02469A40754D04FF4D874FE +:100D5000056804EB01142D5915F00405956005682C +:100D60002D594ED0ED08556005682C5904F0020449 +:100D7000D4604FF4DA74056804EB01142D5905F0C2 +:100D80000F05156105682D59C5F30725956105689F +:100D90002C59240C54614FF4DC72046802EB0112EC +:100DA000A4581C700468A458240A5C700468A458F1 +:100DB000240C9C700468A258120EDA704FF4DE7294 +:100DC000046802EB0112A4581C710468A458240A98 +:100DD0005C710468A458240C9C710468A258120E1B +:100DE000DA71006881B1016941F0200101610020E0 +:100DF00030BDE468A8E7416A41F400114162012076 +:100E000030BD6D0D1560AFE7C16841F02001C160D4 +:100E1000EDE72DE9F05F0546006800244669D0F84B +:100E200004908768D0F80CB0D0F810A0D0F81880E3 +:100E3000F10748D0F90714D001218160B80703D524 +:100E4000284600F01AFA0CE0780702D54FF4006447 +:100E500007E0380702D54FF4805402E0284600F03E +:100E60000BFAF80516D529684FF480708860B8052C +:100E700003D5284600F003FA0CE0780502D544F4C7 +:100E8000005407E0380502D544F4804402E02846C7 +:100E900000F0F4F9F80316D529684FF48030886023 +:100EA000B80303D5284600F0ECF90CE0780302D52E +:100EB00044F4004407E0380302D544F4803402E0EF +:100EC000284600F0DDF9300707D55FEACB6004D58E +:100ED0002968102044F40074C86070074FF00807B8 +:100EE00007D55FEA0B7004D52868C760284600F074 +:100EF0005FF9B00706D52868C068800702D0284689 +:100F000000F058F9700607D55FEACA6004D5296871 +:100F1000102044F480640861B00607D55FEA0A70C7 +:100F200004D528680761284600F076F9F00606D552 +:100F300028680069800702D0284600F06EF9B003E7 +:100F400008D55FEAC96005D52968102048602846A1 +:100F500000F064F9F00307D55FEA097004D528684A +:100F60004760284600F08EF9300446D55FEA4970A4 +:100F700040D5F00504D55FEAC87001D044F0010403 +:100F8000B00504D55FEA887001D544F0020470050D +:100F900004D55FEA487001D544F00404300529D532 +:100FA00018F0700F26D008F07000402815D006DC2D +:100FB000102809D020280AD0302816D10AE050285D +:100FC0000ED0602811D10EE044F008040DE044F08A +:100FD00010040AE044F0200407E044F0400404E078 +:100FE00044F0800401E044F480742868816921F0B1 +:100FF00070018161296804204860002C05D0686A6E +:10100000204368622846FFF78FFEBDE8F09F70B569 +:10101000040003D094F8200010B104E0012070BD5A +:10102000204600F081F82068016821F0020101608B +:1010300000F07CFB0546052604E000F077FB401B32 +:101040000A2811D8206840688007F6D42068016813 +:1010500041F00101016000F069FB05460BE000F082 +:1010600065FB401B0A2806D9606A40F400306062C4 +:1010700084F82060D2E720684068C007EFD0207E67 +:101080000128206801683DD021F080010160607E68 +:1010900001282068016838D021F040010160A07E5D +:1010A00001282068016833D021F020010160E07E32 +:1010B0000128206801682ED041F010010160207FD6 +:1010C00001282068016829D021F008010160607FB3 +:1010D00001282068016824D021F004010160D4E9CE +:1010E00002010843D4E90412114308436168491E10 +:1010F00008432168C86100206062012084F8200054 +:10110000002070BD41F08001C0E741F04001C5E71B +:1011100041F02001CAE721F01001CFE741F00801BA +:10112000D4E741F00401D9E710B586B00446142194 +:101130006846FFF78FF81B49206888422FD11A486C +:101140000021026842F000720260006800F0007046 +:10115000059015481038026842F0080202600068E5 +:10116000022200F0080005900320CDE90210CDE92D +:1011700000020920049069460C4800F0E3F90022BF +:101180001146132000F040FB132000F02FFB00223B +:101190001146142000F038FB142000F027FB06B0A5 +:1011A00010BD00000064004040380240000C0240C6 +:1011B0007047000010B5016888B0D1F8B011124A2C +:1011C000490D00910168114C91420FD10099A1F293 +:1011D000052107290AD22288C9B2521C22800C4A52 +:1011E00002EBC1036A460021FFF79FFD2088B0F59E +:1011F000FA7F06D1002020800648016881F48041F2 +:10120000016008B010BD000000640040080000202C +:1012100058060020141402407047704770470000C1 +:1012200070B5044690F82000012804D0606A40F4AC +:101230000020606218E0022084F820002068016825 +:1012400021F00101016000F071FA05460EE000BFD7 +:1012500000F06CFA401B0A2808D9606A40F400309C +:101260006062052084F82000012070BD206840687D +:10127000C007EDD1606270BD70477047704770471E +:1012800070477047704790F83510022903D08021CD +:10129000416501207047052180F83510006801681C +:1012A00021F0010101600020704700002DE9F843A2 +:1012B00004464FF00009CDF8009063484FF41651F2 +:1012C000A56D0068B0FBF1F72E6894F85C1008205B +:1012D00000FA01F131420FD021680A6852070BD59C +:1012E0000A6822F004020A6094F85C108840A86042 +:1012F000606D40F00100606594F85C104FF00108EB +:1013000008FA01F0304208D021684969090604D57D +:10131000A860606D40F00200606594F85C100420E5 +:101320008840304208D021680968890704D5A86040 +:10133000606D40F00400606594F85C1010208840F7 +:10134000304218D021680968090714D5A8602068C0 +:101350000168490304D50068000308D5A16C07E0C3 +:101360000168C90503D4016821F008010160216CFE +:1013700009B12046884794F85C102020884030420C +:1013800031D021680968C9062DD5A86094F83500C8 +:1013900005282068016806D0490347D50068000386 +:1013A0001DD4616C1CE021F01601016020684169C8 +:1013B00021F080014161206C08B9A06C20B1206847 +:1013C000016821F00801016094F85C103F2088401A +:1013D000A86084F8349084F83580216D1FE0E16BBB +:1013E00009B120468847606D00282BD0606DC0078A +:1013F00014D0052084F835002068016821F001012F +:1014000001600098401C0090B84203D82068006832 +:10141000C007F6D184F8349084F83580E16C002957 +:1014200010D001B02046BDE8F04308470168C90567 +:10143000D5D4016821F01001016084F8349084F85B +:101440003580CCE7BDE8F883040000202DE9F041A9 +:10145000044600F06BF906465CB1002584F8345070 +:10146000022084F835002068016821F00101016044 +:101470000DE00120BDE8F08100F058F9801B05283F +:1014800005D920206065032084F83500F2E7206844 +:101490000068C007F0D12268116820480140D4E9F3 +:1014A00001031843D4E903363343184363691843EF +:1014B000A3691843E3691843236A18430843616A20 +:1014C000042903D1D4E90B131943084310602068A1 +:1014D0004069666A20F0070130460E430127042860 +:1014E0000CD1A06A0643E06A40B12046FFF7E8F954 +:1014F00020B14020606584F83570BAE72068466105 +:101500002046FFF7C9F994F85C203F2191408160A3 +:10151000656584F835700020ACE700003F8010F06E +:1015200070B5044600F002F90546601C02D004487C +:101530000078044400F0FAF8401BA042FAD370BDD2 +:101540000C0000202DE9F84F00224FF00108032580 +:101550004FF00F0E0B6808FA02F42340A3426ED13D +:101560004E68012E05D0022E03D0112E01D0122E6E +:1015700012D186684FEA420C05FA0CF7BE43CF68D9 +:1015800007FA0CF7374387604668A6430C79C4F323 +:101590000014944034434460C668570005FA07FCC1 +:1015A0008C6826EA0C06BC403443C4604C68022CAC +:1015B00001D0122C13D1D40800EB8404A346D4F834 +:1015C000209054074FEAD46A0EFA0AF629EA06096F +:1015D0000E6906FA0AF646EA0906CBF820600468A6 +:1015E0000E7924EA0C0406F00306BE40264306608A +:1015F0004C68E4006FD53B4C266846F48046266074 +:10160000246822F0030604F480440094364C3444E9 +:10161000A446D4F808489607360F0EFA06F7BC43DE +:10162000324FB84201D100272EE0314FB84201D1EC +:10163000012729E02F4FB84202D1022724E04AE0D7 +:101640002D4FB84201D103271EE02C4FB84201D1E3 +:10165000042719E02A4FB84201D1052714E0294F89 +:10166000B84201D106270FE0274FB84201D1072722 +:101670000AE0264FB84201D1082705E0244FB842BE +:1016800001D1092700E00A27B7402743CCF80878A2 +:10169000204E34684F689C43FF0300D51C433460E0 +:1016A0001C4E361D34684F689C43BF0300D51C4355 +:1016B0003460184E083634684F689C43FF0200D5EA +:1016C0001C433460134E0C3634684F689C43BF0291 +:1016D00000D51C433460521C102AFFF43BAFBDE818 +:1016E000F88F000044380240003001400000024002 +:1016F0000004024000080240000C024000100240BA +:101700000014024000180240001C02400020024069 +:1017100000240240003C01400069084000D0012044 +:1017200070470AB1816170470904FBE7014880688E +:10173000704700000C0000200248816802781144C4 +:10174000816070470C0000200B4810B5016841F41F +:1017500000710160016841F480610160016841F439 +:1017600080710160032000F06FF8002000F006F89F +:1017700000F024F8002010BD003C024070B50D4D73 +:1017800004464FF47A712878B1FBF0F00A490968F1 +:10179000B1FBF0F000F03AFC48B9102C07D200225F +:1017A0002146501E00F030F800206C6070BD012012 +:1017B00070BD00000C000020040000200A4808B59D +:1017C000016841F480410160006800F480400090AD +:1017D0000548001F016841F080510160006800F079 +:1017E0008050009008BD000044380240002809DB0A +:1017F00000F01F02012191404009800000F1E0202B +:10180000C0F8001170470000F0B40E4B1B680C4686 +:10181000C3F30223C3F10705042D00D90425191DC4 +:10182000072901D2002300E0DB1E012606FA05F19C +:10183000491E214099409E40761E16403143F0BC1F +:1018400001F070BB0CED00E0064900F007020868EB +:101850004FF6FF03184040EA0220034A1043086095 +:10186000704700000CED00E00000FA052DE9F0479C +:101870000E46050065D0DFF81481D8F80000F7B2F5 +:1018800000F00F00B04207D288F80070D8F80000CE +:1018900000F00F00B04254D128683D4C810712D5AA +:1018A000400703D5206840F4E05020602878000706 +:1018B00003D5206840F4604020602068A96820F0CB +:1018C000F000084320602878C0072DD030496868B0 +:1018D0000839012812D0022813D0032811D0096832 +:1018E000890700292DDA216821F0030101432160D5 +:1018F000FFF71CFF814641F2883A0EE00968890330 +:10190000EFE709688901ECE7FFF710FFA0EB090199 +:10191000514502D90320BDE8F0872068696800F0CE +:101920000C00B0EB810FEFD1D8F80010404601F069 +:101930000F01B14207D90770006800F00F00B042F4 +:1019400001D00120E7E72878400705D52068E9683D +:1019500020F4E050084320602878000706D520686E +:10196000296920F4604040EAC100206000F038F8A6 +:101970002168084AC1F30311515CC8400649086058 +:1019800006480068FFF7FAFE0020C4E7003C02406A +:1019900008380240BE3E000804000020100000206D +:1019A0000448054900680968044AC1F38221515C72 +:1019B000C84070470400002008380240CE3E0008AE +:1019C0000448054900680968044AC1F34231515C82 +:1019D000C84070470400002008380240CE3E00088E +:1019E000154810B5006810F00C02144813D01449C3 +:1019F000042A0FD0082A0ED10F4C241F2268236816 +:101A000002F03F025B0207D52068C0F38810A0FBFC +:101A1000010106E0084610BD2168C1F38811A1FB51 +:101A200000010023FEF7DEFB2168C1F30141491CE0 +:101A30004900B0FBF1F010BD083802400024F4006A +:101A4000001BB7002DE9F84F040076D02078DFF8AE +:101A500038A3CE4DC00749D0DAF800105046C1F384 +:101A60008101012908D00068C0F3810002280AD151 +:101A7000281D0068400206D52868800336D56068B6 +:101A80000028E2D032E06068B0F5803F10D0B0F5B9 +:101A9000A02F286810D020F480302860286820F417 +:101AA000802028606068A0B1FFF740FE06460CE089 +:101AB000286840F48030F4E740F480202860F7E79D +:101AC000FFF734FE801B642873D828688003F7D59D +:101AD0000CE0FFF72BFE064605E000BFFFF726FEF1 +:101AE000801B6428F0D828688003F7D42078DFF8BA +:101AF000A08280074FF000093ED5DAF8001050466A +:101B000011F00C0F09D00068C0F3810002280BD13E +:101B10009D48001F0068400206D42868800715D53C +:101B2000E068012809D111E0E068B8B10120C8F8E7 +:101B30000000FFF7FBFD064605E020E1FFF7F6FD9C +:101B4000801B0228C0D828688007F7D5286821693B +:101B500020F0F80040EAC10028600DE0C8F80090CD +:101B6000FFF7E4FD064604E0FFF7E0FD801B0228D6 +:101B70001FD828688007F7D42078000722D5824E26 +:101B8000844861696C3671B101210160FFF7CEFDB7 +:101B9000074604E0FFF7CAFDC01B022809D83068D9 +:101BA0008007F7D50EE0C0F80090FFF7BFFD0746AD +:101BB00005E082E0FFF7BAFDC01B02287DD830683F +:101BC0008007F7D42078400768D5DFF8BCB100273C +:101BD0000BF1380BDBF80000C0000BD4DBF8001071 +:101BE00041F08051CBF80010DBF80000012700F035 +:101BF00080500090684E3068C00510D4306840F4C2 +:101C000080703060FFF792FD009005E0FFF78EFDD9 +:101C10000099401A022850D83068C005F6D55A4EAF +:101C2000A068683601280FD00528306810D020F051 +:101C300001003060306820F004003060A068B8B166 +:101C4000FFF774FD00900FE0306840F00100F4E70A +:101C500040F004003060F7E7FFF768FD0099411A93 +:101C600041F28830814266D830688007F4D50EE0B2 +:101C7000FFF75CFD009007E0FFF758FD0099411A5F +:101C800041F28830814256D830688007F4D42FB1B1 +:101C9000DBF8001021F08051CBF80010A069D0B320 +:101CA000DAF800205146C2F38102022A4AD0022803 +:101CB000484607D0C8F8600000E03CE0FFF736FD7A +:101CC00004463BE04746C8F86000FFF72FFD064694 +:101CD00005E000BFFFF72AFD801B02282BD82868EB +:101CE0008001F7D4D4E907010843A16A2B4A4908C7 +:101CF00002EB0141626A41EA8211084394F82C1018 +:101D000040EA01612048001F016001203866FFF7AA +:101D10000DFD044605E034E0FFF708FD001B022836 +:101D200009D828688001F7D52BE000BFFFF7FEFC3B +:101D3000001B022802D90320BDE8F88F2868800123 +:101D4000F4D41EE00128F7D00868E26900F48001AD +:101D5000914214D1226A00F03F0191420FD147F61F +:101D6000C071626A0140914209D1A26A00F4403117 +:101D7000914204D1E16A00F07060884201D00120F4 +:101D8000DAE70020D8E700000838024000380240B7 +:101D900000004742800E4742007000400000FFFFF5 +:101DA00070B5040005D00025A56294F8510010B16B +:101DB00006E0012070BD84F85050204600F030F855 +:101DC000022084F851002068016821F04001016080 +:101DD000D4E901010843D4E90312114308436169BE +:101DE0000843218B01F400710843E1690843216A2B +:101DF0000843A16A084321680860A069042101EA38 +:101E00001040616A0843216848602068C16921F474 +:101E10000061C1616565012084F85100002070BD3A +:101E2000F0B587B0044614216846FEF713FA1C4942 +:101E30002068884232D11B480024016841F4805157 +:101E40000160006800F4805005901648143801685D +:101E500041F002010160016801F002010591016891 +:101E600041F0010101600068022500F001000590C9 +:101E70001820CDE9000502AA0326052782E8D00034 +:101E800069460948FFF75EFB8020CDE9000502AAFC +:101E9000694682E8D0000548FFF754FB07B0F0BD63 +:101EA000003001404438024000040240000002407B +:101EB0002DE9F84F044690F8500000271D461646BD +:101EC000894601280DD04FF0010B84F850B0FFF780 +:101ED0002DFC804694F85100BA46012804D0022710 +:101EE0008EE00220BDE8F88FB9F1000F7DD0002E02 +:101EF0007BD0032084F85100C4F854A0C4F830907B +:101F0000A686E686C4F838A0A4F83CA0A4F83EA0B3 +:101F1000C4F844A0C4F840A0A068B0F5004F04D1B4 +:101F20002068016841F48041016020680168490629 +:101F300003D4016841F040010160E068B0F5006F32 +:101F4000606803D030B3012E24D040E008B1012EE8 +:101F50001CD1206B21680088C86006E02068816879 +:101F6000890709D5216B0988C160206B801C20631B +:101F7000E08E401EE08609E0FFF7D8FBA0EB0800EA +:101F8000A84202D3681C01D031E07DB3E08E002866 +:101F9000E4D11FE0206B21680078087306E0206818 +:101FA0008168890709D5216B09780173206B401C72 +:101FB0002063E08E401EE08609E0FFF7B7FBA0EB50 +:101FC0000800A84202D3681C01D010E075B1E08E71 +:101FD0000028E4D142462946204600F071FC08B1B1 +:101FE00020206065A06820B107E008E0FFE7032734 +:101FF00006E02068C16880680090606D00B101272C +:1020000084F851B084F850A038466BE710B5401EF4 +:10201000B0F1807F01D3012010BD4FF0E02460615A +:102020000F21601700F07EFF0020A06107202061D3 +:10203000002010BD10B590F83C20012A22D00122CA +:1020400080F83C20CA688C6822F4407222434C68B5 +:1020500022F4806222430C6822F4006222430C695D +:1020600022F4805222434C6922F400522243C9696F +:10207000002322F480420A4301684A6480F83C301D +:10208000002010BD022010BD70B590F83C20012A40 +:1020900032D0012480F83C40022280F83D200368C1 +:1020A0005A689D6822F070060A6832435A60134BE2 +:1020B00002689A4214D0B2F1804F11D0104B9A426C +:1020C0000ED0104B9A420BD00F4B9A4208D00F4BB8 +:1020D0009A4205D00E4B9A4202D00E4B9A4204D13E +:1020E000496825F080031943916080F83D40002144 +:1020F00080F83C10084670BD022070BD0000014011 +:102100000004004000080040000C004000040140B2 +:10211000004001400018004070B586B0044614210C +:102120006846FEF797F818492068884229D1174871 +:102130000024016841F001010160016801F0010122 +:102140000591016841F0100101600068022500F06E +:10215000100005904FF440700090CDE90154012625 +:10216000CDE9034669460A48FFF7ECF94FF4C04051 +:102170000090CDE90154CDE9034669460548FFF7D3 +:10218000E1F906B070BD00000000014030380240A7 +:10219000000002400010024070B5044690F83C0078 +:1021A0000D4601280DD0012684F83C60022084F8F9 +:1021B0003D0042B1042A18D0082A2AD00C2A4DD159 +:1021C00039E0022070BD206800F0A8FC2068816919 +:1021D00041F0080181612068816921F00401816179 +:1021E000206881692A69114311E0206800F0C6FC6B +:1021F0002068816941F4006181612068816921F46E +:1022000080618161206881692A6941EA02218161D6 +:1022100024E0206800F0E8FC2068C16941F0080172 +:10222000C1612068C16921F00401C1612068C169F0 +:102230002A69114311E0206800F00AFD2068C16995 +:1022400041F40061C1612068C16921F48061C1610C +:102250002068C1692A6941EA0221C16184F83D60B0 +:10226000002084F83C0070BD10B5040003D094F841 +:102270003D0010B107E0012010BD002084F83C00B3 +:10228000204600F00DF8022084F83D00211D206852 +:1022900000F0E0FB012084F83D00002010BD0000AC +:1022A00008B500680649884208D10648016841F02F +:1022B00001010160006800F00100009008BD00000D +:1022C00000000140443802407047000070B50268C9 +:1022D00004461068D168536910F00F0F52D003F014 +:1022E000010501F490762E435FD0C20705D0CA05E0 +:1022F00003D5E26B42F00102E263420705D5DA073B +:1023000003D0E26B42F00202E263820705D5DA07EE +:1023100003D0E26B42F00402E263020707D501F04A +:1023200020022A4303D0E26B42F00802E263E26B30 +:10233000002A33D0800604D5880602D5204600F056 +:10234000C5FC20684069E16BC0F38010090700D428 +:1023500028B3204600F0ACFC2068416949061AD534 +:10236000416921F040014161606BA0B11B490165E9 +:10237000606BFEF788FF002810D0606B016DBDE830 +:1023800070400847830610D58B060ED52046BDE861 +:10239000704000F09BBC2046FFF796FF70BD2046C2 +:1023A000FFF792FF0020E06370BD030606D50B0621 +:1023B00004D52046BDE8704000F068BD4006F3D566 +:1023C0004806F1D5D168204621F04001D160202196 +:1023D00084F8391000F08FF870BD0000A12C0008BF +:1023E00070B5040004D094F83900002510B106E05F +:1023F000012070BD84F83850204600F023F82420D6 +:1024000084F839002068C16821F40051C160204679 +:1024100000F0A8FC2068016921F490410161206866 +:10242000416921F02A0141612068C16841F40051ED +:10243000C160E563202084F8390084F83A00002068 +:1024400070BD000070B586B0064614216846FDF7E1 +:1024500001FF23493068884240D1224800250168A5 +:1024600041F010010160006800F0100005901D4867 +:102470001438016841F0020101600068694600F00B +:1024800002000590C02000900220CDE90105032044 +:102490000390072004901448FFF754F8144C134895 +:1024A00020604FF0006060604020C4E90205000138 +:1024B000C4E90405A561E561256220466562FEF771 +:1024C000C5FF08B1FEF727FA346300221146252024 +:1024D000A663FFF799F92520FFF788F906B070BDCC +:1024E000001001404438024000040240B864024039 +:1024F000F801002070477047FEE700007FB5002418 +:1025000015480094019402941249039401604FF419 +:102510008031C0E901140461047680F820400F493D +:10252000C0E90A140125C561C46080F830404561E6 +:10253000FEF7A4FA08B1FEF7EEF90620CDE9000592 +:10254000694602940448FEF7E7F9002801D0FEF737 +:10255000E2F97FBD00200140B00000200100000F23 +:10256000104810B50E4901600321416000214FF46D +:1025700000228160C0E903124FF4401242610176EB +:10258000012242768176C17601774177FEF73FFDE1 +:10259000002803D0BDE81040FEF7BDB910BD000013 +:1025A00000640040F8000020094808B5016841F4C3 +:1025B000800101600068002200F480000090114654 +:1025C0004620FFF721F9BDE808404620FFF70EB985 +:1025D000303802402DE9F04F87B014216846FDF7EE +:1025E00039FE59480024016841F002010160016888 +:1025F00001F002010591016841F0010101600168EB +:1026000001F001010591016841F0080101600168D4 +:1026100001F008010591016841F4807101600168D1 +:1026200001F480710591016841F080010160016849 +:1026300001F080010591016841F0400101600168ED +:1026400001F040010591016841F01001016001684D +:1026500001F010010591016841F02001016000685E +:102660004FF4C06500F0200005900022294637484D +:10267000FFF757F8DFF8D8A0002204215046FFF7F3 +:1026800050F800222C213348FFF74BF8DFF8C8B090 +:102690004FF48077002239465846FFF742F84FF44E +:1026A0000068002241462D48FFF73BF84FF480496F +:1026B000002249462A48FFF734F800950125CDE964 +:1026C0000154694621480394FEF73CFF0426009616 +:1026D000CDE90154694650460394FEF733FF2C20A0 +:1026E0000090CDE9015469461A480394FEF72AFF89 +:1026F0001020CDE90004694616480294FEF722FF37 +:102700000097CDE90154694658460394FEF71AFF35 +:10271000CDE9006469460D480294FEF713FFCDF839 +:102720000080CDE9015469460C480394FEF70AFF86 +:10273000CDF80090CDE90154694609480394FEF7AD +:1027400001FF07B0BDE8F08F3038024000040240BE +:1027500000200240001C024000180240001002400D +:1027600000140240104810B50E4901604FF4827108 +:10277000416000218160C1604FF400720161C0E9D5 +:1027800005122822C0E90721416281620A21C16243 +:10279000FFF706FB002803D0BDE81040FEF7BBB8EA +:1027A00010BD0000003001402001002010B592B0A3 +:1027B00000240F941C2168461094FDF74BFD202146 +:1027C00007A8FDF747FD2D482B490160A721C0E967 +:1027D000011444F62061C0E9031444618461FFF7E9 +:1027E00043FD08B1FEF797F80F940FA92348109402 +:1027F000FFF74AFC08B1FEF78EF8602000904FF416 +:102800007A70CDE90104039404940594002269468A +:102810001A480694FFF7C0FC08B1FEF77CF80422C2 +:1028200069461648FFF7B8FC08B1FEF774F80822AD +:1028300069461248FFF7B0FC08B1FEF76CF80C22AD +:1028400069460E48FFF7A8FC08B1FEF764F8079444 +:10285000089409944FF400500A94CDE90B4007A95D +:1028600006480E94FFF7E6FB08B1FEF754F803485C +:10287000FFF752FC12B010BD0000014078010020AB +:102880000C4810B50A4901604FF4E1314160002164 +:1028900081600C22C160C0E904128161C161FFF74F +:1028A0009FFD002803D0BDE81040FEF734B810BDEE +:1028B00000100140B8010020FEE77047704700009B +:1028C00038B504461248134B0068B0FBF3F04FF4E0 +:1028D0007A73584300906068B0F5827F0DD10B4643 +:1028E000009200228021204600F016F870B1606D41 +:1028F00040F020006065032038BD009830B1401ED4 +:10290000009020688068C0430006F6D5002038BDDE +:102910000400002000366E012DE9F0411D461746E7 +:102920000E460446DDF8188008E0681C06D0FEF765 +:10293000FDFEA0EB0800A8420BD255B120688068CC +:1029400036EA000030D00020B842EED10020BDE8C9 +:10295000F0812068416821F0E00141606068B0F5D5 +:10296000827F0BD1A068B0F5004F02D0B0F5806F28 +:1029700004D12068016821F040010160A06AB0F52F +:10298000005F09D12068016821F4005101602068CE +:10299000016841F400510160012084F851000020D9 +:1029A00084F850000320D2E70120CDE77047FEF7FE +:1029B000C3BE000030B593B030216846FDF74AFC35 +:1029C00014210CA8FDF746FC19480025016841F0C8 +:1029D00080510160006800F0805011901548016836 +:1029E00041F4404101600068022400F4404011902D +:1029F00001200090000401908001CDE906400620EE +:102A00000890A820CDE9090404200B906846FFF740 +:102A100019F80CA90F2081E831004FF4A0500F9055 +:102A2000E002109005210CA8FEF720FF13B030BD86 +:102A300040380240007000400548016841F47001D0 +:102A4000016003494FF00060803908607047000062 +:102A500088ED00E0F0B50268254C264D264E274F44 +:102A6000274B4FF0804CA04209D0604507D0A842C8 +:102A700005D0B04203D0B84201D0984204D122F030 +:102A8000700E4A6842EA0E02A0421BD0604519D07F +:102A9000A84217D0B04215D0B84213D0984211D0F6 +:102AA000184DA8420ED0184DA8420BD0174DA84281 +:102AB00008D0174DA84205D0164DA84202D0164D99 +:102AC000A84203D122F44075CA682A434D6922F016 +:102AD00080022A4302608A68C2620A688262A04257 +:102AE00001D0984201D10969016301214161F0BD22 +:102AF000000001400004004000080040000C0040BD +:102B000000040140004001400044014000480140F1 +:102B100000180040001C004000200040F0B5026A90 +:102B200022F001020262036A42688469124E24F0B4 +:102B300073050C682C4323F002058B682B430D4D65 +:102B4000A84201D0B04205D123F00807CB683B432F +:102B500023F00403A84201D0B04205D14D6922F40C +:102B6000407215438A692A4342608461496841631F +:102B70000362F0BD0000014000040140F0B5026AAC +:102B800022F010020262026A436884690D6824F42C +:102B9000E64444EA05248D6822F0200242EA051248 +:102BA0000F4D104EA84201D0B04206D1CF6822F09E +:102BB000800242EA071222F04002A84201D0B0424D +:102BC00007D14D6923F4406343EA85038D6943EAE5 +:102BD000850343608461496881630262F0BD00003F +:102BE0000000014000040140F0B5026A22F4807246 +:102BF0000262026A4368C46922F4007224F0730519 +:102C00000C68124E2C438D6842EA05220E4DA842F4 +:102C100001D0B04206D1CF6822F4006242EA072216 +:102C200022F48062A84201D0B04207D14D6923F45A +:102C3000405343EA05138D6943EA05134360C461B9 +:102C40004968C1630262F0BD000001400004014018 +:102C500030B5026A22F480520262046A4268C36993 +:102C60000D6823F4E64343EA05238D6824F40054F9 +:102C700044EA0534084DA84202D0084DA84204D1C8 +:102C80004D6922F4804242EA85124260C36149687C +:102C90000164046230BD00000000014000040140F6 +:102CA00010B5806B0021C185C184FFF70DFB10BDFD +:102CB0000168CA6822F49072CA6001684A6922F009 +:102CC00001024A61202180F83A10704710B590F84F +:102CD0003A10222901D0022010BD8168B1F5805F31 +:102CE00011D00169002901681FD0496801F07F03F4 +:102CF000816A4A1C82620B70C18D491E0904090C4D +:102D0000C18518D02BE00269816A002A02685268E6 +:102D100005D0D2B20A80816A491C8162ECE7C2F315 +:102D200008020A80816A891CF7E74A68816A4B1C9D +:102D300083620A70E0E70168CA6822F02002CA6074 +:102D40000168CA6822F48072CA6001684A6922F088 +:102D500001024A61202180F83A10FFF7CBFB0020E6 +:102D600010BD00002DE9F041044600680169E268E9 +:102D700021F44051114301612169A068E2690843CF +:102D80006169114308432168CA6849F20C639A4398 +:102D90000243CA6020684169A26921F4407111436D +:102DA0004161E069192764253226B0F5004F354AA4 +:102DB000354920684FF0000806D0884201D0904283 +:102DC00036D1FEF7FDFD35E0884201D0904202D1B8 +:102DD000FEF7F6FD01E0FEF7E3FD61684A18A0FB8F +:102DE000070148EB0803FDF7FDF90146B0FBF5F0DC +:102DF0000201B1FBF5F06FF01803584301EB8000BE +:102E000006EBC000B0FBF5F000F0F80002EB40026A +:102E1000B1FBF5F0584301EB800006EBC000B0FBBE +:102E2000F5F000F00700216810448860BDE8F081EB +:102E3000FEF7B6FD61688B0F8A00A0FB0701FDF766 +:102E4000D1F90146B0FBF5F06FF01802504301EBE9 +:102E5000800006EB0010B0FBF5F000F0F002B1FBD3 +:102E6000F5F002EB0012B1FBF5F06FF018035843D8 +:102E700001EB800006EB0010B0FBF5F000F00F0056 +:102E8000D1E70000001401400010014090F8391013 +:102E9000212901D0022070478168B1F5805F016A65 +:102EA0000BD04A1C0262026809785160C18C491E2D +:102EB0000904090CC1840ED017E009880268C1F327 +:102EC0000801516001690029016A02D0491C0162B0 +:102ED000ECE7891CFBE70168CA6822F08002CA603F +:102EE0000068C16841F04001C160002070470000E7 +:102EF0000148FFF7EBB90000B8010020FEE7000031 +:102F000037B514460846064B6A46214600F0ECF8F1 +:102F100004466946002000F07EFC20463EBD0000CD +:102F2000173800080907090E002804DB00F1E0202B +:102F300080F80014704700F00F0000F1E02080F8E6 +:102F4000141D704702E008C8121F08C1002AFAD1F8 +:102F500070477047002001E001C1121F002AFBD119 +:102F6000704700002DE9FF5F82B00021DDE90430E9 +:102F7000020DDDF840B0034318D044F61050A2F221 +:102F8000FF3242431514119801281FD0A5EB0B0006 +:102F9000401C5FEA000A4FF000064E4FDFF8389100 +:102FA000B046504615D5CAF1000413E0119801242B +:102FB0004AA3012801D16FEA0B010298119AC0E9D6 +:102FC0000031C0E9024206B0BDE8F09FCBF100003D +:102FD000DFE704460021404A491842EB0450CDE99E +:102FE000001012E0E00707D032463B464046494613 +:102FF000FDF717FA8046894632463B461046194689 +:10300000FDF70FFA06460F466410002CEAD1DDE901 +:103010000401DDE90023BAF1000F06DAFDF701FA39 +:1030200042464B46FDF7FDF905E0FDF76CFA4246D6 +:103030004B46FDF768FA04460E460022284BFDF782 +:10304000E9FA03D84FF0FF30014607E00022254B94 +:1030500020463146FDF73EF9FDF7C4FA102409E099 +:10306000002C0ADB0A220023FDF7BCF8039B303258 +:103070001A55641E50EA0102F2D1641C039AC4F18D +:1030800011031444119A012A03D0012208430DD1DF +:103090000AE0084304D000204FF0110B119072E7B2 +:1030A000A3EB0B056D1E0DE05B4504DD4FF0000248 +:1030B00005F1010504E003DA4FF00002A5F1010576 +:1030C000002AECD002981199C0E90231C0E900450C +:1030D00079E70000000014400000F03F30000000DD +:1030E0000000F0430000E03F2DE9FF4F95B09B4604 +:1030F0008946064600250FE2252877D10024274679 +:10310000F84A0121059400E0044316F8013F203BF2 +:1031100001FA03F01042F7D130782A2811D06FF06D +:103120002F033078A0F13002092A16D8059A44F00E +:10313000020402EB820203EB42021044761C05906B +:10314000EFE759F8042B0592002A03DA504244F4C1 +:103150000054059044F00204761C30782E2816D1D5 +:1031600016F8010F44F004042A280DD06FF02F0246 +:103170003078A0F13003092B09D807EB870302EB65 +:103180004303C718761CF3E759F8047B761C3078A4 +:103190006C280FD006DC4C2817D068280DD06A2880 +:1031A00014D104E0742810D07A280FD10DE044F433 +:1031B00000140AE044F4801401E044F440147278EE +:1031C000824202D104F58014761C761C3078662881 +:1031D0000BD013DC582877D009DC002875D045289F +:1031E000F6D04628F4D047281AD19DE118E063288C +:1031F00035D0642879D0652812D195E1702873D034 +:1032000008DC6728F1D069286FD06E280DD06F28B0 +:1032100006D1B5E073282CD0752875D0782874D0E5 +:103220005A46179990476D1C75E1C4F30250022865 +:1032300009D003280DD0D9F8001004280DD00D6056 +:1032400009F1040967E1D9F80010EA17C1E9005251 +:10325000F6E7D9F800100D80F2E70D70F0E719F8E5 +:10326000041B8DF8001000208DF80100EA460120B3 +:1032700003E059F804AB4FF0FF3061074FF0000155 +:1032800002D40DE008F101018846B9420FDA804509 +:10329000F8DB1AF808100029F4D108E008F1010160 +:1032A00088468142FADB1AF808100029F6D1059801 +:1032B0005B46A0EB080721463846179A00F094FABF +:1032C000284400EB080507E04DE029E10DE01AF87D +:1032D000010B5A4617999047B8F10108F7D25B469F +:1032E00021463846179A13E142E00A220092C4F3BD +:1032F00002524FF0000A022A08D059F804CB032AE0 +:103300004FEAEC710AD00DE029E02AE009F107014B +:1033100021F00702F2E802C1914609E00FFA8CFCA5 +:103320004FEAEC71042A03D14FFA8CFC4FEAEC719E +:10333000002907DA0A460021DCF1000C61EB0201EA +:103340002D2202E0220504D52B228DF80420012233 +:1033500003E0E20701D02022F7E7904659E00A2176 +:1033600002E010220DE010214FF0000A00910BE066 +:1033700010224FF0000A44F004040827009203E0F2 +:1033800008224FF0000A0092C4F30252022A05D02C +:1033900059F804CB0021032A08D009E009F10701FC +:1033A00021F00702F2E802C1914605E01FFA8CFC09 +:1033B000042A01D10CF0FF0C4FF00008220728D599 +:1033C000702806D0009B83F0100353EA0A0305D04F +:1033D0000EE040228DF80420012208E05CEA0102A0 +:1033E00006D030228DF804208DF805000222904688 +:1033F000009B83F0080353EA0A030AD15CEA010246 +:1034000001D1620705D530228DF804204FF0010864 +:103410007F1E582804D034A003900EA802900DE01F +:1034200036A0F9E753466046009AFCF7DBFE844677 +:103430000398825C0298401E029002705CEA0100D0 +:10344000F0D1029806A9081A00F1200A600702D5F7 +:1034500024F4803400E00127574502DDA7EB0A0081 +:1034600000E0002000EB0A01009005984144401A5A +:103470000590E00306D45B462146179A059800F0B4 +:10348000B3F90544002706E001A85A46C05D179924 +:1034900090476D1C7F1C4745F6DBE0030CD55B466F +:1034A0002146179A059800F09FF9054404E0302062 +:1034B0005A46179990476D1C0099481E00900029A4 +:1034C000F5DC08E0029802995A460078491C0291FE +:1034D000179990476D1CBAF10001AAF1010AF1DCBD +:1034E00065E10000092801003031323334353637C8 +:1034F0003839616263646566000000003031323340 +:1035000034353637383941424344454600000000DF +:1035100000F058F90544761C307800287FF4ECADB3 +:1035200019B02846BDE8F08F620700D4062709F1DC +:10353000070222F0070CFCE80223E14603F00048F2 +:103540005FEA080C02D00FF2702C0DE05FEA045C19 +:1035500002D50FF2682C07E05FEAC47C02D00FF2BC +:10356000602C01E0AFF2700C4FF0FF3823F0004305 +:10357000CDF850C065280CD006DC452809D0462877 +:103580001DD047283DD13DE0662818D067287ED160 +:1035900038E00021112F01DB112000E0781CCDE97B +:1035A000000106A90EA8FFF7DDFCDDE90F010E9A68 +:1035B00003910021009207F1010A04914DE04FF0C0 +:1035C00000400097CDE9011006A90EA8FFF7CAFC3C +:1035D000DDE90F0203920E9B11990022DDF80CA089 +:1035E0000093049211B9791C00EB010AB7EB0A00B1 +:1035F00004D4C0F1FF3007F1010A0490AAEB0700E0 +:10360000019044E0012F00DA01270021112F01DD94 +:10361000112000E03846CDE9000106A90EA8FFF709 +:10362000A1FCDDE90F010E9A0391002104910092A3 +:10363000BA4621070CD40399514500DA8A46BAF1FB +:10364000010F05DD009AAAF10101515C302908D073 +:10365000B84202DA10F1040F06DA0121CDE90110B7 +:1036600015E0AAF10101E9E7002805DC049901440D +:103670000491AAEB000102E0411C514500DD8A469D +:103680000499401A401C01904FF00040029020071E +:1036900004D40198504501DBCDF8048000208DF85A +:1036A0004F0002980DF14F07B0F1004F25D02B20AD +:1036B0000E9002984FF0020800280CDA4042029067 +:1036C0002D200E9007E00A210298FCF7CEFD303144 +:1036D000029007F8011DB8F10001A8F10108F2DC21 +:1036E00002980028EFD1791E0E980870307800F00B +:1036F000200040F0450007F8020D12A8C01B00F1A1 +:1037000007081498007800B1012000EB0A01019825 +:1037100001EBE07105984144401A401E0590E0031A +:1037200006D45B462146179A059800F05DF80544DB +:103730001498007818B15A46179990476D1CE00309 +:1037400024D55B462146179A059800F04DF80544AC +:103750001CE00498002807DBDDE90301884203DD53 +:103760000098405C179901E0179930205A4690471D +:10377000049805F10105401C04900198401E019039 +:1037800004D12E205A46179990476D1CBAF10001BA +:10379000AAF1010ADDDC05E017F8010B5A4617997A +:1037A00090476D1CB8F10001A8F10108F4DC5B46FC +:1037B0002146179A0598ABE62D0000002B0000006B +:1037C000200000002DE9F041044600251E46174662 +:1037D000880404D405E039462020B0476D1C641EDF +:1037E000F9D52846BDE8F0812DE9F04104460025D1 +:1037F0001E469046C80301D5302700E020278804E4 +:1038000004D505E041463846B0476D1C641EF9D525 +:103810002846BDE8F0810A68531C0B6010707047A1 +:10382000401F044AC0B202EBC00002680A60406850 +:10383000486070475806002038B5C0B2049C009418 +:1038400000F002F838BD000030B589B00C9C28B3F8 +:1038500040F2FF100290002008250490CDE90505F4 +:103860008DF81C00080A8DF800008DF80110100A70 +:103870008DF80200180A8DF804008DF80530200A32 +:103880008DF806008DF803208DF8074001236A4665 +:1038900002A90448FDF75EF909B030BD4FF400708D +:1038A000D8E70000F800002000B58BB0002101220D +:1038B000CDE90612059100910191029103910491C5 +:1038C0000E21CDE908216946FDF7A8F90448FDF766 +:1038D000A7FC02210248FDF72BF90BB000BD000048 +:1038E000F800002090ED120ABDEEC00A10EE100A9A +:1038F00000B270471CB5044600886946FFF790FF88 +:1039000001219DF802300DA2084600F0EFF9A07BDE +:10391000012801D000201CBDBDF8000040BAE080A5 +:10392000BDF8020040BA2081BDF8040040BA6081B1 +:103930009DF80600207301201CBD000056616C3A02 +:103940002025690010B5074C0421607820700648D6 +:10395000FDF7E2FE607010B92078012800D0002049 +:1039600010BD00000A0000200004024008B5FDF769 +:10397000EBFEFFF71FF8FEF72DFEFEF715FEFEF734 +:103980007FFFFEF7BBFDFEF7EDFEFEF7E9FDFEF75C +:103990000DFF01223C213C48FDF7C3FE00F014F965 +:1039A000002000F0CDF800F099F800F0C3F90022F3 +:1039B0004FF480713548FDF7B4FE0A20FDF7B0FDE5 +:1039C000002000F0BDF800F0B5F93148FFF76CFFBA +:1039D000304C01200025A0732571608040F2052045 +:1039E0002D4E20802B48FFF785FFFFF7ABFF80B1FE +:1039F00094ED120ADFED290A294930EE200A10EE73 +:103A0000100A84ED120A884203DD9FED260A84ED38 +:103A1000120A012124A2084600F068F9B4F9063020 +:103A200023A20121022000F061F9B4F9063024A29A +:103A30000121032000F05AF9B4F9083023A2012132 +:103A4000042000F053F93088401C00B23080FA287E +:103A500005D121483580416981F40061416100232D +:103A60001A460C490120009500F0FEF9002309498F +:103A70001A464C311846009500F0F6F900F05AF954 +:103A80000A20FDF74DFDADE7001C02400018024082 +:103A9000F8000020180000200000002000401C4614 +:103AA0000060EA4600000000474D3630323000002A +:103AB0002020566F6C746167653A2025660000000F +:103AC0002020416E676C653A2025660020205370E7 +:103AD0006565643A20256600001002402DE9F04734 +:103AE000002000F02DF8DFF8549000245FF000066D +:103AF00009EBC60000EBD400002507784FFA86F8E2 +:103B0000380604EB050041B201D5012200E0002295 +:103B1000404600F035F878066D1C070EEDB2082D12 +:103B2000EED3761CF6B2802EE2D30834E4B2402CF9 +:103B3000DCD3BDE8F04700F0FDB800004A430008C0 +:103B4000F0B500210D4BFF260C46002201280FD0B6 +:103B500003EBC20580B16F5CC7F1FF076F54521CC5 +:103B6000D2B2802AF2D9491CC9B20829EDD3F0BDDE +:103B700003EBC2056E54F2E76C54F0E758020020E4 +:103B800070B5802817D2002915DB3F2913DCCB172D +:103B900001EB5375C5F3C70325F007050124094E52 +:103BA000491B8C4006EBC000012A05D0C15C022AEB +:103BB00005D0A143C15470BDC15C2143FAE7614007 +:103BC000F8E700005802002070B5474D4FF48064BC +:103BD000002221462846FDF7A4FD4FF4FA70FDF7B8 +:103BE0009FFC012221462846FDF79BFD0021AE20C7 +:103BF00000F024F90021084600F020F900211020EF +:103C000000F01CF90021402000F018F9002181206B +:103C100000F014F90021CF2000F010F90021A120BC +:103C200000F00CF90021C82000F008F90021A620BE +:103C300000F004F90021A82000F000F900213F2045 +:103C400000F0FCF80021D32000F0F8F8002108462D +:103C500000F0F4F80021D52000F0F0F800218020D9 +:103C600000F0ECF80021D92000F0E8F80021F12064 +:103C700000F0E4F80021DA2000F0E0F80021122042 +:103C800000F0DCF80021DB2000F0D8F80021402013 +:103C900000F0D4F80021202000F0D0F8002102200C +:103CA00000F0CCF800218D2000F0C8F8002114208D +:103CB00000F0C4F80021A42000F0C0F80021A620E4 +:103CC00000F0BCF80021AF2000F0B8F80021AF20D0 +:103CD00000F0B4F80020FFF733FFBDE8704000218A +:103CE000084600F041B80000000402400FB430B5AF +:103CF000A1B00C46054680216846FCF7ABFA042DBE +:103D000013D8142C11D8002C0FD027AA6846269956 +:103D1000FFF7F6F8C4F11500C0B200210DF800104D +:103D20006A462146284600F071F821B030BC5DF8A3 +:103D300014FB000070B50B4E00242146002000F05B +:103D400013F8002506EBC5000121005D00F076F8B0 +:103D50006D1CEDB2802DF5D3641CE4B2082CECD3BD +:103D600070BD00005802002010B5801CC4B2B031F4 +:103D7000C8B2002100F062F8102040EA14100021BF +:103D800000F05CF804F0F000BDE81040002100F005 +:103D900055B800002DE9F04F01EB410100EB400068 +:103DA00049068006040E203A4FEA1169D0B216493E +:103DB00000EB4000A046002501EB800B00261BF81D +:103DC00005704FFA89FA380601D5012200E0002279 +:103DD00061B25046FFF7D4FE7806641C070EE4B2C9 +:103DE000A4EB08000C2809D0761CF6B2082EEAD302 +:103DF0006D1CEDB20C2DE1D3BDE8F08F09F101008F +:103E0000444600F0FF09F3E7D63E0008F0B5174638 +:103E10000C46064600250CE021463046FFF7BAFF67 +:103E2000641CE4B2142C02D90024761CF6B26D1C7A +:103E3000EDB27A5D002AEFD1F0BD000013B508485D +:103E40004FF4007309B1012200E000221946FDF78A +:103E500068FC0A23012269460248FEF729F81CBDC6 +:103E600000040240200100202DE9F84F00252F46D4 +:103E70003E46DDF828B0994692463446804619B150 +:103E80000846FFF72FFD0446BAF1000002D0FFF705 +:103E900029FD0646B9F1000002D0FFF723FD0746D1 +:103EA000BBF1000002D0FFF71DFD05463B46324640 +:103EB000214640460095FFF7BFFCBDE8F88F0000A3 +:103EC00000000000000001020304060708090000CA +:103ED00000000102030400000000000000000000D8 +:103EE0000000000000003F40000000000000000053 +:103EF0003000400030004000000009000BC03D00D1 +:103F00000BC03D00090018C024407FE022403180F2 +:103F10000000180024C01B000D8032400180038087 +:103F20001C4027401C80074000401000600000003B +:103F30000000000000000000000000001F80204082 +:103F400040200000402020401F80000000000900A9 +:103F500006001F80060009000000040004003F80E6 +:103F600004000400000000100060000000000000D9 +:103F7000000004000400040004000400000000002D +:103F800000400000000000000000002001C006000A +:103F90003800400000001F802040204020401F804B +:103FA0000000000010403FC000400000000018C0AA +:103FB000214022402440184000001080204024402E +:103FC00024401B80000002000D0011003FC0014092 +:103FD00000003C80244024402440238000001F80B7 +:103FE000244024403440038000003000200027C0DB +:103FF0003800200000001B802440244024401B8007 +:1040000000001C0022C0224022401F80000000004F +:1040100000000840000000000000000000000460F4 +:10402000000000000000000004000A0011002080D1 +:1040300040400900090009000900090000000000D3 +:104040004040208011000A00040018002000234096 +:104050002400180000001F802040274029401F40F6 +:104060000000004007C039000F0001C000402040A0 +:104070003FC0244024401B8000001F80204020407F +:1040800020403080000020403FC0204020401F8062 +:10409000000020403FC024402E4030C0000020409F +:1040A0003FC024402E00300000000F001080204050 +:1040B00022403380020020403FC0040004003FC083 +:1040C0002040204020403FC02040204000000060B1 +:1040D000202020203FC02000200020403FC024405E +:1040E0000B0030C0204020403FC020400040004036 +:1040F00000C03FC03C0003C03C003FC00000204067 +:104100003FC00C4023003FC020001F8020402040C3 +:1041100020401F80000020403FC0244024001800A1 +:1041200000001F802140214020E01FA0000020400F +:104130003FC02440260019C0004018C0244024403D +:10414000224031800000300020403FC0204030003D +:10415000000020003F80004000403F802000200001 +:104160003E0001C0070038002000380007C03C00B6 +:1041700007C038000000204039C0060039C0204088 +:1041800000002000384007C03840200000003040C8 +:1041900021C02640384020C00000000000007FE021 +:1041A000402040200000000070000C000380004010 +:1041B00000000000402040207FE0000000000000E0 +:1041C000200040002000000000000010001000103F +:1041D000001000100010000000004000000000006F +:1041E0000000000002800540054003C000402000A0 +:1041F0003FC00440044003800000000003800440EE +:1042000004400640000000000380044024403FC0FA +:10421000004000000380054005400340000000000E +:1042200004401FC0244024402000000002E005504C +:1042300005500650042020403FC00440040003C045 +:1042400000400000044027C00040000000000010B3 +:104250000010041027E00000000020403FC0014093 +:10426000070004C00440204020403FC00040004000 +:10427000000007C0040007C0040003C000000440A1 +:1042800007C00440040003C0004000000380044055 +:10429000044003800000041007F004500440038031 +:1042A0000000000003800440045007F000100440A8 +:1042B00007C0024004000400000000000640054062 +:1042C000054004C00000000004001F8004400040BE +:1042D0000000040007800040044007C000400400C4 +:1042E000070004C0018006000400060001C00700AA +:1042F00001C006000000044006C0010006C00440E2 +:1043000000000410071004E0018006000400000013 +:10431000044005C006400440000000000000040006 +:104320007BE040200000000000000000FFF00000E3 +:104330000000000040207BE004000000000040007E +:10434000800040002000200040000000000000002D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:104390000006000000000000001E000000000000F9 +:1043A00000DE00000000000000D800000000000057 +:1043B00000D800000000000000D80000000000004D +:1043C00000DE00000000000000FE00000000000011 +:1043D00000F6000000000000007200000000000075 +:1043E0000000000000000000007C00000000000051 +:1043F00000FE00000000000000C6000000000000F9 +:1044000000C600000000000000C600000000000020 +:1044100000FE000000000000007C00000000000022 +:104420000000000000000000001E0000000000006E +:1044300000DE00000000000000D6000000000000C8 +:1044400000D600000000000000D6000000000000C0 +:1044500000D600000000000000DE40000000000068 +:1044600000FE600000000010006C700000000030D2 +:1044700000007800000000F0007C7C00000007F0E5 +:1044800000FE7E0000003FF000C67F000001FFF04C +:1044900000C67F80000FFFF000C67FC0007FFFF0E6 +:1044A00000FE7FE003FFFFF0007C7FF03FFFFFF0A6 +:1044B00000027FF83FFFFFF000067FFC3FFFFFF0A8 +:1044C000001E7FFE3FFFFFF000BC7FFF3FFFFFF0BD +:1044D00000E07FFFBFFFFF8000F87FFFFFFFFC00D1 +:1044E000003E7FFFFFFFE000000E7FFFFFFF0000A8 +:1044F00000B87FFFFFF8000000E07FFFFFF0000042 +:1045000000FE7FFFFFF00000001E7FFFFFF00000B5 +:1045100000027FFFFFF0000000007FEFFFF00200CD +:1045200000067FE7FFF00200000E7FE3FFF00200CD +:10453000001C7FE1FFF8030000BA7FE0FFFC0300EE +:1045400000F67FE07FFE038000E67FE03FFF038010 +:1045500000F67FE03FFF83C0003E7FE03FFFC3C027 +:10456000000E7FE03FFFE3E000027FE03FFFF3E06B +:1045700000007FE03FFFFBF000027FE03FFFFFF025 +:1045800000667FE03FFFFFF800F67FE03FFFFFF8A7 +:1045900000D67FE03FFFFFFC00D67FF07FFFFFFCEF +:1045A00000D67FF8FFF7FFFE00D67FFFFFF3FFFE88 +:1045B00000DE3FFFFFE1FFFF008C3FFFFFE0FFCF8A +:1045C00000401FFFFFC07FC780C01FFFFFC03FC369 +:1045D00080C00FFFFF801FC1C0FE07FFFF000FC09C +:1045E000C0FE03FFFE0007C060C001FFFC0003C067 +:1045F00020C0007FF00001C00086000F800000C0D6 +:10460000001600000000004000D60000000000007E +:1046100000D600000000000000D6000000000000EE +:1046200000D600000000000000D6000000000000DE +:1046300000D000000000000000C0000000000000EA +:104640000006000000000000001E00000000000046 +:1046500000DE00000000000000D8000000000000A4 +:1046600000D800000000000000D80000000000009A +:1046700000DE00000000000000DE0000000000007E +:1046800000F60000000000000072000000000000C2 +:1046900000000000000000000062000000000000B8 +:1046A00000F600000000000000F60000000000001E +:1046B00000D600000000000000D60000000000004E +:1046C00000D600000000000000DE00000000000036 +:1046D000008C00000000000000000000000000004E +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000061016000637 +:104750001016000074470008000000201800000038 +:10476000442F00088C47000818000020780A000039 +:10477000542F0008000000000024F4000000000096 +:0C4780000100000010000000000000001C :04000005080001AD41 :00000001FF diff --git a/Standard_robot/Src/gpio.c b/Standard_robot/Src/gpio.c index c661604cf27831a82ac55a5f5de9d8fca3eb7480..2f78994346ee036490ac34cb7184d2c823ff30c5 100644 --- a/Standard_robot/Src/gpio.c +++ b/Standard_robot/Src/gpio.c @@ -46,6 +46,7 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); @@ -54,6 +55,9 @@ void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, OLED_DC_Pin|OLED_RST_Pin, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(Z_GPIO_Port, Z_Pin, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOH, POWER1_CTRL_Pin|POWER2_CTRL_Pin|POWER4_CTRL_Pin, GPIO_PIN_RESET); @@ -73,6 +77,13 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = Z_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(Z_GPIO_Port, &GPIO_InitStruct); + /*Configure GPIO pins : PHPin PHPin PHPin */ GPIO_InitStruct.Pin = POWER1_CTRL_Pin|POWER2_CTRL_Pin|POWER4_CTRL_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; diff --git a/Standard_robot/Src/main.c b/Standard_robot/Src/main.c index 30a8159891981a866495a2a1f0abb7a512c8e59e..c5c827b5ca6bc18fdd99b95e60470a0be43ff8a7 100644 --- a/Standard_robot/Src/main.c +++ b/Standard_robot/Src/main.c @@ -37,6 +37,7 @@ #include "bsp_led.h" #include "bsp_can.h" +#include "motor.h" #include "pid.h" #include "oled.h" #include "string.h" @@ -61,10 +62,11 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ -extern moto_info_t motor_info[MOTOR_MAX_NUM]; int16_t led_cnt; -pid_struct_t motor_pid[7]; float target_speed; +motor_t gm6020; +motor_t m2006; + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -123,78 +125,59 @@ int main(void) oled_refresh_gram(); HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, GPIO_PIN_RESET); - HAL_Delay(500); + HAL_Delay(10); oled_clear(Pen_Clear); oled_refresh_gram(); can_user_init(&hcan1); // config can filter, start can - for (uint8_t i = 0; i < 3; i++) - { - pid_init(&motor_pid[i], 2, 0.005, 2, 16000, 16000); //init pid parameter chassis, kp=2, ki=0.005, kd=2, output limit = 16000 - } - for (uint8_t i = 4; i < 7; i++) - { - pid_init(&motor_pid[i], 40, 3, 0, 30000, 30000); //init pid parameter gimbal, kp=40, ki=3, kd=0, output limit = 30000 - } + /* USER CODE END 2 */ - - + gm6020.type = GM6020; + gm6020.can_info.can_id = 0; + gm6020.can_info.tx_id = 1; + gm6020.can_info.rx_id = 0x205; /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - oled_print_button(1, 1); + /* USER CODE BEGIN 3 */ - /* led blink */ - led_cnt ++; - if (led_cnt == 250) - { - led_cnt = 0; - LED_RED_TOGGLE(); //blink cycle 500ms - } - - /* scan is key be pressd down to change target speed and pwm pulse */ + get_motor_data(&gm6020); + + /* scan is key be pressd down to change target speed and pwm pulse */ if (key_scan()) { - target_speed += 60.0f; // target speed increase 60rpm - if (target_speed > 180) // if current speed = 180, press key to stop motor + gm6020.voltage += 10000; + if (gm6020.voltage > 30000) { - target_speed = 0; + gm6020.voltage = 0; } } - - /* motor speed pid calc */ - for (uint8_t i = 0; i < 3; i++) - { - motor_info[i].set_voltage = pid_calc(&motor_pid[i], target_speed*20, motor_info[i].rotor_speed); - } - for (uint8_t i = 4; i < 7; i++) + + oled_printf(1, 1, "GM6020"); + oled_printf(2, 1," Voltage: %f", gm6020.info.GM6020_info.angle); + oled_printf(3, 1," Angle: %f", gm6020.info.GM6020_info.angle); + oled_printf(4, 1," Speed: %f", gm6020.info.GM6020_info.speed); + + /* led blink */ + led_cnt ++; + if (led_cnt == 250) { - motor_info[i].set_voltage = pid_calc(&motor_pid[i], target_speed, motor_info[i].rotor_speed); + led_cnt = 0; + LED_RED_TOGGLE(); //blink cycle 500ms } - /* send motor control message through can bus*/ - set_motor_voltage(0, - motor_info[0].set_voltage, - motor_info[1].set_voltage, - motor_info[2].set_voltage, - motor_info[3].set_voltage); - set_motor_voltage(1, - motor_info[4].set_voltage, - motor_info[5].set_voltage, - motor_info[6].set_voltage, - 0); - + set_motor_voltage(1, &gm6020, NULL, NULL, NULL); //0x1ff + set_motor_voltage(0, &m2006, NULL, NULL, NULL); //0x200 + oled_refresh_gram(); + HAL_Delay(10); } - HAL_Delay(10); /* USER CODE END 3 */ } diff --git a/Standard_robot/Standard_robot.ioc b/Standard_robot/Standard_robot.ioc index ed031719d674d26818e1e70a4a48483647b476d6..8255080ffd09ddde12160587fa066778e04085b3 100644 --- a/Standard_robot/Standard_robot.ioc +++ b/Standard_robot/Standard_robot.ioc @@ -42,32 +42,33 @@ Mcu.Name=STM32F427I(G-I)Hx Mcu.Package=UFBGA176 Mcu.Pin0=PB4 Mcu.Pin1=PB3 -Mcu.Pin10=PH2 -Mcu.Pin11=PA8 -Mcu.Pin12=PH0/OSC_IN -Mcu.Pin13=PH3 -Mcu.Pin14=PH1/OSC_OUT -Mcu.Pin15=PH4 -Mcu.Pin16=PG8 -Mcu.Pin17=PH5 -Mcu.Pin18=PB2/BOOT1 -Mcu.Pin19=PE13 +Mcu.Pin10=PA9 +Mcu.Pin11=PH2 +Mcu.Pin12=PA8 +Mcu.Pin13=PH0/OSC_IN +Mcu.Pin14=PH3 +Mcu.Pin15=PH1/OSC_OUT +Mcu.Pin16=PH4 +Mcu.Pin17=PG8 +Mcu.Pin18=PH5 +Mcu.Pin19=PB2/BOOT1 Mcu.Pin2=PA14 -Mcu.Pin20=PA6 -Mcu.Pin21=PE11 -Mcu.Pin22=PE14 -Mcu.Pin23=PA7 -Mcu.Pin24=PF14 -Mcu.Pin25=PB10 -Mcu.Pin26=VP_SYS_VS_Systick +Mcu.Pin20=PE13 +Mcu.Pin21=PA6 +Mcu.Pin22=PE11 +Mcu.Pin23=PE14 +Mcu.Pin24=PA7 +Mcu.Pin25=PF14 +Mcu.Pin26=PB10 +Mcu.Pin27=VP_SYS_VS_Systick Mcu.Pin3=PA13 Mcu.Pin4=PB9 Mcu.Pin5=PB7 Mcu.Pin6=PB6 Mcu.Pin7=PD0 Mcu.Pin8=PD1 -Mcu.Pin9=PA9 -Mcu.PinsNb=27 +Mcu.Pin9=PI2 +Mcu.PinsNb=28 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F427IIHx @@ -168,6 +169,10 @@ PH5.GPIOParameters=GPIO_Label PH5.GPIO_Label=POWER4_CTRL PH5.Locked=true PH5.Signal=GPIO_Output +PI2.GPIOParameters=GPIO_Label +PI2.GPIO_Label=Z +PI2.Locked=true +PI2.Signal=GPIO_Output PinOutPanel.CurrentBGAView=Top PinOutPanel.RotationAngle=0 ProjectManager.AskForMigrate=true