├── README.md ├── Sleep Monitor.code-workspace ├── hal └── STM32F10x_StdPeriph_Driver │ ├── Release_Notes.html │ ├── inc │ ├── misc.h │ ├── stm32f10x_adc.h │ ├── stm32f10x_bkp.h │ ├── stm32f10x_can.h │ ├── stm32f10x_cec.h │ ├── stm32f10x_crc.h │ ├── stm32f10x_dac.h │ ├── stm32f10x_dbgmcu.h │ ├── stm32f10x_dma.h │ ├── stm32f10x_exti.h │ ├── stm32f10x_flash.h │ ├── stm32f10x_fsmc.h │ ├── stm32f10x_gpio.h │ ├── stm32f10x_i2c.h │ ├── stm32f10x_iwdg.h │ ├── stm32f10x_pwr.h │ ├── stm32f10x_rcc.h │ ├── stm32f10x_rtc.h │ ├── stm32f10x_sdio.h │ ├── stm32f10x_spi.h │ ├── stm32f10x_tim.h │ ├── stm32f10x_usart.h │ └── stm32f10x_wwdg.h │ ├── src │ ├── misc.c │ ├── stm32f10x_adc.c │ ├── stm32f10x_bkp.c │ ├── stm32f10x_can.c │ ├── stm32f10x_cec.c │ ├── stm32f10x_crc.c │ ├── stm32f10x_dac.c │ ├── stm32f10x_dbgmcu.c │ ├── stm32f10x_dma.c │ ├── stm32f10x_exti.c │ ├── stm32f10x_flash.c │ ├── stm32f10x_fsmc.c │ ├── stm32f10x_gpio.c │ ├── stm32f10x_i2c.c │ ├── stm32f10x_iwdg.c │ ├── stm32f10x_pwr.c │ ├── stm32f10x_rcc.c │ ├── stm32f10x_rtc.c │ ├── stm32f10x_sdio.c │ ├── stm32f10x_spi.c │ ├── stm32f10x_tim.c │ ├── stm32f10x_usart.c │ └── stm32f10x_wwdg.c │ ├── stm32f10x.h │ ├── system_stm32f10x.c │ └── system_stm32f10x.h ├── lib ├── cJSON │ ├── cJSON.c │ └── cJSON.h └── cmsis │ ├── arm_common_tables.h │ ├── arm_const_structs.h │ ├── arm_math.h │ ├── cmsis_armcc.h │ ├── cmsis_armclang.h │ ├── cmsis_compiler.h │ ├── cmsis_gcc.h │ ├── cmsis_iccarm.h │ ├── cmsis_version.h │ ├── core_armv8mbl.h │ ├── core_armv8mml.h │ ├── core_cm0.h │ ├── core_cm0plus.h │ ├── core_cm1.h │ ├── core_cm23.h │ ├── core_cm3.h │ ├── core_cm33.h │ ├── core_cm4.h │ ├── core_cm7.h │ ├── core_sc000.h │ ├── core_sc300.h │ ├── mpu_armv7.h │ ├── mpu_armv8.h │ └── tz_context.h └── src ├── Games ├── Game_Snake.c ├── Game_Snake.h ├── Game_Snake_Data.h ├── game_of_life.c └── game_of_life.h ├── Hardware ├── Battery.c ├── Battery.h ├── Buzzer.c ├── Buzzer.h ├── CCS811.c ├── CCS811.h ├── CountSensor.c ├── CountSensor.h ├── DS3231.c ├── DS3231.h ├── EC800.c ├── EC800.h ├── EC800_Cacert.h ├── Encoder.c ├── Encoder.h ├── Key.c ├── Key.h ├── LED.c ├── LED.h ├── LightSensor.c ├── LightSensor.h ├── MAX44009.c ├── MAX44009.h ├── MLX90640.c ├── MLX90640.h ├── RTC_Alarm.c ├── RTC_Alarm.h ├── Remote.c ├── Remote.h ├── SHT45.c ├── SHT45.h ├── Servo.c ├── Servo.h ├── W25Q128.c ├── W25Q128.h ├── wdg.c └── wdg.h ├── LCD ├── bmp.h ├── lcd.c ├── lcd.h └── lcdfont.h ├── Menu ├── Menu_Setting.c ├── menu.c ├── menu.h └── menu_Data.c ├── OLED ├── OLED.c ├── OLED.h ├── OLED_Data.h ├── OLED_Data_ASCII.c ├── OLED_Data_Hanzi.c ├── OLED_Data_Hanzi_12x12.c ├── OLED_Data_Image.c └── OLED_Patch_byAdam.c ├── System ├── ADC.c ├── ADC.h ├── DMA.c ├── DMA.h ├── Delay.c ├── Delay.h ├── I2C.c ├── I2C.h ├── IC.c ├── IC.h ├── PWM.c ├── PWM.h ├── SPI.c ├── SPI.h ├── Serial.c ├── Serial.h ├── Timer.c ├── Timer.h ├── Usart3Serial.h ├── bool.h ├── sys.h ├── usart.c └── usart.h ├── Tools ├── Tools.c ├── Tools.h ├── Tools_Reader.c ├── Tools_Reader.h ├── Tools_Remote.c └── Tools_Remote.h ├── main.c ├── startup_stm32f10x_md.s ├── stm32f10x_conf.h ├── stm32f10x_it.c ├── stm32f10x_it.h ├── test.c └── test.exe /README.md: -------------------------------------------------------------------------------- 1 | # Sleep-Monitor —— 基于 stm32 的睡眠质量& 环境检测仪 2 | 3 | ![1](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/06e9547c-ad06-4274-bad5-fe46553ad3a6) 4 | ![2](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/5586d7d7-2842-4ee5-a004-eef90a222e8f) 5 | ![3](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/5ada3b6d-def1-4123-ba2e-08b2dab025cc) 6 | ![4](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/c12e83c9-30f3-4fea-9bb8-e31e450e7de8) 7 | ![5](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/dec41f81-018c-409d-bb66-57ee630cb75a) 8 | ![6](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/6c17076d-0ceb-498e-ae6b-134027fb3622) 9 | ![7](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/d87939b9-4a90-42da-b59f-0e073547e70e) 10 | ![8](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/7d7d7678-44a4-4232-8459-230d73a6a372) 11 | ![9](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/8ad97dfd-3eb3-4e35-ac44-ee7449048fad) 12 | ![10](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/4a6b67b5-bfb9-4f77-988b-8376c21f0977) 13 | ![11](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/fb959781-f353-483e-b498-cad842fd5ed8) 14 | ![12](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/542510f5-451d-49fd-b4dd-ab5a727dc69e) 15 | ![13](https://github.com/aystmjz/Sleep-Monitor/assets/85049845/40c94352-bfa5-43b2-aae0-24c0f896c57a) 16 | 17 | -------------------------------------------------------------------------------- /Sleep Monitor.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": { 8 | "EIDE.SourceTree.AutoSearchIncludePath": true, 9 | "EIDE.SourceTree.AutoSearchObjFile": true, 10 | "files.associations": { 11 | ".eideignore": "ignore", 12 | "*.a51": "a51", 13 | "*.h": "c", 14 | "*.c": "c", 15 | "*.hxx": "cpp", 16 | "*.hpp": "cpp", 17 | "*.c++": "cpp", 18 | "*.cpp": "cpp", 19 | "*.cxx": "cpp", 20 | "*.cc": "cpp", 21 | "__config": "c", 22 | "battery,h": "c" 23 | }, 24 | "files.autoGuessEncoding": true, 25 | "C_Cpp.default.configurationProvider": "cl.eide", 26 | "C_Cpp.errorSquiggles": "disabled", 27 | "[yaml]": { 28 | "editor.insertSpaces": true, 29 | "editor.tabSize": 4, 30 | "editor.autoIndent": "advanced" 31 | }, 32 | "backgroundCover.opacity": 0 33 | }, 34 | "extensions": { 35 | "recommendations": [ 36 | "cl.eide", 37 | "keroc.hex-fmt", 38 | "xiaoyongdong.srecord", 39 | "hars.cppsnippets", 40 | "zixuanwang.linkerscript", 41 | "redhat.vscode-yaml", 42 | "IBM.output-colorizer", 43 | "cschlosser.doxdocgen", 44 | "ms-vscode.vscode-serial-monitor", 45 | "dan-c-underwood.arm", 46 | "marus25.cortex-debug" 47 | ] 48 | } 49 | } -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_cec.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the CEC firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_CEC_H 25 | #define __STM32F10x_CEC_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup CEC 39 | * @{ 40 | */ 41 | 42 | 43 | /** @defgroup CEC_Exported_Types 44 | * @{ 45 | */ 46 | 47 | /** 48 | * @brief CEC Init structure definition 49 | */ 50 | typedef struct 51 | { 52 | uint16_t CEC_BitTimingMode; /*!< Configures the CEC Bit Timing Error Mode. 53 | This parameter can be a value of @ref CEC_BitTiming_Mode */ 54 | uint16_t CEC_BitPeriodMode; /*!< Configures the CEC Bit Period Error Mode. 55 | This parameter can be a value of @ref CEC_BitPeriod_Mode */ 56 | }CEC_InitTypeDef; 57 | 58 | /** 59 | * @} 60 | */ 61 | 62 | /** @defgroup CEC_Exported_Constants 63 | * @{ 64 | */ 65 | 66 | /** @defgroup CEC_BitTiming_Mode 67 | * @{ 68 | */ 69 | #define CEC_BitTimingStdMode ((uint16_t)0x00) /*!< Bit timing error Standard Mode */ 70 | #define CEC_BitTimingErrFreeMode CEC_CFGR_BTEM /*!< Bit timing error Free Mode */ 71 | 72 | #define IS_CEC_BIT_TIMING_ERROR_MODE(MODE) (((MODE) == CEC_BitTimingStdMode) || \ 73 | ((MODE) == CEC_BitTimingErrFreeMode)) 74 | /** 75 | * @} 76 | */ 77 | 78 | /** @defgroup CEC_BitPeriod_Mode 79 | * @{ 80 | */ 81 | #define CEC_BitPeriodStdMode ((uint16_t)0x00) /*!< Bit period error Standard Mode */ 82 | #define CEC_BitPeriodFlexibleMode CEC_CFGR_BPEM /*!< Bit period error Flexible Mode */ 83 | 84 | #define IS_CEC_BIT_PERIOD_ERROR_MODE(MODE) (((MODE) == CEC_BitPeriodStdMode) || \ 85 | ((MODE) == CEC_BitPeriodFlexibleMode)) 86 | /** 87 | * @} 88 | */ 89 | 90 | 91 | /** @defgroup CEC_interrupts_definition 92 | * @{ 93 | */ 94 | #define CEC_IT_TERR CEC_CSR_TERR 95 | #define CEC_IT_TBTRF CEC_CSR_TBTRF 96 | #define CEC_IT_RERR CEC_CSR_RERR 97 | #define CEC_IT_RBTF CEC_CSR_RBTF 98 | #define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TERR) || ((IT) == CEC_IT_TBTRF) || \ 99 | ((IT) == CEC_IT_RERR) || ((IT) == CEC_IT_RBTF)) 100 | /** 101 | * @} 102 | */ 103 | 104 | 105 | /** @defgroup CEC_Own_Address 106 | * @{ 107 | */ 108 | #define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10) 109 | /** 110 | * @} 111 | */ 112 | 113 | /** @defgroup CEC_Prescaler 114 | * @{ 115 | */ 116 | #define IS_CEC_PRESCALER(PRESCALER) ((PRESCALER) <= 0x3FFF) 117 | 118 | /** 119 | * @} 120 | */ 121 | 122 | /** @defgroup CEC_flags_definition 123 | * @{ 124 | */ 125 | 126 | /** 127 | * @brief ESR register flags 128 | */ 129 | #define CEC_FLAG_BTE ((uint32_t)0x10010000) 130 | #define CEC_FLAG_BPE ((uint32_t)0x10020000) 131 | #define CEC_FLAG_RBTFE ((uint32_t)0x10040000) 132 | #define CEC_FLAG_SBE ((uint32_t)0x10080000) 133 | #define CEC_FLAG_ACKE ((uint32_t)0x10100000) 134 | #define CEC_FLAG_LINE ((uint32_t)0x10200000) 135 | #define CEC_FLAG_TBTFE ((uint32_t)0x10400000) 136 | 137 | /** 138 | * @brief CSR register flags 139 | */ 140 | #define CEC_FLAG_TEOM ((uint32_t)0x00000002) 141 | #define CEC_FLAG_TERR ((uint32_t)0x00000004) 142 | #define CEC_FLAG_TBTRF ((uint32_t)0x00000008) 143 | #define CEC_FLAG_RSOM ((uint32_t)0x00000010) 144 | #define CEC_FLAG_REOM ((uint32_t)0x00000020) 145 | #define CEC_FLAG_RERR ((uint32_t)0x00000040) 146 | #define CEC_FLAG_RBTF ((uint32_t)0x00000080) 147 | 148 | #define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFF03) == 0x00) && ((FLAG) != 0x00)) 149 | 150 | #define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_BTE) || ((FLAG) == CEC_FLAG_BPE) || \ 151 | ((FLAG) == CEC_FLAG_RBTFE) || ((FLAG)== CEC_FLAG_SBE) || \ 152 | ((FLAG) == CEC_FLAG_ACKE) || ((FLAG) == CEC_FLAG_LINE) || \ 153 | ((FLAG) == CEC_FLAG_TBTFE) || ((FLAG) == CEC_FLAG_TEOM) || \ 154 | ((FLAG) == CEC_FLAG_TERR) || ((FLAG) == CEC_FLAG_TBTRF) || \ 155 | ((FLAG) == CEC_FLAG_RSOM) || ((FLAG) == CEC_FLAG_REOM) || \ 156 | ((FLAG) == CEC_FLAG_RERR) || ((FLAG) == CEC_FLAG_RBTF)) 157 | 158 | /** 159 | * @} 160 | */ 161 | 162 | /** 163 | * @} 164 | */ 165 | 166 | /** @defgroup CEC_Exported_Macros 167 | * @{ 168 | */ 169 | 170 | /** 171 | * @} 172 | */ 173 | 174 | /** @defgroup CEC_Exported_Functions 175 | * @{ 176 | */ 177 | void CEC_DeInit(void); 178 | void CEC_Init(CEC_InitTypeDef* CEC_InitStruct); 179 | void CEC_Cmd(FunctionalState NewState); 180 | void CEC_ITConfig(FunctionalState NewState); 181 | void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress); 182 | void CEC_SetPrescaler(uint16_t CEC_Prescaler); 183 | void CEC_SendDataByte(uint8_t Data); 184 | uint8_t CEC_ReceiveDataByte(void); 185 | void CEC_StartOfMessage(void); 186 | void CEC_EndOfMessageCmd(FunctionalState NewState); 187 | FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG); 188 | void CEC_ClearFlag(uint32_t CEC_FLAG); 189 | ITStatus CEC_GetITStatus(uint8_t CEC_IT); 190 | void CEC_ClearITPendingBit(uint16_t CEC_IT); 191 | 192 | #ifdef __cplusplus 193 | } 194 | #endif 195 | 196 | #endif /* __STM32F10x_CEC_H */ 197 | 198 | /** 199 | * @} 200 | */ 201 | 202 | /** 203 | * @} 204 | */ 205 | 206 | /** 207 | * @} 208 | */ 209 | 210 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 211 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_crc.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the CRC firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_CRC_H 25 | #define __STM32F10x_CRC_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup CRC 39 | * @{ 40 | */ 41 | 42 | /** @defgroup CRC_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup CRC_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | /** 55 | * @} 56 | */ 57 | 58 | /** @defgroup CRC_Exported_Macros 59 | * @{ 60 | */ 61 | 62 | /** 63 | * @} 64 | */ 65 | 66 | /** @defgroup CRC_Exported_Functions 67 | * @{ 68 | */ 69 | 70 | void CRC_ResetDR(void); 71 | uint32_t CRC_CalcCRC(uint32_t Data); 72 | uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); 73 | uint32_t CRC_GetCRC(void); 74 | void CRC_SetIDRegister(uint8_t IDValue); 75 | uint8_t CRC_GetIDRegister(void); 76 | 77 | #ifdef __cplusplus 78 | } 79 | #endif 80 | 81 | #endif /* __STM32F10x_CRC_H */ 82 | /** 83 | * @} 84 | */ 85 | 86 | /** 87 | * @} 88 | */ 89 | 90 | /** 91 | * @} 92 | */ 93 | 94 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 95 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_dbgmcu.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the DBGMCU 8 | * firmware library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_DBGMCU_H 25 | #define __STM32F10x_DBGMCU_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup DBGMCU 39 | * @{ 40 | */ 41 | 42 | /** @defgroup DBGMCU_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup DBGMCU_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | #define DBGMCU_SLEEP ((uint32_t)0x00000001) 55 | #define DBGMCU_STOP ((uint32_t)0x00000002) 56 | #define DBGMCU_STANDBY ((uint32_t)0x00000004) 57 | #define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) 58 | #define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) 59 | #define DBGMCU_TIM1_STOP ((uint32_t)0x00000400) 60 | #define DBGMCU_TIM2_STOP ((uint32_t)0x00000800) 61 | #define DBGMCU_TIM3_STOP ((uint32_t)0x00001000) 62 | #define DBGMCU_TIM4_STOP ((uint32_t)0x00002000) 63 | #define DBGMCU_CAN1_STOP ((uint32_t)0x00004000) 64 | #define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) 65 | #define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) 66 | #define DBGMCU_TIM8_STOP ((uint32_t)0x00020000) 67 | #define DBGMCU_TIM5_STOP ((uint32_t)0x00040000) 68 | #define DBGMCU_TIM6_STOP ((uint32_t)0x00080000) 69 | #define DBGMCU_TIM7_STOP ((uint32_t)0x00100000) 70 | #define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) 71 | #define DBGMCU_TIM15_STOP ((uint32_t)0x00400000) 72 | #define DBGMCU_TIM16_STOP ((uint32_t)0x00800000) 73 | #define DBGMCU_TIM17_STOP ((uint32_t)0x01000000) 74 | #define DBGMCU_TIM12_STOP ((uint32_t)0x02000000) 75 | #define DBGMCU_TIM13_STOP ((uint32_t)0x04000000) 76 | #define DBGMCU_TIM14_STOP ((uint32_t)0x08000000) 77 | #define DBGMCU_TIM9_STOP ((uint32_t)0x10000000) 78 | #define DBGMCU_TIM10_STOP ((uint32_t)0x20000000) 79 | #define DBGMCU_TIM11_STOP ((uint32_t)0x40000000) 80 | 81 | #define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0x800000F8) == 0x00) && ((PERIPH) != 0x00)) 82 | /** 83 | * @} 84 | */ 85 | 86 | /** @defgroup DBGMCU_Exported_Macros 87 | * @{ 88 | */ 89 | 90 | /** 91 | * @} 92 | */ 93 | 94 | /** @defgroup DBGMCU_Exported_Functions 95 | * @{ 96 | */ 97 | 98 | uint32_t DBGMCU_GetREVID(void); 99 | uint32_t DBGMCU_GetDEVID(void); 100 | void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); 101 | 102 | #ifdef __cplusplus 103 | } 104 | #endif 105 | 106 | #endif /* __STM32F10x_DBGMCU_H */ 107 | /** 108 | * @} 109 | */ 110 | 111 | /** 112 | * @} 113 | */ 114 | 115 | /** 116 | * @} 117 | */ 118 | 119 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 120 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_exti.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the EXTI firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_EXTI_H 25 | #define __STM32F10x_EXTI_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup EXTI 39 | * @{ 40 | */ 41 | 42 | /** @defgroup EXTI_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @brief EXTI mode enumeration 48 | */ 49 | 50 | typedef enum 51 | { 52 | EXTI_Mode_Interrupt = 0x00, 53 | EXTI_Mode_Event = 0x04 54 | }EXTIMode_TypeDef; 55 | 56 | #define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) 57 | 58 | /** 59 | * @brief EXTI Trigger enumeration 60 | */ 61 | 62 | typedef enum 63 | { 64 | EXTI_Trigger_Rising = 0x08, 65 | EXTI_Trigger_Falling = 0x0C, 66 | EXTI_Trigger_Rising_Falling = 0x10 67 | }EXTITrigger_TypeDef; 68 | 69 | #define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ 70 | ((TRIGGER) == EXTI_Trigger_Falling) || \ 71 | ((TRIGGER) == EXTI_Trigger_Rising_Falling)) 72 | /** 73 | * @brief EXTI Init Structure definition 74 | */ 75 | 76 | typedef struct 77 | { 78 | uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. 79 | This parameter can be any combination of @ref EXTI_Lines */ 80 | 81 | EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. 82 | This parameter can be a value of @ref EXTIMode_TypeDef */ 83 | 84 | EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. 85 | This parameter can be a value of @ref EXTIMode_TypeDef */ 86 | 87 | FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. 88 | This parameter can be set either to ENABLE or DISABLE */ 89 | }EXTI_InitTypeDef; 90 | 91 | /** 92 | * @} 93 | */ 94 | 95 | /** @defgroup EXTI_Exported_Constants 96 | * @{ 97 | */ 98 | 99 | /** @defgroup EXTI_Lines 100 | * @{ 101 | */ 102 | 103 | #define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ 104 | #define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ 105 | #define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ 106 | #define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ 107 | #define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ 108 | #define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ 109 | #define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ 110 | #define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ 111 | #define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ 112 | #define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ 113 | #define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ 114 | #define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ 115 | #define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ 116 | #define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ 117 | #define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ 118 | #define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ 119 | #define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ 120 | #define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ 121 | #define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS 122 | Wakeup from suspend event */ 123 | #define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ 124 | 125 | #define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 0x00) && ((LINE) != (uint16_t)0x00)) 126 | #define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ 127 | ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ 128 | ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ 129 | ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ 130 | ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ 131 | ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ 132 | ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ 133 | ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ 134 | ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ 135 | ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19)) 136 | 137 | 138 | /** 139 | * @} 140 | */ 141 | 142 | /** 143 | * @} 144 | */ 145 | 146 | /** @defgroup EXTI_Exported_Macros 147 | * @{ 148 | */ 149 | 150 | /** 151 | * @} 152 | */ 153 | 154 | /** @defgroup EXTI_Exported_Functions 155 | * @{ 156 | */ 157 | 158 | void EXTI_DeInit(void); 159 | void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 160 | void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); 161 | void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); 162 | FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); 163 | void EXTI_ClearFlag(uint32_t EXTI_Line); 164 | ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); 165 | void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 166 | 167 | #ifdef __cplusplus 168 | } 169 | #endif 170 | 171 | #endif /* __STM32F10x_EXTI_H */ 172 | /** 173 | * @} 174 | */ 175 | 176 | /** 177 | * @} 178 | */ 179 | 180 | /** 181 | * @} 182 | */ 183 | 184 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 185 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_iwdg.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the IWDG 8 | * firmware library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_IWDG_H 25 | #define __STM32F10x_IWDG_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup IWDG 39 | * @{ 40 | */ 41 | 42 | /** @defgroup IWDG_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup IWDG_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | /** @defgroup IWDG_WriteAccess 55 | * @{ 56 | */ 57 | 58 | #define IWDG_WriteAccess_Enable ((uint16_t)0x5555) 59 | #define IWDG_WriteAccess_Disable ((uint16_t)0x0000) 60 | #define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ 61 | ((ACCESS) == IWDG_WriteAccess_Disable)) 62 | /** 63 | * @} 64 | */ 65 | 66 | /** @defgroup IWDG_prescaler 67 | * @{ 68 | */ 69 | 70 | #define IWDG_Prescaler_4 ((uint8_t)0x00) 71 | #define IWDG_Prescaler_8 ((uint8_t)0x01) 72 | #define IWDG_Prescaler_16 ((uint8_t)0x02) 73 | #define IWDG_Prescaler_32 ((uint8_t)0x03) 74 | #define IWDG_Prescaler_64 ((uint8_t)0x04) 75 | #define IWDG_Prescaler_128 ((uint8_t)0x05) 76 | #define IWDG_Prescaler_256 ((uint8_t)0x06) 77 | #define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ 78 | ((PRESCALER) == IWDG_Prescaler_8) || \ 79 | ((PRESCALER) == IWDG_Prescaler_16) || \ 80 | ((PRESCALER) == IWDG_Prescaler_32) || \ 81 | ((PRESCALER) == IWDG_Prescaler_64) || \ 82 | ((PRESCALER) == IWDG_Prescaler_128)|| \ 83 | ((PRESCALER) == IWDG_Prescaler_256)) 84 | /** 85 | * @} 86 | */ 87 | 88 | /** @defgroup IWDG_Flag 89 | * @{ 90 | */ 91 | 92 | #define IWDG_FLAG_PVU ((uint16_t)0x0001) 93 | #define IWDG_FLAG_RVU ((uint16_t)0x0002) 94 | #define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) 95 | #define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) 96 | /** 97 | * @} 98 | */ 99 | 100 | /** 101 | * @} 102 | */ 103 | 104 | /** @defgroup IWDG_Exported_Macros 105 | * @{ 106 | */ 107 | 108 | /** 109 | * @} 110 | */ 111 | 112 | /** @defgroup IWDG_Exported_Functions 113 | * @{ 114 | */ 115 | 116 | void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); 117 | void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); 118 | void IWDG_SetReload(uint16_t Reload); 119 | void IWDG_ReloadCounter(void); 120 | void IWDG_Enable(void); 121 | FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); 122 | 123 | #ifdef __cplusplus 124 | } 125 | #endif 126 | 127 | #endif /* __STM32F10x_IWDG_H */ 128 | /** 129 | * @} 130 | */ 131 | 132 | /** 133 | * @} 134 | */ 135 | 136 | /** 137 | * @} 138 | */ 139 | 140 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 141 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_pwr.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the PWR firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_PWR_H 25 | #define __STM32F10x_PWR_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup PWR 39 | * @{ 40 | */ 41 | 42 | /** @defgroup PWR_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup PWR_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | /** @defgroup PVD_detection_level 55 | * @{ 56 | */ 57 | 58 | #define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) 59 | #define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) 60 | #define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) 61 | #define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) 62 | #define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) 63 | #define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) 64 | #define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) 65 | #define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) 66 | #define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_2V2) || ((LEVEL) == PWR_PVDLevel_2V3)|| \ 67 | ((LEVEL) == PWR_PVDLevel_2V4) || ((LEVEL) == PWR_PVDLevel_2V5)|| \ 68 | ((LEVEL) == PWR_PVDLevel_2V6) || ((LEVEL) == PWR_PVDLevel_2V7)|| \ 69 | ((LEVEL) == PWR_PVDLevel_2V8) || ((LEVEL) == PWR_PVDLevel_2V9)) 70 | /** 71 | * @} 72 | */ 73 | 74 | /** @defgroup Regulator_state_is_STOP_mode 75 | * @{ 76 | */ 77 | 78 | #define PWR_Regulator_ON ((uint32_t)0x00000000) 79 | #define PWR_Regulator_LowPower ((uint32_t)0x00000001) 80 | #define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ 81 | ((REGULATOR) == PWR_Regulator_LowPower)) 82 | /** 83 | * @} 84 | */ 85 | 86 | /** @defgroup STOP_mode_entry 87 | * @{ 88 | */ 89 | 90 | #define PWR_STOPEntry_WFI ((uint8_t)0x01) 91 | #define PWR_STOPEntry_WFE ((uint8_t)0x02) 92 | #define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) 93 | 94 | /** 95 | * @} 96 | */ 97 | 98 | /** @defgroup PWR_Flag 99 | * @{ 100 | */ 101 | 102 | #define PWR_FLAG_WU ((uint32_t)0x00000001) 103 | #define PWR_FLAG_SB ((uint32_t)0x00000002) 104 | #define PWR_FLAG_PVDO ((uint32_t)0x00000004) 105 | #define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ 106 | ((FLAG) == PWR_FLAG_PVDO)) 107 | 108 | #define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) 109 | /** 110 | * @} 111 | */ 112 | 113 | /** 114 | * @} 115 | */ 116 | 117 | /** @defgroup PWR_Exported_Macros 118 | * @{ 119 | */ 120 | 121 | /** 122 | * @} 123 | */ 124 | 125 | /** @defgroup PWR_Exported_Functions 126 | * @{ 127 | */ 128 | 129 | void PWR_DeInit(void); 130 | void PWR_BackupAccessCmd(FunctionalState NewState); 131 | void PWR_PVDCmd(FunctionalState NewState); 132 | void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); 133 | void PWR_WakeUpPinCmd(FunctionalState NewState); 134 | void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); 135 | void PWR_EnterSTANDBYMode(void); 136 | FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); 137 | void PWR_ClearFlag(uint32_t PWR_FLAG); 138 | 139 | #ifdef __cplusplus 140 | } 141 | #endif 142 | 143 | #endif /* __STM32F10x_PWR_H */ 144 | /** 145 | * @} 146 | */ 147 | 148 | /** 149 | * @} 150 | */ 151 | 152 | /** 153 | * @} 154 | */ 155 | 156 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 157 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_rtc.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the RTC firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_RTC_H 25 | #define __STM32F10x_RTC_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup RTC 39 | * @{ 40 | */ 41 | 42 | /** @defgroup RTC_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup RTC_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | /** @defgroup RTC_interrupts_define 55 | * @{ 56 | */ 57 | 58 | #define RTC_IT_OW ((uint16_t)0x0004) /*!< Overflow interrupt */ 59 | #define RTC_IT_ALR ((uint16_t)0x0002) /*!< Alarm interrupt */ 60 | #define RTC_IT_SEC ((uint16_t)0x0001) /*!< Second interrupt */ 61 | #define IS_RTC_IT(IT) ((((IT) & (uint16_t)0xFFF8) == 0x00) && ((IT) != 0x00)) 62 | #define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_OW) || ((IT) == RTC_IT_ALR) || \ 63 | ((IT) == RTC_IT_SEC)) 64 | /** 65 | * @} 66 | */ 67 | 68 | /** @defgroup RTC_interrupts_flags 69 | * @{ 70 | */ 71 | 72 | #define RTC_FLAG_RTOFF ((uint16_t)0x0020) /*!< RTC Operation OFF flag */ 73 | #define RTC_FLAG_RSF ((uint16_t)0x0008) /*!< Registers Synchronized flag */ 74 | #define RTC_FLAG_OW ((uint16_t)0x0004) /*!< Overflow flag */ 75 | #define RTC_FLAG_ALR ((uint16_t)0x0002) /*!< Alarm flag */ 76 | #define RTC_FLAG_SEC ((uint16_t)0x0001) /*!< Second flag */ 77 | #define IS_RTC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFF0) == 0x00) && ((FLAG) != 0x00)) 78 | #define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_RTOFF) || ((FLAG) == RTC_FLAG_RSF) || \ 79 | ((FLAG) == RTC_FLAG_OW) || ((FLAG) == RTC_FLAG_ALR) || \ 80 | ((FLAG) == RTC_FLAG_SEC)) 81 | #define IS_RTC_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFFFF) 82 | 83 | /** 84 | * @} 85 | */ 86 | 87 | /** 88 | * @} 89 | */ 90 | 91 | /** @defgroup RTC_Exported_Macros 92 | * @{ 93 | */ 94 | 95 | /** 96 | * @} 97 | */ 98 | 99 | /** @defgroup RTC_Exported_Functions 100 | * @{ 101 | */ 102 | 103 | void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); 104 | void RTC_EnterConfigMode(void); 105 | void RTC_ExitConfigMode(void); 106 | uint32_t RTC_GetCounter(void); 107 | void RTC_SetCounter(uint32_t CounterValue); 108 | void RTC_SetPrescaler(uint32_t PrescalerValue); 109 | void RTC_SetAlarm(uint32_t AlarmValue); 110 | uint32_t RTC_GetDivider(void); 111 | void RTC_WaitForLastTask(void); 112 | void RTC_WaitForSynchro(void); 113 | FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); 114 | void RTC_ClearFlag(uint16_t RTC_FLAG); 115 | ITStatus RTC_GetITStatus(uint16_t RTC_IT); 116 | void RTC_ClearITPendingBit(uint16_t RTC_IT); 117 | 118 | #ifdef __cplusplus 119 | } 120 | #endif 121 | 122 | #endif /* __STM32F10x_RTC_H */ 123 | /** 124 | * @} 125 | */ 126 | 127 | /** 128 | * @} 129 | */ 130 | 131 | /** 132 | * @} 133 | */ 134 | 135 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 136 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_wwdg.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file contains all the functions prototypes for the WWDG firmware 8 | * library. 9 | ****************************************************************************** 10 | * @attention 11 | * 12 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 13 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 14 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 15 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 16 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 17 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 18 | * 19 | *

