1 /*!
2     \file    gd32f403_bkp.h
3     \brief   definitions for the BKP
4 
5     \version 2017-02-10, V1.0.0, firmware for GD32F403
6     \version 2018-12-25, V2.0.0, firmware for GD32F403
7     \version 2020-09-30, V2.1.0, firmware for GD32F403
8 */
9 
10 /*
11     Copyright (c) 2020, GigaDevice Semiconductor Inc.
12 
13     Redistribution and use in source and binary forms, with or without modification,
14 are permitted provided that the following conditions are met:
15 
16     1. Redistributions of source code must retain the above copyright notice, this
17        list of conditions and the following disclaimer.
18     2. Redistributions in binary form must reproduce the above copyright notice,
19        this list of conditions and the following disclaimer in the documentation
20        and/or other materials provided with the distribution.
21     3. Neither the name of the copyright holder nor the names of its contributors
22        may be used to endorse or promote products derived from this software without
23        specific prior written permission.
24 
25     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
34 OF SUCH DAMAGE.
35 */
36 
37 #ifndef GD32F403_BKP_H
38 #define GD32F403_BKP_H
39 
40 #include "gd32f403.h"
41 
42 /* BKP definitions */
43 #define BKP                           BKP_BASE                 /*!< BKP base address */
44 
45 /* registers definitions */
46 #define BKP_DATA0                     REG16((BKP) + 0x04U)     /*!< BKP data register 0 */
47 #define BKP_DATA1                     REG16((BKP) + 0x08U)     /*!< BKP data register 1 */
48 #define BKP_DATA2                     REG16((BKP) + 0x0CU)     /*!< BKP data register 2 */
49 #define BKP_DATA3                     REG16((BKP) + 0x10U)     /*!< BKP data register 3 */
50 #define BKP_DATA4                     REG16((BKP) + 0x14U)     /*!< BKP data register 4 */
51 #define BKP_DATA5                     REG16((BKP) + 0x18U)     /*!< BKP data register 5 */
52 #define BKP_DATA6                     REG16((BKP) + 0x1CU)     /*!< BKP data register 6 */
53 #define BKP_DATA7                     REG16((BKP) + 0x20U)     /*!< BKP data register 7 */
54 #define BKP_DATA8                     REG16((BKP) + 0x24U)     /*!< BKP data register 8 */
55 #define BKP_DATA9                     REG16((BKP) + 0x28U)     /*!< BKP data register 9 */
56 #define BKP_DATA10                    REG16((BKP) + 0x40U)     /*!< BKP data register 10 */
57 #define BKP_DATA11                    REG16((BKP) + 0x44U)     /*!< BKP data register 11 */
58 #define BKP_DATA12                    REG16((BKP) + 0x48U)     /*!< BKP data register 12 */
59 #define BKP_DATA13                    REG16((BKP) + 0x4CU)     /*!< BKP data register 13 */
60 #define BKP_DATA14                    REG16((BKP) + 0x50U)     /*!< BKP data register 14 */
61 #define BKP_DATA15                    REG16((BKP) + 0x54U)     /*!< BKP data register 15 */
62 #define BKP_DATA16                    REG16((BKP) + 0x58U)     /*!< BKP data register 16 */
63 #define BKP_DATA17                    REG16((BKP) + 0x5CU)     /*!< BKP data register 17 */
64 #define BKP_DATA18                    REG16((BKP) + 0x60U)     /*!< BKP data register 18 */
65 #define BKP_DATA19                    REG16((BKP) + 0x64U)     /*!< BKP data register 19 */
66 #define BKP_DATA20                    REG16((BKP) + 0x68U)     /*!< BKP data register 20 */
67 #define BKP_DATA21                    REG16((BKP) + 0x6CU)     /*!< BKP data register 21 */
68 #define BKP_DATA22                    REG16((BKP) + 0x70U)     /*!< BKP data register 22 */
69 #define BKP_DATA23                    REG16((BKP) + 0x74U)     /*!< BKP data register 23 */
70 #define BKP_DATA24                    REG16((BKP) + 0x78U)     /*!< BKP data register 24 */
71 #define BKP_DATA25                    REG16((BKP) + 0x7CU)     /*!< BKP data register 25 */
72 #define BKP_DATA26                    REG16((BKP) + 0x80U)     /*!< BKP data register 26 */
73 #define BKP_DATA27                    REG16((BKP) + 0x84U)     /*!< BKP data register 27 */
74 #define BKP_DATA28                    REG16((BKP) + 0x88U)     /*!< BKP data register 28 */
75 #define BKP_DATA29                    REG16((BKP) + 0x8CU)     /*!< BKP data register 29 */
76 #define BKP_DATA30                    REG16((BKP) + 0x90U)     /*!< BKP data register 30 */
77 #define BKP_DATA31                    REG16((BKP) + 0x94U)     /*!< BKP data register 31 */
78 #define BKP_DATA32                    REG16((BKP) + 0x98U)     /*!< BKP data register 32 */
79 #define BKP_DATA33                    REG16((BKP) + 0x9CU)     /*!< BKP data register 33 */
80 #define BKP_DATA34                    REG16((BKP) + 0xA0U)     /*!< BKP data register 34 */
81 #define BKP_DATA35                    REG16((BKP) + 0xA4U)     /*!< BKP data register 35 */
82 #define BKP_DATA36                    REG16((BKP) + 0xA8U)     /*!< BKP data register 36 */
83 #define BKP_DATA37                    REG16((BKP) + 0xACU)     /*!< BKP data register 37 */
84 #define BKP_DATA38                    REG16((BKP) + 0xB0U)     /*!< BKP data register 38 */
85 #define BKP_DATA39                    REG16((BKP) + 0xB4U)     /*!< BKP data register 39 */
86 #define BKP_DATA40                    REG16((BKP) + 0xB8U)     /*!< BKP data register 40 */
87 #define BKP_DATA41                    REG16((BKP) + 0xBCU)     /*!< BKP data register 41 */
88 #define BKP_OCTL                      REG16((BKP) + 0x2CU)     /*!< RTC signal output control register */
89 #define BKP_TPCTL                     REG16((BKP) + 0x30U)     /*!< tamper pin control register */
90 #define BKP_TPCS                      REG16((BKP) + 0x34U)     /*!< tamper control and status register */
91 
92 /* bits definitions */
93 /* BKP_DATA */
94 #define BKP_DATA                      BITS(0,15)               /*!< backup data */
95 
96 /* BKP_OCTL */
97 #define BKP_OCTL_RCCV                 BITS(0,6)                /*!< RTC clock calibration value */
98 #define BKP_OCTL_COEN                 BIT(7)                   /*!< RTC clock calibration output enable */
99 #define BKP_OCTL_ASOEN                BIT(8)                   /*!< RTC alarm or second signal output enable */
100 #define BKP_OCTL_ROSEL                BIT(9)                   /*!< RTC output selection */
101 #define BKP_OCTL_CCOSEL               BIT(14)                  /*!< RTC clock output selection */
102 #define BKP_OCTL_CALDIR               BIT(15)                  /*!< RTC clock calibration direction */
103 
104 /* BKP_TPCTL */
105 #define BKP_TPCTL_TPEN                BIT(0)                   /*!< tamper detection enable */
106 #define BKP_TPCTL_TPAL                BIT(1)                   /*!< tamper pin active level */
107 
108 /* BKP_TPCS */
109 #define BKP_TPCS_TER                 BIT(0)                    /*!< tamper event reset */
110 #define BKP_TPCS_TIR                 BIT(1)                    /*!< tamper interrupt reset */
111 #define BKP_TPCS_TPIE                BIT(2)                    /*!< tamper interrupt enable */
112 #define BKP_TPCS_TEF                 BIT(8)                    /*!< tamper event flag */
113 #define BKP_TPCS_TIF                 BIT(9)                    /*!< tamper interrupt flag */
114 
115 /* constants definitions */
116 /* BKP register */
117 #define BKP_DATA0_9(number)           REG16((BKP) + 0x04U + (number) * 0x04U)
118 #define BKP_DATA10_41(number)         REG16((BKP) + 0x40U + ((number)-10U) * 0x04U)
119 
120 /* get data of BKP data register */
121 #define BKP_DATA_GET(regval)          GET_BITS((uint32_t)(regval), 0, 15)
122 
123 /* RTC clock calibration value */
124 #define OCTL_RCCV(regval)             (BITS(0,6) & ((uint32_t)(regval) << 0))
125 
126 /* RTC output selection */
127 #define RTC_OUTPUT_ALARM_PULSE        ((uint16_t)0x0000U)      /*!< RTC alarm pulse is selected as the RTC output */
128 #define RTC_OUTPUT_SECOND_PULSE       ((uint16_t)0x0200U)      /*!< RTC second pulse is selected as the RTC output */
129 
130 /* RTC clock output selection */
131 #define RTC_CLOCK_DIV_64              ((uint16_t)0x0000U)      /*!< RTC clock div 64 */
132 #define RTC_CLOCK_DIV_1               ((uint16_t)0x4000U)      /*!< RTC clock div 1 */
133 
134 /* RTC clock calibration direction */
135 #define RTC_CLOCK_SLOWED_DOWN         ((uint16_t)0x0000U)      /*!< RTC clock slow down */
136 #define RTC_CLOCK_SPEED_UP            ((uint16_t)0x8000U)      /*!< RTC clock speed up */
137 
138 /* tamper pin active level */
139 #define TAMPER_PIN_ACTIVE_HIGH        ((uint16_t)0x0000U)      /*!< the tamper pin is active high */
140 #define TAMPER_PIN_ACTIVE_LOW         ((uint16_t)0x0002U)      /*!< the tamper pin is active low */
141 
142 /* tamper flag */
143 #define BKP_FLAG_TAMPER                 BKP_TPCS_TEF             /*!< tamper event flag */
144 
145 /* tamper interrupt flag */
146 #define BKP_INT_FLAG_TAMPER             BKP_TPCS_TIF             /*!< tamper interrupt flag */
147 
148 /* BKP data register number */
149 typedef enum
150 {
151     BKP_DATA_0 = 1,                         /*!< BKP data register 0 */
152     BKP_DATA_1,                             /*!< BKP data register 1 */
153     BKP_DATA_2,                             /*!< BKP data register 2 */
154     BKP_DATA_3,                             /*!< BKP data register 3 */
155     BKP_DATA_4,                             /*!< BKP data register 4 */
156     BKP_DATA_5,                             /*!< BKP data register 5 */
157     BKP_DATA_6,                             /*!< BKP data register 6 */
158     BKP_DATA_7,                             /*!< BKP data register 7 */
159     BKP_DATA_8,                             /*!< BKP data register 8 */
160     BKP_DATA_9,                             /*!< BKP data register 9 */
161     BKP_DATA_10,                            /*!< BKP data register 10 */
162     BKP_DATA_11,                            /*!< BKP data register 11 */
163     BKP_DATA_12,                            /*!< BKP data register 12 */
164     BKP_DATA_13,                            /*!< BKP data register 13 */
165     BKP_DATA_14,                            /*!< BKP data register 14 */
166     BKP_DATA_15,                            /*!< BKP data register 15 */
167     BKP_DATA_16,                            /*!< BKP data register 16 */
168     BKP_DATA_17,                            /*!< BKP data register 17 */
169     BKP_DATA_18,                            /*!< BKP data register 18 */
170     BKP_DATA_19,                            /*!< BKP data register 19 */
171     BKP_DATA_20,                            /*!< BKP data register 20 */
172     BKP_DATA_21,                            /*!< BKP data register 21 */
173     BKP_DATA_22,                            /*!< BKP data register 22 */
174     BKP_DATA_23,                            /*!< BKP data register 23 */
175     BKP_DATA_24,                            /*!< BKP data register 24 */
176     BKP_DATA_25,                            /*!< BKP data register 25 */
177     BKP_DATA_26,                            /*!< BKP data register 26 */
178     BKP_DATA_27,                            /*!< BKP data register 27 */
179     BKP_DATA_28,                            /*!< BKP data register 28 */
180     BKP_DATA_29,                            /*!< BKP data register 29 */
181     BKP_DATA_30,                            /*!< BKP data register 30 */
182     BKP_DATA_31,                            /*!< BKP data register 31 */
183     BKP_DATA_32,                            /*!< BKP data register 32 */
184     BKP_DATA_33,                            /*!< BKP data register 33 */
185     BKP_DATA_34,                            /*!< BKP data register 34 */
186     BKP_DATA_35,                            /*!< BKP data register 35 */
187     BKP_DATA_36,                            /*!< BKP data register 36 */
188     BKP_DATA_37,                            /*!< BKP data register 37 */
189     BKP_DATA_38,                            /*!< BKP data register 38 */
190     BKP_DATA_39,                            /*!< BKP data register 39 */
191     BKP_DATA_40,                            /*!< BKP data register 40 */
192     BKP_DATA_41,                            /*!< BKP data register 41 */
193 }bkp_data_register_enum;
194 
195 /* function declarations */
196 /* reset BKP registers */
197 void bkp_deinit(void);
198 /* write BKP data register */
199 void bkp_write_data(bkp_data_register_enum register_number, uint16_t data);
200 /* read BKP data register */
201 uint16_t bkp_read_data(bkp_data_register_enum register_number);
202 
203 /* RTC related functions */
204 /* enable RTC clock calibration output */
205 void bkp_rtc_calibration_output_enable(void);
206 /* disable RTC clock calibration output */
207 void bkp_rtc_calibration_output_disable(void);
208 /* enable RTC alarm or second signal output */
209 void bkp_rtc_signal_output_enable(void);
210 /* disable RTC alarm or second signal output */
211 void bkp_rtc_signal_output_disable(void);
212 /* RTC output selection */
213 void bkp_rtc_output_select(uint16_t outputsel);
214 /* RTC clock output selection */
215 void bkp_rtc_clock_output_select(uint16_t clocksel);
216 /* RTC clock calibration direction */
217 void bkp_rtc_clock_calibration_direction(uint16_t direction);
218 /* set RTC clock calibration value */
219 void bkp_rtc_calibration_value_set(uint8_t value);
220 
221 /* tamper pin related functions */
222 /* enable tamper pin detection */
223 void bkp_tamper_detection_enable(void);
224 /* disable tamper pin detection */
225 void bkp_tamper_detection_disable(void);
226 /* set tamper pin active level */
227 void bkp_tamper_active_level_set(uint16_t level);
228 /* enable tamper pin interrupt */
229 void bkp_tamper_interrupt_enable(void);
230 /* disable tamper pin interrupt */
231 void bkp_tamper_interrupt_disable(void);
232 
233 /* flag functions */
234 /* get BKP flag state */
235 FlagStatus bkp_flag_get(uint16_t flag);
236 /* clear BKP flag state */
237 void bkp_flag_clear(uint16_t flag);
238 /* get BKP interrupt flag state */
239 FlagStatus bkp_interrupt_flag_get(uint16_t flag);
240 /* clear BKP interrupt flag state */
241 void bkp_interrupt_flag_clear(uint16_t flag);
242 
243 #endif /* GD32F403_BKP_H */
244