1 /******************************************************************************
2 * Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd ("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42 /******************************************************************************/
43 /** \file vc.h
44  **
45  ** Headerfile for Voltage Comparator functions
46  ** @link VC Group Some description @endlink
47  **
48  **   - 2017-06-28 Alex    First Version
49  **
50  ******************************************************************************/
51 
52 #ifndef __VC_H__
53 #define __VC_H__
54 
55 /******************************************************************************
56  * Include files
57  ******************************************************************************/
58 #include "ddl.h"
59 #include "interrupts_hc32l136.h"
60 
61 /* C binding of definitions if building with C++ compiler */
62 #ifdef __cplusplus
63 extern "C"
64 {
65 #endif
66 
67 /**
68  ******************************************************************************
69  ** \defgroup VcGroup Voltage Comparator (VC)
70  **
71  ******************************************************************************/
72 //@{
73 
74 /******************************************************************************
75  * Global type definitions
76  ******************************************************************************/
77 
78 /**
79  ******************************************************************************
80  ** \brief VC通道
81  *****************************************************************************/
82 typedef enum en_vc_channel
83 {
84     VcChannel0 = 0u,                 ///< 通道0
85     VcChannel1 = 1u,                 ///< 通道1
86 }en_vc_channel_t;
87 
88 
89 /**
90  ******************************************************************************
91  ** \brief VC迟滞
92  *****************************************************************************/
93 typedef enum en_vc_cmp_delay
94 {
95     VcDelayoff  = 0u,            ///< 迟滞关闭
96     VcDelay10mv = 1u,            ///< 迟滞10mv
97     VcDelay20mv = 2u,            ///< 迟滞20mv
98     VcDelay30mv = 3u,            ///< 迟滞30mv
99 }en_vc_cmp_delay_t;
100 
101 /**
102  ******************************************************************************
103  ** \brief VC偏置电流
104  *****************************************************************************/
105 typedef enum en_vc_bias_current
106 {
107     VcBias300na  = 0u,            ///< 偏置电流300na
108     VcBias1200na = 1u,            ///< 偏置电流1.2ua
109     VcBias10ua   = 2u,            ///< 偏置电流10ua
110     VcBias20ua   = 3u,            ///< 偏置电流20ua
111 }en_vc_bias_current_t;
112 
113 /**
114  ******************************************************************************
115  ** \brief VC输出滤波时间
116  *****************************************************************************/
117 typedef enum en_vc_resp_filter
118 {
119     VcFilter7us     = 0u,            ///< 输出滤波时间7us
120     VcFilter14us    = 1u,           ///< 输出滤波时间14us
121     VcFilter28us    = 2u,           ///< 输出滤波时间28us
122     VcFilter112us   = 3u,          ///< 输出滤波时间112us
123     VcFilter450us   = 4u,          ///< 输出滤波时间450us
124     VcFilter1800us  = 5u,         ///< 输出滤波时间1.8ms
125     VcFilter7200us  = 6u,         ///< 输出滤波时间7.2ms
126     VcFilter28800us = 7u,        ///< 输出滤波时间28.8ms
127 }en_vc_resp_filter_t;
128 
129 /**
130  ******************************************************************************
131  ** \brief VC P端输入
132  *****************************************************************************/
133 typedef enum en_vc_input_p_src
134 {
135                                    //VC0                        //VC1
136     VcInPCh0 = 0u,                ///< 输入通道0 PC0		输入通道0 PA0
137     VcInPCh1 = 1u,                ///< 输入通道1 PC1		输入通道0 PA1
138     VcInPCh2 = 2u,                ///< 输入通道2 PC2		输入通道0 PA2
139     VcInPCh3 = 3u,                ///< 输入通道3 PC3		输入通道0 PA3
140     VcInPCh4 = 4u,                ///< 输入通道4 PA0		输入通道0 PA4
141     VcInPCh5 = 5u,                ///< 输入通道5 PA1		输入通道0 PA5
142     VcInPCh6 = 6u,                ///< 输入通道6 PA2		输入通道0 PB1
143     VcInPCh7 = 7u,                ///< 输入通道7 PA3		输入通道0 PB2
144     VcInPCh8 = 8u,                ///< 输入通道7 PA4		输入通道0 PB10
145     VcInPCh9 = 9u,                ///< 输入通道7 PA5		输入通道0 PB12
146     VcInPCh10 = 10u,                ///< 输入通道7 PA6		输入通道0 PB13
147     VcInPCh11 = 11u,                ///< 输入通道7 PA7		输入通道0 PB14
148     VcInPCh12 = 12u,                ///< 输入通道7 PB4		输入通道0 PB4
149     VcInPCh13 = 13u,                ///< 输入通道7 PB5		输入通道0 PB5
150     VcInPCh14 = 14u,                ///< 输入通道7 PB6		输入通道0 PB6
151     VcInPCh15 = 15u,                ///< 输入通道7 PB7		输入通道0 PB7
152 }en_vc_input_p_src_t;
153 
154 /**
155  ******************************************************************************
156  ** \brief VC N端输入
157  *****************************************************************************/
158 typedef enum en_vc_input_n_src
159 {
160                                  //VC0                          //VC1
161     VcInNCh0    = 0u,         ///< 输入通道0  PA0	        输入通道0 PC0
162     VcInNCh1    = 1u,         ///< 输入通道1  PA1		输入通道0 PC1
163     VcInNCh2    = 2u,         ///< 输入通道2  PA2		输入通道0 PC2
164     VcInNCh3    = 3u,         ///< 输入通道3  PA3		输入通道0 PC3
165     VcInNCh4    = 4u,         ///< 输入通道4  PA4		输入通道0 PA0
166     VcInNCh5    = 5u,         ///< 输入通道5  PA5		输入通道0 PA1
167     VcInNCh6    = 6u,         ///< 输入通道6  PA6		输入通道0 PB0
168     VcInNCh7    = 7u,         ///< 输入通道7  PA7		输入通道0 PB1
169     VcInNCh8    = 8u,         ///< 输入通道8  PC4		输入通道0 PB2
170     VcInNCh9    = 9u,         ///< 输入通道9  PC5		输入通道0 PB3
171     VcInNCh10   = 10u,        ///< 输入通道10 PB0 		输入通道0 PB4
172     ResDivOut   = 11u,        ///< Vcc分压                      Vcc分压
173     AiTs        = 12u,        ///< 温度传感器                  温度传感器
174     AiBg1p2     = 13u,        ///< BGR 1.2V                    BGR 1.2V
175     AiAdcVref   = 14u,        ///< ADCVREF                     ADCVREF
176     AiLdo       = 15u,        ///< LDO                         LDO
177 }en_vc_input_n_src_t;
178 
179 /**
180  ******************************************************************************
181  ** \brief VC中断触发方式
182  *****************************************************************************/
183 typedef enum en_vc_irq_sel
184 {
185     VcIrqNone = 0u,            ///< 无中断
186     VcIrqRise = 1u,            ///< 上升沿触发
187     VcIrqFall = 2u,            ///< 下降沿触发
188     VcIrqHigh = 3u,            ///< 高电平触发
189 
190 }en_vc_irq_sel_t;
191 
192 /**
193  ******************************************************************************
194  ** \brief VC状态
195  *****************************************************************************/
196 typedef enum en_vc_stat
197 {
198     VcCmpResult  = 0u,                ///< VC比较输出结果
199     VcIntrResult = 1u,               ///< VC中断状态
200 }en_vc_stat_t;
201 
202 /**
203  ******************************************************************************
204  ** \brief VC输出配置
205  *****************************************************************************/
206 typedef enum en_vc_output_config
207 {
208     VcOutInvTimer = 0u,              ///< 结果输出负向到各Timer0,1,2,3
209     VcOutTIM0RCLR = 1u,              ///< 结果使能输出到TIM0 REFCLR
210     VcOutTIM1RCLR = 2u,              ///< 结果使能输出到TIM1 REFCLR
211     VcOutTIM2RCLR = 3u,              ///< 结果使能输出到TIM2 REFCLR
212     VcOutTIM3RCLR = 4u,              ///< 结果使能输出到TIM3 REFCLR
213     VcOutTIMBK    = 5u,              ///< 结果使能输出到Timer0,1,2,3刹车
214     VcOutInvTIM4  = 9u,              ///< 结果输出负向到Timer4
215     VcOutTIM4     = 10u,             ///< 结果使能输出到Timer4
216     VcOutInvTIM5  = 11u,             ///< 结果输出负向到Timer5
217     VcOutTIM5     = 12u,             ///< 结果使能输出到Timer5
218     VcOutInvTIM6  = 13u,             ///< 结果输出负向到Timer6
219     VcOutTIM6     = 14u,             ///< 结果使能输出到Timer6
220     VcOutBrake    = 15u,             ///< 结果使能输出到Advanced Timer刹车
221     VcOutDisable  = 16u,             ///< 结果输出除能
222 }en_vc_output_config_t;
223 
224 /**
225  ******************************************************************************
226  ** \brief VC DIV参考电压Vref选择
227  *****************************************************************************/
228 typedef enum en_vc_div_vref
229 {
230     VcDivVrefAvcc = 0u,              ///< AVCC
231     VcDivVrefAdc  = 1u,               ///< ADC_CR0 SREF选择参考电压
232 }en_vc_div_vref_t;
233 
234 /**
235  ******************************************************************************
236  ** \brief VC模块配置
237  *****************************************************************************/
238 typedef struct stc_vc_dac_config
239 {
240     boolean_t           bDivEn;       ///< 使能/除能 6-bit VCC divider
241     uint8_t             u8DivVal;     ///< 6-bit VCC divider设置值
242     en_vc_div_vref_t    enDivVref;    ///< 6-bit VCC divider输入参考电压选择
243 }stc_vc_dac_config_t;
244 
245 /**
246  ******************************************************************************
247  ** \brief VC通道配置
248  *****************************************************************************/
249 typedef struct stc_vc_channel_config
250 {
251     en_vc_channel_t         enVcChannel;        ///< VC通道选择
252     en_vc_cmp_delay_t       enVcCmpDly;         ///< VC迟滞
253     en_vc_bias_current_t    enVcBiasCurrent;    ///< VC偏转电流
254     en_vc_resp_filter_t     enVcFilterTime;     ///< 输出滤波时间
255     en_vc_input_p_src_t     enVcInPin_P;        ///< P端输入
256     en_vc_input_n_src_t     enVcInPin_N;        ///< N端输入
257     en_vc_output_config_t   enVcOutConfig;      ///< 输出配置
258     en_vc_irq_sel_t         enVcIrqSel;         ///< 中断触发方式
259     func_ptr_t              pfnAnalogCmpCb;     ///< 中断回调函数
260 }stc_vc_channel_config_t;
261 
262 /******************************************************************************
263  * Global definitions
264  ******************************************************************************/
265 
266 /******************************************************************************
267  * Local type definitions ('typedef')
268  ******************************************************************************/
269 
270 /******************************************************************************
271  * Global variable definitions ('extern')
272  ******************************************************************************/
273 
274 /******************************************************************************
275  * Global function prototypes (definition in C source)
276  ******************************************************************************/
277 
278 //VC init/deinit
279 
280 en_result_t Vc_ChannelInit(en_vc_channel_t enChannel,
281                             stc_vc_channel_config_t *pstcChannelConfig);
282 en_result_t Vc_ChannelDeInit(en_vc_channel_t enChannel);
283 en_result_t Vc_DACInit(stc_vc_dac_config_t *pstcDacConfig);
284 //VC function enable/disable
285 en_result_t Vc_EnableChannel(en_vc_channel_t enChannel);
286 en_result_t Vc_DisableChannel(en_vc_channel_t enChannel);
287 
288 //VC filter enable/disable
289 en_result_t Vc_EnableFilter(en_vc_channel_t enChannel);
290 en_result_t Vc_DisableFilter(en_vc_channel_t enChannel);
291 
292 //get stat
293 boolean_t Vc_GetStat(en_vc_channel_t enChannel, en_vc_stat_t enStat);
294 //clear stat
295 void Vc_ClearIrq(en_vc_channel_t enChannel);
296 
297 //irq enable/disable
298 en_result_t Vc_EnableIrq(en_vc_channel_t enChannel);
299 en_result_t Vc_DisableIrq(en_vc_channel_t enChannel);
300 en_result_t Vc_ConfigIrq(en_vc_channel_t enChannel, en_vc_irq_sel_t enSel);
301 //@} // VcGroup
302 
303 #ifdef __cplusplus
304 }
305 #endif
306 
307 #endif /* __VC_H__ */
308 /******************************************************************************
309  * EOF (not truncated)
310  ******************************************************************************/
311 
312