© COPYRIGHT 2011 STMicroelectronics

20 | ****************************************************************************** 21 | */ 22 | 23 | /* Define to prevent recursive inclusion -------------------------------------*/ 24 | #ifndef __STM32F10x_WWDG_H 25 | #define __STM32F10x_WWDG_H 26 | 27 | #ifdef __cplusplus 28 | extern "C" { 29 | #endif 30 | 31 | /* Includes ------------------------------------------------------------------*/ 32 | #include "stm32f10x.h" 33 | 34 | /** @addtogroup STM32F10x_StdPeriph_Driver 35 | * @{ 36 | */ 37 | 38 | /** @addtogroup WWDG 39 | * @{ 40 | */ 41 | 42 | /** @defgroup WWDG_Exported_Types 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup WWDG_Exported_Constants 51 | * @{ 52 | */ 53 | 54 | /** @defgroup WWDG_Prescaler 55 | * @{ 56 | */ 57 | 58 | #define WWDG_Prescaler_1 ((uint32_t)0x00000000) 59 | #define WWDG_Prescaler_2 ((uint32_t)0x00000080) 60 | #define WWDG_Prescaler_4 ((uint32_t)0x00000100) 61 | #define WWDG_Prescaler_8 ((uint32_t)0x00000180) 62 | #define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ 63 | ((PRESCALER) == WWDG_Prescaler_2) || \ 64 | ((PRESCALER) == WWDG_Prescaler_4) || \ 65 | ((PRESCALER) == WWDG_Prescaler_8)) 66 | #define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) 67 | #define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) 68 | 69 | /** 70 | * @} 71 | */ 72 | 73 | /** 74 | * @} 75 | */ 76 | 77 | /** @defgroup WWDG_Exported_Macros 78 | * @{ 79 | */ 80 | /** 81 | * @} 82 | */ 83 | 84 | /** @defgroup WWDG_Exported_Functions 85 | * @{ 86 | */ 87 | 88 | void WWDG_DeInit(void); 89 | void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); 90 | void WWDG_SetWindowValue(uint8_t WindowValue); 91 | void WWDG_EnableIT(void); 92 | void WWDG_SetCounter(uint8_t Counter); 93 | void WWDG_Enable(uint8_t Counter); 94 | FlagStatus WWDG_GetFlagStatus(void); 95 | void WWDG_ClearFlag(void); 96 | 97 | #ifdef __cplusplus 98 | } 99 | #endif 100 | 101 | #endif /* __STM32F10x_WWDG_H */ 102 | 103 | /** 104 | * @} 105 | */ 106 | 107 | /** 108 | * @} 109 | */ 110 | 111 | /** 112 | * @} 113 | */ 114 | 115 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 116 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_crc.c 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file provides all the CRC firmware functions. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Includes ------------------------------------------------------------------*/ 23 | #include "stm32f10x_crc.h" 24 | 25 | /** @addtogroup STM32F10x_StdPeriph_Driver 26 | * @{ 27 | */ 28 | 29 | /** @defgroup CRC 30 | * @brief CRC driver modules 31 | * @{ 32 | */ 33 | 34 | /** @defgroup CRC_Private_TypesDefinitions 35 | * @{ 36 | */ 37 | 38 | /** 39 | * @} 40 | */ 41 | 42 | /** @defgroup CRC_Private_Defines 43 | * @{ 44 | */ 45 | 46 | /** 47 | * @} 48 | */ 49 | 50 | /** @defgroup CRC_Private_Macros 51 | * @{ 52 | */ 53 | 54 | /** 55 | * @} 56 | */ 57 | 58 | /** @defgroup CRC_Private_Variables 59 | * @{ 60 | */ 61 | 62 | /** 63 | * @} 64 | */ 65 | 66 | /** @defgroup CRC_Private_FunctionPrototypes 67 | * @{ 68 | */ 69 | 70 | /** 71 | * @} 72 | */ 73 | 74 | /** @defgroup CRC_Private_Functions 75 | * @{ 76 | */ 77 | 78 | /** 79 | * @brief Resets the CRC Data register (DR). 80 | * @param None 81 | * @retval None 82 | */ 83 | void CRC_ResetDR(void) 84 | { 85 | /* Reset CRC generator */ 86 | CRC->CR = CRC_CR_RESET; 87 | } 88 | 89 | /** 90 | * @brief Computes the 32-bit CRC of a given data word(32-bit). 91 | * @param Data: data word(32-bit) to compute its CRC 92 | * @retval 32-bit CRC 93 | */ 94 | uint32_t CRC_CalcCRC(uint32_t Data) 95 | { 96 | CRC->DR = Data; 97 | 98 | return (CRC->DR); 99 | } 100 | 101 | /** 102 | * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). 103 | * @param pBuffer: pointer to the buffer containing the data to be computed 104 | * @param BufferLength: length of the buffer to be computed 105 | * @retval 32-bit CRC 106 | */ 107 | uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) 108 | { 109 | uint32_t index = 0; 110 | 111 | for(index = 0; index < BufferLength; index++) 112 | { 113 | CRC->DR = pBuffer[index]; 114 | } 115 | return (CRC->DR); 116 | } 117 | 118 | /** 119 | * @brief Returns the current CRC value. 120 | * @param None 121 | * @retval 32-bit CRC 122 | */ 123 | uint32_t CRC_GetCRC(void) 124 | { 125 | return (CRC->DR); 126 | } 127 | 128 | /** 129 | * @brief Stores a 8-bit data in the Independent Data(ID) register. 130 | * @param IDValue: 8-bit value to be stored in the ID register 131 | * @retval None 132 | */ 133 | void CRC_SetIDRegister(uint8_t IDValue) 134 | { 135 | CRC->IDR = IDValue; 136 | } 137 | 138 | /** 139 | * @brief Returns the 8-bit data stored in the Independent Data(ID) register 140 | * @param None 141 | * @retval 8-bit value of the ID register 142 | */ 143 | uint8_t CRC_GetIDRegister(void) 144 | { 145 | return (CRC->IDR); 146 | } 147 | 148 | /** 149 | * @} 150 | */ 151 | 152 | /** 153 | * @} 154 | */ 155 | 156 | /** 157 | * @} 158 | */ 159 | 160 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 161 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_dbgmcu.c 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file provides all the DBGMCU firmware functions. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Includes ------------------------------------------------------------------*/ 23 | #include "stm32f10x_dbgmcu.h" 24 | 25 | /** @addtogroup STM32F10x_StdPeriph_Driver 26 | * @{ 27 | */ 28 | 29 | /** @defgroup DBGMCU 30 | * @brief DBGMCU driver modules 31 | * @{ 32 | */ 33 | 34 | /** @defgroup DBGMCU_Private_TypesDefinitions 35 | * @{ 36 | */ 37 | 38 | /** 39 | * @} 40 | */ 41 | 42 | /** @defgroup DBGMCU_Private_Defines 43 | * @{ 44 | */ 45 | 46 | #define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) 47 | /** 48 | * @} 49 | */ 50 | 51 | /** @defgroup DBGMCU_Private_Macros 52 | * @{ 53 | */ 54 | 55 | /** 56 | * @} 57 | */ 58 | 59 | /** @defgroup DBGMCU_Private_Variables 60 | * @{ 61 | */ 62 | 63 | /** 64 | * @} 65 | */ 66 | 67 | /** @defgroup DBGMCU_Private_FunctionPrototypes 68 | * @{ 69 | */ 70 | 71 | /** 72 | * @} 73 | */ 74 | 75 | /** @defgroup DBGMCU_Private_Functions 76 | * @{ 77 | */ 78 | 79 | /** 80 | * @brief Returns the device revision identifier. 81 | * @param None 82 | * @retval Device revision identifier 83 | */ 84 | uint32_t DBGMCU_GetREVID(void) 85 | { 86 | return(DBGMCU->IDCODE >> 16); 87 | } 88 | 89 | /** 90 | * @brief Returns the device identifier. 91 | * @param None 92 | * @retval Device identifier 93 | */ 94 | uint32_t DBGMCU_GetDEVID(void) 95 | { 96 | return(DBGMCU->IDCODE & IDCODE_DEVID_MASK); 97 | } 98 | 99 | /** 100 | * @brief Configures the specified peripheral and low power mode behavior 101 | * when the MCU under Debug mode. 102 | * @param DBGMCU_Periph: specifies the peripheral and low power mode. 103 | * This parameter can be any combination of the following values: 104 | * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode 105 | * @arg DBGMCU_STOP: Keep debugger connection during STOP mode 106 | * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode 107 | * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted 108 | * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted 109 | * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted 110 | * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted 111 | * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted 112 | * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted 113 | * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted 114 | * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted 115 | * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted 116 | * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted 117 | * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted 118 | * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted 119 | * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted 120 | * @arg DBGMCU_CAN2_STOP: Debug CAN2 stopped when Core is halted 121 | * @arg DBGMCU_TIM15_STOP: TIM15 counter stopped when Core is halted 122 | * @arg DBGMCU_TIM16_STOP: TIM16 counter stopped when Core is halted 123 | * @arg DBGMCU_TIM17_STOP: TIM17 counter stopped when Core is halted 124 | * @arg DBGMCU_TIM9_STOP: TIM9 counter stopped when Core is halted 125 | * @arg DBGMCU_TIM10_STOP: TIM10 counter stopped when Core is halted 126 | * @arg DBGMCU_TIM11_STOP: TIM11 counter stopped when Core is halted 127 | * @arg DBGMCU_TIM12_STOP: TIM12 counter stopped when Core is halted 128 | * @arg DBGMCU_TIM13_STOP: TIM13 counter stopped when Core is halted 129 | * @arg DBGMCU_TIM14_STOP: TIM14 counter stopped when Core is halted 130 | * @param NewState: new state of the specified peripheral in Debug mode. 131 | * This parameter can be: ENABLE or DISABLE. 132 | * @retval None 133 | */ 134 | void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) 135 | { 136 | /* Check the parameters */ 137 | assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); 138 | assert_param(IS_FUNCTIONAL_STATE(NewState)); 139 | 140 | if (NewState != DISABLE) 141 | { 142 | DBGMCU->CR |= DBGMCU_Periph; 143 | } 144 | else 145 | { 146 | DBGMCU->CR &= ~DBGMCU_Periph; 147 | } 148 | } 149 | 150 | /** 151 | * @} 152 | */ 153 | 154 | /** 155 | * @} 156 | */ 157 | 158 | /** 159 | * @} 160 | */ 161 | 162 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 163 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aystmjz/Sleep-Monitor/8af61daaba9f7d16447779d1ca6340399633e7f8/hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aystmjz/Sleep-Monitor/8af61daaba9f7d16447779d1ca6340399633e7f8/hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_iwdg.c 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file provides all the IWDG firmware functions. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Includes ------------------------------------------------------------------*/ 23 | #include "stm32f10x_iwdg.h" 24 | 25 | /** @addtogroup STM32F10x_StdPeriph_Driver 26 | * @{ 27 | */ 28 | 29 | /** @defgroup IWDG 30 | * @brief IWDG driver modules 31 | * @{ 32 | */ 33 | 34 | /** @defgroup IWDG_Private_TypesDefinitions 35 | * @{ 36 | */ 37 | 38 | /** 39 | * @} 40 | */ 41 | 42 | /** @defgroup IWDG_Private_Defines 43 | * @{ 44 | */ 45 | 46 | /* ---------------------- IWDG registers bit mask ----------------------------*/ 47 | 48 | /* KR register bit mask */ 49 | #define KR_KEY_Reload ((uint16_t)0xAAAA) 50 | #define KR_KEY_Enable ((uint16_t)0xCCCC) 51 | 52 | /** 53 | * @} 54 | */ 55 | 56 | /** @defgroup IWDG_Private_Macros 57 | * @{ 58 | */ 59 | 60 | /** 61 | * @} 62 | */ 63 | 64 | /** @defgroup IWDG_Private_Variables 65 | * @{ 66 | */ 67 | 68 | /** 69 | * @} 70 | */ 71 | 72 | /** @defgroup IWDG_Private_FunctionPrototypes 73 | * @{ 74 | */ 75 | 76 | /** 77 | * @} 78 | */ 79 | 80 | /** @defgroup IWDG_Private_Functions 81 | * @{ 82 | */ 83 | 84 | /** 85 | * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. 86 | * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. 87 | * This parameter can be one of the following values: 88 | * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers 89 | * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers 90 | * @retval None 91 | */ 92 | void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) 93 | { 94 | /* Check the parameters */ 95 | assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); 96 | IWDG->KR = IWDG_WriteAccess; 97 | } 98 | 99 | /** 100 | * @brief Sets IWDG Prescaler value. 101 | * @param IWDG_Prescaler: specifies the IWDG Prescaler value. 102 | * This parameter can be one of the following values: 103 | * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 104 | * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 105 | * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 106 | * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 107 | * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 108 | * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 109 | * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 110 | * @retval None 111 | */ 112 | void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) 113 | { 114 | /* Check the parameters */ 115 | assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); 116 | IWDG->PR = IWDG_Prescaler; 117 | } 118 | 119 | /** 120 | * @brief Sets IWDG Reload value. 121 | * @param Reload: specifies the IWDG Reload value. 122 | * This parameter must be a number between 0 and 0x0FFF. 123 | * @retval None 124 | */ 125 | void IWDG_SetReload(uint16_t Reload) 126 | { 127 | /* Check the parameters */ 128 | assert_param(IS_IWDG_RELOAD(Reload)); 129 | IWDG->RLR = Reload; 130 | } 131 | 132 | /** 133 | * @brief Reloads IWDG counter with value defined in the reload register 134 | * (write access to IWDG_PR and IWDG_RLR registers disabled). 135 | * @param None 136 | * @retval None 137 | */ 138 | void IWDG_ReloadCounter(void) 139 | { 140 | IWDG->KR = KR_KEY_Reload; 141 | } 142 | 143 | /** 144 | * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). 145 | * @param None 146 | * @retval None 147 | */ 148 | void IWDG_Enable(void) 149 | { 150 | IWDG->KR = KR_KEY_Enable; 151 | } 152 | 153 | /** 154 | * @brief Checks whether the specified IWDG flag is set or not. 155 | * @param IWDG_FLAG: specifies the flag to check. 156 | * This parameter can be one of the following values: 157 | * @arg IWDG_FLAG_PVU: Prescaler Value Update on going 158 | * @arg IWDG_FLAG_RVU: Reload Value Update on going 159 | * @retval The new state of IWDG_FLAG (SET or RESET). 160 | */ 161 | FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) 162 | { 163 | FlagStatus bitstatus = RESET; 164 | /* Check the parameters */ 165 | assert_param(IS_IWDG_FLAG(IWDG_FLAG)); 166 | if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) 167 | { 168 | bitstatus = SET; 169 | } 170 | else 171 | { 172 | bitstatus = RESET; 173 | } 174 | /* Return the flag status */ 175 | return bitstatus; 176 | } 177 | 178 | /** 179 | * @} 180 | */ 181 | 182 | /** 183 | * @} 184 | */ 185 | 186 | /** 187 | * @} 188 | */ 189 | 190 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 191 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aystmjz/Sleep-Monitor/8af61daaba9f7d16447779d1ca6340399633e7f8/hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file stm32f10x_wwdg.c 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief This file provides all the WWDG firmware functions. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Includes ------------------------------------------------------------------*/ 23 | #include "stm32f10x_wwdg.h" 24 | #include "stm32f10x_rcc.h" 25 | 26 | /** @addtogroup STM32F10x_StdPeriph_Driver 27 | * @{ 28 | */ 29 | 30 | /** @defgroup WWDG 31 | * @brief WWDG driver modules 32 | * @{ 33 | */ 34 | 35 | /** @defgroup WWDG_Private_TypesDefinitions 36 | * @{ 37 | */ 38 | 39 | /** 40 | * @} 41 | */ 42 | 43 | /** @defgroup WWDG_Private_Defines 44 | * @{ 45 | */ 46 | 47 | /* ----------- WWDG registers bit address in the alias region ----------- */ 48 | #define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) 49 | 50 | /* Alias word address of EWI bit */ 51 | #define CFR_OFFSET (WWDG_OFFSET + 0x04) 52 | #define EWI_BitNumber 0x09 53 | #define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) 54 | 55 | /* --------------------- WWDG registers bit mask ------------------------ */ 56 | 57 | /* CR register bit mask */ 58 | #define CR_WDGA_Set ((uint32_t)0x00000080) 59 | 60 | /* CFR register bit mask */ 61 | #define CFR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) 62 | #define CFR_W_Mask ((uint32_t)0xFFFFFF80) 63 | #define BIT_Mask ((uint8_t)0x7F) 64 | 65 | /** 66 | * @} 67 | */ 68 | 69 | /** @defgroup WWDG_Private_Macros 70 | * @{ 71 | */ 72 | 73 | /** 74 | * @} 75 | */ 76 | 77 | /** @defgroup WWDG_Private_Variables 78 | * @{ 79 | */ 80 | 81 | /** 82 | * @} 83 | */ 84 | 85 | /** @defgroup WWDG_Private_FunctionPrototypes 86 | * @{ 87 | */ 88 | 89 | /** 90 | * @} 91 | */ 92 | 93 | /** @defgroup WWDG_Private_Functions 94 | * @{ 95 | */ 96 | 97 | /** 98 | * @brief Deinitializes the WWDG peripheral registers to their default reset values. 99 | * @param None 100 | * @retval None 101 | */ 102 | void WWDG_DeInit(void) 103 | { 104 | RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); 105 | RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); 106 | } 107 | 108 | /** 109 | * @brief Sets the WWDG Prescaler. 110 | * @param WWDG_Prescaler: specifies the WWDG Prescaler. 111 | * This parameter can be one of the following values: 112 | * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 113 | * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 114 | * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 115 | * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 116 | * @retval None 117 | */ 118 | void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) 119 | { 120 | uint32_t tmpreg = 0; 121 | /* Check the parameters */ 122 | assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); 123 | /* Clear WDGTB[1:0] bits */ 124 | tmpreg = WWDG->CFR & CFR_WDGTB_Mask; 125 | /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ 126 | tmpreg |= WWDG_Prescaler; 127 | /* Store the new value */ 128 | WWDG->CFR = tmpreg; 129 | } 130 | 131 | /** 132 | * @brief Sets the WWDG window value. 133 | * @param WindowValue: specifies the window value to be compared to the downcounter. 134 | * This parameter value must be lower than 0x80. 135 | * @retval None 136 | */ 137 | void WWDG_SetWindowValue(uint8_t WindowValue) 138 | { 139 | __IO uint32_t tmpreg = 0; 140 | 141 | /* Check the parameters */ 142 | assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); 143 | /* Clear W[6:0] bits */ 144 | 145 | tmpreg = WWDG->CFR & CFR_W_Mask; 146 | 147 | /* Set W[6:0] bits according to WindowValue value */ 148 | tmpreg |= WindowValue & (uint32_t) BIT_Mask; 149 | 150 | /* Store the new value */ 151 | WWDG->CFR = tmpreg; 152 | } 153 | 154 | /** 155 | * @brief Enables the WWDG Early Wakeup interrupt(EWI). 156 | * @param None 157 | * @retval None 158 | */ 159 | void WWDG_EnableIT(void) 160 | { 161 | *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; 162 | } 163 | 164 | /** 165 | * @brief Sets the WWDG counter value. 166 | * @param Counter: specifies the watchdog counter value. 167 | * This parameter must be a number between 0x40 and 0x7F. 168 | * @retval None 169 | */ 170 | void WWDG_SetCounter(uint8_t Counter) 171 | { 172 | /* Check the parameters */ 173 | assert_param(IS_WWDG_COUNTER(Counter)); 174 | /* Write to T[6:0] bits to configure the counter value, no need to do 175 | a read-modify-write; writing a 0 to WDGA bit does nothing */ 176 | WWDG->CR = Counter & BIT_Mask; 177 | } 178 | 179 | /** 180 | * @brief Enables WWDG and load the counter value. 181 | * @param Counter: specifies the watchdog counter value. 182 | * This parameter must be a number between 0x40 and 0x7F. 183 | * @retval None 184 | */ 185 | void WWDG_Enable(uint8_t Counter) 186 | { 187 | /* Check the parameters */ 188 | assert_param(IS_WWDG_COUNTER(Counter)); 189 | WWDG->CR = CR_WDGA_Set | Counter; 190 | } 191 | 192 | /** 193 | * @brief Checks whether the Early Wakeup interrupt flag is set or not. 194 | * @param None 195 | * @retval The new state of the Early Wakeup interrupt flag (SET or RESET) 196 | */ 197 | FlagStatus WWDG_GetFlagStatus(void) 198 | { 199 | return (FlagStatus)(WWDG->SR); 200 | } 201 | 202 | /** 203 | * @brief Clears Early Wakeup interrupt flag. 204 | * @param None 205 | * @retval None 206 | */ 207 | void WWDG_ClearFlag(void) 208 | { 209 | WWDG->SR = (uint32_t)RESET; 210 | } 211 | 212 | /** 213 | * @} 214 | */ 215 | 216 | /** 217 | * @} 218 | */ 219 | 220 | /** 221 | * @} 222 | */ 223 | 224 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 225 | -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/stm32f10x.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aystmjz/Sleep-Monitor/8af61daaba9f7d16447779d1ca6340399633e7f8/hal/STM32F10x_StdPeriph_Driver/stm32f10x.h -------------------------------------------------------------------------------- /hal/STM32F10x_StdPeriph_Driver/system_stm32f10x.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file system_stm32f10x.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 11-March-2011 7 | * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Header File. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /** @addtogroup CMSIS 23 | * @{ 24 | */ 25 | 26 | /** @addtogroup stm32f10x_system 27 | * @{ 28 | */ 29 | 30 | /** 31 | * @brief Define to prevent recursive inclusion 32 | */ 33 | #ifndef __SYSTEM_STM32F10X_H 34 | #define __SYSTEM_STM32F10X_H 35 | 36 | #ifdef __cplusplus 37 | extern "C" { 38 | #endif 39 | 40 | /** @addtogroup STM32F10x_System_Includes 41 | * @{ 42 | */ 43 | 44 | /** 45 | * @} 46 | */ 47 | 48 | 49 | /** @addtogroup STM32F10x_System_Exported_types 50 | * @{ 51 | */ 52 | 53 | extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ 54 | 55 | /** 56 | * @} 57 | */ 58 | 59 | /** @addtogroup STM32F10x_System_Exported_Constants 60 | * @{ 61 | */ 62 | 63 | /** 64 | * @} 65 | */ 66 | 67 | /** @addtogroup STM32F10x_System_Exported_Macros 68 | * @{ 69 | */ 70 | 71 | /** 72 | * @} 73 | */ 74 | 75 | /** @addtogroup STM32F10x_System_Exported_Functions 76 | * @{ 77 | */ 78 | 79 | extern void SystemInit(void); 80 | extern void SystemCoreClockUpdate(void); 81 | /** 82 | * @} 83 | */ 84 | 85 | #ifdef __cplusplus 86 | } 87 | #endif 88 | 89 | #endif /*__SYSTEM_STM32F10X_H */ 90 | 91 | /** 92 | * @} 93 | */ 94 | 95 | /** 96 | * @} 97 | */ 98 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 99 | -------------------------------------------------------------------------------- /lib/cmsis/arm_common_tables.h: -------------------------------------------------------------------------------- 1 | /* ---------------------------------------------------------------------- 2 | * Project: CMSIS DSP Library 3 | * Title: arm_common_tables.h 4 | * Description: Extern declaration for common tables 5 | * 6 | * $Date: 27. January 2017 7 | * $Revision: V.1.5.1 8 | * 9 | * Target Processor: Cortex-M cores 10 | * -------------------------------------------------------------------- */ 11 | /* 12 | * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. 13 | * 14 | * SPDX-License-Identifier: Apache-2.0 15 | * 16 | * Licensed under the Apache License, Version 2.0 (the License); you may 17 | * not use this file except in compliance with the License. 18 | * You may obtain a copy of the License at 19 | * 20 | * www.apache.org/licenses/LICENSE-2.0 21 | * 22 | * Unless required by applicable law or agreed to in writing, software 23 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT 24 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 25 | * See the License for the specific language governing permissions and 26 | * limitations under the License. 27 | */ 28 | 29 | #ifndef _ARM_COMMON_TABLES_H 30 | #define _ARM_COMMON_TABLES_H 31 | 32 | #include "arm_math.h" 33 | 34 | extern const uint16_t armBitRevTable[1024]; 35 | extern const q15_t armRecipTableQ15[64]; 36 | extern const q31_t armRecipTableQ31[64]; 37 | extern const float32_t twiddleCoef_16[32]; 38 | extern const float32_t twiddleCoef_32[64]; 39 | extern const float32_t twiddleCoef_64[128]; 40 | extern const float32_t twiddleCoef_128[256]; 41 | extern const float32_t twiddleCoef_256[512]; 42 | extern const float32_t twiddleCoef_512[1024]; 43 | extern const float32_t twiddleCoef_1024[2048]; 44 | extern const float32_t twiddleCoef_2048[4096]; 45 | extern const float32_t twiddleCoef_4096[8192]; 46 | #define twiddleCoef twiddleCoef_4096 47 | extern const q31_t twiddleCoef_16_q31[24]; 48 | extern const q31_t twiddleCoef_32_q31[48]; 49 | extern const q31_t twiddleCoef_64_q31[96]; 50 | extern const q31_t twiddleCoef_128_q31[192]; 51 | extern const q31_t twiddleCoef_256_q31[384]; 52 | extern const q31_t twiddleCoef_512_q31[768]; 53 | extern const q31_t twiddleCoef_1024_q31[1536]; 54 | extern const q31_t twiddleCoef_2048_q31[3072]; 55 | extern const q31_t twiddleCoef_4096_q31[6144]; 56 | extern const q15_t twiddleCoef_16_q15[24]; 57 | extern const q15_t twiddleCoef_32_q15[48]; 58 | extern const q15_t twiddleCoef_64_q15[96]; 59 | extern const q15_t twiddleCoef_128_q15[192]; 60 | extern const q15_t twiddleCoef_256_q15[384]; 61 | extern const q15_t twiddleCoef_512_q15[768]; 62 | extern const q15_t twiddleCoef_1024_q15[1536]; 63 | extern const q15_t twiddleCoef_2048_q15[3072]; 64 | extern const q15_t twiddleCoef_4096_q15[6144]; 65 | extern const float32_t twiddleCoef_rfft_32[32]; 66 | extern const float32_t twiddleCoef_rfft_64[64]; 67 | extern const float32_t twiddleCoef_rfft_128[128]; 68 | extern const float32_t twiddleCoef_rfft_256[256]; 69 | extern const float32_t twiddleCoef_rfft_512[512]; 70 | extern const float32_t twiddleCoef_rfft_1024[1024]; 71 | extern const float32_t twiddleCoef_rfft_2048[2048]; 72 | extern const float32_t twiddleCoef_rfft_4096[4096]; 73 | 74 | /* floating-point bit reversal tables */ 75 | #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) 76 | #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) 77 | #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) 78 | #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) 79 | #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) 80 | #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) 81 | #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) 82 | #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) 83 | #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) 84 | 85 | extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; 86 | extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; 87 | extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; 88 | extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; 89 | extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; 90 | extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; 91 | extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; 92 | extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; 93 | extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; 94 | 95 | /* fixed-point bit reversal tables */ 96 | #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) 97 | #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) 98 | #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) 99 | #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) 100 | #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) 101 | #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) 102 | #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) 103 | #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) 104 | #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) 105 | 106 | extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; 107 | extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; 108 | extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; 109 | extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; 110 | extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; 111 | extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; 112 | extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; 113 | extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; 114 | extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; 115 | 116 | /* Tables for Fast Math Sine and Cosine */ 117 | extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; 118 | extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; 119 | extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; 120 | 121 | #endif /* ARM_COMMON_TABLES_H */ 122 | -------------------------------------------------------------------------------- /lib/cmsis/arm_const_structs.h: -------------------------------------------------------------------------------- 1 | /* ---------------------------------------------------------------------- 2 | * Project: CMSIS DSP Library 3 | * Title: arm_const_structs.h 4 | * Description: Constant structs that are initialized for user convenience. 5 | * For example, some can be given as arguments to the arm_cfft_f32() function. 6 | * 7 | * $Date: 27. January 2017 8 | * $Revision: V.1.5.1 9 | * 10 | * Target Processor: Cortex-M cores 11 | * -------------------------------------------------------------------- */ 12 | /* 13 | * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. 14 | * 15 | * SPDX-License-Identifier: Apache-2.0 16 | * 17 | * Licensed under the Apache License, Version 2.0 (the License); you may 18 | * not use this file except in compliance with the License. 19 | * You may obtain a copy of the License at 20 | * 21 | * www.apache.org/licenses/LICENSE-2.0 22 | * 23 | * Unless required by applicable law or agreed to in writing, software 24 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT 25 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 26 | * See the License for the specific language governing permissions and 27 | * limitations under the License. 28 | */ 29 | 30 | #ifndef _ARM_CONST_STRUCTS_H 31 | #define _ARM_CONST_STRUCTS_H 32 | 33 | #include "arm_math.h" 34 | #include "arm_common_tables.h" 35 | 36 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; 37 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; 38 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; 39 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; 40 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; 41 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; 42 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; 43 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; 44 | extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; 45 | 46 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; 47 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; 48 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; 49 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; 50 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; 51 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; 52 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; 53 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; 54 | extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; 55 | 56 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; 57 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; 58 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; 59 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; 60 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; 61 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; 62 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; 63 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; 64 | extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /lib/cmsis/cmsis_version.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************//** 2 | * @file cmsis_version.h 3 | * @brief CMSIS Core(M) Version definitions 4 | * @version V5.0.2 5 | * @date 19. April 2017 6 | ******************************************************************************/ 7 | /* 8 | * Copyright (c) 2009-2017 ARM Limited. All rights reserved. 9 | * 10 | * SPDX-License-Identifier: Apache-2.0 11 | * 12 | * Licensed under the Apache License, Version 2.0 (the License); you may 13 | * not use this file except in compliance with the License. 14 | * You may obtain a copy of the License at 15 | * 16 | * www.apache.org/licenses/LICENSE-2.0 17 | * 18 | * Unless required by applicable law or agreed to in writing, software 19 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT 20 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21 | * See the License for the specific language governing permissions and 22 | * limitations under the License. 23 | */ 24 | 25 | #if defined ( __ICCARM__ ) 26 | #pragma system_include /* treat file as system include file for MISRA check */ 27 | #elif defined (__clang__) 28 | #pragma clang system_header /* treat file as system include file */ 29 | #endif 30 | 31 | #ifndef __CMSIS_VERSION_H 32 | #define __CMSIS_VERSION_H 33 | 34 | /* CMSIS Version definitions */ 35 | #define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ 36 | #define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ 37 | #define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ 38 | __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ 39 | #endif 40 | -------------------------------------------------------------------------------- /lib/cmsis/tz_context.h: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * @file tz_context.h 3 | * @brief Context Management for Armv8-M TrustZone 4 | * @version V1.0.1 5 | * @date 10. January 2018 6 | ******************************************************************************/ 7 | /* 8 | * Copyright (c) 2017-2018 Arm Limited. All rights reserved. 9 | * 10 | * SPDX-License-Identifier: Apache-2.0 11 | * 12 | * Licensed under the Apache License, Version 2.0 (the License); you may 13 | * not use this file except in compliance with the License. 14 | * You may obtain a copy of the License at 15 | * 16 | * www.apache.org/licenses/LICENSE-2.0 17 | * 18 | * Unless required by applicable law or agreed to in writing, software 19 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT 20 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21 | * See the License for the specific language governing permissions and 22 | * limitations under the License. 23 | */ 24 | 25 | #if defined ( __ICCARM__ ) 26 | #pragma system_include /* treat file as system include file for MISRA check */ 27 | #elif defined (__clang__) 28 | #pragma clang system_header /* treat file as system include file */ 29 | #endif 30 | 31 | #ifndef TZ_CONTEXT_H 32 | #define TZ_CONTEXT_H 33 | 34 | #include 35 | 36 | #ifndef TZ_MODULEID_T 37 | #define TZ_MODULEID_T 38 | /// \details Data type that identifies secure software modules called by a process. 39 | typedef uint32_t TZ_ModuleId_t; 40 | #endif 41 | 42 | /// \details TZ Memory ID identifies an allocated memory slot. 43 | typedef uint32_t TZ_MemoryId_t; 44 | 45 | /// Initialize secure context memory system 46 | /// \return execution status (1: success, 0: error) 47 | uint32_t TZ_InitContextSystem_S (void); 48 | 49 | /// Allocate context memory for calling secure software modules in TrustZone 50 | /// \param[in] module identifies software modules called from non-secure mode 51 | /// \return value != 0 id TrustZone memory slot identifier 52 | /// \return value 0 no memory available or internal error 53 | TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); 54 | 55 | /// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S 56 | /// \param[in] id TrustZone memory slot identifier 57 | /// \return execution status (1: success, 0: error) 58 | uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); 59 | 60 | /// Load secure context (called on RTOS thread context switch) 61 | /// \param[in] id TrustZone memory slot identifier 62 | /// \return execution status (1: success, 0: error) 63 | uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); 64 | 65 | /// Store secure context (called on RTOS thread context switch) 66 | /// \param[in] id TrustZone memory slot identifier 67 | /// \return execution status (1: success, 0: error) 68 | uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); 69 | 70 | #endif // TZ_CONTEXT_H 71 | -------------------------------------------------------------------------------- /src/Games/Game_Snake.c: -------------------------------------------------------------------------------- 1 | #include "Game_Snake.h" 2 | #include "Game_Snake_Data.h" 3 | 4 | Tile Map[8][15]; 5 | uint8_t Game_Speed = 200; // 游戏速度(延时) 6 | uint8_t Game_Credits = 0; // 游戏积分 7 | 8 | void Game_Snake_Show_Tile_8x8(uint8_t Y, uint8_t X, Tile Tile) 9 | { 10 | for (int8_t i = 0; i < 8; i++) { 11 | OLED_DisplayBuf[Y][X * 8 + i] = (Game_Snake_Tile_8x8[Tile][i]); // 显示区块 12 | } 13 | } 14 | 15 | void Map_Clear(void) // 清除地图 16 | { 17 | int8_t i, j; 18 | for (i = 0; i < 8; i++) { 19 | for (j = 0; j < 15; j++) { 20 | Map[i][j] = air; 21 | } 22 | } 23 | } 24 | 25 | void Map_Update(void) // 上传地图 26 | { 27 | int8_t i, j; 28 | for (i = 0; i < 8; i++) { 29 | for (j = 0; j < 15; j++) { 30 | Game_Snake_Show_Tile_8x8(i, j, Map[i][j]); 31 | } 32 | } 33 | OLED_DrawRectangle(0, 0, 120, 64, 0); 34 | } 35 | 36 | void RandFood(void) // 随机放置食物 37 | { 38 | srand(DS3231_GetTimeStamp()); 39 | int8_t Y = rand() % 8; 40 | int8_t X = rand() % 15; 41 | while (Map[Y][X] != air) { 42 | Y = rand() % 8; 43 | X = rand() % 15; 44 | } 45 | Map[Y][X] = food; 46 | } 47 | 48 | Tile Game_Snake_GetFront(Game_Snake_Class *Snake) // 获取前方信息 49 | { 50 | switch (Snake->Heading) { 51 | case up: { 52 | return Map[Snake->H_Y - 1][Snake->H_X]; 53 | } 54 | case right: { 55 | return Map[Snake->H_Y][Snake->H_X + 1]; 56 | } 57 | case down: { 58 | return Map[Snake->H_Y + 1][Snake->H_X]; 59 | } 60 | case left: { 61 | return Map[Snake->H_Y][Snake->H_X - 1]; 62 | } 63 | } 64 | return air; 65 | } 66 | 67 | uint8_t Game_Snake_Advance(Game_Snake_Class *Snake) // 把蛇映射到地图 68 | { 69 | int8_t Front_X = Snake->H_X, Front_Y = Snake->H_Y; 70 | 71 | switch (Snake->Heading) { 72 | case up: { 73 | Front_Y = Snake->H_Y - 1; 74 | break; 75 | } 76 | case right: { 77 | Front_X = Snake->H_X + 1; 78 | break; 79 | } 80 | case down: { 81 | Front_Y = Snake->H_Y + 1; 82 | break; 83 | } 84 | case left: { 85 | Front_X = Snake->H_X - 1; 86 | break; 87 | } 88 | } 89 | 90 | //if(Front_X==0)Front_X=1; 91 | //if(Front_Y==0)Front_Y=1; 92 | Front_X %= 15; 93 | Front_Y %= 8; 94 | 95 | if (Map[Front_Y][Front_X] == air) // 如果前方为空气 96 | { 97 | *Snake->node[Snake->Head_i] = SnakeBody; // 蛇头节点指向的地图方块变为蛇身 98 | Snake->Head_i = (Snake->Head_i + 1) % 120; // 蛇头节点下标前进1格 99 | Snake->node[Snake->Head_i] = &Map[Front_Y][Front_X]; // 蛇头节点指向到前方地图方块 100 | *Snake->node[Snake->Head_i] = SnakeHead; // 蛇头节点指向的地图方块变为蛇头 101 | 102 | *Snake->node[Snake->Tail_i] = air; // 消除蛇尾地图方块 103 | Snake->Tail_i = (Snake->Tail_i + 1) % 120; // 蛇尾节点下标前进1格 104 | *Snake->node[Snake->Tail_i] = SnakeTail; // 蛇尾节点指向的地图方块变为蛇尾 105 | 106 | Snake->H_X = Front_X; // 蛇头坐标更新 107 | Snake->H_Y = Front_Y; 108 | } else if (Map[Front_Y][Front_X] == food) // 如果前方为食物 109 | { 110 | *Snake->node[Snake->Head_i] = SnakeBody; // 蛇头节点指向的地图方块变为蛇身 111 | Snake->Head_i = (Snake->Head_i + 1) % 120; // 蛇头节点下标前进1格 112 | Snake->node[Snake->Head_i] = &Map[Front_Y][Front_X]; // 蛇头节点指向到前方地图方块 113 | *Snake->node[Snake->Head_i] = SnakeHead; // 蛇头节点指向的地图方块变为蛇头 114 | 115 | RandFood(); // 随机放置食物 116 | Game_Credits += 1; // 加积分 117 | Game_Speed -= Game_Speed / 8; // 减延时 118 | 119 | Snake->H_X = Front_X; // 蛇头坐标更新 120 | Snake->H_Y = Front_Y; 121 | } else // 前方有障碍 122 | { 123 | return 0; // 前进失败 124 | } 125 | 126 | return 1; // 前进成功 127 | } 128 | 129 | void Game_Snake_Play(Game_Snake_Class *Snake) // 开始游戏 130 | { 131 | while (Snake->Head_i - Snake->Tail_i < 3) // 出身点随机方向强制移动三格; 132 | { 133 | Snake->H_X++; 134 | *Snake->node[Snake->Head_i] = SnakeBody; // 蛇头节点指向的地图方块变为蛇身 135 | Snake->Head_i = (Snake->Head_i + 1) % 120; // 蛇头节点下标前进1格 136 | Snake->node[Snake->Head_i] = &Map[Snake->H_Y][Snake->H_X]; // 蛇头节点指向到前方地图方块 137 | *Snake->node[Snake->Head_i] = SnakeHead; // 蛇头节点指向的地图方块变为蛇头 138 | 139 | Map_Update(); 140 | OLED_Update(); 141 | Delay_ms(Game_Speed); 142 | } 143 | WSAD Heading_Previous = Snake->Heading; 144 | int8_t temp = 0; 145 | 146 | while (1) // 主循环 147 | { 148 | if (Menu_EnterEvent() == 2) { return; } // 退出游戏 149 | 150 | temp = Menu_RollEvent(); 151 | 152 | if (temp > 0) { Snake->Heading++; } 153 | if (temp < 0) { Snake->Heading--; } 154 | Snake->Heading %= 4; 155 | 156 | if (Game_Snake_Advance(Snake)) { Heading_Previous = Snake->Heading; } // 如果前进成功则记录方向 157 | else { 158 | Snake->Heading = Heading_Previous; // 如果前进失败尝试之前的方向再试一次 159 | if (Game_Snake_Advance(Snake) == 0) // 如果仍然失败则游戏结束 160 | { 161 | OLED_Clear(); 162 | OLED_Printf(0, 12, OLED_8X16, "游戏结束 得分:%d ", Game_Credits); 163 | OLED_Update(); 164 | 165 | while (1) { 166 | if (Menu_EnterEvent()) { return; } // 退出游戏 167 | } 168 | } 169 | } 170 | 171 | Map_Update(); 172 | OLED_Update(); 173 | Delay_ms(Game_Speed); 174 | } 175 | } 176 | 177 | void Game_Snake_Init(void) 178 | { 179 | Game_Credits = 0; 180 | Game_Speed = 200; 181 | Map_Clear(); // 清除蛇尸 182 | 183 | Game_Snake_Class Snake_1; 184 | Snake_1.Head_i = 0; 185 | Snake_1.Tail_i = 0; 186 | Snake_1.H_X = rand() % 15; 187 | Snake_1.H_Y = rand() % 8; 188 | Snake_1.Heading = right; 189 | Snake_1.node[Snake_1.Head_i] = &Map[Snake_1.H_Y][Snake_1.H_X]; 190 | 191 | Map[Snake_1.H_Y][Snake_1.H_X] = SnakeHead; 192 | 193 | RandFood(); 194 | 195 | OLED_Update(); 196 | Game_Snake_Play(&Snake_1); 197 | 198 | return; 199 | } 200 | -------------------------------------------------------------------------------- /src/Games/Game_Snake.h: -------------------------------------------------------------------------------- 1 | #ifndef __GAME_SNAKE_H 2 | #define __GAME_SNAKE_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include 6 | #include "Delay.h" 7 | #include "OLED.h" 8 | #include "Key.h" 9 | #include "Menu.h" 10 | #include "Encoder.h" 11 | #include "DS3231.h" 12 | 13 | typedef enum{ 14 | air, //空气 15 | wall, //墙 16 | food, //食物 17 | SnakeHead, //蛇头 18 | SnakeBody, //蛇身 19 | SnakeTail, //蛇尾 20 | }Tile; 21 | 22 | typedef enum{ 23 | up = 0 , // 上 24 | right = 1 , // 右 25 | down = 2 , // 下 26 | left = 3 , // 左 27 | }WSAD; //方向键 28 | 29 | typedef struct{ 30 | Tile* node[128]; //蛇节点 31 | 32 | uint8_t Head_i; //蛇头下标 33 | uint8_t Tail_i; //蛇尾下标 34 | 35 | uint8_t H_X; //蛇头X坐标 36 | uint8_t H_Y; //蛇头Y坐标 37 | WSAD Heading; //前进方向 38 | }Game_Snake_Class; 39 | 40 | void Game_Snake_Init(void); 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /src/Games/Game_Snake_Data.h: -------------------------------------------------------------------------------- 1 | /*贴图方块*/ 2 | const uint8_t Game_Snake_Tile_8x8[][8] = 3 | { 4 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\air.bmp --*/ 5 | /*-- 宽度x高度=8x8 --*/ 6 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 7 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\wall.bmp --*/ 8 | /*-- 宽度x高度=8x8 --*/ 9 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 10 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\food.bmp --*/ 11 | /*-- 宽度x高度=8x8 --*/ 12 | 0x00,0x30,0x4A,0x4A,0x4C,0x48,0x30,0x00, 13 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\head.bmp --*/ 14 | /*-- 宽度x高度=8x8 --*/ 15 | 0xFF,0x81,0xBD,0xA5,0xA5,0xBD,0x81,0xFF, 16 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\body.bmp --*/ 17 | /*-- 宽度x高度=8x8 --*/ 18 | 0x00,0x7E,0x42,0x5A,0x5A,0x42,0x7E,0x00, 19 | /*-- 调入了一幅图像:C:\Users\Adam\Desktop\stm32\bmp\food.bmp --*/ 20 | /*-- 宽度x高度=8x8 --*/ 21 | 0x00,0x30,0x4A,0x4A,0x4C,0x48,0x30,0x00, 22 | }; 23 | 24 | -------------------------------------------------------------------------------- /src/Games/game_of_life.c: -------------------------------------------------------------------------------- 1 | #include "game_of_life.h" 2 | 3 | uint8_t Nodes_Cache[8][120]; // 计算缓存 4 | 5 | void Update_Display(void) // 上传屏幕 6 | { 7 | memcpy(OLED_DisplayBuf, Nodes_Cache, 1024); 8 | } 9 | 10 | void Point_life(uint8_t X, uint8_t Y) // 写点生 11 | { 12 | Nodes_Cache[(Y / 8)][X] |= (0x01 << (Y % 8)); 13 | } 14 | 15 | void Point_death(uint8_t X, uint8_t Y) // 写点死 16 | { 17 | Nodes_Cache[(Y / 8)][X] &= ~(0x01 << (Y % 8)); 18 | } 19 | 20 | uint8_t CountPointRound(uint8_t X, uint8_t Y) // 统计点周围细胞数量 21 | { 22 | return ( 23 | OLED_GetPoint(X - 1, Y - 1) + OLED_GetPoint(X, Y - 1) + OLED_GetPoint(X + 1, Y - 1) + 24 | OLED_GetPoint(X - 1, Y) + OLED_GetPoint(X + 1, Y) + 25 | OLED_GetPoint(X - 1, Y + 1) + OLED_GetPoint(X, Y + 1) + OLED_GetPoint(X + 1, Y + 1)); 26 | } 27 | 28 | void Game_Of_Life_Turn(void) // 刷新游戏回合 29 | { 30 | uint8_t x, y; 31 | uint8_t Count; 32 | 33 | for (y = 0; y < 64; y++) { 34 | for (x = 0; x < 120; x++) { 35 | Count = CountPointRound(x, y); 36 | if (OLED_GetPoint(x, y)) { 37 | if (Count < 2 || Count > 3) { 38 | Point_death(x, y); 39 | } 40 | } else { 41 | if (Count == 3) { 42 | Point_life(x, y); 43 | } 44 | } 45 | } 46 | } 47 | Update_Display(); 48 | } 49 | 50 | void Game_Of_Life_Seed(int16_t seed) // 游戏初始化种子 51 | { 52 | srand(seed); 53 | for (uint8_t i = 0; i < 8; i++) 54 | for (uint8_t j = 0; j < 120; j++) { 55 | Nodes_Cache[i][j] = rand(); 56 | } 57 | Update_Display(); 58 | } 59 | 60 | void Game_Of_Life_Play(void) // 游戏开始 61 | { 62 | uint8_t x1 = 8, x2 = 16, y1 = 32, y2 = 32; 63 | int8_t shift = -1; 64 | 65 | int16_t Angle = 7; 66 | float px = 72, py = 32; 67 | 68 | uint8_t Key_Temp; 69 | 70 | OLED_Clear(); 71 | Game_Of_Life_Seed(DS3231_GetTimeStamp()); // 放置种子 72 | 73 | while (1) { 74 | Game_Of_Life_Turn(); 75 | 76 | if (shift > 0) { 77 | y2 += Menu_RollEvent() * 8; 78 | } else { 79 | x2 += Menu_RollEvent() * 8; 80 | } 81 | x2 %= 120; 82 | y2 %= 64; 83 | OLED_DrawLine(x1, y1, x2, y2); 84 | if ((x2 - x1) > 1) { 85 | x1 += (x2 - x1) / 8 + 1; 86 | } else if ((x2 - x1) < -1) { 87 | x1 += (x2 - x1) / 8 - 1; 88 | } else { 89 | x1 = x2; 90 | } 91 | if ((y2 - y1) > 1) { 92 | y1 += (y2 - y1) / 2 + 1; 93 | } else if ((y2 - y1) < -1) { 94 | y1 += (y2 - y1) / 2 - 1; 95 | } else { 96 | y1 = y2; 97 | } 98 | 99 | OLED_Rotation_C_P(64, 32, &px, &py, Angle); 100 | OLED_DrawLine(64, 32, px + 0.5, py + 0.5); 101 | 102 | OLED_Update(); 103 | Key_Temp = Menu_EnterEvent(); 104 | if (Key_Temp == 1) { shift = -shift; } 105 | if (Key_Temp == 2) { return; } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/Games/game_of_life.h: -------------------------------------------------------------------------------- 1 | #ifndef __GAME_OF_LIFE_H 2 | #define __GAME_OF_LIFE_H 3 | 4 | #include 5 | #include 6 | #include "OLED.h" 7 | #include "Delay.h" 8 | #include "Menu.h" 9 | #include "Encoder.h" 10 | #include "DS3231.h" 11 | 12 | 13 | void Game_Of_Life_Play(void); //开始游戏 14 | void Game_Of_Life_Seed(int16_t seed); //游戏初始化种子 15 | 16 | #endif 17 | 18 | -------------------------------------------------------------------------------- /src/Hardware/Battery.c: -------------------------------------------------------------------------------- 1 | #include "Battery.h" 2 | 3 | uint8_t Battery=0; 4 | uint8_t Battery_Flag=0; 5 | 6 | uint8_t Battery_calculate(uint16_t battery_ADC) 7 | { 8 | uint8_t batteryLevel; 9 | if(battery_ADC>4160)return 100; 10 | if(battery_ADC<3580)return 0; 11 | switch (battery_ADC) 12 | { 13 | case 4160:batteryLevel=100;break; 14 | case 4156:batteryLevel=99;break; 15 | case 4152:batteryLevel=99;break; 16 | case 4148:batteryLevel=99;break; 17 | case 4144:batteryLevel=98;break; 18 | case 4140:batteryLevel=97;break; 19 | case 4136:batteryLevel=97;break; 20 | case 4132:batteryLevel=96;break; 21 | case 4128:batteryLevel=96;break; 22 | case 4124:batteryLevel=96;break; 23 | case 4120:batteryLevel=95;break; 24 | case 4116:batteryLevel=95;break; 25 | case 4112:batteryLevel=94;break; 26 | case 4108:batteryLevel=93;break; 27 | case 4104:batteryLevel=93;break; 28 | case 4100:batteryLevel=92;break; 29 | case 4096:batteryLevel=92;break; 30 | case 4092:batteryLevel=91;break; 31 | case 4088:batteryLevel=90;break; 32 | case 4084:batteryLevel=90;break; 33 | case 4080:batteryLevel=90;break;//90 34 | case 4076:batteryLevel=90;break; 35 | case 4072:batteryLevel=89;break; 36 | case 4068:batteryLevel=89;break; 37 | case 4064:batteryLevel=89;break; 38 | case 4060:batteryLevel=88;break; 39 | case 4056:batteryLevel=88;break; 40 | case 4052:batteryLevel=87;break;//87 41 | case 4048:batteryLevel=87;break; 42 | case 4044:batteryLevel=87;break; 43 | case 4040:batteryLevel=86;break; 44 | case 4036:batteryLevel=86;break; 45 | case 4032:batteryLevel=85;break;//85 46 | case 4028:batteryLevel=85;break; 47 | case 4024:batteryLevel=85;break; 48 | case 4020:batteryLevel=84;break; 49 | case 4016:batteryLevel=84;break; 50 | case 4012:batteryLevel=84;break; 51 | case 4008:batteryLevel=83;break; 52 | case 4004:batteryLevel=83;break; 53 | case 4000:batteryLevel=83;break; 54 | case 3996:batteryLevel=82;break; 55 | case 3992:batteryLevel=82;break; 56 | case 3988:batteryLevel=82;break; 57 | case 3984:batteryLevel=81;break; 58 | case 3980:batteryLevel=80;break; 59 | case 3976:batteryLevel=80;break; 60 | case 3972:batteryLevel=80;break;//80 61 | case 3968:batteryLevel=80;break; 62 | case 3964:batteryLevel=79;break; 63 | case 3960:batteryLevel=79;break; 64 | case 3956:batteryLevel=78;break; 65 | case 3952:batteryLevel=78;break; 66 | case 3948:batteryLevel=77;break; 67 | case 3944:batteryLevel=77;break; 68 | case 3940:batteryLevel=76;break; 69 | case 3936:batteryLevel=75;break; 70 | case 3932:batteryLevel=75;break;//75 71 | case 3928:batteryLevel=74;break; 72 | case 3924:batteryLevel=73;break; 73 | case 3920:batteryLevel=73;break; 74 | case 3916:batteryLevel=72;break; 75 | case 3912:batteryLevel=71;break; 76 | case 3908:batteryLevel=71;break; 77 | case 3904:batteryLevel=70;break; 78 | case 3900:batteryLevel=70;break;//70 79 | case 3896:batteryLevel=70;break; 80 | case 3892:batteryLevel=69;break; 81 | case 3888:batteryLevel=68;break; 82 | case 3884:batteryLevel=67;break; 83 | case 3880:batteryLevel=66;break; 84 | case 3876:batteryLevel=65;break; 85 | case 3872:batteryLevel=65;break;//65 86 | case 3868:batteryLevel=65;break; 87 | case 3864:batteryLevel=64;break; 88 | case 3860:batteryLevel=63;break; 89 | case 3856:batteryLevel=62;break; 90 | case 3852:batteryLevel=62;break; 91 | case 3848:batteryLevel=61;break; 92 | case 3844:batteryLevel=61;break; 93 | case 3840:batteryLevel=60;break;//60 94 | case 3836:batteryLevel=60;break; 95 | case 3832:batteryLevel=59;break; 96 | case 3828:batteryLevel=58;break; 97 | case 3824:batteryLevel=57;break; 98 | case 3820:batteryLevel=56;break; 99 | case 3816:batteryLevel=55;break; 100 | case 3812:batteryLevel=55;break;//55 101 | case 3808:batteryLevel=54;break; 102 | case 3804:batteryLevel=53;break; 103 | case 3800:batteryLevel=52;break; 104 | case 3796:batteryLevel=51;break; 105 | case 3792:batteryLevel=50;break;//50 106 | case 3788:batteryLevel=49;break; 107 | case 3784:batteryLevel=48;break; 108 | case 3780:batteryLevel=47;break; 109 | case 3776:batteryLevel=46;break; 110 | case 3772:batteryLevel=45;break;//45 111 | case 3768:batteryLevel=44;break; 112 | case 3764:batteryLevel=43;break; 113 | case 3760:batteryLevel=42;break;//42 114 | case 3756:batteryLevel=41;break;///41 115 | case 3752:batteryLevel=40;break;//40 116 | case 3748:batteryLevel=39;break; 117 | case 3744:batteryLevel=38;break; 118 | case 3740:batteryLevel=37;break; 119 | case 3736:batteryLevel=36;break; 120 | case 3732:batteryLevel=35;break;//35 121 | case 3733:batteryLevel=34;break; 122 | case 3731:batteryLevel=33;break; 123 | case 3730:batteryLevel=32;break; 124 | case 3729:batteryLevel=31;break; 125 | case 3728:batteryLevel=30;break;//30 126 | case 3724:batteryLevel=29;break; 127 | case 3720:batteryLevel=28;break; 128 | case 3716:batteryLevel=27;break; 129 | case 3712:batteryLevel=26;break; 130 | case 3708:batteryLevel=25;break;//25 131 | case 3704:batteryLevel=24;break; 132 | case 3700:batteryLevel=23;break; 133 | case 3696:batteryLevel=22;break; 134 | case 3691:batteryLevel=21;break; 135 | case 3692:batteryLevel=20;break;///20 136 | case 3688:batteryLevel=19;break; 137 | case 3684:batteryLevel=18;break; 138 | case 3680:batteryLevel=17;break; 139 | case 3676:batteryLevel=16;break; 140 | case 3672:batteryLevel=15;break;//15 141 | case 3668:batteryLevel=14;break; 142 | case 3664:batteryLevel=13;break; 143 | case 3660:batteryLevel=12;break;//12 144 | case 3656:batteryLevel=11;break; 145 | case 3652:batteryLevel=10;break;//10 146 | case 3648:batteryLevel=9;break; 147 | case 3644:batteryLevel=8;break;//8 148 | case 3640:batteryLevel=8;break; 149 | case 3636:batteryLevel=7;break; 150 | case 3632:batteryLevel=6;break; 151 | case 3628:batteryLevel=5;break;//5 152 | case 3624:batteryLevel=4;break; 153 | case 3620:batteryLevel=4;break; 154 | case 3616:batteryLevel=3;break; 155 | case 3612:batteryLevel=3;break;//3 156 | case 3608:batteryLevel=3;break; 157 | case 3604:batteryLevel=3;break; 158 | case 3600:batteryLevel=2;break; 159 | case 3596:batteryLevel=2;break; 160 | case 3592:batteryLevel=1;break;//1 161 | case 3588:batteryLevel=1;break; 162 | case 3584:batteryLevel=1;break; 163 | case 3580:batteryLevel=0;break;//0 164 | } 165 | return batteryLevel; 166 | } 167 | 168 | uint8_t Battery_UpdateLevel(uint16_t battery_ADC) 169 | { 170 | static uint8_t batteryLevel_Last[5], batteryLevel_Init_Flag = 1, batteryLevel_Index = 0, lastBattery; 171 | uint16_t batteryLevel = 0; 172 | if ((battery_ADC * 4) > Battery_CHARGE) { 173 | batteryLevel_Init_Flag = 1; 174 | return 1; 175 | } 176 | if (batteryLevel_Init_Flag) { 177 | for (uint8_t i = 0; i < 5; i++) batteryLevel_Last[i] = Battery_calculate(battery_ADC * 4) + 5; 178 | lastBattery = Battery_calculate(battery_ADC * 4) + 5; 179 | batteryLevel_Init_Flag = 0; 180 | } 181 | batteryLevel_Last[batteryLevel_Index] = Battery_calculate(battery_ADC * 4); 182 | batteryLevel_Index++; 183 | batteryLevel_Index %= 5; 184 | for (uint8_t i = 0; i < 5; i++) { 185 | batteryLevel += batteryLevel_Last[i]; 186 | } 187 | if ((batteryLevel / 5) < lastBattery) 188 | Battery = batteryLevel / 5; 189 | return 0; 190 | } 191 | 192 | uint8_t Battery_GetLevel() 193 | { 194 | return Battery; 195 | } 196 | 197 | 198 | -------------------------------------------------------------------------------- /src/Hardware/Battery.h: -------------------------------------------------------------------------------- 1 | #ifndef __BATTERY_H 2 | #define __BATTERY_H 3 | #include "stm32f10x.h" // Device header 4 | 5 | #define Battery_CHARGE 4000 6 | 7 | extern uint8_t Battery_Flag; 8 | 9 | uint8_t Battery_calculate(uint16_t Battery); 10 | uint8_t Battery_UpdateLevel(uint16_t Battery_ADC); 11 | uint8_t Battery_GetLevel(); 12 | 13 | #endif -------------------------------------------------------------------------------- /src/Hardware/Buzzer.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | void Buzzer_Init(void) 4 | { 5 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 6 | 7 | GPIO_InitTypeDef GPIO_InitStructure; 8 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 9 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12; 10 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 11 | GPIO_Init (GPIOB,&GPIO_InitStructure); 12 | 13 | } 14 | 15 | void Buzzer_ON(void) 16 | { 17 | GPIO_ResetBits(GPIOB,GPIO_Pin_12); 18 | } 19 | 20 | void Buzzer_OFF(void) 21 | { 22 | GPIO_SetBits(GPIOB,GPIO_Pin_12); 23 | } 24 | 25 | 26 | void Buzzer_Turn(void) 27 | { 28 | if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0) 29 | GPIO_SetBits(GPIOB,GPIO_Pin_12); 30 | else 31 | GPIO_ResetBits(GPIOB,GPIO_Pin_12); 32 | } 33 | -------------------------------------------------------------------------------- /src/Hardware/Buzzer.h: -------------------------------------------------------------------------------- 1 | #ifndef __Buzzer_H 2 | #define __Buzzer_H 3 | 4 | void Buzzer_Init(void); 5 | void Buzzer_ON(void); 6 | void Buzzer_OFF(void); 7 | void Buzzer_Turn(void); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/Hardware/CCS811.c: -------------------------------------------------------------------------------- 1 | #include "CCS811.h" 2 | 3 | CCS811_DataTypeDef CCS; 4 | 5 | void CCS811_WriteByte(uint8_t WordAddress, uint8_t Data) 6 | { 7 | CCS811_I2C_Start(); 8 | CCS811_I2C_SendByte(CCS811_ADDRESS); 9 | CCS811_I2C_ReceiveAck(); 10 | CCS811_I2C_SendByte(WordAddress); 11 | CCS811_I2C_ReceiveAck(); 12 | CCS811_I2C_SendByte(Data); 13 | CCS811_I2C_ReceiveAck(); 14 | CCS811_I2C_Stop(); 15 | } 16 | 17 | void CCS811_Write(uint8_t WordAddress) 18 | { 19 | CCS811_I2C_Start(); 20 | CCS811_I2C_SendByte(CCS811_ADDRESS); 21 | CCS811_I2C_ReceiveAck(); 22 | CCS811_I2C_SendByte(WordAddress); 23 | CCS811_I2C_ReceiveAck(); 24 | CCS811_I2C_Stop(); 25 | } 26 | 27 | uint8_t CCS811_ReadByte(uint8_t WordAddress) 28 | { 29 | uint8_t Data; 30 | CCS811_I2C_Start(); 31 | CCS811_I2C_SendByte(CCS811_ADDRESS); 32 | CCS811_I2C_ReceiveAck(); 33 | CCS811_I2C_SendByte(WordAddress); 34 | CCS811_I2C_ReceiveAck(); 35 | CCS811_I2C_Stop(); 36 | CCS811_I2C_Start(); 37 | CCS811_I2C_SendByte(CCS811_ADDRESS | 0x01); 38 | CCS811_I2C_ReceiveAck(); 39 | Data = CCS811_I2C_ReceiveByte(); 40 | CCS811_I2C_SendAck(1); 41 | CCS811_I2C_Stop(); 42 | return Data; 43 | } 44 | 45 | void CCS811_MultiReadByte(uint8_t WordAddress, uint8_t *Data_p, uint8_t Length) 46 | { 47 | CCS811_I2C_Start(); 48 | CCS811_I2C_SendByte(CCS811_ADDRESS); 49 | CCS811_I2C_ReceiveAck(); 50 | CCS811_I2C_SendByte(WordAddress); 51 | CCS811_I2C_ReceiveAck(); 52 | CCS811_I2C_Stop(); 53 | CCS811_I2C_Start(); 54 | CCS811_I2C_SendByte(CCS811_ADDRESS | 0x01); 55 | CCS811_I2C_ReceiveAck(); 56 | Length--; 57 | while (Length--) { 58 | *Data_p++ = CCS811_I2C_ReceiveByte(); 59 | CCS811_I2C_SendAck(0); 60 | } 61 | *Data_p = CCS811_I2C_ReceiveByte(); 62 | CCS811_I2C_SendAck(1); 63 | CCS811_I2C_Stop(); 64 | } 65 | 66 | void CCS811_Init() 67 | { 68 | CCS811_I2C_Init(); 69 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 70 | GPIO_InitTypeDef GPIO_InitStructure; 71 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 72 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 73 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 74 | GPIO_Init(GPIOA, &GPIO_InitStructure); 75 | CCS811_Sleep(); 76 | } 77 | 78 | uint8_t CCS811_GetHardWareID(void) 79 | { 80 | return CCS811_ReadByte(HW_ID_REG); 81 | } 82 | 83 | uint8_t CCS811_GetErrorID(void) 84 | { 85 | return CCS811_ReadByte(ERROR_ID_REG); 86 | } 87 | 88 | uint8_t CCS811_GetStatus(void) 89 | { 90 | return CCS811_ReadByte(STATUS_REG); 91 | } 92 | 93 | void CCS811_RESET(void) 94 | { 95 | CCS811_I2C_Start(); 96 | CCS811_I2C_SendByte(CCS811_ADDRESS); 97 | CCS811_I2C_ReceiveAck(); 98 | CCS811_I2C_SendByte(SW_RESET); 99 | CCS811_I2C_ReceiveAck(); 100 | CCS811_I2C_SendByte(0x11); 101 | CCS811_I2C_ReceiveAck(); 102 | CCS811_I2C_SendByte(0xE5); 103 | CCS811_I2C_ReceiveAck(); 104 | CCS811_I2C_SendByte(0x72); 105 | CCS811_I2C_ReceiveAck(); 106 | CCS811_I2C_SendByte(0x8A); 107 | CCS811_I2C_ReceiveAck(); 108 | CCS811_I2C_Stop(); 109 | } 110 | 111 | void CCS811_SetMeasurementMode(uint8_t mode) 112 | { 113 | CCS.mode = mode; 114 | CCS811_Wake(); 115 | Delay_ms(10); 116 | CCS811_Write(APP_START_REG); 117 | CCS811_WriteByte(MEAS_MODE_REG, mode); 118 | Delay_ms(100); 119 | CCS811_Sleep(); 120 | } 121 | 122 | uint8_t CCS811_GetData(void) 123 | { 124 | CCS811_Wake(); 125 | if (CCS811_GetHardWareID() != CCS811_HardWareID) { 126 | Debug_printf("CCS811 HardWareError\r\n"); 127 | CCS811_Sleep(); 128 | return 0; 129 | } else if (CCS811_GetErrorID()) { 130 | CCS811_RESET(); 131 | Delay_ms(100); 132 | CCS811_SetMeasurementMode(CCS.mode); 133 | Debug_printf("CCS811 RESET\r\n"); 134 | CCS811_Sleep(); 135 | return 0; 136 | } 137 | CCS.status = CCS811_GetStatus(); 138 | if (CCS.status | 0x08) { 139 | CCS811_MultiReadByte(ALG_RESULT_DATA, CCS.raw_data, 8); 140 | CCS.eco2 = (uint16_t)CCS.raw_data[0] * 256 + CCS.raw_data[1]; 141 | CCS.tvoc = (uint16_t)CCS.raw_data[2] * 256 + CCS.raw_data[3]; 142 | CCS811_Sleep(); 143 | if (CCS.eco2 == 400 || CCS.eco2 == 0 || CCS.tvoc == 0) 144 | return 0; 145 | else if (CCS.eco2 > 20000 || CCS.tvoc > 20000) 146 | return 0; 147 | else 148 | return 1; 149 | } else { 150 | CCS811_Sleep(); 151 | return 0; 152 | } 153 | } 154 | 155 | /*uint8_t CCS811_BUF[12]; 156 | uint8_t CCS811_Information[10]; 157 | uint8_t CCS811_temp = 0x5a; 158 | uint8_t CCS811_MeasureMode, CCS811_Status, CCS811_Error_ID; 159 | 160 | CCS811_SetMeasurementMode(DRIVE_MODE_1SEC); 161 | 162 | while (1) { 163 | 164 | CCS811_Wake(); // nWAKE pin is asserted at least 50μs before the transaction and kept asserted throughout,nWAKE pin is active low 165 | // CCS811_WriteByte(MEAS_MODE_REG,DRIVE_MODE_1SEC); // Write Measure Mode Register,sensor measurement every second,no interrupt 166 | Delay_ms(300); 167 | CCS811_Information[0] = CCS811_ReadByte(HW_ID_REG); // Read CCS's information ,ID 168 | sprintf(st, "HW_ID_REG:%x\r\n", CCS811_Information[0]); 169 | Debug_printf(st); 170 | CCS811_Status = CCS811_ReadByte(STATUS_REG); 171 | sprintf(st, "CCS811_Status:%x\r\n", CCS811_Status); 172 | Debug_printf(st); 173 | // if (CCS811_Status & 0x10) CCS811_WriteByte(APP_START_REG, 0x00); 174 | CCS811_Error_ID = CCS811_ReadByte(ERROR_ID_REG); 175 | sprintf(st, "CCS811_Error_ID:%x\r\n", CCS811_Error_ID); 176 | Debug_printf(st); 177 | // CCS811_WriteByte(MEAS_MODE_REG, DRIVE_MODE_1SEC); 178 | CCS811_MeasureMode = CCS811_ReadByte(MEAS_MODE_REG); 179 | sprintf(st, "CCS811_MeasureMode:%x\r\n", CCS811_MeasureMode); 180 | Debug_printf(st); 181 | CCS811_MultiReadByte(ALG_RESULT_DATA, CCS811_BUF, 8); 182 | // CCS811_Information[0] = CCS811_ReadByte(HW_ID_REG); // Read CCS's information ,ID 183 | 184 | CCS.eco2 = (uint16_t)CCS811_BUF[0] * 256 + CCS811_BUF[1]; 185 | CCS.tvoc = (uint16_t)CCS811_BUF[2] * 256 + CCS811_BUF[3]; 186 | sprintf(st, "eco2=%d tvoc=%d\r\n", CCS.eco2, CCS.tvoc); 187 | Debug_printf(st); 188 | LCD_ShowNum(0, 0, CCS.eco2, 4); 189 | LCD_ShowNum(60, 0, CCS.tvoc, 4); 190 | LCD_ShowNum(0, 40, CCS811_Information[0], 4); 191 | LCD_ShowNum(60, 40, CCS811_Information[1], 4); 192 | LCD_ShowNum(120, 40, CCS811_Information[3], 4); 193 | LCD_ShowNum(0, 20, CCS811_Status, 4); 194 | LCD_ShowNum(60, 20, CCS811_Error_ID, 4); 195 | LCD_ShowNum(120, 20, CCS811_MeasureMode, 4); 196 | Delay_ms(2000); 197 | // CCS811_Information[0] = 0; 198 | if (CCS811_GetErrorID()) { 199 | if (CCS811_GetHardWareID() != CCS811_HardWareID) { 200 | Debug_printf("CCS811 HardWareError\r\n"); 201 | } else { 202 | CCS811_RESET(); 203 | Delay_ms(100); 204 | CCS811_SetMeasurementMode(DRIVE_MODE_1SEC); 205 | Debug_printf("CCS811 RESET\r\n"); 206 | } 207 | } 208 | CCS811_Sleep(); 209 | } 210 | */ 211 | -------------------------------------------------------------------------------- /src/Hardware/CCS811.h: -------------------------------------------------------------------------------- 1 | #ifndef __CCS811_H__ 2 | #define __CCS811_H__ 3 | #include "stm32f10x.h" // Device header 4 | #include "sys.h" 5 | #include "Delay.h" 6 | #include "I2C.h" 7 | #include "EC800.h" 8 | 9 | typedef struct { 10 | uint16_t eco2; 11 | uint16_t tvoc; 12 | uint8_t status; 13 | uint8_t mode; 14 | uint8_t raw_data[8]; 15 | } CCS811_DataTypeDef; 16 | 17 | extern CCS811_DataTypeDef CCS; 18 | 19 | #define CCS811_Wake() do{GPIO_ResetBits(GPIOA,GPIO_Pin_8);Delay_ms(100);}while(0) 20 | #define CCS811_Sleep() do{GPIO_SetBits(GPIOA,GPIO_Pin_8);Delay_ms(100);}while(0) 21 | 22 | #define CCS811_ADDRESS 0x5A << 1 23 | #define CCS811_HardWareID 0x81 24 | #define STATUS_REG 0x00 25 | #define MEAS_MODE_REG 0x01 26 | #define ALG_RESULT_DATA 0x02 27 | #define ENV_DATA 0x05 28 | #define NTC_REG 0x06 29 | #define THRESHOLDS 0x10 30 | #define BASELINE 0x11 31 | #define HW_ID_REG 0x20 32 | #define ERROR_ID_REG 0xE0 33 | #define APP_START_REG 0xF4 34 | #define SW_RESET 0xFF 35 | #define CCS_811_ADDRESS 0x5A 36 | #define GPIO_WAKE 0x5 37 | #define DRIVE_MODE_IDLE 0x0 38 | #define DRIVE_MODE_1SEC 0x10 39 | #define DRIVE_MODE_10SEC 0x20 40 | #define DRIVE_MODE_60SEC 0x30 41 | #define INTERRUPT_DRIVEN 0x8 42 | #define THRESHOLDS_ENABLED 0x4 43 | 44 | void CCS811_WriteByte(uint8_t WordAddress, uint8_t Data); 45 | void CCS811_Write(uint8_t WordAddress); 46 | uint8_t CCS811_ReadByte(uint8_t WordAddress); 47 | void CCS811_MultiReadByte(uint8_t WordAddress, uint8_t *Data_p, uint8_t Length); 48 | void CCS811_Init(); 49 | uint8_t CCS811_GetHardWareID(void); 50 | uint8_t CCS811_GetErrorID(void); 51 | void CCS811_RESET(void); 52 | void CCS811_SetMeasurementMode(uint8_t mode); 53 | uint8_t CCS811_GetData(void); 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /src/Hardware/CountSensor.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | uint16_t CountSensor_Count; 4 | 5 | void CountSensor_Init(void) 6 | { 7 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 8 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 9 | 10 | GPIO_InitTypeDef GPIO_InitStructure; 11 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD ; 12 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_14; 13 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; 14 | GPIO_Init (GPIOB,&GPIO_InitStructure); 15 | GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); 16 | 17 | EXTI_InitTypeDef EXTI_InitStructure; 18 | EXTI_InitStructure.EXTI_Line=EXTI_Line14; 19 | EXTI_InitStructure.EXTI_LineCmd=ENABLE; 20 | EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 21 | EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 22 | EXTI_Init(&EXTI_InitStructure); 23 | //EXTI_Trigger_Rising = 0x08, 24 | // EXTI_Trigger_Falling = 0x0C, 25 | // EXTI_Trigger_Rising_Falling = 0x10 26 | // GPIO_Mode_IN_FLOATING = 0x04, 27 | // GPIO_Mode_IPD = 0x28, 28 | // GPIO_Mode_IPU = 0x48, 29 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 30 | NVIC_InitTypeDef NVIC_InitStructure; 31 | NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; 32 | NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 33 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; 34 | NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; 35 | NVIC_Init(&NVIC_InitStructure); 36 | } 37 | 38 | uint16_t CountSensor_Get(void) 39 | { 40 | return CountSensor_Count; 41 | } 42 | 43 | void EXTI15_10_IRQHandler(void) 44 | { 45 | if(EXTI_GetITStatus(EXTI_Line14)==SET) 46 | { 47 | CountSensor_Count++; 48 | EXTI_ClearITPendingBit(EXTI_Line14); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/Hardware/CountSensor.h: -------------------------------------------------------------------------------- 1 | #ifndef __COUNTSENSOR_H 2 | #define __COUNTSENSOR_H 3 | 4 | 5 | void CountSensor_Init(void); 6 | uint16_t CountSensor_Get(void); 7 | void EXTI15_10_IRQHandler(void); 8 | 9 | 10 | #endif 11 | -------------------------------------------------------------------------------- /src/Hardware/DS3231.c: -------------------------------------------------------------------------------- 1 | #include "DS3231.h" 2 | 3 | static const uint8_t RTC_CLOCK_ADDR[7] = {0x00, 0x01, 0x02, 0x04, 0x05, 0x03, 0x06}; 4 | static const uint8_t RTC_ALARM1_ADDR[4] = {0x07, 0x08, 0x09, 0x0A}; 5 | static const uint8_t RTC_ALARM2_ADDR[3] = {0x0B, 0x0C, 0x0D}; 6 | uint8_t Alarm_Date[2] = {8, 0}; // 闹钟时间 7 | uint8_t Alarm_Status; // 闹钟状态 8 | uint8_t Alarm_Enable_Flag; // 闹钟使能标志 9 | 10 | struct tm Time_Date; // 全局时间(北京时间) 11 | 12 | void DS3231_TurnOnAlarm(void) 13 | { 14 | } 15 | 16 | void DS3231_TurnOffAlarm(void) 17 | { 18 | } 19 | 20 | uint8_t DS3231_GetAlarmEnableFlag(void) 21 | { 22 | return ((DS3231_ReadByte(DS3231_CONTROL) & 0x01)); 23 | } 24 | 25 | uint8_t DS3231_GetAlarmStatus(void) 26 | { 27 | return (DS3231_ReadByte(DS3231_STATUS) & 0x01); 28 | } 29 | 30 | void DS3231_WriteByte(uint8_t WordAddress, uint8_t Data) 31 | { 32 | DS3231_I2C_Start(); 33 | DS3231_I2C_SendByte(DS3231_ADDRESS); 34 | DS3231_I2C_ReceiveAck(); 35 | DS3231_I2C_SendByte(WordAddress); 36 | DS3231_I2C_ReceiveAck(); 37 | DS3231_I2C_SendByte(Data); 38 | DS3231_I2C_ReceiveAck(); 39 | DS3231_I2C_Stop(); 40 | } 41 | 42 | uint8_t DS3231_ReadByte(uint8_t WordAddress) 43 | { 44 | uint8_t Data; 45 | DS3231_I2C_Start(); 46 | DS3231_I2C_SendByte(DS3231_ADDRESS); 47 | DS3231_I2C_ReceiveAck(); 48 | DS3231_I2C_SendByte(WordAddress); 49 | DS3231_I2C_ReceiveAck(); 50 | DS3231_I2C_Stop(); 51 | DS3231_I2C_Start(); 52 | DS3231_I2C_SendByte(DS3231_ADDRESS | 0x01); 53 | DS3231_I2C_ReceiveAck(); 54 | Data = DS3231_I2C_ReceiveByte(); 55 | DS3231_I2C_SendAck(1); 56 | DS3231_I2C_Stop(); 57 | return Data; 58 | } 59 | 60 | /// @brief 读取时钟(闹钟)数据 61 | void DS3231_ReadTime() 62 | { 63 | uint8_t i, temp, time[7]; 64 | for (i = 0; i < 7; i++) { 65 | temp = DS3231_ReadByte(RTC_CLOCK_ADDR[i]); 66 | time[i] = (temp / 16) * 10 + (temp % 16); 67 | } 68 | Alarm_Status = (DS3231_ReadByte(DS3231_STATUS) & 0x01); 69 | 70 | Time_Date.tm_year = time[6] + 2000 - 1900; 71 | Time_Date.tm_mon = time[4] - 1; 72 | Time_Date.tm_mday = time[3]; 73 | Time_Date.tm_hour = time[2]; 74 | Time_Date.tm_min = time[1]; 75 | Time_Date.tm_sec = time[0]; 76 | mktime(&Time_Date); // 计算星期 77 | } 78 | 79 | /// @brief 获取时间戳 80 | /// @return 时间戳(北京时间) 81 | time_t DS3231_GetTimeStamp(void) 82 | { 83 | return (mktime(&Time_Date) - 8 * 60 * 60); 84 | } 85 | 86 | /// @brief 写入时钟数据 87 | void DS3231_WriteTime(struct tm time_data) 88 | { 89 | uint8_t time[7]; 90 | mktime(&time_data); // 计算星期 91 | time[6] = time_data.tm_year + 1900 - 2000; 92 | time[4] = time_data.tm_mon + 1; 93 | time[5] = time_data.tm_wday; 94 | time[3] = time_data.tm_mday; 95 | time[2] = time_data.tm_hour; 96 | time[1] = time_data.tm_min; 97 | time[0] = time_data.tm_sec; 98 | for (uint8_t i = 0; i < 7; i++) { 99 | DS3231_WriteByte(RTC_CLOCK_ADDR[i], (time[i] / 10) * 16 + time[i] % 10); 100 | } 101 | } 102 | 103 | /// @brief 写入闹钟数据 104 | void DS3231_WriteAlarm() 105 | { 106 | DS3231_WriteByte(RTC_ALARM1_ADDR[0], 0); 107 | DS3231_WriteByte(RTC_ALARM1_ADDR[3], 0x80); 108 | for (uint8_t i = 1; i < 3; i++) { 109 | DS3231_WriteByte(RTC_ALARM1_ADDR[i], ((Alarm_Date[2 - i] / 10) << 4) + (Alarm_Date[2 - i] % 10)); 110 | } 111 | DS3231_WriteByte(DS3231_CONTROL, 0x04 + Alarm_Enable_Flag); 112 | } 113 | 114 | /// @brief 复位闹钟 115 | void DS3231_ResetAlarm() 116 | { 117 | DS3231_WriteByte(DS3231_STATUS, 0x00); 118 | } 119 | 120 | void DS3231_Init() 121 | { 122 | DS3231_I2C_Init(); 123 | uint8_t i, temp; 124 | DS3231_WriteByte(DS3231_STATUS, 0x00); 125 | if (!Alarm_Enable) DS3231_WriteByte(DS3231_CONTROL, 0x04); 126 | DS3231_ReadTime(); 127 | 128 | temp = DS3231_ReadByte(DS3231_CONTROL); 129 | Alarm_Enable_Flag = !(!(temp & 0x01)); 130 | 131 | Alarm_Status = (DS3231_ReadByte(DS3231_STATUS) & 0x01); 132 | 133 | for (i = 1; i <= 2; i++) { 134 | temp = DS3231_ReadByte(RTC_ALARM1_ADDR[i]); 135 | Alarm_Date[2 - i] = (temp >> 4) * 10 + (temp & 0x0F); 136 | } 137 | } 138 | 139 | // 北京时间 140 | uint8_t IsSameDay(time_t time_cnt1, time_t time_cnt2) 141 | { 142 | struct tm time_date1, time_date2; 143 | time_cnt1 += 8 * 60 * 60; // 转换回GMT 144 | time_cnt2 += 8 * 60 * 60; 145 | time_date1 = *localtime(&time_cnt1); 146 | time_date2 = *localtime(&time_cnt2); 147 | if (time_date1.tm_yday == time_date2.tm_yday && time_date1.tm_year == time_date2.tm_year) 148 | return 1; 149 | else 150 | return 0; 151 | } 152 | 153 | uint8_t IsTime(void) 154 | { 155 | static uint8_t last_sec = 0; 156 | if (Time_Sec / 10 == last_sec) 157 | return 0; 158 | else if ((Time_Hour >= 0 && Time_Hour <= TIME_HOUR_END) || (Time_Hour <= 23 && Time_Hour >= TIME_HOUR_BEGIN)) { 159 | last_sec = Time_Sec / 10; 160 | return 1; 161 | } else 162 | return 0; 163 | } 164 | 165 | uint8_t Check_date(uint8_t w_year, uint8_t w_month, uint8_t w_date) 166 | { 167 | uint8_t Month_buf[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 月份修正表 168 | if (w_month == 2) // 闰年2月+1天 169 | (((w_year % 4 == 0) && (w_year % 100 != 0)) || (w_year % 400 == 0)) ? Month_buf[1] += 1 : Month_buf[1]; 170 | if (w_month > 12 || w_month < 1 || w_date > Month_buf[w_month - 1] || w_date < 1) // 判断月份日期是否合法 171 | return 0; 172 | return 1; 173 | } 174 | 175 | uint16_t TimeDate_ToAddress(uint8_t hour, uint8_t min, uint8_t sec) 176 | { 177 | if (hour <= TIME_HOUR_END) hour += 24; 178 | hour -= TIME_HOUR_BEGIN; 179 | sec /= 10; 180 | return (uint16_t)(hour * 60 * 6 + min * 6 + sec) << 4; 181 | } 182 | 183 | uint16_t TimeStamp_ToAddress(time_t time_cnt) 184 | { 185 | struct tm time_date; 186 | time_cnt += 8 * 60 * 60; 187 | time_date = *localtime(&time_cnt); 188 | return TimeDate_ToAddress(time_date.tm_hour, time_date.tm_min, time_date.tm_sec); 189 | } -------------------------------------------------------------------------------- /src/Hardware/DS3231.h: -------------------------------------------------------------------------------- 1 | #ifndef __DS3231_H__ 2 | #define __DS3231_H__ 3 | #include "I2C.h" 4 | #include 5 | 6 | #define DS3231_ADDRESS 0xD0 7 | #define DS3231_CONTROL 0x0E 8 | #define DS3231_STATUS 0x0F 9 | #define Alarm_Enable 0 10 | 11 | #define Time_Year (Time_Date.tm_year + 1900) 12 | #define Time_Mon (Time_Date.tm_mon + 1) 13 | #define Time_Day (Time_Date.tm_mday) 14 | #define Time_Week (Time_Date.tm_wday) 15 | #define Time_Hour (Time_Date.tm_hour) 16 | #define Time_Min (Time_Date.tm_min) 17 | #define Time_Sec (Time_Date.tm_sec) 18 | 19 | #define TIME_HOUR_BEGIN 22 20 | #define TIME_HOUR_END 9 21 | //时间段总长度不能超过11小时 22 | 23 | extern uint8_t Alarm_Date[2]; // 闹钟时间 24 | extern uint8_t Alarm_Status; // 闹钟状态 25 | extern uint8_t Alarm_Enable_Flag; // 闹钟使能标志 26 | extern struct tm Time_Date; 27 | 28 | void DS3231_WriteByte(uint8_t WordAddress, uint8_t Data); 29 | uint8_t DS3231_ReadByte(uint8_t WordAddress); 30 | void DS3231_ReadTime(); 31 | time_t DS3231_GetTimeStamp(void); 32 | void DS3231_WriteTime(struct tm time); 33 | void DS3231_WriteAlarm(); 34 | void DS3231_ResetAlarm(); 35 | void DS3231_Init(); 36 | uint8_t IsSameDay(time_t time_cnt1, time_t time_cnt2); 37 | uint8_t IsTime(void); 38 | uint8_t Check_date(uint8_t w_year, uint8_t w_month, uint8_t w_date); 39 | uint16_t TimeDate_ToAddress(uint8_t hour, uint8_t min, uint8_t sec); 40 | uint16_t TimeStamp_ToAddress(time_t time_cnt); 41 | 42 | #endif -------------------------------------------------------------------------------- /src/Hardware/EC800.h: -------------------------------------------------------------------------------- 1 | #ifndef __EC800_H 2 | #define __EC800_H 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "stm32f10x.h" 8 | #include "usart.h" 9 | #include "wdg.h" 10 | #include "Delay.h" 11 | #include "cJSON.h" 12 | 13 | typedef struct 14 | { 15 | float Temp; 16 | float Hum; 17 | float Light; 18 | uint16_t eco2; 19 | uint16_t tvoc; 20 | uint8_t Led; 21 | uint8_t Beep; 22 | 23 | } Environment_DataTypeDef; 24 | 25 | #define ToByte1(x) ((x) & 0xff) 26 | #define ToByte2(x) ((x >> 8) & 0xff) 27 | #define ToByte3(x) ((x >> 16) & 0xff) 28 | #define ToByte4(x) ((x >> 24) & 0xff) 29 | 30 | #define DATA1 ((uint16_t)Data.Temp) 31 | #define DATA2 ((uint16_t)(Data.Temp * 100) % 100) 32 | #define DATA3 ((uint16_t)Data.Hum) 33 | #define DATA4 ((uint16_t)(Data.Hum * 100) % 100) 34 | #define DATA5 ((uint16_t)Data.Light) 35 | #define DATA6 ((uint16_t)(Data.Light * 100) % 100) 36 | #define DATA7 (ToByte2((uint16_t)Data.eco2)) 37 | #define DATA8 (ToByte1((uint16_t)Data.eco2)) 38 | #define DATA9 (ToByte2((uint16_t)Data.tvoc)) 39 | #define DATA10 (ToByte1((uint16_t)Data.tvoc)) 40 | #define DATA_NULL 0XFF 41 | #define DATA_LEN 10+1 42 | 43 | extern char Debug_str[100]; 44 | extern Environment_DataTypeDef Data; 45 | 46 | #define ATcmd_Set(message) sprintf(AT_cmd, (message)) 47 | #define AT_cmd_Buff 128 48 | 49 | void Debug_printf(char *SendBuf); 50 | void Main_printf(char *SendBuf); 51 | void ATcmd_Send(char *ATcmd); 52 | uint8_t ATcmd_Scan(char *Ack); 53 | uint8_t Data_Scan(char *Data, char *Flag, uint8_t Len); 54 | uint16_t Data_ScanInt(char *Flag, uint8_t Len); 55 | uint8_t ATcmd_Wait(char *Ack, char *Error, uint16_t Wait_Time, uint8_t Try_Time); 56 | void ATcmd_Make(int num, const char *cmd, ...); 57 | void ATcmd_MakeSend(int num, const char *cmd, ...); 58 | void Clear_Buffer(void); 59 | void EC800_Init(void); 60 | void MQTT_Init(void); 61 | uint16_t EC800_GetADC(); 62 | void Pub_String(const char *topic, char *str); 63 | void Pub_Json(const char *topic, cJSON *json); 64 | void Pub_Data(const char *topic); 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /src/Hardware/EC800_Cacert.h: -------------------------------------------------------------------------------- 1 | #ifndef __EC800_CACERT_H 2 | #define __EC800_CACERT_H 3 | 4 | const char* cacert="-----BEGIN CERTIFICATE-----\r\n\ 5 | MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n\ 6 | MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n\ 7 | d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n\ 8 | QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n\ 9 | MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n\ 10 | b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n\ 11 | 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n\ 12 | CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n\ 13 | nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n\ 14 | 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n\ 15 | T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n\ 16 | gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n\ 17 | BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n\ 18 | TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n\ 19 | DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n\ 20 | hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n\ 21 | 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n\ 22 | PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n\ 23 | YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n\ 24 | CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n\ 25 | -----END CERTIFICATE-----\r\n"; 26 | 27 | #endif -------------------------------------------------------------------------------- /src/Hardware/Encoder.c: -------------------------------------------------------------------------------- 1 | #include "Encoder.h" 2 | 3 | static int16_t lastNum; 4 | 5 | void Encoder_Init(void) 6 | { 7 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); 8 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 9 | 10 | GPIO_InitTypeDef GPIO_InitStructure; 11 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 12 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7; 13 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 14 | GPIO_Init (GPIOB,&GPIO_InitStructure); 15 | 16 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 17 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 18 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 19 | TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR 20 | TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//PSC 21 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 22 | TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); 23 | 24 | TIM_ICInitTypeDef TIM_ICInitStructure; 25 | TIM_ICStructInit(&TIM_ICInitStructure); 26 | TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; 27 | TIM_ICInitStructure.TIM_ICFilter=0xf; 28 | TIM_ICInit(TIM4, &TIM_ICInitStructure); 29 | TIM_ICInitStructure.TIM_Channel=TIM_Channel_2; 30 | TIM_ICInitStructure.TIM_ICFilter=0xf; 31 | TIM_ICInit(TIM4, &TIM_ICInitStructure); 32 | TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); 33 | 34 | TIM_Cmd(TIM4,ENABLE); 35 | } 36 | 37 | 38 | int16_t Encoder_GetCounter(void) 39 | { 40 | return (TIM_GetCounter(TIM4)+1)/4; 41 | } 42 | 43 | void Encoder_Set(int16_t Num) 44 | { 45 | TIM_SetCounter(TIM4,Num*4-1); 46 | } 47 | 48 | void Encoder_Clear(void) 49 | { 50 | lastNum=0; 51 | TIM_SetCounter(TIM4,0); 52 | } 53 | 54 | int16_t Encoder_Get_Div4(void) 55 | { 56 | if(Encoder_GetCounter() - lastNum) 57 | { 58 | int16_t temp = (Encoder_GetCounter() - lastNum); 59 | 60 | lastNum = Encoder_GetCounter(); 61 | return temp; 62 | } 63 | return 0; 64 | 65 | } 66 | 67 | 68 | -------------------------------------------------------------------------------- /src/Hardware/Encoder.h: -------------------------------------------------------------------------------- 1 | #ifndef __ENCODER_H 2 | #define __ENCODER_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | 6 | void Encoder_Init(void); 7 | int16_t Encoder_GetCounter(void); 8 | void Encoder_Set(int16_t Num); 9 | void Encoder_Clear(void); 10 | int16_t Encoder_Get_Div4(void); 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /src/Hardware/Key.c: -------------------------------------------------------------------------------- 1 | #include "Key.h" 2 | 3 | uint8_t Key_KeyNumber; 4 | 5 | void Timer_Init(void) 6 | { 7 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); 8 | TIM_InternalClockConfig(TIM1); 9 | 10 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 11 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 12 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 13 | TIM_TimeBaseInitStructure.TIM_Period=9500-1;//100ms 14 | TIM_TimeBaseInitStructure.TIM_Prescaler=72-1; 15 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 16 | TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure); 17 | 18 | TIM_ClearITPendingBit(TIM1,TIM_IT_Update); 19 | TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 20 | 21 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 22 | NVIC_InitTypeDef NVIC_InitStructure; 23 | NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn; 24 | NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 25 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; 26 | NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; 27 | NVIC_Init(&NVIC_InitStructure); 28 | 29 | TIM_Cmd(TIM1,ENABLE); 30 | } 31 | 32 | 33 | void Key_Init(void) 34 | { 35 | Timer_Init(); 36 | 37 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 38 | 39 | GPIO_InitTypeDef GPIO_InitStructure; 40 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 41 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 42 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 43 | GPIO_Init(GPIOB, &GPIO_InitStructure); 44 | } 45 | 46 | uint8_t Key_Read(void) 47 | { 48 | return !GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1); 49 | } 50 | 51 | uint8_t Key_Get(void) 52 | { 53 | uint8_t Temp=0; 54 | Temp=Key_KeyNumber; 55 | Key_KeyNumber=0; 56 | 57 | return Temp; 58 | } 59 | 60 | uint8_t Key_GetState() 61 | { 62 | uint8_t KeyNumber=0; 63 | if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){KeyNumber=1;} 64 | 65 | return KeyNumber; 66 | } 67 | 68 | void Key_Entry() 69 | { 70 | static uint8_t NowState,LastState; 71 | static uint16_t HoldTimer; 72 | LastState=NowState; 73 | NowState=Key_GetState(); 74 | if(LastState==0&&NowState==1){Key_KeyNumber=1;HoldTimer=0;} 75 | else if(LastState==1&&NowState==1){HoldTimer++;if(HoldTimer>20)Key_KeyNumber=2;} 76 | } -------------------------------------------------------------------------------- /src/Hardware/Key.h: -------------------------------------------------------------------------------- 1 | #ifndef __KEY_H 2 | #define __KEY_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include "Delay.h" 6 | 7 | void Timer_Init(void); 8 | void Key_Init(void); 9 | uint8_t Key_Read(void); 10 | uint8_t Key_Get(void); 11 | uint8_t Key_GetState(); 12 | void Key_Entry(); 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /src/Hardware/LED.c: -------------------------------------------------------------------------------- 1 | #include "led.h" 2 | 3 | /* 4 | //初始化PA0 5 | //LED IO初始化 6 | //初始化PA15 PA1 7 | //LED IO初始化 这些端口根据你的板子的灯来定义,没有特别指定 8 | void LED_Init(void) 9 | { 10 | GPIO_InitTypeDef GPIO_InitStructure; 11 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PA,PB端口时钟 12 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8; 13 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 14 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz 15 | GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA0 16 | GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_8); 17 | 18 | 19 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 20 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 21 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz 22 | GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB3 23 | GPIO_SetBits(GPIOB,GPIO_Pin_0); 24 | LED1=0; 25 | } 26 | */ 27 | 28 | 29 | void LED_Init(void) 30 | { 31 | GPIO_InitTypeDef GPIO_InitStructure; 32 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 33 | 34 | 35 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 36 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2; 37 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 38 | GPIO_Init (GPIOB,&GPIO_InitStructure); 39 | 40 | GPIO_SetBits(GPIOB,GPIO_Pin_2); 41 | } 42 | 43 | void LED1_ON(void) 44 | { 45 | GPIO_ResetBits(GPIOB,GPIO_Pin_2); 46 | } 47 | 48 | void LED1_OFF(void) 49 | { 50 | GPIO_SetBits(GPIOB,GPIO_Pin_2); 51 | } 52 | 53 | 54 | void LED1_Turn(void) 55 | { 56 | if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==0) 57 | GPIO_SetBits(GPIOB,GPIO_Pin_2); 58 | else 59 | GPIO_ResetBits(GPIOB,GPIO_Pin_2); 60 | } 61 | 62 | -------------------------------------------------------------------------------- /src/Hardware/LED.h: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 3 | * @Date: 2023-07-27 20:28:03 4 | * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 5 | * @LastEditTime: 2023-08-08 17:37:40 6 | * @FilePath: \mqtt\HARDWARE\LED\led.h 7 | * @Description: ??????,???`customMade`, ??koroFileHeader???? ????: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | #ifndef __LED_H 10 | #define __LED_H 11 | #include "stm32f10x.h" // Device header 12 | 13 | 14 | #define LED1 PBout(0) 15 | #define LED2 PAout(8) 16 | #define PWRKEY PAout(0) 17 | void LED_Init(void); 18 | void LED1_ON(void); 19 | void LED1_OFF(void); 20 | void LED1_Turn(void); 21 | 22 | 23 | #endif 24 | -------------------------------------------------------------------------------- /src/Hardware/LightSensor.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | void LightSensor_Init(void) 4 | { 5 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 6 | 7 | GPIO_InitTypeDef GPIO_InitStructure; 8 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 9 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13; 10 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 11 | GPIO_Init (GPIOB,&GPIO_InitStructure); 12 | 13 | } 14 | 15 | uint8_t LightSensor_Get(void) 16 | { 17 | return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); 18 | } 19 | -------------------------------------------------------------------------------- /src/Hardware/LightSensor.h: -------------------------------------------------------------------------------- 1 | #ifndef __LIGHTSENSOR_H 2 | #define __LIGHTSENSOR_H 3 | 4 | void LightSensor_Init(void); 5 | uint8_t LightSensor_Get(void); 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /src/Hardware/MAX44009.c: -------------------------------------------------------------------------------- 1 | #include "MAX44009.h" 2 | 3 | MAX44009_DataTypeDef MAX; 4 | 5 | void MAX44009_WriteByte(uint8_t WordAddress, uint8_t Data) 6 | { 7 | MAX44009_I2C_Start(); 8 | MAX44009_I2C_SendByte(MAX44009_ADDRESS); 9 | MAX44009_I2C_ReceiveAck(); 10 | MAX44009_I2C_SendByte(WordAddress); 11 | MAX44009_I2C_ReceiveAck(); 12 | MAX44009_I2C_SendByte(Data); 13 | MAX44009_I2C_ReceiveAck(); 14 | MAX44009_I2C_Stop(); 15 | } 16 | 17 | uint8_t MAX44009_ReadByte(uint8_t WordAddress) 18 | { 19 | uint8_t Data; 20 | MAX44009_I2C_Start(); 21 | MAX44009_I2C_SendByte(MAX44009_ADDRESS); 22 | MAX44009_I2C_ReceiveAck(); 23 | MAX44009_I2C_SendByte(WordAddress); 24 | MAX44009_I2C_ReceiveAck(); 25 | MAX44009_I2C_Start(); 26 | MAX44009_I2C_SendByte(MAX44009_ADDRESS | 0x01); 27 | MAX44009_I2C_ReceiveAck(); 28 | Data = MAX44009_I2C_ReceiveByte(); 29 | MAX44009_I2C_SendAck(1); 30 | MAX44009_I2C_Stop(); 31 | return Data; 32 | } 33 | 34 | void MAX44009_Init(void) 35 | { 36 | MAX44009_I2C_Init(); 37 | MAX44009_WriteByte(MAX44009_CONFIG_REG, MAX44009_AUTO_MODE); 38 | } 39 | 40 | uint8_t MAX44009_GetData(void) 41 | { 42 | uint8_t exponent, mant; 43 | MAX.raw_data[0] = MAX44009_ReadByte(MAX44009_HIGH_REG); 44 | MAX.raw_data[1] = MAX44009_ReadByte(MAX44009_LOW_REG); 45 | exponent = (MAX.raw_data[0] & 0xf0) >> 4; 46 | mant = (MAX.raw_data[0] & 0x0f) << 4 | MAX.raw_data[1]; 47 | MAX.Lux = (float)(((0x00000001 << exponent) * (float)mant) * 0.045); 48 | if (MAX.raw_data[0] || MAX.raw_data[1]) 49 | return 1; 50 | else 51 | return 0; 52 | } 53 | -------------------------------------------------------------------------------- /src/Hardware/MAX44009.h: -------------------------------------------------------------------------------- 1 | #ifndef __MAX44009_H 2 | #define __MAX44009_H 3 | #include "stm32f10x.h" // Device header 4 | #include "sys.h" 5 | #include "I2C.h" 6 | 7 | typedef struct { 8 | float Lux; 9 | uint8_t raw_data[2]; 10 | } MAX44009_DataTypeDef; 11 | 12 | extern MAX44009_DataTypeDef MAX; 13 | 14 | #define MAX44009_ADDRESS 0x94 15 | #define MAX44009_CONFIG_REG 0x02 16 | #define MAX44009_HIGH_REG 0x03 17 | #define MAX44009_LOW_REG 0x04 18 | #define MAX44009_AUTO_MODE 0x00 19 | 20 | 21 | uint8_t MAX44009_ReadByte(uint8_t WordAddress); 22 | void MAX44009_Init(void); 23 | uint8_t MAX44009_GetData(void); 24 | 25 | #endif -------------------------------------------------------------------------------- /src/Hardware/MLX90640.h: -------------------------------------------------------------------------------- 1 | #ifndef __MLX90640_H__ 2 | #define __MLX90640_H__ 3 | #include 4 | #include 5 | #include "stm32f10x.h" // Device header 6 | #include "usart.h" 7 | #include "Delay.h" 8 | #include "lcd.h" 9 | 10 | extern const char *MQTT_Topic; 11 | extern uint8_t FPS_MLX90640; 12 | 13 | #define abs(x) ((x) > 0 ? (x) : -(x)) 14 | 15 | #define CROSS 1 16 | 17 | #define Raw_H 24 18 | #define Raw_L 32 19 | #define SCREEN 240 20 | #define BAR 16 21 | #define Temp_MAX 4000 22 | #define Temp_MIN 2000 23 | #define Temp_Face 2000 24 | #define ZOOM 8 25 | 26 | #define MethodNUM 8 27 | 28 | typedef enum { 29 | GCM_Pseudo1, 30 | GCM_Pseudo2, 31 | GCM_Metal1, 32 | GCM_Metal2, 33 | GCM_Rainbow1, 34 | GCM_Rainbow2, 35 | GCM_Rainbow3, 36 | GCM_Gray, 37 | } ConverMethod; 38 | 39 | typedef struct { 40 | uint16_t Raw[Raw_L][Raw_H]; 41 | uint8_t PseColor[Raw_L][Raw_H]; 42 | uint16_t Max, Min; 43 | uint8_t Max_x, Max_y, Min_x, Min_y; 44 | uint16_t Average; 45 | uint16_t Target; 46 | uint8_t Face_Flag; 47 | uint8_t Face_Up,Face_Down,Face_Left,Face_Right,Face_x,Face_y; 48 | uint16_t Face_Average; 49 | } TempDataTypeDef; 50 | 51 | typedef struct { 52 | uint8_t RGB_L; 53 | uint8_t RGB_H; 54 | // uint16_t RGB; 55 | // uint8_t colorR; 56 | // uint8_t colorG; 57 | // uint8_t colorB; 58 | } ColorTypeDef; 59 | 60 | extern TempDataTypeDef TempData; 61 | extern uint8_t Emissivity; 62 | 63 | uint16_t LCD_RGBToDATA(uint8_t colorR, uint8_t colorG, uint8_t colorB); 64 | void TempPseColor_Init(ConverMethod Method); 65 | void Show_TempRaw(uint8_t x, uint8_t y); 66 | void Show_MinAndMax(uint8_t n); 67 | uint8_t MLX90640_CheckData(uint8_t *data); 68 | void MLX90640_SetEmissivity(uint8_t value); 69 | void MLX90640_SendInitCMD(void); 70 | void MLX90640_TurnOff(void); 71 | void MLX90640_SendCMD(const uint8_t *CMD); 72 | void MLX90640_Init(void); 73 | void Show_PseColorBar(uint8_t x, uint8_t y); 74 | void Show_TempBilinearInter(uint8_t x, uint8_t y, TempDataTypeDef *Data); 75 | uint8_t MLX90640_RefreshData(void); 76 | 77 | #endif 78 | -------------------------------------------------------------------------------- /src/Hardware/RTC_Alarm.c: -------------------------------------------------------------------------------- 1 | 2 | #include "RTC_Alarm.h" 3 | #include "stm32f10x_rtc.h" 4 | #include "stm32f10x_pwr.h" 5 | #include "stm32f10x_bkp.h" 6 | #include "led.h" 7 | //RTC中断配置 8 | void RTC_NVIC_Config(void) 9 | { 10 | NVIC_InitTypeDef NVIC_InitStructure; 11 | 12 | NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断 13 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级1位,从优先级3位 14 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 15 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断 16 | NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 17 | } 18 | 19 | //RTC闹钟初始化:启动时钟、配置LSI做RTC时钟、设置预分频40000得到1Hz 20 | //设置运行时间WORK_TIMES 21 | void RTC_Alarm_Configuration(void) 22 | { 23 | /* Enable PWR and BKP clocks */ 24 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); 25 | /* Allow access to BKP Domain */ 26 | PWR_BackupAccessCmd(ENABLE); 27 | /* Reset Backup Domain */ 28 | BKP_DeInit(); 29 | 30 | /* RTC clock source configuration ----------------------------------------*/ 31 | /* Enable the LSI OSC */ 32 | RCC_LSICmd(ENABLE); 33 | /* Wait till LSI is ready */ 34 | while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) 35 | { 36 | } 37 | /* Select the RTC Clock Source */ 38 | RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); 39 | /* Enable the RTC Clock */ 40 | RCC_RTCCLKCmd(ENABLE); 41 | /* Wait for RTC registers synchronization */ 42 | RTC_WaitForSynchro(); 43 | /* Wait until last write operation on RTC registers has finished */ 44 | RTC_WaitForLastTask(); 45 | /* 使能RTC闹钟中断*/ 46 | RTC_ITConfig(RTC_IT_ALR, ENABLE); 47 | /* Wait until last write operation on RTC registers has finished */ 48 | RTC_WaitForLastTask(); 49 | /* Set RTC prescaler: set RTC period to 1sec */ 50 | RTC_SetPrescaler(40000); 51 | /* Wait until last write operation on RTC registers has finished */ 52 | RTC_WaitForLastTask(); 53 | 54 | //中断配置 55 | RTC_NVIC_Config(); 56 | 57 | //设置运行WORK_TIMES 58 | RTC_SetAlarm(RTC_GetCounter() + WORK_TIMES); 59 | RTC_WaitForLastTask(); 60 | } 61 | 62 | //设置闹钟时长并进入待机 63 | //s为中断秒数 64 | void RTC_Enter_StandbyMode(u32 s) 65 | { 66 | 67 | RTC_SetAlarm(RTC_GetCounter() + s); 68 | RTC_WaitForLastTask(); 69 | // 进入待机模式, 此时所有1.8V域的时钟都关闭,HIS和HSE的振荡器关闭, 电压调节器关闭. 70 | // 只有WKUP引脚上升沿,RTC警告事件,NRST引脚的外部复位,IWDG复位. 71 | /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */ 72 | // PWR_EnterSTANDBYMode(); 73 | } 74 | 75 | //中断服务函数 76 | void RTC_IRQHandler(void) 77 | { 78 | if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断 79 | { 80 | RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断 81 | RTC_Enter_StandbyMode(STANDBY_TIMES);//进入待机 82 | } 83 | } 84 | 85 | 86 | -------------------------------------------------------------------------------- /src/Hardware/RTC_Alarm.h: -------------------------------------------------------------------------------- 1 | /* 2 | 该模块启动STM32的AWU功能,采用LSI作为RTC时钟,周期性待机和唤醒单片机 3 | 移植该模块 : 4 | 1、只需调用RTC_Alarm_Configuration配置启动函数, 5 | 2、修改工作时间WORK_TIMES、待机时间STANDBY_TIMES,单位秒s, 6 | 设置的为32为闹钟寄存器,0-4294967295s(71582788.25min) 7 | 8 | */ 9 | #ifndef __RTC_Alarm_H 10 | #define __RTC_Alarm_H 11 | 12 | #include "stm32f10x.h" 13 | 14 | //宏定义,单位s,0-4294967295s(71582788.25min) 15 | //运行时间 16 | #define WORK_TIMES 2 17 | //待机时间 18 | #define STANDBY_TIMES 2 19 | 20 | void RTC_Alarm_Configuration(void); 21 | void RTC_NVIC_Config(void); 22 | void RTC_Enter_StandbyMode(u32 s); 23 | #endif 24 | 25 | -------------------------------------------------------------------------------- /src/Hardware/Remote.h: -------------------------------------------------------------------------------- 1 | #ifndef __RED_H 2 | #define __RED_H 3 | #include "Delay.h" 4 | #include "sys.h" 5 | 6 | #define REMOTE_ADDRESS_LEN 8 7 | #define REMOTE_COMMAND_LEN 8 8 | #define REMOTE_ID 0x00 // 红外遥控识别码(ID) 9 | 10 | /*红外发送*/ 11 | typedef enum { 12 | REMOTE_Common_Verify, 13 | REMOTE_Repeat_Verify, 14 | REMOTE_No_Verify, 15 | } RemoteMethod; 16 | 17 | #define REMOTE_PIN PAout(6) 18 | 19 | #define START_LOW_TIME 9000 20 | #define START_HIGH_TIME 4500 21 | #define REPEAT_LOW_TIME 9000 22 | #define REPEAT_HIGH_TIME 2500 23 | #define ZERO_LOW_TIME 560 24 | #define ZERO_HIGH_TIME 560 25 | #define ONE_LOW_TIME 560 26 | #define ONE_HIGH_TIME 1690 27 | 28 | /*红外接收*/ 29 | #define REST 0 // 空闲状态 30 | #define BEGIN 1 // 起始状态 31 | #define RUN 2 // 解码状态 32 | 33 | #define ONE_TIME (ONE_LOW_TIME + ONE_HIGH_TIME) 34 | #define ZERO_TIME (ZERO_LOW_TIME + ZERO_HIGH_TIME) 35 | #define START_TIME (START_LOW_TIME + START_HIGH_TIME) 36 | #define REPEAT_TIME (REPEAT_LOW_TIME + REPEAT_HIGH_TIME) 37 | #define ERROR_TIME 500 38 | 39 | #define REMOTE_ID_VERIFY 1 40 | #define REMOTE_ADDRESS_VERIFY 0 41 | #define REMOTE_COMMAND_VERIFY 1 42 | 43 | #define CMD_START 0x40 44 | #define CMD_UP 0x19 45 | #define CMD_DOWN 0x18 46 | 47 | extern uint8_t Remote_RepeatCounter; // 按键按下的次数 48 | extern uint8_t Remote_Free_Flag; 49 | 50 | void Remote_Init(RemoteMethod method); 51 | uint16_t Remote_GetAddress(void); 52 | uint16_t Remote_GetCommand(void); 53 | uint16_t Remote_GetRawCommand(void); 54 | void Remote_ClearCommand(void); 55 | void Remote_Transmit(uint16_t address, uint16_t command); 56 | void Remote_SendRepeat(void); 57 | 58 | #endif -------------------------------------------------------------------------------- /src/Hardware/SHT45.c: -------------------------------------------------------------------------------- 1 | #include "SHT45.h" 2 | 3 | SHT45_DataTypeDef SHT; 4 | 5 | void SHT45_WriteCommand(uint8_t Command) 6 | { 7 | SHT45_I2C_Start(); 8 | SHT45_I2C_SendByte(SHT45_ADDRESS); 9 | SHT45_I2C_ReceiveAck(); 10 | SHT45_I2C_SendByte(Command); 11 | SHT45_I2C_ReceiveAck(); 12 | SHT45_I2C_Stop(); 13 | } 14 | 15 | void SHT45_MultiReadByte(uint8_t *Data_p, uint8_t Length) 16 | { 17 | SHT45_I2C_Start(); 18 | SHT45_I2C_SendByte(SHT45_ADDRESS | 0x01); 19 | SHT45_I2C_ReceiveAck(); 20 | Length--; 21 | while (Length--) { 22 | *Data_p++ = SHT45_I2C_ReceiveByte(); 23 | SHT45_I2C_SendAck(0); 24 | } 25 | *Data_p = SHT45_I2C_ReceiveByte(); 26 | SHT45_I2C_SendAck(1); 27 | SHT45_I2C_Stop(); 28 | } 29 | 30 | void SHT45_Init(void) 31 | { 32 | SHT45_I2C_Init(); 33 | } 34 | 35 | uint8_t SHT45_GetData(void) 36 | { 37 | uint16_t t_ticks, rh_ticks; 38 | SHT45_WriteCommand(SHT45_HIGH_CMD); 39 | Delay_ms(10); 40 | SHT45_MultiReadByte(SHT.raw_data, 6); 41 | t_ticks = ((uint16_t)SHT.raw_data[0] << 8) | SHT.raw_data[1]; 42 | rh_ticks = ((uint16_t)SHT.raw_data[3] << 8) | SHT.raw_data[4]; 43 | SHT.Temp = -45 + 175 * (float)t_ticks / 65535; 44 | SHT.Hum = -6 + 125 * (float)rh_ticks / 65535; 45 | if (SHT.Hum > 100) 46 | SHT.Hum = 100; 47 | if (SHT.Hum < 0) 48 | SHT.Hum = 0; 49 | if (SHT.raw_data[0] || SHT.raw_data[3]) 50 | return 1; 51 | else 52 | return 0; 53 | } 54 | -------------------------------------------------------------------------------- /src/Hardware/SHT45.h: -------------------------------------------------------------------------------- 1 | #ifndef __SHT45_H 2 | #define __SHT45_H 3 | #include "stm32f10x.h" // Device header 4 | #include "sys.h" 5 | #include "I2C.h" 6 | 7 | typedef struct { 8 | float Temp; 9 | float Hum; 10 | uint8_t raw_data[6]; 11 | } SHT45_DataTypeDef; 12 | 13 | extern SHT45_DataTypeDef SHT; 14 | 15 | #define SHT45_ADDRESS 0x44<<1 16 | #define SHT45_HIGH_CMD 0xFD 17 | 18 | void SHT45_WriteCommand(uint8_t Command); 19 | void SHT45_MultiReadByte(uint8_t *Data_p, uint8_t Length); 20 | void SHT45_Init(void); 21 | uint8_t SHT45_GetData(void); 22 | 23 | #endif 24 | -------------------------------------------------------------------------------- /src/Hardware/Servo.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" 2 | #include "PWM.h" // Device header 3 | 4 | void Servo_Init_(void) 5 | { 6 | PWM_Servo_Init(); 7 | } 8 | 9 | void Servo_SetAngle(float Angle) 10 | { 11 | PWM_SetCompare2(Angle/180*2000+500); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/Hardware/Servo.h: -------------------------------------------------------------------------------- 1 | #ifndef __SERVO_H_ 2 | #define __SERVO_H_ 3 | 4 | void Servo_Init_(void); 5 | void Servo_SetAngle(float Angle); 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /src/Hardware/W25Q128.c: -------------------------------------------------------------------------------- 1 | #include "W25Q128.h" 2 | 3 | void W25Q128_Init(void) 4 | { 5 | W25Q128_SPI_Init(); 6 | } 7 | 8 | void W25Q128_ReadID(uint8_t *MID, uint16_t *DID) 9 | { 10 | W25Q128_SPI_Start(); 11 | W25Q128_SPI_SwapByte(W25Q128_JEDEC_ID); 12 | *MID = W25Q128_SPI_SwapByte(W25Q128_DUMMY_BYTE); 13 | *DID = W25Q128_SPI_SwapByte(W25Q128_DUMMY_BYTE); 14 | *DID <<= 8; 15 | *DID |= W25Q128_SPI_SwapByte(W25Q128_DUMMY_BYTE); 16 | W25Q128_SPI_Stop(); 17 | } 18 | 19 | void W25Q128_WriteEnable(void) 20 | { 21 | W25Q128_SPI_Start(); 22 | W25Q128_SPI_SwapByte(W25Q128_WRITE_ENABLE); 23 | W25Q128_SPI_Stop(); 24 | } 25 | 26 | void W25Q128_WaitBusy(void) 27 | { 28 | uint32_t Timeout; 29 | W25Q128_SPI_Start(); 30 | W25Q128_SPI_SwapByte(W25Q128_READ_STATUS_REGISTER_1); 31 | Timeout = 100000; 32 | while ((W25Q128_SPI_SwapByte(W25Q128_DUMMY_BYTE) & 0x01) == 0x01) { 33 | Timeout--; 34 | if (Timeout == 0) { 35 | break; 36 | } 37 | } 38 | W25Q128_SPI_Stop(); 39 | } 40 | 41 | void W25Q128_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count) 42 | { 43 | W25Q128_WaitBusy(); 44 | W25Q128_WriteEnable(); 45 | 46 | W25Q128_SPI_Start(); 47 | W25Q128_SPI_SwapByte(W25Q128_PAGE_PROGRAM); 48 | W25Q128_SPI_SwapByte(Address >> 16); 49 | W25Q128_SPI_SwapByte(Address >> 8); 50 | W25Q128_SPI_SwapByte(Address); 51 | for (uint16_t i = 0; i < Count; i++) { 52 | W25Q128_SPI_SwapByte(DataArray[i]); 53 | } 54 | W25Q128_SPI_Stop(); 55 | } 56 | 57 | void W25Q128_SectorErase(uint32_t Address) 58 | { 59 | W25Q128_WaitBusy(); 60 | W25Q128_WriteEnable(); 61 | 62 | W25Q128_SPI_Start(); 63 | W25Q128_SPI_SwapByte(W25Q128_SECTOR_ERASE_4KB); 64 | W25Q128_SPI_SwapByte(Address >> 16); 65 | W25Q128_SPI_SwapByte(Address >> 8); 66 | W25Q128_SPI_SwapByte(Address); 67 | W25Q128_SPI_Stop(); 68 | } 69 | 70 | void W25Q128_BlockErase(uint32_t Address) 71 | { 72 | W25Q128_WaitBusy(); 73 | W25Q128_WriteEnable(); 74 | 75 | W25Q128_SPI_Start(); 76 | W25Q128_SPI_SwapByte(W25Q128_BLOCK_ERASE_64KB); 77 | W25Q128_SPI_SwapByte(Address >> 16); 78 | W25Q128_SPI_SwapByte(Address >> 8); 79 | W25Q128_SPI_SwapByte(Address); 80 | W25Q128_SPI_Stop(); 81 | } 82 | 83 | void W25Q128_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count) 84 | { 85 | W25Q128_SPI_Start(); 86 | W25Q128_SPI_SwapByte(W25Q128_READ_DATA); 87 | W25Q128_SPI_SwapByte(Address >> 16); 88 | W25Q128_SPI_SwapByte(Address >> 8); 89 | W25Q128_SPI_SwapByte(Address); 90 | for (uint32_t i = 0; i < Count; i++) { 91 | DataArray[i] = W25Q128_SPI_SwapByte(W25Q128_DUMMY_BYTE); 92 | } 93 | W25Q128_SPI_Stop(); 94 | } 95 | 96 | uint8_t W25Q128_GetNewestBlock(void) 97 | { 98 | uint8_t block_index = 1, time_temp[4]; 99 | uint32_t time_cnt = 0; 100 | for (uint32_t i = 1; i <= W25Q128_MAX_BLOCK; i++) { 101 | uint32_t temp = 0; 102 | W25Q128_ReadData(i << 16, time_temp, 4); 103 | for (uint8_t j = 0; j < 4; j++) { 104 | temp |= (uint32_t)time_temp[j] << (j * 8); 105 | } 106 | if (temp != 0xffffffff && temp >= time_cnt) { 107 | time_cnt = temp; 108 | block_index = i; 109 | } 110 | } 111 | return block_index; 112 | } 113 | 114 | uint8_t W25Q128_SearchBlock(time_t time_cnt) 115 | { 116 | uint8_t time_temp[4]; 117 | for (uint32_t i = 1; i <= W25Q128_MAX_BLOCK; i++) { 118 | uint32_t temp = 0; 119 | W25Q128_ReadData(i << 16, time_temp, 4); 120 | for (uint8_t j = 0; j < 4; j++) { 121 | temp |= (uint32_t)time_temp[j] << (j * 8); 122 | } 123 | if (temp != 0xffffffff && IsSameDay(temp, time_cnt)) { 124 | return (uint8_t)i; 125 | } 126 | } 127 | return 0; 128 | } 129 | 130 | uint32_t W25Q128_GetBlockTimeStamp(uint8_t block_index) 131 | { 132 | uint8_t time_temp[4]; 133 | uint32_t time_cnt = 0; 134 | 135 | W25Q128_ReadData((uint32_t)block_index << 16, time_temp, 4); 136 | for (uint8_t i = 0; i < 4; i++) { 137 | time_cnt |= (uint32_t)time_temp[i] << (i * 8); 138 | } 139 | // LCD_ShowNum(40, 100, time_temp[0], 3); 140 | // LCD_ShowNum(40, 120, time_temp[1], 3); 141 | // LCD_ShowNum(40, 140, time_temp[2], 3); 142 | // LCD_ShowNum(40, 160, time_temp[3], 3); 143 | return time_cnt; 144 | } 145 | 146 | void W25Q128_WriteBlockTimeStamp(uint8_t block_index, time_t time_cnt) 147 | { 148 | uint8_t temp[4]; 149 | temp[3] = (time_cnt >> 24) & 0xff; 150 | temp[2] = (time_cnt >> 16) & 0xff; 151 | temp[1] = (time_cnt >> 8) & 0xff; 152 | temp[0] = (time_cnt) & 0xff; 153 | W25Q128_PageProgram((uint32_t)block_index << 16, temp, 4); 154 | } 155 | 156 | extern char debug_str[100]; 157 | 158 | void W25Q128_WirteData(void) 159 | { 160 | static uint8_t block_index; 161 | // if (!IsTime()) return; // 是否到了上传数据的时间 162 | block_index = W25Q128_GetNewestBlock(); 163 | if (!IsSameDay(W25Q128_GetBlockTimeStamp(block_index), DS3231_GetTimeStamp())) { 164 | if (block_index == W25Q128_MAX_BLOCK) 165 | block_index = 1; 166 | else 167 | block_index++; 168 | W25Q128_BlockErase((uint32_t)block_index << 16); // 新块则清除内存 169 | Delay_ms(100); 170 | W25Q128_WriteBlockTimeStamp(block_index, DS3231_GetTimeStamp()); 171 | Debug_printf("新块\r\n"); 172 | } 173 | uint8_t data[16]; 174 | data[0] = 0x00; 175 | data[1] = DATA1; 176 | data[2] = DATA2; 177 | data[3] = DATA3; 178 | data[4] = DATA4; 179 | data[5] = DATA5; 180 | data[6] = DATA6; 181 | data[7] = DATA7; 182 | data[8] = DATA8; 183 | data[9] = DATA9; 184 | data[10] = DATA10; 185 | data[11] = DATA_NULL; 186 | data[12] = DATA_NULL; 187 | data[13] = DATA_NULL; 188 | data[14] = DATA_NULL; 189 | data[15] = DATA_NULL; 190 | // 上传数据 191 | W25Q128_PageProgram(((uint32_t)block_index << 16) | TimeDate_ToAddress(Time_Hour, Time_Min, Time_Sec), data, DATA_LEN); 192 | 193 | sprintf(debug_str, "写入数据成功,block_index=%d\r\n", block_index); 194 | Debug_printf(debug_str); 195 | for (uint8_t i = 0; i < DATA_LEN; i++) { 196 | sprintf(debug_str, "data%d:%d\r\n", i, data[i]); 197 | Debug_printf(debug_str); 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /src/Hardware/W25Q128.h: -------------------------------------------------------------------------------- 1 | #ifndef __W25Q128_H 2 | #define __W25Q128_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include "SPI.h" 6 | #include "sys.h" 7 | #include 8 | #include "DS3231.h" 9 | #include "EC800.h" 10 | #include "led.h" 11 | 12 | #define W25Q128_WRITE_ENABLE 0x06 13 | #define W25Q128_WRITE_DISABLE 0x04 14 | #define W25Q128_READ_STATUS_REGISTER_1 0x05 15 | #define W25Q128_READ_STATUS_REGISTER_2 0x35 16 | #define W25Q128_WRITE_STATUS_REGISTER 0x01 17 | #define W25Q128_PAGE_PROGRAM 0x02 18 | #define W25Q128_QUAD_PAGE_PROGRAM 0x32 19 | #define W25Q128_BLOCK_ERASE_64KB 0xD8 20 | #define W25Q128_BLOCK_ERASE_32KB 0x52 21 | #define W25Q128_SECTOR_ERASE_4KB 0x20 22 | #define W25Q128_CHIP_ERASE 0xC7 23 | #define W25Q128_ERASE_SUSPEND 0x75 24 | #define W25Q128_ERASE_RESUME 0x7A 25 | #define W25Q128_POWER_DOWN 0xB9 26 | #define W25Q128_HIGH_PERFORMANCE_MODE 0xA3 27 | #define W25Q128_CONTINUOUS_READ_MODE_RESET 0xFF 28 | #define W25Q128_RELEASE_POWER_DOWN_HPM_DEVICE_ID 0xAB 29 | #define W25Q128_MANUFACTURER_DEVICE_ID 0x90 30 | #define W25Q128_READ_UNIQUE_ID 0x4B 31 | #define W25Q128_JEDEC_ID 0x9F 32 | #define W25Q128_READ_DATA 0x03 33 | #define W25Q128_FAST_READ 0x0B 34 | #define W25Q128_FAST_READ_DUAL_OUTPUT 0x3B 35 | #define W25Q128_FAST_READ_DUAL_IO 0xBB 36 | #define W25Q128_FAST_READ_QUAD_OUTPUT 0x6B 37 | #define W25Q128_FAST_READ_QUAD_IO 0xEB 38 | #define W25Q128_OCTAL_WORD_READ_QUAD_IO 0xE3 39 | 40 | #define W25Q128_DUMMY_BYTE 0xFF 41 | 42 | #define W25Q128_MAX_BLOCK 240 43 | 44 | void W25Q128_Init(void); 45 | void W25Q128_ReadID(uint8_t *MID, uint16_t *DID); 46 | void W25Q128_WriteEnable(void); 47 | void W25Q128_WaitBusy(void); 48 | void W25Q128_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count); 49 | void W25Q128_SectorErase(uint32_t Address); 50 | void W25Q128_BlockErase(uint32_t Address); 51 | void W25Q128_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count); 52 | uint8_t W25Q128_GetNewestBlock(void); 53 | uint8_t W25Q128_SearchBlock(time_t time_cnt); 54 | uint32_t W25Q128_GetBlockTimeStamp(uint8_t block_index); 55 | void W25Q128_WriteBlockTimeStamp(uint8_t block_index, time_t time_cnt); 56 | void W25Q128_WirteData(void); 57 | 58 | #endif 59 | -------------------------------------------------------------------------------- /src/Hardware/wdg.c: -------------------------------------------------------------------------------- 1 | #include "wdg.h" 2 | #include "stm32f10x_iwdg.h" 3 | void IWDG_Init(u8 prer,u16 rlr) 4 | { 5 | IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作 6 | 7 | IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64 8 | 9 | IWDG_SetReload(rlr); //设置IWDG重装载值 10 | 11 | IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器 12 | 13 | IWDG_Enable(); //使能IWDG 14 | } 15 | //喂独立看门狗 16 | void IWDG_Feed(void) 17 | { 18 | IWDG_ReloadCounter();//reload 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/Hardware/wdg.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __WDG_H 3 | #define __WDG_H 4 | #include "stm32f10x.h" // Device header 5 | 6 | void IWDG_Init(u8 prer,u16 rlr); 7 | void IWDG_Feed(void); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/LCD/lcd.h: -------------------------------------------------------------------------------- 1 | #ifndef LCD_H_ 2 | #define LCD_H_ 3 | #include "stm32f10x.h" // Device header 4 | #include "DMA.h" 5 | #include "sys.h" 6 | #include "SPI.h" 7 | #include "MLX90640.h" 8 | 9 | #include "Delay.h" 10 | #define LCD_W 240 11 | #define LCD_H 240 12 | 13 | #define TempSymbol 0 14 | #define PercentSymbol 1 15 | #define BatterySymbol1 2 16 | #define BatterySymbol2 3 17 | #define BatterySymbol3 14 18 | #define BatterySymbol4 15 19 | #define BatterySymbol5 16 20 | #define EmissivitySymbol1 4 21 | #define EmissivitySymbol2 5 22 | #define EmissivitySymbol3 6 23 | 24 | 25 | 26 | #define u8 uint8_t 27 | #define u16 uint16_t 28 | #define u32 uint32_t 29 | 30 | #define DC PAout(4) // DC 31 | 32 | #define LCD_SEND_BUFF_LEN 3841 33 | 34 | // LCD模式设置 35 | // 0:4线串行模式 36 | // 1:并行8080模式 37 | #define LCD_MODE 0 38 | #define SIZE 16 39 | #define XLevelL 0x00 40 | #define XLevelH 0x10 41 | #define Max_Column 128 42 | #define Max_Row 64 43 | #define Brightness 0xFF 44 | #define X_WIDTH 128 45 | #define Y_WIDTH 64 46 | 47 | #define LCD_CMD 0 // 写命令 48 | #define LCD_DATA 1 // 写数据 49 | 50 | extern u16 BACK_COLOR, POINT_COLOR,REFRESH_MODE; // 背景色,画笔色 51 | extern u8 LCD_SendBuff[LCD_SEND_BUFF_LEN]; 52 | 53 | void LCD_DMA_ClearCounter(void); 54 | void LCD_DMA_AddDate(u8 Date); 55 | void LCD_DMA_Transfer(void); 56 | void LCD_DMA_TransferLen(u16 DataLen); 57 | void LCD_DMA_Waite(void); 58 | void LCD_DMA_Init(void); 59 | 60 | void LCD_GPIOInit(void); 61 | void LCD_WriteByte(u8 Byte); 62 | void LCD_WriteDATA(u16 Data); 63 | void LCD_WriteREG(u8 Data); 64 | void LCD_Write_REG_DATA(u8 reg, u16 Data); 65 | void LCD_SetAddress(u16 x1, u16 y1, u16 x2, u16 y2); 66 | void LCD_Init(void); 67 | void LCD_Clear(u16 color); 68 | void showhanzi(unsigned int x, unsigned int y, unsigned char index); 69 | void LCD_ShowSymbol(u16 x, u16 y, u8 index); 70 | void LCD_DrawCross(u16 x, u16 y, u8 size, u16 color); 71 | void LCD_DrawPoint(u16 x, u16 y); 72 | void LCD_Fill(u16 xsta, u16 ysta, u16 xend, u16 yend, u16 color); 73 | void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); 74 | void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); 75 | void Draw_Circle(u16 x0, u16 y0, u8 r); 76 | void LCD_ShowChar(u16 x, u16 y, u8 num, u8 mode); 77 | u32 mypow(u8 m, u8 n); 78 | 79 | void LCD_MDA_ShowSymbol(u16 x, u8 index, u8 site); 80 | void LCD_MDA_ShowChar(u16 x, u8 num, u8 site); 81 | void LCD_MDA_ShowNum(u16 x, u32 num, u8 len, u8 site); 82 | void LCD_MDA_ShowString(u16 x, const u8 *p, u8 site); 83 | void LCD_ShowNum(u16 x, u16 y, u32 num, u8 len); 84 | void LCD_ShowString(u16 x, u16 y, const u8 *p); 85 | 86 | u16 RGBToColor(u8 colorR, u8 colorG, u8 colorB); 87 | 88 | 89 | // 画笔颜色 90 | #define WHITE 0xFFFF 91 | #define BLACK 0x0000 92 | #define BLUE 0x001F 93 | #define BRED 0XF81F 94 | #define GRED 0XFFE0 95 | #define GBLUE 0X07FF 96 | #define RED 0xF800 97 | #define MAGENTA 0xF81F 98 | #define GREEN 0x07E0 99 | #define CYAN 0x7FFF 100 | #define YELLOW 0xFFE0 101 | #define BROWN 0XBC40 // 棕色 102 | #define BRRED 0XFC07 // 棕红色 103 | #define GRAY 0X8430 // 灰色 104 | // GUI颜色 105 | 106 | #define DARKBLUE 0X01CF // 深蓝色 107 | #define LIGHTBLUE 0X7D7C // 浅蓝色 108 | #define GRAYBLUE 0X5458 // 灰蓝色 109 | // 以上三色为PANEL的颜色 110 | 111 | #define LIGHTGREEN 0X841F // 浅绿色 112 | #define LGRAY 0XC618 // 浅灰色(PANNEL),窗体背景色 113 | 114 | #define LGRAYBLUE 0XA651 // 浅灰蓝色(中间层颜色) 115 | #define LBBLUE 0X2B12 // 浅棕蓝色(选择条目的反色) 116 | 117 | #endif 118 | -------------------------------------------------------------------------------- /src/Menu/Menu_Setting.c: -------------------------------------------------------------------------------- 1 | #include "Menu.h" 2 | 3 | struct Option_Class Menu_SettingOptionList[]; 4 | 5 | void Set_CursorStyle(void) 6 | { 7 | static int8_t State = 0; 8 | 9 | if (State == 0) 10 | { 11 | Menu_Global.Cur_Style = mouse; 12 | Menu_SettingOptionList[1].String = "光标风格[鼠标]"; 13 | State++; 14 | } 15 | else if (State == 1) 16 | { 17 | Menu_Global.Cur_Style = frame; 18 | Menu_SettingOptionList[1].String = "光标风格[矩形]"; 19 | State++; 20 | } 21 | else // if(Menu_Global.Cur_Style == frame) 22 | { 23 | Menu_Global.Cur_Style = reverse; 24 | Menu_SettingOptionList[1].String = "光标风格[反相]"; 25 | State = 0; 26 | } 27 | } 28 | 29 | void Set_animation_speed(void) 30 | { 31 | static int8_t State = 0; 32 | 33 | if (State == 0) 34 | { 35 | Menu_Global.Cursor_ActSpeed = 0.2; 36 | Menu_Global.Slide_ActSpeed = 4; 37 | Menu_SettingOptionList[2].String = "动画速度[快]"; 38 | State++; 39 | } 40 | else if (State == 1) 41 | { 42 | Menu_Global.Cursor_ActSpeed = 0.99; 43 | Menu_Global.Slide_ActSpeed = 16; 44 | Menu_SettingOptionList[2].String = "动画速度[关]"; 45 | State++; 46 | } 47 | else if (State == 2) 48 | { 49 | Menu_Global.Cursor_ActSpeed = 0.1; 50 | Menu_Global.Slide_ActSpeed = 1.26; 51 | Menu_SettingOptionList[2].String = "动画速度[慢]"; 52 | State++; 53 | } 54 | else 55 | { 56 | Menu_Global.Cursor_ActSpeed = 0.15; 57 | Menu_Global.Slide_ActSpeed = 2; 58 | Menu_SettingOptionList[2].String = "动画速度[中]"; 59 | State = 0; 60 | } 61 | State %= 4; 62 | } 63 | 64 | void Menu_RunSettingMenu(void) 65 | { 66 | static struct Menu_Class Menu = {.isInit = 1}; // 创建菜单实体 67 | if (Menu.isInit) 68 | { 69 | Menu_MenuClassInit(&Menu, Menu_SettingOptionList); 70 | } 71 | Menu_RunWindow(&Menu); 72 | } 73 | struct Option_Class Menu_SettingOptionList[] = { 74 | {"<<<"}, 75 | {"光标风格[反相]", Set_CursorStyle}, 76 | {"动画速度[中]", Set_animation_speed}, 77 | {".."}}; 78 | -------------------------------------------------------------------------------- /src/Menu/menu.h: -------------------------------------------------------------------------------- 1 | #ifndef __MENU_H 2 | #define __MENU_H 3 | #include "stm32f10x.h" // Device header 4 | #include 5 | #include 6 | #include 7 | #include "OLED.h" 8 | #include "Encoder.h" 9 | #include "Key.h" 10 | #include "Remote.h" 11 | 12 | #include "Tools.h" 13 | 14 | #include "Game_Snake.h" 15 | #include "game_of_life.h" 16 | 17 | 18 | enum GlobalStateStyle 19 | { 20 | InitMenu, 21 | StartMenu, 22 | InitThermalCamera, 23 | StartThermalCamera, 24 | InitClock, 25 | StartClock, 26 | InitRemote, 27 | StartRemote, 28 | InitNowData, 29 | StartNowData, 30 | }; 31 | 32 | enum CursorStyle 33 | { 34 | reverse, 35 | mouse, 36 | frame, 37 | }; 38 | 39 | enum MenuStyle 40 | { 41 | multi, 42 | single, 43 | }; 44 | 45 | struct MenuProperty 46 | { 47 | uint8_t isRun;//菜单是否在运行 48 | float Cursor_Actual_X; // 当前光标位置X 49 | float Cursor_Actual_Y; // 当前光标位置Y 50 | float Cursor_Actual_W; // 当前光标尺寸宽 51 | float Cursor_Actual_H; // 当前光标尺寸高 52 | enum CursorStyle Cur_Style; // 光标风格; 53 | float Cursor_ActSpeed; // 光标动画速度系数; 54 | float Slide_ActSpeed; // 滚动动画速度系数; 55 | int8_t Font_Width; // 字体宽度 56 | int8_t Font_Height; // 字体宽度 57 | int8_t Line_Height; // 行高 58 | int8_t Layout_Margin; // 页边距 59 | 60 | int8_t Window_X; // 窗口位置X 61 | int8_t Window_Y; // 窗口位置Y 62 | uint8_t Window_W; // 窗口宽度 63 | uint8_t Window_H; // 窗口高度 64 | 65 | struct Menu_Class *RunningMenu; // 运行中的菜单 66 | }; 67 | 68 | 69 | /**********************************************************/ 70 | struct Option_Class 71 | { 72 | char *String; // 选项名字 73 | void (*func)(void); // 函数指针 74 | uint16_t *Variable; // 数值 75 | 76 | // int8_t Coord_X; // 选项坐标X 77 | // int8_t Coord_Y; // 选项坐标Y 78 | // uint8_t Width; // 选项宽度 79 | // uint8_t Height; // 选项高度 80 | 81 | uint8_t StrLen; // 由于中文占三个字节,用strlen计算名字宽度不再准确,故需额外储存名字宽度 82 | }; 83 | 84 | struct Menu_Class 85 | { 86 | enum MenuStyle Menu_Style;//菜单样式 87 | 88 | int8_t isInit; // 是否初始化菜单状态 89 | int8_t isShow; // 是否显示菜单 90 | int8_t isReadKey; // 是否读取按键 91 | int8_t isCaller; // 是否调用下级程序 92 | 93 | int8_t Cat_i; // 选中下标 94 | int8_t Cur_i; // 光标下标 95 | int8_t Cur_i_Ceiling; // 光标位置限制,自动计算;上限位 96 | enum CursorStyle Cur_Style; // 光标风格 97 | 98 | int8_t Show_i; // 显示起始下标 99 | int8_t Show_i_previous; // 显示起始下标的前一个状态(用于比较) 100 | int8_t Show_offset; // 显示Y轴的偏移相关 101 | 102 | uint8_t Option_MaxNum; // 选项列表长度 103 | uint8_t Option_MaxStrLen; // 选项列表长度 104 | struct Option_Class *Option_List; 105 | 106 | int8_t Font_Width; // 字宽 107 | int8_t Font_Height; // 字高 108 | int8_t Line_Height; // 行高 109 | int8_t Layout_Margin; // 页边距 布局 110 | 111 | int8_t Window_X; // 窗口坐标X 112 | int8_t Window_Y; // 窗口坐标Y 113 | uint8_t Window_W; // 窗口宽度 114 | uint8_t Window_H; // 窗口高度 115 | int8_t Window_Border; // 窗口边框 116 | int8_t Window_BotCol; // 窗口底色bottom colour 117 | 118 | int8_t Target_Window_X; // 窗口坐标X 119 | int8_t Target_Window_Y; // 窗口坐标Y 120 | uint8_t Target_Window_W; // 窗口宽度 121 | uint8_t Target_Window_H; // 窗口高度 122 | }; 123 | 124 | extern struct MenuProperty Menu_Global;//全局属性 125 | extern struct Menu_Class Menu_StartMenu;//开始菜单对象 126 | 127 | extern enum GlobalStateStyle GlobalState; 128 | 129 | /**********************************************************/ 130 | int8_t Menu_Start(int8_t Shift); 131 | void Menu_SelectOption(void); 132 | void Menu_TurnOffMenu(void); 133 | /**********************************************************/ 134 | int8_t Menu_RunWindow(struct Menu_Class *MU); // 运行窗口 135 | /**********************************************************/ 136 | uint8_t Menu_GetOptionStrLen(char *String);//获取选项字符串长度 137 | uint8_t Menu_PrintfOptionStr(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, uint8_t FontSize, char *format, ...);//范围格式化字符串打印 138 | /**********************************************************/ 139 | void Menu_ShowCursor(float Target_Cur_X, float Target_Cur_Y, float Target_Cur_W, float Target_Cur_H, enum CursorStyle CurStyle, float Cur_Act_Speed);//显示光标 140 | float Menu_CurveMigration(float Actual_Value, float Target_Value, float Act_Speed);//平滑偏移数值 141 | /**********************************************************/ 142 | void Menu_MenuClassInit(struct Menu_Class *MU, struct Option_Class *OL);//菜单对象初始化 143 | void Menu_ShowWallpaper(const uint8_t *Wallpaper);//显示壁纸 144 | /**********************************************************/ 145 | void Menu_RunMainMenu(void); 146 | void Menu_RunToolsMenu(void); 147 | void Menu_RunDataMenu(void); 148 | void Menu_RunGamesMenu(void); 149 | void Menu_RunSettingMenu(void); 150 | void Menu_Information(void); 151 | /**********************************************************/ 152 | int8_t Menu_RollEvent(void); 153 | int8_t Menu_EnterEvent(void); 154 | int8_t Menu_BackEvent(void); 155 | /**********************************************************/ 156 | 157 | #endif 158 | -------------------------------------------------------------------------------- /src/Menu/menu_Data.c: -------------------------------------------------------------------------------- 1 | #include "Menu.h" 2 | 3 | int8_t Menu_Start(int8_t Shift) 4 | { 5 | if (Shift == 0) { 6 | if (Menu_Global.RunningMenu->isInit) { 7 | return 0; 8 | } else { 9 | Menu_RunMainMenu(); 10 | return 1; 11 | } 12 | } else if (Shift == 1) { 13 | Menu_RunMainMenu(); 14 | } else // if(Shift == -1) 15 | { 16 | Menu_Global.RunningMenu->isInit = 1; 17 | return 0; 18 | } 19 | return 0; 20 | } 21 | 22 | /*创建选项列表*/ 23 | struct Option_Class Menu_StartOptionList[] = { 24 | {"<<<"}, 25 | {"工具", Menu_RunToolsMenu}, 26 | {"数据", Menu_RunDataMenu}, 27 | {"游戏", Menu_RunGamesMenu}, 28 | {"设置", Menu_RunSettingMenu}, 29 | {"信息", Menu_Information}, 30 | {".."}}; 31 | 32 | /*创建开始菜单对象*/ 33 | struct Menu_Class Menu_StartMenu = {.isInit = 1}; 34 | 35 | void Menu_RunMainMenu(void) 36 | { 37 | if (Menu_StartMenu.isInit) // 由于开始菜单没有上级, 需手动配置部分参数; 38 | { 39 | Menu_MenuClassInit(&Menu_StartMenu, Menu_StartOptionList); 40 | /*手动配置区*******/ 41 | Menu_StartMenu.Target_Window_X = 0; 42 | Menu_StartMenu.Target_Window_Y = 0; 43 | Menu_StartMenu.Window_X = 0; 44 | Menu_StartMenu.Window_Y = 64; 45 | Menu_Global.Cursor_Actual_X = 0; 46 | Menu_Global.Cursor_Actual_Y = 64; 47 | 48 | /*******手动配置区*/ 49 | } 50 | 51 | Menu_RunWindow(&Menu_StartMenu); 52 | } 53 | 54 | void Menu_StartThermalCamera(void) 55 | { 56 | Menu_TurnOffMenu(); 57 | GlobalState = InitThermalCamera; 58 | } 59 | 60 | void Menu_StartClock(void) 61 | { 62 | Menu_TurnOffMenu(); 63 | GlobalState = InitClock; 64 | } 65 | 66 | void Menu_RunToolsMenu(void) 67 | { 68 | /*创建选项列表*/ 69 | static struct Option_Class Menu_ToolsOptionList[] = { 70 | {"<<<"}, 71 | {"热成像仪", Menu_StartThermalCamera}, 72 | {"红外遥控", Tools_Remote}, 73 | {"时钟", Menu_StartClock}, 74 | {".."}}; 75 | 76 | /*创建菜单对象*/ 77 | static struct Menu_Class Menu_ToolsMenu = {.isInit = 1}; // 赋值初始化 78 | 79 | if (Menu_ToolsMenu.isInit) { 80 | Menu_MenuClassInit(&Menu_ToolsMenu, Menu_ToolsOptionList); 81 | /*手动配置区*******/ 82 | 83 | /*******手动配置区*/ 84 | } 85 | 86 | Menu_RunWindow(&Menu_ToolsMenu); 87 | } 88 | 89 | void Menu_StartNowData(void) 90 | { 91 | Menu_TurnOffMenu(); 92 | GlobalState = InitNowData; 93 | } 94 | 95 | void Menu_RunDataMenu(void) 96 | { 97 | /*创建选项列表*/ 98 | static struct Option_Class Menu_DataOptionList[] = { 99 | {"<<<"}, 100 | {"实时环境数据", Menu_StartNowData}, 101 | {"历史环境数据", Tools_Reader}, 102 | {".."}}; 103 | 104 | /*创建菜单对象*/ 105 | static struct Menu_Class Menu_DataMenu = {.isInit = 1}; // 赋值初始化 106 | 107 | if (Menu_DataMenu.isInit) { 108 | Menu_MenuClassInit(&Menu_DataMenu, Menu_DataOptionList); 109 | /*手动配置区*******/ 110 | 111 | /*******手动配置区*/ 112 | } 113 | 114 | Menu_RunWindow(&Menu_DataMenu); 115 | } 116 | 117 | void Menu_RunGamesMenu(void) 118 | { 119 | static struct Option_Class Menu_GamesOptionList[] = { 120 | {"<<<"}, 121 | {"贪吃蛇", Game_Snake_Init}, // 贪吃蛇 122 | {"康威生命游戏", Game_Of_Life_Play}, // 康威生命游戏,元胞自动机 123 | {".."}}; 124 | static struct Menu_Class Menu_GamesMenu = {multi, 1}; 125 | 126 | if (Menu_GamesMenu.isInit) { 127 | Menu_MenuClassInit(&Menu_GamesMenu, Menu_GamesOptionList); 128 | /*手动配置区*******/ 129 | 130 | /*******手动配置区*/ 131 | } 132 | Menu_RunWindow(&Menu_GamesMenu); 133 | } 134 | 135 | void Menu_Information(void) 136 | { 137 | float Angle = 3640; 138 | while (1) { 139 | OLED_Clear(); 140 | 141 | // OLED_ShowImage(88, 8, 32, 32, goutou); 142 | OLED_Rotation_Block(88 + 16, 8 + 16, 16, Angle); 143 | 144 | Angle += Menu_RollEvent() * 8; 145 | 146 | if (Angle > 1) { 147 | Angle -= Angle / 32 + 1; 148 | } else if (Angle < -1) { 149 | Angle -= Angle / 32 - 1; 150 | } else { 151 | Angle = 0; 152 | } 153 | // Angle += 2; 154 | // Angle %= 360; 155 | 156 | OLED_ShowString(2, 0, "Menu Window\nv1.2", OLED_8X16); 157 | OLED_ShowString(2, 32, "By:Adam", OLED_8X16); 158 | OLED_ShowString(2, 48, "UP:加油哦大灰狼", OLED_8X16); 159 | 160 | OLED_Update(); 161 | if (Menu_EnterEvent()) { 162 | return; 163 | } 164 | if (Menu_BackEvent()) { 165 | return; 166 | } 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /src/OLED/OLED.h: -------------------------------------------------------------------------------- 1 | #ifndef __OLED_H 2 | #define __OLED_H 3 | 4 | #include 5 | #include "OLED_Data.h" 6 | #include "lcd.h" 7 | 8 | /*参数宏定义*********************/ 9 | 10 | /*FontSize参数取值*/ 11 | /*此参数值不仅用于判断,而且用于计算横向字符偏移,默认值为字体像素宽度*/ 12 | #define OLED_8X16 8 13 | #define OLED_6X8 6 14 | 15 | /*IsFilled参数数值*/ 16 | #define OLED_UNFILLED 0 17 | #define OLED_FILLED 1 18 | 19 | /*********************参数宏定义*/ 20 | 21 | extern uint8_t OLED_DisplayBuf[8][120]; 22 | 23 | /*函数声明*********************/ 24 | 25 | /*初始化函数*/ 26 | void OLED_Init(void); 27 | 28 | /*更新函数*/ 29 | void OLED_Update(void); 30 | void OLED_UpdateArea(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height); 31 | 32 | /*显存控制函数*/ 33 | void OLED_Clear(void); 34 | void OLED_ClearArea(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height); 35 | void OLED_Reverse(void); 36 | void OLED_ReverseArea(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height); 37 | 38 | /*显示函数*/ 39 | void OLED_ShowChar(uint8_t X, uint8_t Y, char Char, uint8_t FontSize); 40 | void OLED_ShowString(uint8_t X, uint8_t Y, char *String, uint8_t FontSize); 41 | void OLED_ShowNum(uint8_t X, uint8_t Y, uint32_t Number, uint8_t Length, uint8_t FontSize); 42 | void OLED_ShowSignedNum(uint8_t X, uint8_t Y, int32_t Number, uint8_t Length, uint8_t FontSize); 43 | void OLED_ShowHexNum(uint8_t X, uint8_t Y, uint32_t Number, uint8_t Length, uint8_t FontSize); 44 | void OLED_ShowBinNum(uint8_t X, uint8_t Y, uint32_t Number, uint8_t Length, uint8_t FontSize); 45 | void OLED_ShowFloatNum(uint8_t X, uint8_t Y, double Number, uint8_t IntLength, uint8_t FraLength, uint8_t FontSize); 46 | void OLED_ShowChinese(uint8_t X, uint8_t Y, char *Chinese); 47 | void OLED_ShowImage(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, const uint8_t *Image); 48 | void OLED_Printf(uint8_t X, uint8_t Y, uint8_t FontSize, char *format, ...); 49 | 50 | /*绘图函数*/ 51 | void OLED_DrawPoint(uint8_t X, uint8_t Y); 52 | uint8_t OLED_GetPoint(uint8_t X, uint8_t Y); 53 | void OLED_DrawLine(uint8_t X0, uint8_t Y0, uint8_t X1, uint8_t Y1); 54 | void OLED_DrawRectangle(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, uint8_t IsFilled); 55 | void OLED_DrawTriangle(uint8_t X0, uint8_t Y0, uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2, uint8_t IsFilled); 56 | void OLED_DrawCircle(uint8_t X, uint8_t Y, uint8_t Radius, uint8_t IsFilled); 57 | void OLED_DrawEllipse(uint8_t X, uint8_t Y, uint8_t A, uint8_t B, uint8_t IsFilled); 58 | void OLED_DrawArc(uint8_t X, uint8_t Y, uint8_t Radius, int16_t StartAngle, int16_t EndAngle, uint8_t IsFilled); 59 | 60 | /*********************函数声明*/ 61 | uint8_t OLED_ShowStringArea(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, char *String, uint8_t FontSize); //区域打印; 62 | 63 | 64 | void OLED_Rotation_C_P(int8_t CX, int8_t CY, float* PX, float* PY, int16_t Angle); //点旋转 65 | void OLED_Rotation_Block(int8_t X, int8_t Y, int8_t Width, int16_t Angle); //区块旋转 66 | void bresenham_ellipse(int x0, int y0, int rx, int ry); 67 | void ellipse_algorithm(int8_t x0, int8_t y0, int8_t a, int8_t b); 68 | 69 | 70 | 71 | #endif 72 | 73 | 74 | /*****************江协科技|版权所有****************/ 75 | /*****************jiangxiekeji.com*****************/ 76 | -------------------------------------------------------------------------------- /src/OLED/OLED_Data.h: -------------------------------------------------------------------------------- 1 | #ifndef __OLED_DATA_H 2 | #define __OLED_DATA_H 3 | 4 | #include 5 | 6 | /*中文字符字节宽度*/ 7 | #define OLED_CHN_CHAR_WIDTH 3 //UTF-8编码格式给3,GB2312编码格式给2 8 | 9 | /*字模基本单元*/ 10 | typedef struct 11 | { 12 | uint8_t Data[32]; //字模数据 13 | char Index[OLED_CHN_CHAR_WIDTH + 1]; //汉字索引 14 | } ChineseCell_t; 15 | 16 | typedef struct 17 | { 18 | uint8_t Data[24]; //字模数据 19 | char Index[OLED_CHN_CHAR_WIDTH + 1]; //汉字索引 20 | } ChineseCell_t12; 21 | 22 | typedef struct 23 | { 24 | uint8_t Data[20]; //字模数据 25 | char Index[OLED_CHN_CHAR_WIDTH + 1]; //汉字索引 26 | } ChineseCell_t10; 27 | 28 | typedef struct 29 | { 30 | uint8_t Data[8]; //字模数据 31 | char Index[OLED_CHN_CHAR_WIDTH + 1]; //汉字索引 32 | } ChineseCell_t8; 33 | 34 | 35 | /*ASCII字模数据声明*/ 36 | extern const uint8_t OLED_F8x16[][16]; 37 | extern const uint8_t OLED_F6x8[][6]; 38 | 39 | /*汉字字模数据声明*/ 40 | extern const ChineseCell_t OLED_CF16x16[]; 41 | extern const ChineseCell_t12 OLED_CF12x12[]; 42 | extern const ChineseCell_t10 OLED_CF10x10[]; 43 | extern const ChineseCell_t8 OLED_CF8x8[]; 44 | 45 | /*图像数据声明*/ 46 | extern const uint8_t Diode[]; 47 | /*按照上面的格式,在这个位置加入新的图像数据声明*/ 48 | extern const uint8_t Cursor[]; 49 | extern const uint8_t goutou[]; 50 | extern const uint8_t Wallpaper[]; 51 | extern const uint8_t XpWallpaper[]; 52 | extern const uint8_t Win11Wallpaper[]; 53 | 54 | //... 55 | 56 | #endif 57 | 58 | 59 | /*****************江协科技|版权所有****************/ 60 | /*****************jiangxiekeji.com*****************/ 61 | -------------------------------------------------------------------------------- /src/System/ADC.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | void AD_Init(void) 4 | { 5 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); 6 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 7 | RCC_ADCCLKConfig(RCC_PCLK2_Div6); 8 | 9 | GPIO_InitTypeDef GPIO_InitStructure; 10 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; 11 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; 12 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 13 | GPIO_Init (GPIOA,&GPIO_InitStructure); 14 | 15 | ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); 16 | 17 | ADC_InitTypeDef ADC_InitStructure; 18 | ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; 19 | ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; 20 | ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; 21 | ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//DISABLE 22 | ADC_InitStructure.ADC_ScanConvMode=DISABLE; 23 | ADC_InitStructure.ADC_NbrOfChannel=1; 24 | ADC_Init(ADC1, &ADC_InitStructure); 25 | 26 | ADC_Cmd(ADC1,ENABLE); 27 | 28 | ADC_ResetCalibration(ADC1); 29 | while(ADC_GetResetCalibrationStatus(ADC1)==SET); 30 | ADC_StartCalibration(ADC1); 31 | while(ADC_GetCalibrationStatus(ADC1)==SET); 32 | ADC_SoftwareStartConvCmd(ADC1,ENABLE); 33 | } 34 | 35 | uint16_t AD_GetValue(void) 36 | { 37 | //while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); 38 | return ADC_GetConversionValue(ADC1); 39 | } 40 | 41 | /* 42 | int16_t AD_Value=0; 43 | float Voltage; 44 | 45 | OLED_ShowString(1,1,"Angle: "); 46 | //OLED_ShowString(2,1,"Freq: "); 47 | OLED_ShowString(3,1,"Value: "); 48 | OLED_ShowString(4,1,"Voltage:0.00V"); 49 | 50 | Voltage=(float)AD_Value/4088*3.3; 51 | OLED_ShowNum(3,9,AD_Value,4); 52 | OLED_ShowNum(4,9,Voltage,1); 53 | OLED_ShowNum(4,11,(uint16_t)(Voltage*100)%100,2); */ -------------------------------------------------------------------------------- /src/System/ADC.h: -------------------------------------------------------------------------------- 1 | #ifndef __ADC_H 2 | #define __ADC_H 3 | 4 | void AD_Init(void); 5 | uint16_t AD_GetValue(void); 6 | 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /src/System/DMA.c: -------------------------------------------------------------------------------- 1 | #include "DMA.h" 2 | 3 | // OLED DMA 4 | void DMA1_Init(DMA_Channel_TypeDef *DMA_CHx, uint32_t cpar, uint32_t cmar, uint16_t cndtr) 5 | { 6 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 7 | 8 | DMA_DeInit(DMA_CHx); 9 | DMA_InitTypeDef DMA_InitStructure; 10 | DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; // dma 要搬运到的外设地址 11 | DMA_InitStructure.DMA_MemoryBaseAddr = cmar; // dma要搬运的内存的地址 12 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 搬运方向, 从内存到外设 13 | DMA_InitStructure.DMA_BufferSize = cndtr; // 要搬运的内存的大小 14 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 传输过程中外设的基地址不变 15 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 传输过程中内存地址递增 16 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 数据宽度为八位 17 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 数据宽度为八位 18 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 正常传输模式 19 | DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; // 优先级设置 20 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 没有内存到内存的传输 21 | DMA_Init(DMA_CHx, &DMA_InitStructure); 22 | } 23 | 24 | // 使能dma1的通道3,因为spi输出对应的是此通道 25 | void DMA1_Transfer(DMA_Channel_TypeDef *DMA_CHx, uint16_t CounterSize) 26 | { 27 | DMA_Cmd(DMA_CHx, DISABLE); 28 | DMA_SetCurrDataCounter(DMA_CHx, CounterSize); 29 | DMA_Cmd(DMA_CHx, ENABLE); 30 | } 31 | -------------------------------------------------------------------------------- /src/System/DMA.h: -------------------------------------------------------------------------------- 1 | #ifndef __DMA_H__ 2 | #define __DMA_H__ 3 | #include "stm32f10x.h" // Device header 4 | #include "Delay.h" 5 | 6 | void DMA1_Init(DMA_Channel_TypeDef *DMA_CHx, uint32_t cpar, uint32_t cmar, uint16_t cndtr); 7 | void DMA1_Transfer(DMA_Channel_TypeDef *DMA_CHx, uint16_t CounterSize); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/System/Delay.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" 2 | 3 | /** 4 | * @brief 微秒级延时 5 | * @param xus 延时时长,范围:0~233015 6 | * @retval 无 7 | */ 8 | void Delay_us(uint32_t xus) 9 | { 10 | SysTick->LOAD = 72 * xus; //设置定时器重装值 11 | SysTick->VAL = 0x00; //清空当前计数值 12 | SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器 13 | while(!(SysTick->CTRL & 0x00010000)); //等待计数到0 14 | SysTick->CTRL = 0x00000004; //关闭定时器 15 | } 16 | 17 | /** 18 | * @brief 毫秒级延时 19 | * @param xms 延时时长,范围:0~4294967295 20 | * @retval 无 21 | */ 22 | void Delay_ms(uint32_t xms) 23 | { 24 | while(xms--) 25 | { 26 | Delay_us(1000); 27 | } 28 | } 29 | 30 | /** 31 | * @brief 秒级延时 32 | * @param xs 延时时长,范围:0~4294967295 33 | * @retval 无 34 | */ 35 | void Delay_s(uint32_t xs) 36 | { 37 | while(xs--) 38 | { 39 | Delay_ms(1000); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/System/Delay.h: -------------------------------------------------------------------------------- 1 | #ifndef __DELAY_H 2 | #define __DELAY_H 3 | #include "stm32f10x.h" 4 | 5 | void Delay_us(uint32_t us); 6 | void Delay_ms(uint32_t ms); 7 | void Delay_s(uint32_t s); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/System/I2C.h: -------------------------------------------------------------------------------- 1 | #ifndef __I2C_H__ 2 | #define __I2C_H__ 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include "sys.h" 6 | #include "Delay.h" 7 | 8 | #define DS3231_I2C_SDA_SET PBout(8) 9 | #define DS3231_I2C_SDA_READ PBin(8) 10 | #define DS3231_I2C_SCL_SET PBout(9) 11 | 12 | #define CCS811_I2C_SDA_SET PAout(11) 13 | #define CCS811_I2C_SDA_READ PAin(11) 14 | #define CCS811_I2C_SCL_SET PAout(12) 15 | 16 | #define SHT45_I2C_SDA_SET PAout(0) 17 | #define SHT45_I2C_SDA_READ PAin(0) 18 | #define SHT45_I2C_SCL_SET PAout(1) 19 | 20 | #define MAX44009_I2C_SDA_SET PCout(14) 21 | #define MAX44009_I2C_SDA_READ PCin(14) 22 | #define MAX44009_I2C_SCL_SET PCout(13) 23 | 24 | void DS3231_I2C_Init(); 25 | void DS3231_I2C_delay(); 26 | void DS3231_I2C_Start(void); 27 | void DS3231_I2C_Stop(void); 28 | void DS3231_I2C_SendByte(uint8_t Byte); 29 | uint8_t DS3231_I2C_ReceiveByte(); 30 | void DS3231_I2C_SendAck(uint8_t AckBit); 31 | uint8_t DS3231_I2C_ReceiveAck(); 32 | 33 | void CCS811_I2C_Init(); 34 | void CCS811_I2C_delay(); 35 | void CCS811_I2C_Start(void); 36 | void CCS811_I2C_Stop(void); 37 | void CCS811_I2C_SendByte(uint8_t Byte); 38 | uint8_t CCS811_I2C_ReceiveByte(); 39 | void CCS811_I2C_SendAck(uint8_t AckBit); 40 | uint8_t CCS811_I2C_ReceiveAck(); 41 | 42 | void SHT45_I2C_Init(); 43 | void SHT45_I2C_delay(); 44 | void SHT45_I2C_Start(void); 45 | void SHT45_I2C_Stop(void); 46 | void SHT45_I2C_SendByte(uint8_t Byte); 47 | uint8_t SHT45_I2C_ReceiveByte(); 48 | void SHT45_I2C_SendAck(uint8_t AckBit); 49 | uint8_t SHT45_I2C_ReceiveAck(); 50 | 51 | void MAX44009_I2C_Init(); 52 | void MAX44009_I2C_delay(); 53 | void MAX44009_I2C_Start(void); 54 | void MAX44009_I2C_Stop(void); 55 | void MAX44009_I2C_SendByte(uint8_t Byte); 56 | uint8_t MAX44009_I2C_ReceiveByte(); 57 | void MAX44009_I2C_SendAck(uint8_t AckBit); 58 | uint8_t MAX44009_I2C_ReceiveAck(); 59 | 60 | #endif -------------------------------------------------------------------------------- /src/System/IC.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | 4 | void IC_Init(void) 5 | { 6 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 7 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 8 | 9 | GPIO_InitTypeDef GPIO_InitStructure; 10 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 11 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; 12 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 13 | GPIO_Init (GPIOA,&GPIO_InitStructure); 14 | 15 | TIM_InternalClockConfig(TIM3); 16 | 17 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 18 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 19 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 20 | TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR 21 | TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//PSC 22 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 23 | TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); 24 | 25 | TIM_ICInitTypeDef TIM_ICInitStructure; 26 | TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; 27 | TIM_ICInitStructure.TIM_ICFilter=0xF; 28 | TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling; 29 | TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; 30 | TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; 31 | TIM_ICInit(TIM3, &TIM_ICInitStructure); 32 | 33 | TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); 34 | TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); 35 | 36 | TIM_Cmd(TIM3,ENABLE); 37 | } 38 | 39 | void IC2_Init(void) 40 | { 41 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 42 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 43 | 44 | GPIO_InitTypeDef GPIO_InitStructure; 45 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 46 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; 47 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 48 | GPIO_Init (GPIOA,&GPIO_InitStructure); 49 | 50 | TIM_InternalClockConfig(TIM3); 51 | 52 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 53 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 54 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 55 | TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR 56 | TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//PSC 57 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 58 | TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); 59 | 60 | TIM_ICInitTypeDef TIM_ICInitStructure; 61 | TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; 62 | TIM_ICInitStructure.TIM_ICFilter=0x0; 63 | TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; 64 | TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; 65 | TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; 66 | TIM_PWMIConfig(TIM3, &TIM_ICInitStructure); 67 | 68 | TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); 69 | TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); 70 | 71 | TIM_Cmd(TIM3,ENABLE); 72 | } 73 | 74 | uint32_t IC_GetFreq(void) 75 | { 76 | return 1000000/(TIM_GetCapture1(TIM3)+1); 77 | } 78 | 79 | uint32_t IC_GetDuty(void) 80 | { 81 | return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1); 82 | } 83 | -------------------------------------------------------------------------------- /src/System/IC.h: -------------------------------------------------------------------------------- 1 | #ifndef __IC_H 2 | #define __IC_H 3 | 4 | void IC_Init(void); 5 | void IC2_Init(void); 6 | uint32_t IC_GetFreq(void); 7 | uint32_t IC_GetDuty(void); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/System/PWM.c: -------------------------------------------------------------------------------- 1 | #include "stm32f10x.h" // Device header 2 | 3 | void PWM_Servo_Init(void) 4 | { 5 | 6 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 7 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 8 | 9 | // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 10 | // GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 11 | // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 12 | 13 | GPIO_InitTypeDef GPIO_InitStructure; 14 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; 15 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; 16 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 17 | GPIO_Init (GPIOA,&GPIO_InitStructure); 18 | 19 | TIM_InternalClockConfig(TIM2); 20 | 21 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 22 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 23 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 24 | TIM_TimeBaseInitStructure.TIM_Period=20000-1;//ARR20000 25 | TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//PSC72 26 | //TIM_PrescalerConfig(TIMx,Prescaler,TIM_PSCReloadMode_Immediate); 27 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 28 | TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); 29 | 30 | TIM_OCInitTypeDef TIM_OCInitStructure; 31 | TIM_OCStructInit(&TIM_OCInitStructure); 32 | TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; 33 | TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; 34 | TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; 35 | TIM_OCInitStructure.TIM_Pulse=0; //CCR 36 | 37 | TIM_OC1Init(TIM2, &TIM_OCInitStructure); 38 | TIM_OC2Init(TIM2, &TIM_OCInitStructure); 39 | TIM_OC3Init(TIM2, &TIM_OCInitStructure); 40 | TIM_OC4Init(TIM2, &TIM_OCInitStructure); 41 | 42 | TIM_Cmd(TIM2,ENABLE); 43 | 44 | 45 | } 46 | 47 | 48 | void PWM_SetCompare1(uint16_t Compare) 49 | { 50 | TIM_SetCompare1(TIM2,Compare); 51 | } 52 | 53 | void PWM_SetCompare2(uint16_t Compare) 54 | { 55 | TIM_SetCompare2(TIM2,Compare); 56 | } 57 | 58 | void PWM_SetCompare3(uint16_t Compare) 59 | { 60 | TIM_SetCompare3(TIM2,Compare); 61 | } 62 | 63 | void PWM_SetCompare4(uint16_t Compare) 64 | { 65 | TIM_SetCompare4(TIM2,Compare); 66 | } 67 | 68 | 69 | 70 | /* void PWM2_Init(void) 71 | { 72 | 73 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); 74 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 75 | 76 | // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 77 | // GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 78 | // GPIO_PinRemapConfig(G PIO_Remap_SWJ_JTAGDisable, ENABLE); 79 | 80 | GPIO_InitTypeDef GPIO_InitStructure; 81 | GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; 82 | GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7; 83 | GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 84 | GPIO_Init (GPIOB,&GPIO_InitStructure); 85 | 86 | TIM_InternalClockConfig(TIM4); 87 | 88 | TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 89 | TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 90 | TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 91 | TIM_TimeBaseInitStructure.TIM_Period=100-1;//ARR100 92 | TIM_TimeBaseInitStructure.TIM_Prescaler=7-1;//PSC72 93 | //TIM_PrescalerConfig(TIMx,Prescaler,TIM_PSCReloadMode_Immediate); 94 | TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; 95 | TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); 96 | 97 | TIM_OCInitTypeDef TIM_OCInitStructure; 98 | TIM_OCStructInit(&TIM_OCInitStructure); 99 | TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; 100 | TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; 101 | TIM_OCInitStructure.TIM_putState=TIM_putState_Enable; 102 | TIM_OCInitStructure.TIM_Pulse=50; //CCR 103 | 104 | TIM_OC1Init(TIM4, &TIM_OCInitStructure); 105 | TIM_OC2Init(TIM4, &TIM_OCInitStructure); 106 | 107 | TIM_Cmd(TIM4,ENABLE); 108 | 109 | 110 | } */ 111 | -------------------------------------------------------------------------------- /src/System/PWM.h: -------------------------------------------------------------------------------- 1 | #ifndef __PWM_H 2 | #define __PWM_H 3 | 4 | void PWM_Servo_Init(void); 5 | void PWM_SetCompare1(uint16_t Compare); 6 | void PWM_SetCompare2(uint16_t Compare); 7 | void PWM_SetCompare3(uint16_t Compare); 8 | void PWM_SetCompare4(uint16_t Compare); 9 | 10 | #endif 11 | -------------------------------------------------------------------------------- /src/System/SPI.c: -------------------------------------------------------------------------------- 1 | #include "SPI.h" 2 | 3 | void W25Q128_SPI_Init(void) 4 | { 5 | 6 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 7 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); 8 | 9 | GPIO_InitTypeDef GPIO_InitStructure; 10 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 11 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 12 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 13 | GPIO_Init(GPIOB, &GPIO_InitStructure); 14 | 15 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 16 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_13; 17 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 18 | GPIO_Init(GPIOB, &GPIO_InitStructure); 19 | 20 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 21 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; 22 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 23 | GPIO_Init(GPIOB, &GPIO_InitStructure); 24 | 25 | SPI_InitTypeDef SPI_InitStructure; 26 | SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 27 | SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 28 | SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 29 | SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 30 | SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; 31 | SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 32 | SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 33 | SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 34 | SPI_InitStructure.SPI_CRCPolynomial = 7; 35 | SPI_Init(SPI2, &SPI_InitStructure); 36 | 37 | SPI_Cmd(SPI2, ENABLE); 38 | 39 | W25Q128_SPI_SS_SET = 1; 40 | } 41 | 42 | void W25Q128_SPI_Start(void) 43 | { 44 | W25Q128_SPI_SS_SET = 0; 45 | } 46 | 47 | void W25Q128_SPI_Stop(void) 48 | { 49 | W25Q128_SPI_SS_SET = 1; 50 | } 51 | 52 | uint8_t W25Q128_SPI_SwapByte(uint8_t ByteSend) 53 | { 54 | while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != SET); 55 | SPI_I2S_SendData(SPI2, ByteSend); 56 | while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != SET); 57 | return SPI_I2S_ReceiveData(SPI2); 58 | } 59 | 60 | // spi1初始化 61 | void LCD_SPI_Init(void) 62 | { 63 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); 64 | 65 | GPIO_InitTypeDef GPIO_InitStructure; 66 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; 67 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 68 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 69 | GPIO_Init(GPIOA, &GPIO_InitStructure); 70 | GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); 71 | 72 | SPI_InitTypeDef SPI_InitStructure; 73 | SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 74 | SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 75 | SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 76 | SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; 77 | SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 78 | SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 79 | SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; 80 | SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 81 | SPI_InitStructure.SPI_CRCPolynomial = 7; 82 | SPI_Init(SPI1, &SPI_InitStructure); 83 | SPI_Cmd(SPI1, ENABLE); 84 | LCD_SPI_ReadWriteByte(0xff); 85 | } 86 | 87 | uint8_t LCD_SPI_ReadWriteByte(uint8_t TxData) 88 | { 89 | uint8_t retry = 0; 90 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) 91 | { 92 | retry++; 93 | if (retry > 200) return 0; 94 | } 95 | SPI_I2S_SendData(SPI1, TxData); 96 | retry = 0; 97 | 98 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) 99 | { 100 | retry++; 101 | if (retry > 200) return 0; 102 | } 103 | return SPI_I2S_ReceiveData(SPI1); 104 | } 105 | -------------------------------------------------------------------------------- /src/System/SPI.h: -------------------------------------------------------------------------------- 1 | #ifndef __SPI_H 2 | #define __SPI_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include "sys.h" 6 | 7 | #define W25Q128_SPI_SS_SET PBout(12) 8 | 9 | void W25Q128_SPI_Init(void); 10 | void W25Q128_SPI_Start(void); 11 | void W25Q128_SPI_Stop(void); 12 | uint8_t W25Q128_SPI_SwapByte(uint8_t ByteSend); 13 | 14 | void LCD_SPI_Init(void); 15 | uint8_t LCD_SPI_ReadWriteByte(uint8_t TxData); 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /src/System/Serial.c: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 3 | * @Date: 2023-08-08 17:24:38 4 | * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 5 | * @LastEditTime: 2023-08-08 17:47:04 6 | * @FilePath: \Wake-up light\src\System\Serial.c 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | #include "stm32f10x.h" // Device header 10 | #include 11 | #include 12 | #include "bool.h" 13 | 14 | bool isUartRxCompleted = false; 15 | uint8_t Serial_RxData; 16 | uint8_t Serial_RxFlag; 17 | 18 | void Serial_Init(void) 19 | { 20 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 21 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 22 | 23 | GPIO_InitTypeDef GPIO_InitStructure; 24 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 25 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 26 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 27 | GPIO_Init(GPIOA, &GPIO_InitStructure); 28 | 29 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 30 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; 31 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 32 | GPIO_Init(GPIOA, &GPIO_InitStructure); 33 | 34 | USART_InitTypeDef USART_InitStructure; 35 | USART_InitStructure.USART_BaudRate = 9600; 36 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 37 | USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 38 | USART_InitStructure.USART_Parity = USART_Parity_No; 39 | USART_InitStructure.USART_StopBits = USART_StopBits_1; 40 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; 41 | USART_Init(USART2, &USART_InitStructure); 42 | 43 | USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 44 | 45 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 46 | 47 | NVIC_InitTypeDef NVIC_InitStructure; 48 | NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; 49 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 50 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 51 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 52 | NVIC_Init(&NVIC_InitStructure); 53 | 54 | USART_Cmd(USART2, ENABLE); 55 | } 56 | 57 | void uartWriteBuf(uint8_t *buf, uint8_t len) 58 | { 59 | while (len--) { 60 | while ((USART2->SR & 0x40) == 0) 61 | ; 62 | USART_SendData(USART2, *buf++); 63 | } 64 | } 65 | 66 | // void USART2_IRQHandler(void) 67 | // { 68 | // if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET) { 69 | // Serial_RxData = USART_ReceiveData(USART2); 70 | // Serial_RxFlag = 1; 71 | // USART_ClearITPendingBit(USART2, USART_IT_RXNE); 72 | // } 73 | // } 74 | -------------------------------------------------------------------------------- /src/System/Serial.h: -------------------------------------------------------------------------------- 1 | #ifndef __SERIAL_H 2 | #define __SERIAL_H 3 | 4 | #include 5 | 6 | void Serial_Init(void); 7 | void uartWriteBuf(uint8_t *buf, uint8_t len); 8 | 9 | uint8_t Serial_GetRxFlag(void); 10 | uint8_t Serial_GetRxData(void); 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /src/System/Timer.c: -------------------------------------------------------------------------------- 1 | #include "timer.h" 2 | #include "led.h" 3 | #include "usart.h" 4 | #include "stm32f10x_tim.h" 5 | #include "stdlib.h" 6 | #include "string.h" 7 | ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// 8 | 9 | //通用定时器3中断初始化 10 | //这里时钟选择为APB1的2倍,而APB1为36M 11 | //arr:自动重装值。 12 | //psc:时钟预分频数 13 | //这里使用的是定时器3! 14 | void TIM3_Int_Init(u16 arr,u16 psc) 15 | { 16 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 17 | NVIC_InitTypeDef NVIC_InitStructure; 18 | 19 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 20 | 21 | TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms 22 | TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 23 | TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 24 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 25 | TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 26 | 27 | TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 28 | 29 | NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 30 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 31 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 32 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 33 | NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 34 | 35 | TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 36 | 37 | } 38 | 39 | 40 | //定时器3中断服务程序 41 | void TIM3_IRQHandler(void) //TIM3中断 42 | { 43 | char *res; 44 | if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 45 | { 46 | 47 | 48 | 49 | 50 | 51 | } 52 | } 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/System/Timer.h: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 3 | * @Date: 2023-08-08 17:24:38 4 | * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git 5 | * @LastEditTime: 2023-08-08 17:45:42 6 | * @FilePath: \Wake-up light\src\System\timer.h 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | #ifndef __TIMER_H 10 | #define __TIMER_H 11 | #include "stm32f10x.h" 12 | 13 | 14 | void TIM3_Int_Init(u16 arr,u16 psc); 15 | void TIM3_PWM_Init(u16 arr,u16 psc); 16 | void TIM2_PWM_Init(u16 arr,u16 psc); 17 | void TIM4_PWM_Init(u16 arr,u16 psc); 18 | #endif 19 | -------------------------------------------------------------------------------- /src/System/Usart3Serial.h: -------------------------------------------------------------------------------- 1 | #ifndef __SERIAL_H_ 2 | #define __SERIAL_H_ 3 | #include "stm32f10x.h" 4 | 5 | void Usart3SerialInit(void); 6 | uint8_t Usart3SerialGetRxFlag(void); 7 | uint8_t Usart3SerialGetRxData(void); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/System/bool.h: -------------------------------------------------------------------------------- 1 | #ifndef BOOL_H_ 2 | #define BOOL_H_ 3 | 4 | typedef enum { 5 | false = 0, 6 | true = !false 7 | } bool; 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /src/System/sys.h: -------------------------------------------------------------------------------- 1 | #ifndef __SYS_H 2 | #define __SYS_H 3 | #include "stm32f10x.h" 4 | 5 | //位带操作,实现51类似的GPIO控制功能 6 | //具体实现思想,参考<>第五章(87页~92页). 7 | //IO口操作宏定义 8 | #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 9 | #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) 10 | #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) 11 | //IO口地址映射 12 | #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C 13 | #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C 14 | #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C 15 | #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C 16 | #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C 17 | #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C 18 | #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C 19 | 20 | #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 21 | #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 22 | #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 23 | #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 24 | #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 25 | #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 26 | #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 27 | 28 | //IO口操作,只对单一的IO口! 29 | //确保n的值小于16! 30 | #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 31 | #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 32 | 33 | #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 34 | #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 35 | 36 | #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出 37 | #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入 38 | 39 | #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出 40 | #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入 41 | 42 | #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出 43 | #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入 44 | 45 | #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出 46 | #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入 47 | 48 | #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出 49 | #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入 50 | 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /src/System/usart.h: -------------------------------------------------------------------------------- 1 | #ifndef __USART_H 2 | #define __USART_H 3 | #include "stm32f10x.h" // Device header 4 | #include "usart.h" 5 | #include "stdio.h" 6 | #include "string.h" 7 | 8 | 9 | #define USART_REC_LEN 200 10 | 11 | 12 | void uart1_init(uint32_t bound); 13 | void uart2_init(uint32_t bound); 14 | void uart3_init(uint32_t bound); 15 | void Uart_Init(uint32_t bound); 16 | void Uart2_SendDATA(u8 *SendBuf, u8 len); 17 | void Uart3_SendStr(char *SendBuf); 18 | void USART1_Send_byte(uint8_t byte); 19 | void USART1_Send_bytes(uint8_t *Buffer, uint8_t Length); 20 | void USART1_IRQHandler(void); 21 | void USART2_IRQHandler(void); 22 | void USART3_IRQHandler(void); 23 | 24 | #endif 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/Tools/Tools.c: -------------------------------------------------------------------------------- 1 | #include "Tools.h" 2 | 3 | void Disable_MUReadKey_Frame(void) 4 | { 5 | Menu_Global.RunningMenu->Cur_Style = frame; 6 | Menu_Global.RunningMenu->isReadKey = 0; 7 | } 8 | 9 | void Disable_MUReadKey_Mouse(void) 10 | { 11 | Menu_Global.RunningMenu->Cur_Style = mouse; 12 | Menu_Global.RunningMenu->isReadKey = 0; 13 | } -------------------------------------------------------------------------------- /src/Tools/Tools.h: -------------------------------------------------------------------------------- 1 | #ifndef __TOOLS_H 2 | #define __TOOLS_H 3 | 4 | #include "stm32f10x.h" // Device header 5 | #include "Delay.h" 6 | #include "OLED.h" 7 | #include "Menu.h" 8 | 9 | 10 | void Tools_Remote(void); 11 | void Tools_Reader(void); 12 | void Disable_MUReadKey_Frame(void); 13 | void Disable_MUReadKey_Mouse(void); 14 | 15 | #endif 16 | 17 | -------------------------------------------------------------------------------- /src/Tools/Tools_Reader.c: -------------------------------------------------------------------------------- 1 | #include "Tools_Reader.h" 2 | 3 | struct Option_Class Reader_Option_List[]; 4 | extern char Temp_str[40]; 5 | 6 | struct Tools_Reader_Class { 7 | uint16_t Year; 8 | uint16_t Mon; 9 | uint16_t Day; 10 | uint16_t Hour; 11 | uint16_t Min; 12 | uint16_t Sec; 13 | struct tm Time; 14 | struct Menu_Class MU; 15 | } Reader; 16 | 17 | struct Option_Class Reader_Option_List[] = { 18 | {"<<<"}, 19 | {"关闭", Menu_TurnOffMenu}, 20 | {"年:%d", Disable_MUReadKey_Mouse, &Reader.Year}, 21 | {"月:%d", Disable_MUReadKey_Mouse, &Reader.Mon}, 22 | {"日:%d", Disable_MUReadKey_Mouse, &Reader.Day}, 23 | {"时:%d", Disable_MUReadKey_Mouse, &Reader.Hour}, 24 | {"分:%d", Disable_MUReadKey_Mouse, &Reader.Min}, 25 | {"秒:%d", Disable_MUReadKey_Mouse, &Reader.Sec}, 26 | {".."}, 27 | }; 28 | char Temp_st[40]; 29 | void Tools_Reader(void) 30 | { 31 | static struct Menu_Class Menu_ReaderMenu = {single, 1}; 32 | uint8_t Key_Temp; 33 | int8_t Encoder_Temp; 34 | uint8_t data[16]; 35 | uint32_t block_index; 36 | if (Menu_ReaderMenu.isInit) { 37 | Menu_MenuClassInit(&Menu_ReaderMenu, Reader_Option_List); 38 | DS3231_ReadTime(); 39 | Reader.Year = Time_Year; 40 | Reader.Mon = Time_Mon; 41 | Reader.Day = Time_Day; 42 | Reader.Hour = Time_Hour; 43 | Reader.Min = Time_Min; 44 | Reader.Sec = Time_Sec / 10 * 10; 45 | Reader.Time.tm_year = Time_Year - 1900; 46 | Reader.Time.tm_mon = Time_Mon - 1; 47 | Reader.Time.tm_mday = Time_Day; 48 | Reader.Time.tm_hour = Time_Hour; 49 | Reader.Time.tm_min = Time_Min; 50 | Reader.Time.tm_sec = Time_Sec; 51 | } 52 | 53 | if (Menu_ReaderMenu.isReadKey == 0) // 如果菜单不读取按键则代表抓住了选项; 54 | { 55 | Key_Temp = Menu_EnterEvent(); 56 | Encoder_Temp = Menu_RollEvent(); 57 | if (Encoder_Temp) { 58 | switch (Menu_ReaderMenu.Cat_i) // 抓住的选项 59 | { 60 | case 2: 61 | if (Check_date(Reader.Year + Encoder_Temp, Reader.Mon, Reader.Day)) 62 | Reader.Year += Encoder_Temp; 63 | break; 64 | case 3: 65 | if (Check_date(Reader.Year, Reader.Mon + Encoder_Temp, Reader.Day)) 66 | Reader.Mon += Encoder_Temp; 67 | break; 68 | case 4: 69 | if (Check_date(Reader.Year, Reader.Mon, Reader.Day + Encoder_Temp)) 70 | Reader.Day += Encoder_Temp; 71 | break; 72 | case 5: 73 | if ((Reader.Hour + Encoder_Temp) < 0) 74 | Reader.Hour = 23; 75 | else if ((Reader.Hour + Encoder_Temp) > 23) 76 | Reader.Hour = 0; 77 | else 78 | Reader.Hour += Encoder_Temp; 79 | break; 80 | case 6: 81 | if ((Reader.Min + Encoder_Temp) < 0) 82 | Reader.Min = 59; 83 | else if ((Reader.Min + Encoder_Temp) > 59) 84 | Reader.Min = 0; 85 | else 86 | Reader.Min += Encoder_Temp; 87 | break; 88 | case 7: 89 | if ((Reader.Sec + Encoder_Temp * 10) < 0) { 90 | Reader.Sec = 50; 91 | if (Reader.Min != 0) Reader.Min--; 92 | } else if ((Reader.Sec + Encoder_Temp * 10) > 50) { 93 | Reader.Sec = 0; 94 | if (Reader.Min != 59) Reader.Min++; 95 | } else 96 | Reader.Sec += Encoder_Temp * 10; 97 | break; 98 | default: 99 | break; 100 | } 101 | Reader.Time.tm_year = Reader.Year - 1900; 102 | Reader.Time.tm_mon = Reader.Mon - 1; 103 | Reader.Time.tm_mday = Reader.Day; 104 | Reader.Time.tm_sec = Reader.Sec; 105 | 106 | block_index = W25Q128_SearchBlock(mktime(&Reader.Time) - 8 * 60 * 60); 107 | if (block_index) { 108 | W25Q128_ReadData((block_index << 16) | TimeDate_ToAddress(Reader.Hour, Reader.Min, Reader.Sec), 109 | data, DATA_LEN); 110 | if ((data[5] != 0 || data[6] != 0) && data[0] == 0) { 111 | sprintf(Temp_str, "Lux=%d.%d ", data[5], data[6]); 112 | LCD_ShowString(20, 20, (const uint8_t *)Temp_str); 113 | } else { 114 | sprintf(Temp_str, "No Date "); 115 | LCD_ShowString(20, 20, (const uint8_t *)Temp_str); 116 | } 117 | if ((data[1] != 0 || data[2] != 0) && data[0] == 0) { 118 | sprintf(Temp_str, "Temp=%d.%d Hum=%d.%d ", data[1], data[2], data[3], data[4]); 119 | LCD_ShowString(20, 40, (const uint8_t *)Temp_str); 120 | } else { 121 | sprintf(Temp_str, "No Date "); 122 | LCD_ShowString(20, 40, (const uint8_t *)Temp_str); 123 | } 124 | if ((data[7] != 0 || data[8] != 0) && data[0] == 0) { 125 | sprintf(Temp_str, "eco2=%d tvoc=%d ", (uint16_t)data[7] << 8 | data[8], (uint16_t)data[9] << 8 | data[10]); 126 | LCD_ShowString(20, 60, (const uint8_t *)Temp_str); 127 | } else { 128 | sprintf(Temp_str, "No Date "); 129 | LCD_ShowString(20, 60, (const uint8_t *)Temp_str); 130 | } 131 | 132 | sprintf(Temp_st, "block_index=%d\r\n", block_index); 133 | Debug_printf(Temp_st); 134 | for (uint8_t i = 0; i < DATA_LEN; i++) { 135 | sprintf(Temp_st, "data%d: %d\r\n", i, data[i]); 136 | Debug_printf(Temp_st); 137 | } 138 | } else { 139 | sprintf(Temp_str, "No Date In The Day "); 140 | LCD_ShowString(20, 20, (const uint8_t *)Temp_str); 141 | sprintf(Temp_str, " "); 142 | LCD_ShowString(20, 40, (const uint8_t *)Temp_str); 143 | LCD_ShowString(20, 60, (const uint8_t *)Temp_str); 144 | } 145 | 146 | // sprintf(Temp_st, "TimeStamp: %d\r\n", mktime(&Reader.Time)); 147 | // Debug_printf(Temp_st); 148 | } 149 | if (Key_Temp) { 150 | Menu_ReaderMenu.isReadKey = 1; 151 | Menu_ReaderMenu.Cur_Style = Menu_Global.Cur_Style; 152 | sprintf(Temp_str, " "); 153 | LCD_ShowString(20, 20, (const uint8_t *)Temp_str); 154 | LCD_ShowString(20, 40, (const uint8_t *)Temp_str); 155 | LCD_ShowString(20, 60, (const uint8_t *)Temp_str); 156 | } 157 | } else { 158 | Reader.MU.Cur_Style = Menu_Global.Cur_Style; 159 | } 160 | 161 | Menu_RunWindow(&Menu_ReaderMenu); 162 | } 163 | -------------------------------------------------------------------------------- /src/Tools/Tools_Reader.h: -------------------------------------------------------------------------------- 1 | #ifndef __TOOLS_READER_H 2 | #define __TOOLS_READER_H 3 | 4 | #include "Tools.h" 5 | #include "DS3231.h" 6 | #include "W25Q128.h" 7 | #include "EC800.h" 8 | 9 | #endif -------------------------------------------------------------------------------- /src/Tools/Tools_Remote.c: -------------------------------------------------------------------------------- 1 | #include "Tools_Remote.h" 2 | 3 | struct Option_Class Remote_Option_List[]; 4 | void Disable_MUReadKey(void); 5 | 6 | struct Tools_Remote_Class { 7 | uint8_t isInit; 8 | uint16_t Address; 9 | uint16_t Command; 10 | struct Menu_Class MU; 11 | } Remote = { 12 | .Address = REMOTE_ID, 13 | .Command = CMD_START, 14 | }; 15 | 16 | void Tools_Remote_Transmit(void) 17 | { 18 | Remote_Transmit(Remote.Address, Remote.Command); 19 | } 20 | 21 | struct Option_Class Remote_Option_List[] = { 22 | {"<<<"}, 23 | {"关闭", Menu_TurnOffMenu}, 24 | {"地址:%d", Disable_MUReadKey_Mouse, &Remote.Address}, 25 | {"命令:%d", Disable_MUReadKey_Mouse, &Remote.Command}, 26 | {"发送命令", Tools_Remote_Transmit}, 27 | {"风扇模式", Disable_MUReadKey_Frame}, 28 | {".."}, 29 | }; 30 | 31 | void Tools_Remote(void) 32 | { 33 | static float NumPow = 1; 34 | static struct Menu_Class Menu_RemoteMenu = {single, 1}; 35 | uint8_t Key_Temp; 36 | int8_t Encoder_Temp; 37 | 38 | if (Menu_RemoteMenu.isInit) { 39 | Menu_MenuClassInit(&Menu_RemoteMenu, Remote_Option_List); 40 | } 41 | 42 | if (Menu_RemoteMenu.isReadKey == 0) // 如果菜单不读取按键则代表抓住了选项; 43 | { 44 | Key_Temp = Menu_EnterEvent(); 45 | Encoder_Temp = -Menu_RollEvent(); 46 | switch (Menu_RemoteMenu.Cat_i) // 抓住的选项 47 | { 48 | case 2: 49 | Remote.Address += Encoder_Temp * NumPow; // 编码器偏移量乘以位权 50 | if (Remote.Address >= 10000) Remote.Address = 0; 51 | break; 52 | case 3: 53 | Remote.Command += Encoder_Temp * NumPow; 54 | if (Remote.Command >= 10000) Remote.Command = 0; 55 | break; 56 | case 5: 57 | if (Encoder_Temp < 0) { 58 | Remote_Transmit(REMOTE_ID, CMD_DOWN); 59 | } 60 | if (Encoder_Temp > 0) { 61 | Remote_Transmit(REMOTE_ID, CMD_UP); 62 | } 63 | if (Key_Temp == 1) { 64 | Remote_Transmit(REMOTE_ID, CMD_START); 65 | } 66 | break; 67 | default: 68 | break; 69 | } 70 | if (Key_Temp == 2) // 长按放手 71 | { 72 | NumPow = 1; 73 | Menu_RemoteMenu.isReadKey = 1; 74 | Menu_RemoteMenu.Cur_Style = Menu_Global.Cur_Style; 75 | } 76 | if (Key_Temp == 1) // 短按加位权 77 | { 78 | NumPow *= 10; // 位权 79 | if (NumPow > 100) { 80 | NumPow = 1; 81 | } 82 | } 83 | } else { 84 | Remote.MU.Cur_Style = Menu_Global.Cur_Style; 85 | } 86 | 87 | Menu_RunWindow(&Menu_RemoteMenu); 88 | } 89 | -------------------------------------------------------------------------------- /src/Tools/Tools_Remote.h: -------------------------------------------------------------------------------- 1 | #ifndef __TOOLS_REMOTE_H 2 | #define __TOOLS_REMOTE_H 3 | 4 | #include "Tools.h" 5 | #include "Remote.h" 6 | #include "sys.h" 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /src/stm32f10x_conf.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file USART/Printf/stm32f10x_conf.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 08-April-2011 7 | * @brief Library configuration file. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Define to prevent recursive inclusion -------------------------------------*/ 23 | #ifndef __STM32F10x_CONF_H 24 | #define __STM32F10x_CONF_H 25 | 26 | /* Includes ------------------------------------------------------------------*/ 27 | /* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */ 28 | #include "stm32f10x_adc.h" 29 | #include "stm32f10x_bkp.h" 30 | #include "stm32f10x_can.h" 31 | #include "stm32f10x_cec.h" 32 | #include "stm32f10x_crc.h" 33 | #include "stm32f10x_dac.h" 34 | #include "stm32f10x_dbgmcu.h" 35 | #include "stm32f10x_dma.h" 36 | #include "stm32f10x_exti.h" 37 | #include "stm32f10x_flash.h" 38 | #include "stm32f10x_fsmc.h" 39 | #include "stm32f10x_gpio.h" 40 | #include "stm32f10x_i2c.h" 41 | #include "stm32f10x_iwdg.h" 42 | #include "stm32f10x_pwr.h" 43 | #include "stm32f10x_rcc.h" 44 | #include "stm32f10x_rtc.h" 45 | #include "stm32f10x_sdio.h" 46 | #include "stm32f10x_spi.h" 47 | #include "stm32f10x_tim.h" 48 | #include "stm32f10x_usart.h" 49 | #include "stm32f10x_wwdg.h" 50 | #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ 51 | 52 | /* Exported types ------------------------------------------------------------*/ 53 | /* Exported constants --------------------------------------------------------*/ 54 | /* Uncomment the line below to expanse the "assert_param" macro in the 55 | Standard Peripheral Library drivers code */ 56 | /* #define USE_FULL_ASSERT 1 */ 57 | 58 | /* Exported macro ------------------------------------------------------------*/ 59 | #ifdef USE_FULL_ASSERT 60 | /** 61 | * @brief The assert_param macro is used for function's parameters check. 62 | * @param expr: If expr is false, it calls assert_failed function which reports 63 | * the name of the source file and the source line number of the call 64 | * that failed. If expr is true, it returns no value. 65 | * @retval None 66 | */ 67 | #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 68 | /* Exported functions ------------------------------------------------------- */ 69 | void assert_failed(uint8_t* file, uint32_t line); 70 | #else 71 | #define assert_param(expr) ((void)0) 72 | #endif /* USE_FULL_ASSERT */ 73 | 74 | #endif /* __STM32F10x_CONF_H */ 75 | 76 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 77 | -------------------------------------------------------------------------------- /src/stm32f10x_it.c: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file USART/Printf/stm32f10x_it.c 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 08-April-2011 7 | * @brief Main Interrupt Service Routines. 8 | * This file provides template for all exceptions handler and peripherals 9 | * interrupt service routine. 10 | ****************************************************************************** 11 | * @attention 12 | * 13 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 14 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 15 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 16 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 17 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 18 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 19 | * 20 | *

