1 /*!
2     \file    gd32f403_dac.h
3     \brief   definitions for the DAC
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_DAC_H
38 #define GD32F403_DAC_H
39 
40 #include "gd32f403.h"
41 
42 /* DACx(x=0,1) definitions */
43 #define DAC                     DAC_BASE
44 #define DAC0                    0U
45 #define DAC1                    1U
46 
47 /* registers definitions */
48 #define DAC_CTL                 REG32(DAC + 0x00U)      /*!< DAC control register */
49 #define DAC_SWT                 REG32(DAC + 0x04U)      /*!< DAC software trigger register */
50 #define DAC0_R12DH              REG32(DAC + 0x08U)      /*!< DAC0 12-bit right-aligned data holding register */
51 #define DAC0_L12DH              REG32(DAC + 0x0CU)      /*!< DAC0 12-bit left-aligned data holding register */
52 #define DAC0_R8DH               REG32(DAC + 0x10U)      /*!< DAC0 8-bit right-aligned data holding register */
53 #define DAC1_R12DH              REG32(DAC + 0x14U)      /*!< DAC1 12-bit right-aligned data holding register */
54 #define DAC1_L12DH              REG32(DAC + 0x18U)      /*!< DAC1 12-bit left-aligned data holding register */
55 #define DAC1_R8DH               REG32(DAC + 0x1CU)      /*!< DAC1 8-bit right-aligned data holding register */
56 #define DACC_R12DH              REG32(DAC + 0x20U)      /*!< DAC concurrent mode 12-bit right-aligned data holding register */
57 #define DACC_L12DH              REG32(DAC + 0x24U)      /*!< DAC concurrent mode 12-bit left-aligned data holding register */
58 #define DACC_R8DH               REG32(DAC + 0x28U)      /*!< DAC concurrent mode 8-bit right-aligned data holding register */
59 #define DAC0_DO                 REG32(DAC + 0x2CU)      /*!< DAC0 data output register */
60 #define DAC1_DO                 REG32(DAC + 0x30U)      /*!< DAC1 data output register */
61 
62 /* bits definitions */
63 /* DAC_CTL */
64 #define DAC_CTL_DEN0            BIT(0)                  /*!< DAC0 enable/disable bit */
65 #define DAC_CTL_DBOFF0          BIT(1)                  /*!< DAC0 output buffer turn on/turn off bit */
66 #define DAC_CTL_DTEN0           BIT(2)                  /*!< DAC0 trigger enable/disable bit */
67 #define DAC_CTL_DTSEL0          BITS(3,5)               /*!< DAC0 trigger source selection enable/disable bits */
68 #define DAC_CTL_DWM0            BITS(6,7)               /*!< DAC0 noise wave mode */
69 #define DAC_CTL_DWBW0           BITS(8,11)              /*!< DAC0 noise wave bit width */
70 #define DAC_CTL_DDMAEN0         BIT(12)                 /*!< DAC0 DMA enable/disable bit */
71 #define DAC_CTL_DEN1            BIT(16)                 /*!< DAC1 enable/disable bit */
72 #define DAC_CTL_DBOFF1          BIT(17)                 /*!< DAC1 output buffer turn on/turn off bit */
73 #define DAC_CTL_DTEN1           BIT(18)                 /*!< DAC1 trigger enable/disable bit */
74 #define DAC_CTL_DTSEL1          BITS(19,21)             /*!< DAC1 trigger source selection enable/disable bits */
75 #define DAC_CTL_DWM1            BITS(22,23)             /*!< DAC1 noise wave mode */
76 #define DAC_CTL_DWBW1           BITS(24,27)             /*!< DAC1 noise wave bit width */
77 #define DAC_CTL_DDMAEN1         BIT(28)                 /*!< DAC1 DMA enable/disable bit */
78 
79 /* DAC_SWT */
80 #define DAC_SWT_SWTR0           BIT(0)                  /*!< DAC0 software trigger bit, cleared by hardware */
81 #define DAC_SWT_SWTR1           BIT(1)                  /*!< DAC1 software trigger bit, cleared by hardware */
82 
83 /* DAC0_R12DH */
84 #define DAC0_R12DH_DAC0_DH      BITS(0,11)              /*!< DAC0 12-bit right-aligned data bits */
85 
86 /* DAC0_L12DH */
87 #define DAC0_L12DH_DAC0_DH      BITS(4,15)              /*!< DAC0 12-bit left-aligned data bits */
88 
89 /* DAC0_R8DH */
90 #define DAC0_R8DH_DAC0_DH       BITS(0,7)               /*!< DAC0 8-bit right-aligned data bits */
91 
92 /* DAC1_R12DH */
93 #define DAC1_R12DH_DAC1_DH      BITS(0,11)              /*!< DAC1 12-bit right-aligned data bits */
94 
95 /* DAC1_L12DH */
96 #define DAC1_L12DH_DAC1_DH      BITS(4,15)              /*!< DAC1 12-bit left-aligned data bits */
97 
98 /* DAC1_R8DH */
99 #define DAC1_R8DH_DAC1_DH       BITS(0,7)               /*!< DAC1 8-bit right-aligned data bits */
100 
101 /* DACC_R12DH */
102 #define DACC_R12DH_DAC0_DH      BITS(0,11)              /*!< DAC concurrent mode DAC0 12-bit right-aligned data bits */
103 #define DACC_R12DH_DAC1_DH      BITS(16,27)             /*!< DAC concurrent mode DAC1 12-bit right-aligned data bits */
104 
105 /* DACC_L12DH */
106 #define DACC_L12DH_DAC0_DH      BITS(4,15)              /*!< DAC concurrent mode DAC0 12-bit left-aligned data bits */
107 #define DACC_L12DH_DAC1_DH      BITS(20,31)             /*!< DAC concurrent mode DAC1 12-bit left-aligned data bits */
108 
109 /* DACC_R8DH */
110 #define DACC_R8DH_DAC0_DH       BITS(0,7)               /*!< DAC concurrent mode DAC0 8-bit right-aligned data bits */
111 #define DACC_R8DH_DAC1_DH       BITS(8,15)              /*!< DAC concurrent mode DAC1 8-bit right-aligned data bits */
112 
113 /* DAC0_DO */
114 #define DAC0_DO_DAC0_DO         BITS(0,11)              /*!< DAC0 12-bit output data bits */
115 
116 /* DAC1_DO */
117 #define DAC1_DO_DAC1_DO         BITS(0,11)              /*!< DAC1 12-bit output data bits */
118 
119 /* constants definitions */
120 /* DAC trigger source */
121 #define CTL_DTSEL(regval)               (BITS(3,5) & ((uint32_t)(regval) << 3))
122 #define DAC_TRIGGER_T5_TRGO             CTL_DTSEL(0)            /*!< TIMER5 TRGO */
123 #define DAC_TRIGGER_T2_TRGO             CTL_DTSEL(1)            /*!< TIMER2 TRGO */
124 #define DAC_TRIGGER_T6_TRGO             CTL_DTSEL(2)            /*!< TIMER6 TRGO */
125 #define DAC_TRIGGER_T3_TRGO             CTL_DTSEL(5)            /*!< TIMER3 TRGO */
126 #define DAC_TRIGGER_EXTI_9              CTL_DTSEL(6)            /*!< EXTI interrupt line9 event */
127 #define DAC_TRIGGER_SOFTWARE            CTL_DTSEL(7)            /*!< software trigger */
128 
129 /* DAC noise wave mode */
130 #define CTL_DWM(regval)                 (BITS(6,7) & ((uint32_t)(regval) << 6))
131 #define DAC_WAVE_DISABLE                CTL_DWM(0)              /*!< wave disable */
132 #define DAC_WAVE_MODE_LFSR              CTL_DWM(1)              /*!< LFSR noise mode */
133 #define DAC_WAVE_MODE_TRIANGLE          CTL_DWM(2)              /*!< triangle noise mode */
134 
135 /* DAC noise wave bit width */
136 #define DWBW(regval)                    (BITS(8,11) & ((uint32_t)(regval) << 8))
137 #define DAC_WAVE_BIT_WIDTH_1            DWBW(0)                 /*!< bit width of the wave signal is 1 */
138 #define DAC_WAVE_BIT_WIDTH_2            DWBW(1)                 /*!< bit width of the wave signal is 2 */
139 #define DAC_WAVE_BIT_WIDTH_3            DWBW(2)                 /*!< bit width of the wave signal is 3 */
140 #define DAC_WAVE_BIT_WIDTH_4            DWBW(3)                 /*!< bit width of the wave signal is 4 */
141 #define DAC_WAVE_BIT_WIDTH_5            DWBW(4)                 /*!< bit width of the wave signal is 5 */
142 #define DAC_WAVE_BIT_WIDTH_6            DWBW(5)                 /*!< bit width of the wave signal is 6 */
143 #define DAC_WAVE_BIT_WIDTH_7            DWBW(6)                 /*!< bit width of the wave signal is 7 */
144 #define DAC_WAVE_BIT_WIDTH_8            DWBW(7)                 /*!< bit width of the wave signal is 8 */
145 #define DAC_WAVE_BIT_WIDTH_9            DWBW(8)                 /*!< bit width of the wave signal is 9 */
146 #define DAC_WAVE_BIT_WIDTH_10           DWBW(9)                 /*!< bit width of the wave signal is 10 */
147 #define DAC_WAVE_BIT_WIDTH_11           DWBW(10)                /*!< bit width of the wave signal is 11 */
148 #define DAC_WAVE_BIT_WIDTH_12           DWBW(11)                /*!< bit width of the wave signal is 12 */
149 
150 /* unmask LFSR bits in DAC LFSR noise mode */
151 #define DAC_LFSR_BIT0                   DAC_WAVE_BIT_WIDTH_1    /*!< unmask the LFSR bit0 */
152 #define DAC_LFSR_BITS1_0                DAC_WAVE_BIT_WIDTH_2    /*!< unmask the LFSR bits[1:0] */
153 #define DAC_LFSR_BITS2_0                DAC_WAVE_BIT_WIDTH_3    /*!< unmask the LFSR bits[2:0] */
154 #define DAC_LFSR_BITS3_0                DAC_WAVE_BIT_WIDTH_4    /*!< unmask the LFSR bits[3:0] */
155 #define DAC_LFSR_BITS4_0                DAC_WAVE_BIT_WIDTH_5    /*!< unmask the LFSR bits[4:0] */
156 #define DAC_LFSR_BITS5_0                DAC_WAVE_BIT_WIDTH_6    /*!< unmask the LFSR bits[5:0] */
157 #define DAC_LFSR_BITS6_0                DAC_WAVE_BIT_WIDTH_7    /*!< unmask the LFSR bits[6:0] */
158 #define DAC_LFSR_BITS7_0                DAC_WAVE_BIT_WIDTH_8    /*!< unmask the LFSR bits[7:0] */
159 #define DAC_LFSR_BITS8_0                DAC_WAVE_BIT_WIDTH_9    /*!< unmask the LFSR bits[8:0] */
160 #define DAC_LFSR_BITS9_0                DAC_WAVE_BIT_WIDTH_10   /*!< unmask the LFSR bits[9:0] */
161 #define DAC_LFSR_BITS10_0               DAC_WAVE_BIT_WIDTH_11   /*!< unmask the LFSR bits[10:0] */
162 #define DAC_LFSR_BITS11_0               DAC_WAVE_BIT_WIDTH_12   /*!< unmask the LFSR bits[11:0] */
163 
164 /* DAC data alignment */
165 #define DATA_ALIGN(regval)              (BITS(0,1) & ((uint32_t)(regval) << 0))
166 #define DAC_ALIGN_12B_R                 DATA_ALIGN(0)           /*!< data right 12 bit alignment */
167 #define DAC_ALIGN_12B_L                 DATA_ALIGN(1)           /*!< data left  12 bit alignment */
168 #define DAC_ALIGN_8B_R                  DATA_ALIGN(2)           /*!< data right  8 bit alignment */
169 
170 /* triangle amplitude in DAC triangle noise mode */
171 #define DAC_TRIANGLE_AMPLITUDE_1        DAC_WAVE_BIT_WIDTH_1    /*!< triangle amplitude is 1 */
172 #define DAC_TRIANGLE_AMPLITUDE_3        DAC_WAVE_BIT_WIDTH_2    /*!< triangle amplitude is 3 */
173 #define DAC_TRIANGLE_AMPLITUDE_7        DAC_WAVE_BIT_WIDTH_3    /*!< triangle amplitude is 7 */
174 #define DAC_TRIANGLE_AMPLITUDE_15       DAC_WAVE_BIT_WIDTH_4    /*!< triangle amplitude is 15 */
175 #define DAC_TRIANGLE_AMPLITUDE_31       DAC_WAVE_BIT_WIDTH_5    /*!< triangle amplitude is 31 */
176 #define DAC_TRIANGLE_AMPLITUDE_63       DAC_WAVE_BIT_WIDTH_6    /*!< triangle amplitude is 63 */
177 #define DAC_TRIANGLE_AMPLITUDE_127      DAC_WAVE_BIT_WIDTH_7    /*!< triangle amplitude is 127 */
178 #define DAC_TRIANGLE_AMPLITUDE_255      DAC_WAVE_BIT_WIDTH_8    /*!< triangle amplitude is 255 */
179 #define DAC_TRIANGLE_AMPLITUDE_511      DAC_WAVE_BIT_WIDTH_9    /*!< triangle amplitude is 511 */
180 #define DAC_TRIANGLE_AMPLITUDE_1023     DAC_WAVE_BIT_WIDTH_10   /*!< triangle amplitude is 1023 */
181 #define DAC_TRIANGLE_AMPLITUDE_2047     DAC_WAVE_BIT_WIDTH_11   /*!< triangle amplitude is 2047 */
182 #define DAC_TRIANGLE_AMPLITUDE_4095     DAC_WAVE_BIT_WIDTH_12   /*!< triangle amplitude is 4095 */
183 
184 /* function declarations */
185 /* initialization functions */
186 /* deinitialize DAC */
187 void dac_deinit(void);
188 /* enable DAC */
189 void dac_enable(uint32_t dac_periph);
190 /* disable DAC */
191 void dac_disable(uint32_t dac_periph);
192 /* enable DAC DMA */
193 void dac_dma_enable(uint32_t dac_periph);
194 /* disable DAC DMA */
195 void dac_dma_disable(uint32_t dac_periph);
196 /* enable DAC output buffer */
197 void dac_output_buffer_enable(uint32_t dac_periph);
198 /* disable DAC output buffer */
199 void dac_output_buffer_disable(uint32_t dac_periph);
200 /* get the last data output value */
201 uint16_t dac_output_value_get(uint32_t dac_periph);
202 /* set DAC data holding register value */
203 void dac_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data);
204 
205 /* DAC trigger configuration */
206 /* enable DAC trigger */
207 void dac_trigger_enable(uint32_t dac_periph);
208 /* disable DAC trigger */
209 void dac_trigger_disable(uint32_t dac_periph);
210 /* configure DAC trigger source */
211 void dac_trigger_source_config(uint32_t dac_periph, uint32_t triggersource);
212 /* enable DAC software trigger */
213 void dac_software_trigger_enable(uint32_t dac_periph);
214 /* disable DAC software trigger */
215 void dac_software_trigger_disable(uint32_t dac_periph);
216 
217 /* DAC wave mode configuration */
218 /* configure DAC wave mode */
219 void dac_wave_mode_config(uint32_t dac_periph, uint32_t wave_mode);
220 /* configure DAC wave bit width */
221 void dac_wave_bit_width_config(uint32_t dac_periph, uint32_t bit_width);
222 /* configure DAC LFSR noise mode */
223 void dac_lfsr_noise_config(uint32_t dac_periph, uint32_t unmask_bits);
224 /* configure DAC triangle noise mode */
225 void dac_triangle_noise_config(uint32_t dac_periph, uint32_t amplitude);
226 
227 /* DAC concurrent mode configuration */
228 /* enable DAC concurrent mode */
229 void dac_concurrent_enable(void);
230 /* disable DAC concurrent mode */
231 void dac_concurrent_disable(void);
232 /* enable DAC concurrent software trigger */
233 void dac_concurrent_software_trigger_enable(void);
234 /* disable DAC concurrent software trigger */
235 void dac_concurrent_software_trigger_disable(void);
236 /* enable DAC concurrent buffer function */
237 void dac_concurrent_output_buffer_enable(void);
238 /* disable DAC concurrent buffer function */
239 void dac_concurrent_output_buffer_disable(void);
240 /* set DAC concurrent mode data holding register value */
241 void dac_concurrent_data_set(uint32_t dac_align, uint16_t data0, uint16_t data1);
242 
243 #endif /* GD32F403_DAC_H */
244