1 /*!
2     \file    gd32f3x0_timer.h
3     \brief   definitions for the TIMER
4 
5     \version 2017-06-06, V1.0.0, firmware for GD32F3x0
6     \version 2019-06-01, V2.0.0, firmware for GD32F3x0
7     \version 2020-09-30, V2.1.0, firmware for GD32F3x0
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 GD32F3X0_TIMER_H
38 #define GD32F3X0_TIMER_H
39 
40 #include "gd32f3x0.h"
41 
42 /* TIMERx(x=0,1,2,5,13..16) definitions */
43 #define TIMER0                           (TIMER_BASE + 0x00012C00U)
44 #define TIMER1                           (TIMER_BASE + 0x00000000U)
45 #define TIMER2                           (TIMER_BASE + 0x00000400U)
46 #ifdef GD32F350
47 #define TIMER5                           (TIMER_BASE + 0x00001000U)
48 #endif
49 #define TIMER13                          (TIMER_BASE + 0x00002000U)
50 #define TIMER14                          (TIMER_BASE + 0x00014000U)
51 #define TIMER15                          (TIMER_BASE + 0x00014400U)
52 #define TIMER16                          (TIMER_BASE + 0x00014800U)
53 
54 /* registers definitions */
55 #define TIMER_CTL0(timerx)               REG32((timerx) + 0x00000000U)         /*!< TIMER control register 0 */
56 #define TIMER_CTL1(timerx)               REG32((timerx) + 0x00000004U)         /*!< TIMER control register 1 */
57 #define TIMER_SMCFG(timerx)              REG32((timerx) + 0x00000008U)         /*!< TIMER slave mode configuration register */
58 #define TIMER_DMAINTEN(timerx)           REG32((timerx) + 0x0000000CU)         /*!< TIMER DMA and interrupt enable register */
59 #define TIMER_INTF(timerx)               REG32((timerx) + 0x00000010U)         /*!< TIMER interrupt flag register */
60 #define TIMER_SWEVG(timerx)              REG32((timerx) + 0x00000014U)         /*!< TIMER software event generation register */
61 #define TIMER_CHCTL0(timerx)             REG32((timerx) + 0x00000018U)         /*!< TIMER channel control register 0 */
62 #define TIMER_CHCTL1(timerx)             REG32((timerx) + 0x0000001CU)         /*!< TIMER channel control register 1 */
63 #define TIMER_CHCTL2(timerx)             REG32((timerx) + 0x00000020U)         /*!< TIMER channel control register 2 */
64 #define TIMER_CNT(timerx)                REG32((timerx) + 0x00000024U)         /*!< TIMER counter register */
65 #define TIMER_PSC(timerx)                REG32((timerx) + 0x00000028U)         /*!< TIMER prescaler register */
66 #define TIMER_CAR(timerx)                REG32((timerx) + 0x0000002CU)         /*!< TIMER counter auto reload register */
67 #define TIMER_CREP(timerx)               REG32((timerx) + 0x00000030U)         /*!< TIMER counter repetition register */
68 #define TIMER_CH0CV(timerx)              REG32((timerx) + 0x00000034U)         /*!< TIMER channel 0 capture/compare value register */
69 #define TIMER_CH1CV(timerx)              REG32((timerx) + 0x00000038U)         /*!< TIMER channel 1 capture/compare value register */
70 #define TIMER_CH2CV(timerx)              REG32((timerx) + 0x0000003CU)         /*!< TIMER channel 2 capture/compare value register */
71 #define TIMER_CH3CV(timerx)              REG32((timerx) + 0x00000040U)         /*!< TIMER channel 3 capture/compare value register */
72 #define TIMER_CCHP(timerx)               REG32((timerx) + 0x00000044U)         /*!< TIMER complementary channel protection register */
73 #define TIMER_DMACFG(timerx)             REG32((timerx) + 0x00000048U)         /*!< TIMER DMA configuration register */
74 #define TIMER_DMATB(timerx)              REG32((timerx) + 0x0000004CU)         /*!< TIMER DMA transfer buffer register */
75 #define TIMER_IRMP(timerx)               REG32((timerx) + 0x00000050U)         /*!< TIMER channel input remap register */
76 #define TIMER_CFG(timerx)                REG32((timerx) + 0x000000FCU)         /*!< TIMER configuration register */
77 
78 /* bits definitions */
79 /* TIMER_CTL0 */
80 #define TIMER_CTL0_CEN                   BIT(0)              /*!< TIMER counter enable */
81 #define TIMER_CTL0_UPDIS                 BIT(1)              /*!< update disable */
82 #define TIMER_CTL0_UPS                   BIT(2)              /*!< update source */
83 #define TIMER_CTL0_SPM                   BIT(3)              /*!< single pulse mode */
84 #define TIMER_CTL0_DIR                   BIT(4)              /*!< timer counter direction */
85 #define TIMER_CTL0_CAM                   BITS(5,6)           /*!< center-aligned mode selection */
86 #define TIMER_CTL0_ARSE                  BIT(7)              /*!< auto-reload shadow enable */
87 #define TIMER_CTL0_CKDIV                 BITS(8,9)           /*!< clock division */
88 
89 /* TIMER_CTL1 */
90 #define TIMER_CTL1_CCSE                  BIT(0)              /*!< commutation control shadow enable */
91 #define TIMER_CTL1_CCUC                  BIT(2)              /*!< commutation control shadow register update control */
92 #define TIMER_CTL1_DMAS                  BIT(3)              /*!< DMA request source selection */
93 #define TIMER_CTL1_MMC                   BITS(4,6)           /*!< master mode control */
94 #define TIMER_CTL1_TI0S                  BIT(7)              /*!< channel 0 trigger input selection(hall mode selection) */
95 #define TIMER_CTL1_ISO0                  BIT(8)              /*!< idle state of channel 0 output */
96 #define TIMER_CTL1_ISO0N                 BIT(9)              /*!< idle state of channel 0 complementary output */
97 #define TIMER_CTL1_ISO1                  BIT(10)             /*!< idle state of channel 1 output */
98 #define TIMER_CTL1_ISO1N                 BIT(11)             /*!< idle state of channel 1 complementary output */
99 #define TIMER_CTL1_ISO2                  BIT(12)             /*!< idle state of channel 2 output */
100 #define TIMER_CTL1_ISO2N                 BIT(13)             /*!< idle state of channel 2 complementary output */
101 #define TIMER_CTL1_ISO3                  BIT(14)             /*!< idle state of channel 3 output */
102 
103 /* TIMER_SMCFG */
104 #define TIMER_SMCFG_SMC                  BITS(0,2)           /*!< slave mode control */
105 #define TIMER_SMCFG_OCRC                 BIT(3)              /*!< OCPRE clear source selection */
106 #define TIMER_SMCFG_TRGS                 BITS(4,6)           /*!< trigger selection */
107 #define TIMER_SMCFG_MSM                  BIT(7)              /*!< master-slave mode */
108 #define TIMER_SMCFG_ETFC                 BITS(8,11)          /*!< external trigger filter control */
109 #define TIMER_SMCFG_ETPSC                BITS(12,13)         /*!< external trigger prescaler */
110 #define TIMER_SMCFG_SMC1                 BIT(14)             /*!< part of SMC for enable external clock mode 1 */
111 #define TIMER_SMCFG_ETP                  BIT(15)             /*!< external trigger polarity */
112 
113 /* TIMER_DMAINTEN */
114 #define TIMER_DMAINTEN_UPIE              BIT(0)              /*!< update interrupt enable */
115 #define TIMER_DMAINTEN_CH0IE             BIT(1)              /*!< channel 0 capture/compare interrupt enable */
116 #define TIMER_DMAINTEN_CH1IE             BIT(2)              /*!< channel 1 capture/compare interrupt enable */
117 #define TIMER_DMAINTEN_CH2IE             BIT(3)              /*!< channel 2 capture/compare interrupt enable */
118 #define TIMER_DMAINTEN_CH3IE             BIT(4)              /*!< channel 3 capture/compare interrupt enable */
119 #define TIMER_DMAINTEN_CMTIE             BIT(5)              /*!< commutation interrupt request enable */
120 #define TIMER_DMAINTEN_TRGIE             BIT(6)              /*!< trigger interrupt enable */
121 #define TIMER_DMAINTEN_BRKIE             BIT(7)              /*!< break interrupt enable */
122 #define TIMER_DMAINTEN_UPDEN             BIT(8)              /*!< update DMA request enable */
123 #define TIMER_DMAINTEN_CH0DEN            BIT(9)              /*!< channel 0 DMA request enable */
124 #define TIMER_DMAINTEN_CH1DEN            BIT(10)             /*!< channel 1 DMA request enable */
125 #define TIMER_DMAINTEN_CH2DEN            BIT(11)             /*!< channel 2 DMA request enable */
126 #define TIMER_DMAINTEN_CH3DEN            BIT(12)             /*!< channel 3 DMA request enable */
127 #define TIMER_DMAINTEN_CMTDEN            BIT(13)             /*!< commutation DMA request enable */
128 #define TIMER_DMAINTEN_TRGDEN            BIT(14)             /*!< trigger DMA request enable */
129 
130 /* TIMER_INTF */
131 #define TIMER_INTF_UPIF                  BIT(0)              /*!< update interrupt flag */
132 #define TIMER_INTF_CH0IF                 BIT(1)              /*!< channel 0 capture/compare interrupt flag */
133 #define TIMER_INTF_CH1IF                 BIT(2)              /*!< channel 1 capture/compare interrupt flag */
134 #define TIMER_INTF_CH2IF                 BIT(3)              /*!< channel 2 capture/compare interrupt flag */
135 #define TIMER_INTF_CH3IF                 BIT(4)              /*!< channel 3 capture/compare interrupt flag */
136 #define TIMER_INTF_CMTIF                 BIT(5)              /*!< channel commutation interrupt flag */
137 #define TIMER_INTF_TRGIF                 BIT(6)              /*!< trigger interrupt flag */
138 #define TIMER_INTF_BRKIF                 BIT(7)              /*!< break interrupt flag */
139 #define TIMER_INTF_CH0OF                 BIT(9)              /*!< channel 0 overcapture flag */
140 #define TIMER_INTF_CH1OF                 BIT(10)             /*!< channel 1 overcapture flag */
141 #define TIMER_INTF_CH2OF                 BIT(11)             /*!< channel 2 overcapture flag */
142 #define TIMER_INTF_CH3OF                 BIT(12)             /*!< channel 3 overcapture flag */
143 
144 /* TIMER_SWEVG */
145 #define TIMER_SWEVG_UPG                  BIT(0)              /*!< update event generate */
146 #define TIMER_SWEVG_CH0G                 BIT(1)              /*!< channel 0 capture or compare event generation */
147 #define TIMER_SWEVG_CH1G                 BIT(2)              /*!< channel 1 capture or compare event generation */
148 #define TIMER_SWEVG_CH2G                 BIT(3)              /*!< channel 2 capture or compare event generation */
149 #define TIMER_SWEVG_CH3G                 BIT(4)              /*!< channel 3 capture or compare event generation */
150 #define TIMER_SWEVG_CMTG                 BIT(5)              /*!< channel commutation event generation */
151 #define TIMER_SWEVG_TRGG                 BIT(6)              /*!< trigger event generation */
152 #define TIMER_SWEVG_BRKG                 BIT(7)              /*!< break event generation */
153 
154 /* TIMER_CHCTL0 */
155 /* output compare mode */
156 #define TIMER_CHCTL0_CH0MS               BITS(0,1)           /*!< channel 0 mode selection */
157 #define TIMER_CHCTL0_CH0COMFEN           BIT(2)              /*!< channel 0 output compare fast enable */
158 #define TIMER_CHCTL0_CH0COMSEN           BIT(3)              /*!< channel 0 output compare shadow enable */
159 #define TIMER_CHCTL0_CH0COMCTL           BITS(4,6)           /*!< channel 0 output compare mode */
160 #define TIMER_CHCTL0_CH0COMCEN           BIT(7)              /*!< channel 0 output compare clear enable */
161 #define TIMER_CHCTL0_CH1MS               BITS(8,9)           /*!< channel 1 mode selection */
162 #define TIMER_CHCTL0_CH1COMFEN           BIT(10)             /*!< channel 1 output compare fast enable */
163 #define TIMER_CHCTL0_CH1COMSEN           BIT(11)             /*!< channel 1 output compare shadow enable */
164 #define TIMER_CHCTL0_CH1COMCTL           BITS(12,14)         /*!< channel 1 output compare mode */
165 #define TIMER_CHCTL0_CH1COMCEN           BIT(15)             /*!< channel 1 output compare clear enable */
166 /* input capture mode */
167 #define TIMER_CHCTL0_CH0CAPPSC           BITS(2,3)           /*!< channel 0 input capture prescaler */
168 #define TIMER_CHCTL0_CH0CAPFLT           BITS(4,7)           /*!< channel 0 input capture filter control */
169 #define TIMER_CHCTL0_CH1CAPPSC           BITS(10,11)         /*!< channel 1 input capture prescaler */
170 #define TIMER_CHCTL0_CH1CAPFLT           BITS(12,15)         /*!< channel 1 input capture filter control */
171 
172 /* TIMER_CHCTL1 */
173 /* output compare mode */
174 #define TIMER_CHCTL1_CH2MS               BITS(0,1)           /*!< channel 2 mode selection */
175 #define TIMER_CHCTL1_CH2COMFEN           BIT(2)              /*!< channel 2 output compare fast enable */
176 #define TIMER_CHCTL1_CH2COMSEN           BIT(3)              /*!< channel 2 output compare shadow enable */
177 #define TIMER_CHCTL1_CH2COMCTL           BITS(4,6)           /*!< channel 2 output compare mode */
178 #define TIMER_CHCTL1_CH2COMCEN           BIT(7)              /*!< channel 2 output compare clear enable */
179 #define TIMER_CHCTL1_CH3MS               BITS(8,9)           /*!< channel 3 mode selection */
180 #define TIMER_CHCTL1_CH3COMFEN           BIT(10)             /*!< channel 3 output compare fast enable */
181 #define TIMER_CHCTL1_CH3COMSEN           BIT(11)             /*!< channel 3 output compare shadow enable */
182 #define TIMER_CHCTL1_CH3COMCTL           BITS(12,14)         /*!< channel 3 output compare mode */
183 #define TIMER_CHCTL1_CH3COMCEN           BIT(15)             /*!< channel 3 output compare clear enable */
184 /* input capture mode */
185 #define TIMER_CHCTL1_CH2CAPPSC           BITS(2,3)           /*!< channel 2 input capture prescaler */
186 #define TIMER_CHCTL1_CH2CAPFLT           BITS(4,7)           /*!< channel 2 input capture filter control */
187 #define TIMER_CHCTL1_CH3CAPPSC           BITS(10,11)         /*!< channel 3 input capture prescaler */
188 #define TIMER_CHCTL1_CH3CAPFLT           BITS(12,15)         /*!< channel 3 input capture filter control */
189 
190 /* TIMER_CHCTL2 */
191 #define TIMER_CHCTL2_CH0EN               BIT(0)              /*!< channel 0 capture/compare function enable */
192 #define TIMER_CHCTL2_CH0P                BIT(1)              /*!< channel 0 capture/compare function polarity */
193 #define TIMER_CHCTL2_CH0NEN              BIT(2)              /*!< channel 0 complementary output enable */
194 #define TIMER_CHCTL2_CH0NP               BIT(3)              /*!< channel 0 complementary output polarity */
195 #define TIMER_CHCTL2_CH1EN               BIT(4)              /*!< channel 1 capture/compare function enable  */
196 #define TIMER_CHCTL2_CH1P                BIT(5)              /*!< channel 1 capture/compare function polarity */
197 #define TIMER_CHCTL2_CH1NEN              BIT(6)              /*!< channel 1 complementary output enable */
198 #define TIMER_CHCTL2_CH1NP               BIT(7)              /*!< channel 1 complementary output polarity */
199 #define TIMER_CHCTL2_CH2EN               BIT(8)              /*!< channel 2 capture/compare function enable  */
200 #define TIMER_CHCTL2_CH2P                BIT(9)              /*!< channel 2 capture/compare function polarity */
201 #define TIMER_CHCTL2_CH2NEN              BIT(10)             /*!< channel 2 complementary output enable */
202 #define TIMER_CHCTL2_CH2NP               BIT(11)             /*!< channel 2 complementary output polarity */
203 #define TIMER_CHCTL2_CH3EN               BIT(12)             /*!< channel 3 capture/compare function enable  */
204 #define TIMER_CHCTL2_CH3P                BIT(13)             /*!< channel 3 capture/compare function polarity */
205 #define TIMER_CHCTL2_CH3NP               BIT(15)             /*!< channel 3 complementary output polarity */
206 
207 /* TIMER_CNT */
208 #define TIMER_CNT_CNT16                  BITS(0,15)          /*!< 16 bit timer counter */
209 #define TIMER_CNT_CNT32                  BITS(0,31)          /*!< 32 bit(TIMER1) timer counter */
210 
211 /* TIMER_PSC */
212 #define TIMER_PSC_PSC                    BITS(0,15)          /*!< prescaler value of the counter clock */
213 
214 /* TIMER_CAR */
215 #define TIMER_CAR_CARL16                 BITS(0,15)          /*!< 16 bit counter auto reload value */
216 #define TIMER_CAR_CARL32                 BITS(0,31)          /*!< 32 bit(TIMER1) counter auto reload value */
217 
218 /* TIMER_CREP */
219 #define TIMER_CREP_CREP                  BITS(0,7)           /*!< counter repetition value */
220 
221 /* TIMER_CH0CV */
222 #define TIMER_CH0CV_CH0VAL16             BITS(0,15)          /*!< 16 bit capture/compare value of channel 0 */
223 #define TIMER_CH0CV_CH0VAL32             BITS(0,31)          /*!< 32 bit(TIMER1) capture/compare value of channel 0 */
224 
225 /* TIMER_CH1CV */
226 #define TIMER_CH1CV_CH1VAL16             BITS(0,15)          /*!< 16 bit capture/compare value of channel 1 */
227 #define TIMER_CH1CV_CH1VAL32             BITS(0,31)          /*!< 32 bit(TIMER1) capture/compare value of channel 1 */
228 
229 /* TIMER_CH2CV */
230 #define TIMER_CH2CV_CH2VAL16             BITS(0,15)          /*!< 16 bit capture/compare value of channel 2 */
231 #define TIMER_CH2CV_CH2VAL32             BITS(0,31)          /*!< 32 bit(TIMER1) capture/compare value of channel 2 */
232 
233 /* TIMER_CH3CV */
234 #define TIMER_CH3CV_CH3VAL16             BITS(0,15)          /*!< 16 bit capture/compare value of channel 3 */
235 #define TIMER_CH3CV_CH3VAL32             BITS(0,31)          /*!< 32 bit(TIMER1) capture/compare value of channel 3 */
236 
237 /* TIMER_CCHP */
238 #define TIMER_CCHP_DTCFG                 BITS(0,7)           /*!< dead time configure */
239 #define TIMER_CCHP_PROT                  BITS(8,9)           /*!< complementary register protect control */
240 #define TIMER_CCHP_IOS                   BIT(10)             /*!< idle mode off-state configure */
241 #define TIMER_CCHP_ROS                   BIT(11)             /*!< run mode off-state configure */
242 #define TIMER_CCHP_BRKEN                 BIT(12)             /*!< break enable */
243 #define TIMER_CCHP_BRKP                  BIT(13)             /*!< break polarity */
244 #define TIMER_CCHP_OAEN                  BIT(14)             /*!< output automatic enable */
245 #define TIMER_CCHP_POEN                  BIT(15)             /*!< primary output enable */
246 
247 /* TIMER_DMACFG */
248 #define TIMER_DMACFG_DMATA               BITS(0,4)           /*!< DMA transfer access start address */
249 #define TIMER_DMACFG_DMATC               BITS(8,12)          /*!< DMA transfer count */
250 
251 /* TIMER_DMATB */
252 #define TIMER_DMATB_DMATB                BITS(0,15)          /*!< DMA transfer buffer address */
253 
254 /* TIMER_IRMP */
255 #define TIMER13_IRMP_CI0_RMP             BITS(0,1)           /*!< TIMER13 channel 0 input remap */
256 
257 /* TIMER_CFG */
258 #define TIMER_CFG_OUTSEL                 BIT(0)              /*!< the output value selection */
259 #define TIMER_CFG_CHVSEL                 BIT(1)              /*!< write CHxVAL register selection */
260 
261 /* constants definitions */
262 /* TIMER init parameter struct definitions*/
263 typedef struct
264 {
265     uint16_t prescaler;                         /*!< prescaler value */
266     uint16_t alignedmode;                       /*!< aligned mode */
267     uint16_t counterdirection;                  /*!< counter direction */
268     uint16_t clockdivision;                     /*!< clock division value */
269     uint32_t period;                            /*!< period value */
270     uint8_t  repetitioncounter;                 /*!< the counter repetition value */
271 }timer_parameter_struct;
272 
273 /* break parameter struct definitions*/
274 typedef struct
275 {
276     uint32_t runoffstate;                       /*!< run mode off-state */
277     uint32_t ideloffstate;                      /*!< idle mode off-state */
278     uint16_t deadtime;                          /*!< dead time */
279     uint16_t breakpolarity;                     /*!< break polarity */
280     uint32_t outputautostate;                   /*!< output automatic enable */
281     uint32_t protectmode;                       /*!< complementary register protect control */
282     uint32_t breakstate;                        /*!< break enable */
283 }timer_break_parameter_struct;
284 
285 /* channel output parameter struct definitions */
286 typedef struct
287 {
288     uint32_t outputstate;                       /*!< channel output state */
289     uint16_t outputnstate;                      /*!< channel complementary output state */
290     uint16_t ocpolarity;                        /*!< channel output polarity */
291     uint16_t ocnpolarity;                       /*!< channel complementary output polarity */
292     uint16_t ocidlestate;                       /*!< idle state of channel output */
293     uint16_t ocnidlestate;                      /*!< idle state of channel complementary output */
294 }timer_oc_parameter_struct;
295 
296 /* channel input parameter struct definitions */
297 typedef struct
298 {
299     uint16_t icpolarity;                        /*!< channel input polarity */
300     uint16_t icselection;                       /*!< channel input mode selection */
301     uint16_t icprescaler;                       /*!< channel input capture prescaler */
302     uint16_t icfilter;                          /*!< channel input capture filter control */
303 }timer_ic_parameter_struct;
304 
305 /* TIMER interrupt enable or disable */
306 #define TIMER_INT_UP                        TIMER_DMAINTEN_UPIE                     /*!< update interrupt */
307 #define TIMER_INT_CH0                       TIMER_DMAINTEN_CH0IE                    /*!< channel 0 interrupt */
308 #define TIMER_INT_CH1                       TIMER_DMAINTEN_CH1IE                    /*!< channel 1 interrupt */
309 #define TIMER_INT_CH2                       TIMER_DMAINTEN_CH2IE                    /*!< channel 2 interrupt */
310 #define TIMER_INT_CH3                       TIMER_DMAINTEN_CH3IE                    /*!< channel 3 interrupt */
311 #define TIMER_INT_CMT                       TIMER_DMAINTEN_CMTIE                    /*!< channel commutation interrupt flag */
312 #define TIMER_INT_TRG                       TIMER_DMAINTEN_TRGIE                    /*!< trigger interrupt */
313 #define TIMER_INT_BRK                       TIMER_DMAINTEN_BRKIE                    /*!< break interrupt */
314 
315 /* TIMER flag */
316 #define TIMER_FLAG_UP                       TIMER_INTF_UPIF                         /*!< update flag */
317 #define TIMER_FLAG_CH0                      TIMER_INTF_CH0IF                        /*!< channel 0 flag */
318 #define TIMER_FLAG_CH1                      TIMER_INTF_CH1IF                        /*!< channel 1 flag */
319 #define TIMER_FLAG_CH2                      TIMER_INTF_CH2IF                        /*!< channel 2 flag */
320 #define TIMER_FLAG_CH3                      TIMER_INTF_CH3IF                        /*!< channel 3 flag */
321 #define TIMER_FLAG_CMT                      TIMER_INTF_CMTIF                        /*!< channel commutation flag */
322 #define TIMER_FLAG_TRG                      TIMER_INTF_TRGIF                        /*!< trigger flag */
323 #define TIMER_FLAG_BRK                      TIMER_INTF_BRKIF                        /*!< break flag */
324 #define TIMER_FLAG_CH0O                     TIMER_INTF_CH0OF                        /*!< channel 0 overcapture flag */
325 #define TIMER_FLAG_CH1O                     TIMER_INTF_CH1OF                        /*!< channel 1 overcapture flag */
326 #define TIMER_FLAG_CH2O                     TIMER_INTF_CH2OF                        /*!< channel 2 overcapture flag */
327 #define TIMER_FLAG_CH3O                     TIMER_INTF_CH3OF                        /*!< channel 3 overcapture flag */
328 
329 /* TIMER interrupt flag */
330 #define TIMER_INT_FLAG_UP                   TIMER_INTF_UPIF                         /*!< update interrupt flag */
331 #define TIMER_INT_FLAG_CH0                  TIMER_INTF_CH0IF                        /*!< channel 0 interrupt flag */
332 #define TIMER_INT_FLAG_CH1                  TIMER_INTF_CH1IF                        /*!< channel 1 interrupt flag */
333 #define TIMER_INT_FLAG_CH2                  TIMER_INTF_CH2IF                        /*!< channel 2 interrupt flag */
334 #define TIMER_INT_FLAG_CH3                  TIMER_INTF_CH3IF                        /*!< channel 3 interrupt flag */
335 #define TIMER_INT_FLAG_CMT                  TIMER_INTF_CMTIF                        /*!< channel commutation interrupt flag */
336 #define TIMER_INT_FLAG_TRG                  TIMER_INTF_TRGIF                        /*!< trigger interrupt flag */
337 #define TIMER_INT_FLAG_BRK                  TIMER_INTF_BRKIF
338 
339 /* TIMER DMA source enable */
340 #define TIMER_DMA_UPD                       ((uint16_t)TIMER_DMAINTEN_UPDEN)        /*!< update DMA enable */
341 #define TIMER_DMA_CH0D                      ((uint16_t)TIMER_DMAINTEN_CH0DEN)       /*!< channel 0 DMA enable */
342 #define TIMER_DMA_CH1D                      ((uint16_t)TIMER_DMAINTEN_CH1DEN)       /*!< channel 1 DMA enable */
343 #define TIMER_DMA_CH2D                      ((uint16_t)TIMER_DMAINTEN_CH2DEN)       /*!< channel 2 DMA enable */
344 #define TIMER_DMA_CH3D                      ((uint16_t)TIMER_DMAINTEN_CH3DEN)       /*!< channel 3 DMA enable */
345 #define TIMER_DMA_CMTD                      ((uint16_t)TIMER_DMAINTEN_CMTDEN)       /*!< commutation DMA request enable */
346 #define TIMER_DMA_TRGD                      ((uint16_t)TIMER_DMAINTEN_TRGDEN)       /*!< trigger DMA enable */
347 
348 /* channel DMA request source selection */
349 #define TIMER_DMAREQUEST_UPDATEEVENT        ((uint8_t)0x00U)                        /*!< DMA request of channel y is sent when update event occurs */
350 #define TIMER_DMAREQUEST_CHANNELEVENT       ((uint8_t)0x01U)                        /*!< DMA request of channel y is sent when channel y event occurs */
351 
352 /* DMA access base address */
353 #define DMACFG_DMATA(regval)                (BITS(0, 4) & ((uint32_t)(regval) << 0U))
354 #define TIMER_DMACFG_DMATA_CTL0             DMACFG_DMATA(0)                         /*!< DMA transfer address is TIMER_CTL0 */
355 #define TIMER_DMACFG_DMATA_CTL1             DMACFG_DMATA(1)                         /*!< DMA transfer address is TIMER_CTL1 */
356 #define TIMER_DMACFG_DMATA_SMCFG            DMACFG_DMATA(2)                         /*!< DMA transfer address is TIMER_SMCFG */
357 #define TIMER_DMACFG_DMATA_DMAINTEN         DMACFG_DMATA(3)                         /*!< DMA transfer address is TIMER_DMAINTEN */
358 #define TIMER_DMACFG_DMATA_INTF             DMACFG_DMATA(4)                         /*!< DMA transfer address is TIMER_INTF */
359 #define TIMER_DMACFG_DMATA_SWEVG            DMACFG_DMATA(5)                         /*!< DMA transfer address is TIMER_SWEVG */
360 #define TIMER_DMACFG_DMATA_CHCTL0           DMACFG_DMATA(6)                         /*!< DMA transfer address is TIMER_CHCTL0 */
361 #define TIMER_DMACFG_DMATA_CHCTL1           DMACFG_DMATA(7)                         /*!< DMA transfer address is TIMER_CHCTL1 */
362 #define TIMER_DMACFG_DMATA_CHCTL2           DMACFG_DMATA(8)                         /*!< DMA transfer address is TIMER_CHCTL2 */
363 #define TIMER_DMACFG_DMATA_CNT              DMACFG_DMATA(9)                         /*!< DMA transfer address is TIMER_CNT */
364 #define TIMER_DMACFG_DMATA_PSC              DMACFG_DMATA(10)                        /*!< DMA transfer address is TIMER_PSC */
365 #define TIMER_DMACFG_DMATA_CAR              DMACFG_DMATA(11)                        /*!< DMA transfer address is TIMER_CAR */
366 #define TIMER_DMACFG_DMATA_CREP             DMACFG_DMATA(12)                        /*!< DMA transfer address is TIMER_CREP */
367 #define TIMER_DMACFG_DMATA_CH0CV            DMACFG_DMATA(13)                        /*!< DMA transfer address is TIMER_CH0CV */
368 #define TIMER_DMACFG_DMATA_CH1CV            DMACFG_DMATA(14)                        /*!< DMA transfer address is TIMER_CH1CV */
369 #define TIMER_DMACFG_DMATA_CH2CV            DMACFG_DMATA(15)                        /*!< DMA transfer address is TIMER_CH2CV */
370 #define TIMER_DMACFG_DMATA_CH3CV            DMACFG_DMATA(16)                        /*!< DMA transfer address is TIMER_CH3CV */
371 #define TIMER_DMACFG_DMATA_CCHP             DMACFG_DMATA(17)                        /*!< DMA transfer address is TIMER_CCHP */
372 #define TIMER_DMACFG_DMATA_DMACFG           DMACFG_DMATA(18)                        /*!< DMA transfer address is TIMER_DMACFG */
373 #define TIMER_DMACFG_DMATA_DMATB            DMACFG_DMATA(19)                        /*!< DMA transfer address is TIMER_DMATB */
374 
375 /* DMA access burst length */
376 #define DMACFG_DMATC(regval)                (BITS(8, 12) & ((uint32_t)(regval) << 8U))
377 #define TIMER_DMACFG_DMATC_1TRANSFER        DMACFG_DMATC(0)                         /*!< DMA transfer 1 time */
378 #define TIMER_DMACFG_DMATC_2TRANSFER        DMACFG_DMATC(1)                         /*!< DMA transfer 2 times */
379 #define TIMER_DMACFG_DMATC_3TRANSFER        DMACFG_DMATC(2)                         /*!< DMA transfer 3 times */
380 #define TIMER_DMACFG_DMATC_4TRANSFER        DMACFG_DMATC(3)                         /*!< DMA transfer 4 times */
381 #define TIMER_DMACFG_DMATC_5TRANSFER        DMACFG_DMATC(4)                         /*!< DMA transfer 5 times */
382 #define TIMER_DMACFG_DMATC_6TRANSFER        DMACFG_DMATC(5)                         /*!< DMA transfer 6 times */
383 #define TIMER_DMACFG_DMATC_7TRANSFER        DMACFG_DMATC(6)                         /*!< DMA transfer 7 times */
384 #define TIMER_DMACFG_DMATC_8TRANSFER        DMACFG_DMATC(7)                         /*!< DMA transfer 8 times */
385 #define TIMER_DMACFG_DMATC_9TRANSFER        DMACFG_DMATC(8)                         /*!< DMA transfer 9 times */
386 #define TIMER_DMACFG_DMATC_10TRANSFER       DMACFG_DMATC(9)                         /*!< DMA transfer 10 times */
387 #define TIMER_DMACFG_DMATC_11TRANSFER       DMACFG_DMATC(10)                        /*!< DMA transfer 11 times */
388 #define TIMER_DMACFG_DMATC_12TRANSFER       DMACFG_DMATC(11)                        /*!< DMA transfer 12 times */
389 #define TIMER_DMACFG_DMATC_13TRANSFER       DMACFG_DMATC(12)                        /*!< DMA transfer 13 times */
390 #define TIMER_DMACFG_DMATC_14TRANSFER       DMACFG_DMATC(13)                        /*!< DMA transfer 14 times */
391 #define TIMER_DMACFG_DMATC_15TRANSFER       DMACFG_DMATC(14)                        /*!< DMA transfer 15 times */
392 #define TIMER_DMACFG_DMATC_16TRANSFER       DMACFG_DMATC(15)                        /*!< DMA transfer 16 times */
393 #define TIMER_DMACFG_DMATC_17TRANSFER       DMACFG_DMATC(16)                        /*!< DMA transfer 17 times */
394 #define TIMER_DMACFG_DMATC_18TRANSFER       DMACFG_DMATC(17)                        /*!< DMA transfer 18 times */
395 
396 /* TIMER software event generation source */
397 #define TIMER_EVENT_SRC_UPG                 ((uint16_t)0x0001U)                     /*!< update event generation */
398 #define TIMER_EVENT_SRC_CH0G                ((uint16_t)0x0002U)                     /*!< channel 0 capture or compare event generation */
399 #define TIMER_EVENT_SRC_CH1G                ((uint16_t)0x0004U)                     /*!< channel 1 capture or compare event generation */
400 #define TIMER_EVENT_SRC_CH2G                ((uint16_t)0x0008U)                     /*!< channel 2 capture or compare event generation */
401 #define TIMER_EVENT_SRC_CH3G                ((uint16_t)0x0010U)                     /*!< channel 3 capture or compare event generation */
402 #define TIMER_EVENT_SRC_CMTG                ((uint16_t)0x0020U)                     /*!< channel commutation event generation */
403 #define TIMER_EVENT_SRC_TRGG                ((uint16_t)0x0040U)                     /*!< trigger event generation */
404 #define TIMER_EVENT_SRC_BRKG                ((uint16_t)0x0080U)                     /*!< break event generation */
405 
406 /* center-aligned mode selection */
407 #define CTL0_CAM(regval)                    ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U)))
408 #define TIMER_COUNTER_EDGE                  CTL0_CAM(0)                             /*!< edge-aligned mode */
409 #define TIMER_COUNTER_CENTER_DOWN           CTL0_CAM(1)                             /*!< center-aligned and counting down assert mode */
410 #define TIMER_COUNTER_CENTER_UP             CTL0_CAM(2)                             /*!< center-aligned and counting up assert mode */
411 #define TIMER_COUNTER_CENTER_BOTH           CTL0_CAM(3)                             /*!< center-aligned and counting up/down assert mode */
412 
413 /* TIMER prescaler reload mode */
414 #define TIMER_PSC_RELOAD_NOW                ((uint8_t)0x00U)                        /*!< the prescaler is loaded right now */
415 #define TIMER_PSC_RELOAD_UPDATE             ((uint8_t)0x01U)                        /*!< the prescaler is loaded at the next update event */
416 
417 /* count direction */
418 #define TIMER_COUNTER_UP                    ((uint16_t)0x0000U)                     /*!< counter up direction */
419 #define TIMER_COUNTER_DOWN                  ((uint16_t)0x0010U)                     /*!< counter down direction */
420 
421 /* specify division ratio between TIMER clock and dead-time and sampling clock */
422 #define CTL0_CKDIV(regval)                  ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U)))
423 #define TIMER_CKDIV_DIV1                    CTL0_CKDIV(0)                           /*!< clock division value is 1, fDTS=fTIMER_CK */
424 #define TIMER_CKDIV_DIV2                    CTL0_CKDIV(1)                           /*!< clock division value is 2, fDTS= fTIMER_CK/2 */
425 #define TIMER_CKDIV_DIV4                    CTL0_CKDIV(2)                           /*!< clock division value is 4, fDTS= fTIMER_CK/4 */
426 
427 /* single pulse mode */
428 #define TIMER_SP_MODE_SINGLE                ((uint8_t)0x00U)                        /*!< single pulse mode */
429 #define TIMER_SP_MODE_REPETITIVE            ((uint8_t)0x01U)                        /*!< repetitive pulse mode */
430 
431 /* update source */
432 #define TIMER_UPDATE_SRC_REGULAR            ((uint8_t)0x00U)                        /*!< update generate only by counter overflow/underflow */
433 #define TIMER_UPDATE_SRC_GLOBAL             ((uint8_t)0x01U)                        /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */
434 
435 /* run mode off-state configure */
436 #define TIMER_ROS_STATE_ENABLE              ((uint32_t)0x00000800U)                 /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */
437 #define TIMER_ROS_STATE_DISABLE             ((uint32_t)0x00000000U)                 /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are disabled */
438 
439 /* idle mode off-state configure */
440 #define TIMER_IOS_STATE_ENABLE              ((uint16_t)0x0400U)                     /*!< when POEN bit is reset, he channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */
441 #define TIMER_IOS_STATE_DISABLE             ((uint16_t)0x0000U)                     /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are disabled */
442 
443 /* break input polarity */
444 #define TIMER_BREAK_POLARITY_LOW            ((uint16_t)0x0000U)                     /*!< break input polarity is low */
445 #define TIMER_BREAK_POLARITY_HIGH           ((uint16_t)0x2000U)                     /*!< break input polarity is high */
446 
447 /* output automatic enable */
448 #define TIMER_OUTAUTO_ENABLE                ((uint16_t)0x4000U)                     /*!< output automatic enable */
449 #define TIMER_OUTAUTO_DISABLE               ((uint16_t)0x0000U)                     /*!< output automatic disable */
450 
451 /* complementary register protect control */
452 #define CCHP_PROT(regval)                   ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U)))
453 #define TIMER_CCHP_PROT_OFF                 CCHP_PROT(0)                            /*!< protect disable */
454 #define TIMER_CCHP_PROT_0                   CCHP_PROT(1)                            /*!< PROT mode 0 */
455 #define TIMER_CCHP_PROT_1                   CCHP_PROT(2)                            /*!< PROT mode 1 */
456 #define TIMER_CCHP_PROT_2                   CCHP_PROT(3)                            /*!< PROT mode 2 */
457 
458 /* break input enable */
459 #define TIMER_BREAK_ENABLE                  ((uint16_t)0x1000U)                     /*!< break input enable */
460 #define TIMER_BREAK_DISABLE                 ((uint16_t)0x0000U)                     /*!< break input disable */
461 
462 /* TIMER channel n(n=0,1,2,3) */
463 #define TIMER_CH_0                          ((uint16_t)0x0000U)                     /*!< TIMER channel 0(TIMERx(x=0..2,13..16)) */
464 #define TIMER_CH_1                          ((uint16_t)0x0001U)                     /*!< TIMER channel 1(TIMERx(x=0..2,14)) */
465 #define TIMER_CH_2                          ((uint16_t)0x0002U)                     /*!< TIMER channel 2(TIMERx(x=0..2)) */
466 #define TIMER_CH_3                          ((uint16_t)0x0003U)                     /*!< TIMER channel 3(TIMERx(x=0..2)) */
467 
468 /* channel enable state*/
469 #define TIMER_CCX_ENABLE                    ((uint32_t)0x00000001U)                 /*!< channel enable */
470 #define TIMER_CCX_DISABLE                   ((uint32_t)0x00000000U)                 /*!< channel disable */
471 
472 /* channel complementary output enable state*/
473 #define TIMER_CCXN_ENABLE                   ((uint16_t)0x0004U)                     /*!< channel complementary enable */
474 #define TIMER_CCXN_DISABLE                  ((uint16_t)0x0000U)                     /*!< channel complementary disable */
475 
476 /* channel output polarity */
477 #define TIMER_OC_POLARITY_HIGH              ((uint16_t)0x0000U)                     /*!< channel output polarity is high */
478 #define TIMER_OC_POLARITY_LOW               ((uint16_t)0x0002U)                     /*!< channel output polarity is low */
479 
480 /* channel complementary output polarity */
481 #define TIMER_OCN_POLARITY_HIGH             ((uint16_t)0x0000U)                     /*!< channel complementary output polarity is high */
482 #define TIMER_OCN_POLARITY_LOW              ((uint16_t)0x0008U)                     /*!< channel complementary output polarity is low */
483 
484 /* idle state of channel output */
485 #define TIMER_OC_IDLE_STATE_HIGH            ((uint16_t)0x0100)                      /*!< idle state of channel output is high */
486 #define TIMER_OC_IDLE_STATE_LOW             ((uint16_t)0x0000)                      /*!< idle state of channel output is low */
487 
488 /* idle state of channel complementary output */
489 #define TIMER_OCN_IDLE_STATE_HIGH           ((uint16_t)0x0200U)                     /*!< idle state of channel complementary output is high */
490 #define TIMER_OCN_IDLE_STATE_LOW            ((uint16_t)0x0000U)                     /*!< idle state of channel complementary output is low */
491 
492 /* channel output compare mode */
493 #define TIMER_OC_MODE_TIMING                ((uint16_t)0x0000U)                     /*!< timing mode */
494 #define TIMER_OC_MODE_ACTIVE                ((uint16_t)0x0010U)                     /*!< active mode */
495 #define TIMER_OC_MODE_INACTIVE              ((uint16_t)0x0020U)                     /*!< inactive mode */
496 #define TIMER_OC_MODE_TOGGLE                ((uint16_t)0x0030U)                     /*!< toggle mode */
497 #define TIMER_OC_MODE_LOW                   ((uint16_t)0x0040U)                     /*!< force low mode */
498 #define TIMER_OC_MODE_HIGH                  ((uint16_t)0x0050U)                     /*!< force high mode */
499 #define TIMER_OC_MODE_PWM0                  ((uint16_t)0x0060U)                     /*!< PWM0 mode */
500 #define TIMER_OC_MODE_PWM1                  ((uint16_t)0x0070U)                     /*!< PWM1 mode*/
501 
502 /* channel output compare shadow enable */
503 #define TIMER_OC_SHADOW_ENABLE              ((uint16_t)0x0008U)                     /*!< channel output shadow state enable */
504 #define TIMER_OC_SHADOW_DISABLE             ((uint16_t)0x0000U)                     /*!< channel output shadow state disable */
505 
506 /* channel output compare fast enable */
507 #define TIMER_OC_FAST_ENABLE                ((uint16_t)0x0004)                      /*!< channel output fast function enable */
508 #define TIMER_OC_FAST_DISABLE               ((uint16_t)0x0000)                      /*!< channel output fast function disable */
509 
510 /* channel output compare clear enable */
511 #define TIMER_OC_CLEAR_ENABLE               ((uint16_t)0x0080U)                     /*!< channel output clear function enable */
512 #define TIMER_OC_CLEAR_DISABLE              ((uint16_t)0x0000U)                     /*!< channel output clear function disable */
513 
514 /* channel control shadow register update control */
515 #define TIMER_UPDATECTL_CCU                 ((uint8_t)0x00U)                        /*!< the shadow registers update by when CMTG bit is set */
516 #define TIMER_UPDATECTL_CCUTRI              ((uint8_t)0x01U)                        /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */
517 
518 /* channel input capture polarity */
519 #define TIMER_IC_POLARITY_RISING            ((uint16_t)0x0000U)                     /*!< input capture rising edge */
520 #define TIMER_IC_POLARITY_FALLING           ((uint16_t)0x0002U)                     /*!< input capture falling edge */
521 #define TIMER_IC_POLARITY_BOTH_EDGE         ((uint16_t)0x000AU)                     /*!< input capture both edge */
522 
523 /* timer input capture selection */
524 #define TIMER_IC_SELECTION_DIRECTTI         ((uint16_t)0x0001U)                     /*!< channel y is configured as input and icy is mapped on CIy */
525 #define TIMER_IC_SELECTION_INDIRECTTI       ((uint16_t)0x0002U)                     /*!< channel y is configured as input and icy is mapped on opposite input */
526 #define TIMER_IC_SELECTION_ITS              ((uint16_t)0x0003U)                     /*!< channel y is configured as input and icy is mapped on ITS */
527 
528 /* channel input capture prescaler */
529 #define TIMER_IC_PSC_DIV1                   ((uint16_t)0x0000U)                     /*!< no prescaler */
530 #define TIMER_IC_PSC_DIV2                   ((uint16_t)0x0004U)                     /*!< divided by 2 */
531 #define TIMER_IC_PSC_DIV4                   ((uint16_t)0x0008U)                     /*!< divided by 4*/
532 #define TIMER_IC_PSC_DIV8                   ((uint16_t)0x000CU)                     /*!< divided by 8 */
533 
534 /* trigger selection */
535 #define SMCFG_TRGSEL(regval)                (BITS(4, 6) & ((uint32_t)(regval) << 4U))
536 #define TIMER_SMCFG_TRGSEL_ITI0              SMCFG_TRGSEL(0)                        /*!< internal trigger 0 */
537 #define TIMER_SMCFG_TRGSEL_ITI1              SMCFG_TRGSEL(1)                        /*!< internal trigger 1 */
538 #define TIMER_SMCFG_TRGSEL_ITI2              SMCFG_TRGSEL(2)                        /*!< internal trigger 2 */
539 #define TIMER_SMCFG_TRGSEL_ITI3              SMCFG_TRGSEL(3)                        /*!< internal trigger 3 */
540 #define TIMER_SMCFG_TRGSEL_CI0F_ED           SMCFG_TRGSEL(4)                        /*!< TI0 Edge Detector */
541 #define TIMER_SMCFG_TRGSEL_CI0FE0            SMCFG_TRGSEL(5)                        /*!< filtered TIMER input 0 */
542 #define TIMER_SMCFG_TRGSEL_CI1FE1            SMCFG_TRGSEL(6)                        /*!< filtered TIMER input 1 */
543 #define TIMER_SMCFG_TRGSEL_ETIFP             SMCFG_TRGSEL(7)                        /*!< external trigger */
544 
545 /* master mode control */
546 #define CTL1_MMC(regval)                    (BITS(4, 6) & ((uint32_t)(regval) << 4U))
547 #define TIMER_TRI_OUT_SRC_RESET             CTL1_MMC(0)                             /*!< the UPG bit as trigger output */
548 #define TIMER_TRI_OUT_SRC_ENABLE            CTL1_MMC(1)                             /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */
549 #define TIMER_TRI_OUT_SRC_UPDATE            CTL1_MMC(2)                             /*!< update event as trigger output */
550 #define TIMER_TRI_OUT_SRC_CH0               CTL1_MMC(3)                             /*!< a capture or a compare match occurred in channal0 as trigger output TRGO */
551 #define TIMER_TRI_OUT_SRC_O0CPRE            CTL1_MMC(4)                             /*!< O0CPRE as trigger output */
552 #define TIMER_TRI_OUT_SRC_O1CPRE            CTL1_MMC(5)                             /*!< O1CPRE as trigger output */
553 #define TIMER_TRI_OUT_SRC_O2CPRE            CTL1_MMC(6)                             /*!< O2CPRE as trigger output */
554 #define TIMER_TRI_OUT_SRC_O3CPRE            CTL1_MMC(7)                             /*!< O3CPRE as trigger output */
555 
556 /* slave mode control */
557 #define SMCFG_SMC(regval)                   (BITS(0, 2) & ((uint32_t)(regval) << 0U))
558 #define TIMER_SLAVE_MODE_DISABLE            SMCFG_SMC(0)                            /*!< slave mode disable */
559 #define TIMER_ENCODER_MODE0                 SMCFG_SMC(1)                            /*!< encoder mode 0 */
560 #define TIMER_ENCODER_MODE1                 SMCFG_SMC(2)                            /*!< encoder mode 1 */
561 #define TIMER_ENCODER_MODE2                 SMCFG_SMC(3)                            /*!< encoder mode 2 */
562 #define TIMER_SLAVE_MODE_RESTART            SMCFG_SMC(4)                            /*!< restart mode */
563 #define TIMER_SLAVE_MODE_PAUSE              SMCFG_SMC(5)                            /*!< pause mode */
564 #define TIMER_SLAVE_MODE_EVENT              SMCFG_SMC(6)                            /*!< event mode */
565 #define TIMER_SLAVE_MODE_EXTERNAL0          SMCFG_SMC(7)                            /*!< external clock mode 0 */
566 
567 /* OCPRE clear source selection */
568 #define TIMER_OCPRE_CLEAR_SOURCE_CLR        ((uint8_t)0x00U)                        /*!< OCPRE_CLR_INT is connected to the OCPRE_CLR input */
569 #define TIMER_OCPRE_CLEAR_SOURCE_ETIF       ((uint8_t)0x01U)                        /*!< OCPRE_CLR_INT is connected to ETIF */
570 
571 /* master slave mode selection */
572 #define TIMER_MASTER_SLAVE_MODE_ENABLE      ((uint8_t)0x00U)                        /*!< master slave mode enable */
573 #define TIMER_MASTER_SLAVE_MODE_DISABLE     ((uint8_t)0x01U)                        /*!< master slave mode disable */
574 
575 /* external trigger prescaler */
576 #define SMCFG_ETPSC(regval)                 (BITS(12, 13) & ((uint32_t)(regval) << 12U))
577 #define TIMER_EXT_TRI_PSC_OFF               SMCFG_ETPSC(0)                          /*!< no divided */
578 #define TIMER_EXT_TRI_PSC_DIV2              SMCFG_ETPSC(1)                          /*!< divided by 2 */
579 #define TIMER_EXT_TRI_PSC_DIV4              SMCFG_ETPSC(2)                          /*!< divided by 4 */
580 #define TIMER_EXT_TRI_PSC_DIV8              SMCFG_ETPSC(3)                          /*!< divided by 8 */
581 
582 /* external trigger polarity */
583 #define TIMER_ETP_FALLING                   TIMER_SMCFG_ETP                         /*!< active low or falling edge active */
584 #define TIMER_ETP_RISING                    ((uint32_t)0x00000000U)                 /*!< active high or rising edge active */
585 
586 /* channel 0 trigger input selection */
587 #define TIMER_HALLINTERFACE_ENABLE          ((uint8_t)0x00U)                        /*!< TIMER hall sensor mode enable */
588 #define TIMER_HALLINTERFACE_DISABLE         ((uint8_t)0x01U)                        /*!< TIMER hall sensor mode disable */
589 
590 /* timerx(x=0,1,2,13,14,15,16) write CHxVAL register selection */
591 #define TIMER_CHVSEL_ENABLE                 ((uint16_t)0x0002U)                     /*!< write CHxVAL register selection enable */
592 #define TIMER_CHVSEL_DISABLE                ((uint16_t)0x0000U)                     /*!< write CHxVAL register selection disable */
593 
594 /* the output value selection */
595 #define TIMER_OUTSEL_DISABLE                ((uint16_t)0x0000U)                     /*!< output value selection disable */
596 #define TIMER_OUTSEL_ENABLE                 ((uint16_t)0x0001U)                     /*!< output value selection enable */
597 
598 /* timer13 channel 0 input remap */
599 #define TIMER13_IRMP(regval)                (BITS(0, 1) & ((uint32_t)(regval) << 0U))
600 #define TIMER13_CI0_RMP_GPIO                TIMER13_IRMP(0)                         /*!< timer13 channel 0 input is connected to GPIO(TIMER13_CH0) */
601 #define TIMER13_CI0_RMP_RTCCLK              TIMER13_IRMP(1)                         /*!< timer13 channel 0 input is connected to the RTCCLK */
602 #define TIMER13_CI0_RMP_HXTAL_DIV32         TIMER13_IRMP(2)                         /*!< timer13 channel 0 input is connected to HXTAL/32 clock */
603 #define TIMER13_CI0_RMP_CKOUTSEL            TIMER13_IRMP(3)                         /*!< timer13 channel 0 input is connected to CKOUTSEL */
604 
605 /* function declarations */
606 /* TIMER timebase*/
607 /* deinit a TIMER */
608 void timer_deinit(uint32_t timer_periph);
609 /* initialize TIMER init parameter struct */
610 void timer_struct_para_init(timer_parameter_struct* initpara);
611 /* initialize TIMER counter */
612 void gd32_timer_init(uint32_t timer_periph, timer_parameter_struct* initpara);
613 /* enable a TIMER */
614 void timer_enable(uint32_t timer_periph);
615 /* disable a TIMER */
616 void timer_disable(uint32_t timer_periph);
617 /* enable the auto reload shadow function */
618 void timer_auto_reload_shadow_enable(uint32_t timer_periph);
619 /* disable the auto reload shadow function */
620 void timer_auto_reload_shadow_disable(uint32_t timer_periph);
621 /* enable the update event */
622 void timer_update_event_enable(uint32_t timer_periph);
623 /* disable the update event */
624 void timer_update_event_disable(uint32_t timer_periph);
625 /* set TIMER counter alignment mode */
626 void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned);
627 /* set TIMER counter up direction */
628 void timer_counter_up_direction(uint32_t timer_periph);
629 /* set TIMER counter down direction */
630 void timer_counter_down_direction(uint32_t timer_periph);
631 /* configure TIMER prescaler */
632 void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload);
633 /* configure TIMER repetition register value */
634 void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition);
635 /* configure TIMER autoreload register value */
636 void timer_autoreload_value_config(uint32_t timer_periph, uint32_t autoreload);
637 /* configure TIMER counter register value */
638 void timer_counter_value_config(uint32_t timer_periph , uint32_t counter);
639 /* read TIMER counter value */
640 uint32_t timer_counter_read(uint32_t timer_periph);
641 /* read TIMER prescaler value */
642 uint16_t timer_prescaler_read(uint32_t timer_periph);
643 /* configure TIMER single pulse mode */
644 void timer_single_pulse_mode_config(uint32_t timer_periph, uint8_t spmode);
645 /* configure TIMER update source */
646 void timer_update_source_config(uint32_t timer_periph, uint8_t update);
647 /* OCPRE clear source selection */
648 void timer_ocpre_clear_source_config(uint32_t timer_periph, uint8_t ocpreclear);
649 
650 /* TIMER interrupt and flag*/
651 /* enable the TIMER interrupt */
652 void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt);
653 /* disable the TIMER interrupt */
654 void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt);
655 /* get TIMER interrupt flag */
656 FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt);
657 /* clear TIMER interrupt flag */
658 void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt);
659 /* get TIMER flags */
660 FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag);
661 /* clear TIMER flags */
662 void timer_flag_clear(uint32_t timer_periph, uint32_t flag);
663 
664 /* TIMER DMA and event*/
665 /* enable the TIMER DMA */
666 void timer_dma_enable(uint32_t timer_periph, uint16_t dma);
667 /* disable the TIMER DMA */
668 void timer_dma_disable(uint32_t timer_periph, uint16_t dma);
669 /* channel DMA request source selection */
670 void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request);
671 /* configure the TIMER DMA transfer */
672 void timer_dma_transfer_config(uint32_t timer_periph,uint32_t dma_baseaddr, uint32_t dma_lenth);
673 /* software generate events */
674 void timer_event_software_generate(uint32_t timer_periph, uint16_t event);
675 
676 /* TIMER channel complementary protection */
677 /* initialize TIMER break parameter struct */
678 void timer_break_struct_para_init(timer_break_parameter_struct* breakpara);
679 /* configure TIMER break function */
680 void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara);
681 /* enable TIMER break function */
682 void timer_break_enable(uint32_t timer_periph);
683 /* disable TIMER break function */
684 void timer_break_disable(uint32_t timer_periph);
685 /* enable TIMER output automatic function */
686 void timer_automatic_output_enable(uint32_t timer_periph);
687 /* disable TIMER output automatic function */
688 void timer_automatic_output_disable(uint32_t timer_periph);
689 /* enable or disable TIMER primary output function */
690 void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue);
691 /* enable or disable channel capture/compare control shadow register */
692 void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue);
693 /* configure TIMER channel control shadow register update control */
694 void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl);
695 
696 /* TIMER channel output */
697 /* initialize TIMER channel output parameter struct */
698 void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara);
699 /* configure TIMER channel output function */
700 void timer_channel_output_config(uint32_t timer_periph,uint16_t channel, timer_oc_parameter_struct* ocpara);
701 /* configure TIMER channel output compare mode */
702 void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel,uint16_t ocmode);
703 /* configure TIMER channel output pulse value */
704 void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse);
705 /* configure TIMER channel output shadow function */
706 void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow);
707 /* configure TIMER channel output fast function */
708 void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast);
709 /* configure TIMER channel output clear function */
710 void timer_channel_output_clear_config(uint32_t timer_periph,uint16_t channel,uint16_t occlear);
711 /* configure TIMER channel output polarity */
712 void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity);
713 /* configure TIMER channel complementary output polarity */
714 void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity);
715 /* configure TIMER channel enable state */
716 void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state);
717 /* configure TIMER channel complementary output enable state */
718 void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate);
719 
720 /* TIMER channel input */
721 /* initialize TIMER channel input parameter struct */
722 void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara);
723 /* configure TIMER input capture parameter */
724 void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpara);
725 /* configure TIMER channel input capture prescaler value */
726 void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler);
727 /* read TIMER channel capture compare register value */
728 uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel);
729 /* configure TIMER input pwm capture function */
730 void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm);
731 /* configure TIMER hall sensor mode */
732 void timer_hall_mode_config(uint32_t timer_periph, uint8_t hallmode);
733 
734 /* TIMER master and slave */
735 /* select TIMER input trigger source */
736 void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger);
737 /* select TIMER master mode output trigger source */
738 void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger);
739 /* select TIMER slave mode */
740 void timer_slave_mode_select(uint32_t timer_periph,uint32_t slavemode);
741 /* configure TIMER master slave mode */
742 void timer_master_slave_mode_config(uint32_t timer_periph, uint8_t masterslave);
743 /* configure TIMER external trigger input */
744 void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter);
745 /* configure TIMER quadrature decoder mode */
746 void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, uint16_t ic0polarity, uint16_t ic1polarity);
747 /* configure TIMER internal clock mode */
748 void timer_internal_clock_config(uint32_t timer_periph);
749 /* configure TIMER the internal trigger as external clock input */
750 void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger);
751 /* configure TIMER the external trigger as external clock input */
752 void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, uint16_t extpolarity,uint32_t extfilter);
753 /* configure TIMER the external clock mode 0 */
754 void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter);
755 /* configure TIMER the external clock mode 1 */
756 void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter);
757 /* disable TIMER the external clock mode 1 */
758 void timer_external_clock_mode1_disable(uint32_t timer_periph);
759 /* configure TIMER channel remap function */
760 void timer_channel_remap_config(uint32_t timer_periph,uint32_t remap);
761 
762 /* TIMER configure */
763 /* configure TIMER write CHxVAL register selection */
764 void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel);
765 /* configure TIMER output value selection */
766 void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel);
767 
768 #endif /* GD32F3X0_TIMER_H */
769