© COPYRIGHT 2011 STMicroelectronics

21 | ****************************************************************************** 22 | */ 23 | 24 | /* Includes ------------------------------------------------------------------*/ 25 | #include "stm32f10x_it.h" 26 | 27 | /** @addtogroup STM32F10x_StdPeriph_Examples 28 | * @{ 29 | */ 30 | 31 | /** @addtogroup USART_Printf 32 | * @{ 33 | */ 34 | 35 | /* Private typedef -----------------------------------------------------------*/ 36 | /* Private define ------------------------------------------------------------*/ 37 | /* Private macro -------------------------------------------------------------*/ 38 | /* Private variables ---------------------------------------------------------*/ 39 | /* Private function prototypes -----------------------------------------------*/ 40 | /* Private functions ---------------------------------------------------------*/ 41 | 42 | /******************************************************************************/ 43 | /* Cortex-M3 Processor Exceptions Handlers */ 44 | /******************************************************************************/ 45 | 46 | /** 47 | * @brief This function handles NMI exception. 48 | * @param None 49 | * @retval None 50 | */ 51 | void NMI_Handler(void) 52 | { 53 | } 54 | 55 | /** 56 | * @brief This function handles Hard Fault exception. 57 | * @param None 58 | * @retval None 59 | */ 60 | void HardFault_Handler(void) 61 | { 62 | /* Go to infinite loop when Hard Fault exception occurs */ 63 | while (1) 64 | { 65 | } 66 | } 67 | 68 | /** 69 | * @brief This function handles Memory Manage exception. 70 | * @param None 71 | * @retval None 72 | */ 73 | void MemManage_Handler(void) 74 | { 75 | /* Go to infinite loop when Memory Manage exception occurs */ 76 | while (1) 77 | { 78 | } 79 | } 80 | 81 | /** 82 | * @brief This function handles Bus Fault exception. 83 | * @param None 84 | * @retval None 85 | */ 86 | void BusFault_Handler(void) 87 | { 88 | /* Go to infinite loop when Bus Fault exception occurs */ 89 | while (1) 90 | { 91 | } 92 | } 93 | 94 | /** 95 | * @brief This function handles Usage Fault exception. 96 | * @param None 97 | * @retval None 98 | */ 99 | void UsageFault_Handler(void) 100 | { 101 | /* Go to infinite loop when Usage Fault exception occurs */ 102 | while (1) 103 | { 104 | } 105 | } 106 | 107 | /** 108 | * @brief This function handles SVCall exception. 109 | * @param None 110 | * @retval None 111 | */ 112 | void SVC_Handler(void) 113 | { 114 | } 115 | 116 | /** 117 | * @brief This function handles Debug Monitor exception. 118 | * @param None 119 | * @retval None 120 | */ 121 | void DebugMon_Handler(void) 122 | { 123 | } 124 | 125 | /** 126 | * @brief This function handles PendSV_Handler exception. 127 | * @param None 128 | * @retval None 129 | */ 130 | void PendSV_Handler(void) 131 | { 132 | } 133 | 134 | /** 135 | * @brief This function handles SysTick Handler. 136 | * @param None 137 | * @retval None 138 | */ 139 | void SysTick_Handler(void) 140 | { 141 | } 142 | 143 | /******************************************************************************/ 144 | /* STM32F10x Peripherals Interrupt Handlers */ 145 | /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ 146 | /* available peripheral interrupt handler's name please refer to the startup */ 147 | /* file (startup_stm32f10x_xx.s). */ 148 | /******************************************************************************/ 149 | 150 | /** 151 | * @brief This function handles PPP interrupt request. 152 | * @param None 153 | * @retval None 154 | */ 155 | /*void PPP_IRQHandler(void) 156 | { 157 | }*/ 158 | 159 | /** 160 | * @} 161 | */ 162 | 163 | /** 164 | * @} 165 | */ 166 | 167 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 168 | -------------------------------------------------------------------------------- /src/stm32f10x_it.h: -------------------------------------------------------------------------------- 1 | /** 2 | ****************************************************************************** 3 | * @file USART/Printf/stm32f10x_it.h 4 | * @author MCD Application Team 5 | * @version V3.5.0 6 | * @date 08-April-2011 7 | * @brief This file contains the headers of the interrupt handlers. 8 | ****************************************************************************** 9 | * @attention 10 | * 11 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 12 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 13 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 14 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 15 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 16 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 17 | * 18 | *

