├── 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 | 
4 | 
5 | 
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 
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
--------------------------------------------------------------------------------