© COPYRIGHT 2011 STMicroelectronics

19 | ****************************************************************************** 20 | */ 21 | 22 | /* Define to prevent recursive inclusion -------------------------------------*/ 23 | #ifndef __STM32F10x_IT_H 24 | #define __STM32F10x_IT_H 25 | 26 | /* Includes ------------------------------------------------------------------*/ 27 | #include "stm32f10x.h" 28 | 29 | /* Exported types ------------------------------------------------------------*/ 30 | /* Exported constants --------------------------------------------------------*/ 31 | /* Exported macro ------------------------------------------------------------*/ 32 | /* Exported functions ------------------------------------------------------- */ 33 | 34 | void NMI_Handler(void); 35 | void HardFault_Handler(void); 36 | void MemManage_Handler(void); 37 | void BusFault_Handler(void); 38 | void UsageFault_Handler(void); 39 | void SVC_Handler(void); 40 | void DebugMon_Handler(void); 41 | void PendSV_Handler(void); 42 | void SysTick_Handler(void); 43 | 44 | #endif /* __STM32F10x_IT_H */ 45 | 46 | /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ 47 | -------------------------------------------------------------------------------- /src/test.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aystmjz/Sleep-Monitor/8af61daaba9f7d16447779d1ca6340399633e7f8/src/test.exe --------------------------------------------------------------------------------