S32 SDK
cmp_hal.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 - 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016 NXP
4  * All rights reserved.
5  *
6  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
7  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
9  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
10  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
11  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
12  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
14  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
15  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
16  * THE POSSIBILITY OF SUCH DAMAGE.
17  */
18 
27 #include "cmp_hal.h"
28 
29 /*******************************************************************************
30  * Code
31  ******************************************************************************/
32 
33 /*FUNCTION**********************************************************************
34  *
35  * Function Name : CMP_HAL_Init
36  * Description : This function initializes the CMP instance to a known
37  * state (the register are written with their reset values from the Reference
38  * Manual).
39  *
40  * Implements : CMP_HAL_Init_Activity
41  *END**************************************************************************/
42 void CMP_HAL_Init(CMP_Type* baseAddr)
43 {
44  baseAddr->C0 = CMP_C0_DMAEN(0U) | CMP_C0_IER(0U) | CMP_C0_IEF(0U) | CMP_C0_CFR(1U) |
45  CMP_C0_CFF(1U) | CMP_C0_FPR(0U) | CMP_C0_SE(0U) | CMP_C0_WE(0U) |
46  CMP_C0_PMODE(0U) | CMP_C0_INVT(0U) | CMP_C0_COS(0U) | CMP_C0_OPE(0U) |
48 
49  baseAddr->C1 = CMP_C1_INPSEL(0U) | CMP_C1_INNSEL(0U) | CMP_C1_CHN7(0U) |
50  CMP_C1_CHN6(0U) | CMP_C1_CHN5(0U) | CMP_C1_CHN4(0U) | CMP_C1_CHN3(0U) | CMP_C1_CHN2(0U) |
51  CMP_C1_CHN1(0U) | CMP_C1_CHN0(0U) | CMP_C1_DACEN(0U) | CMP_C1_VRSEL(0U) |
52  CMP_C1_PSEL(0U) | CMP_C1_MSEL(0U) | CMP_C1_VOSEL(0U);
53 
54  baseAddr->C2 = CMP_C2_RRE(0U) | CMP_C2_RRIE(0U) | CMP_C2_FXMP(0U) | CMP_C2_FXMXCH(0U) | CMP_C2_CH7F(1U) |
55  CMP_C2_CH6F(1U) | CMP_C2_CH5F(1U) | CMP_C2_CH4F(1U) | CMP_C2_CH3F(1U) | CMP_C2_CH2F(1U) |
56  CMP_C2_CH1F(1U) | CMP_C2_CH0F(1U) | CMP_C2_NSAM(0U) | CMP_C2_NSAM(0U) | CMP_C2_INITMOD(0U) |
57  CMP_C2_ACOn(0U);
58 }
59 
60 /*FUNCTION**********************************************************************
61  *
62  * Function Name : CMP_HAL_SetFunctionalMode
63  * Description : This function set CMP functional mode based on configuration
64  * structure. If values for filter count or filter period are specific for selected mode
65  * the value from input structure will be ignored.
66  *
67  * FUNCTIONAL MODE | FILTER COUNT | FILTER PERIOD
68  * ----------------------------------------------------------------
69  * CMP_DISABLED | IGNORED | IGNORED
70  * CMP_CONTINUOUS | IGNORED | IGNORED
71  * CMP_SAMPLED_NONFILTRED_INT_CLK | IGNORED | IGNORED
72  * CMP_SAMPLED_NONFILTRED_EXT_CLK | IGNORED | USED
73  * CMP_SAMPLED_FILTRED_INT_CLK | USED | IGNORED
74  * CMP_SAMPLED_FILTRED_EXT_CLK | USED | USED
75  * CMP_WINDOWED | IGNORED | IGNORED
76  * CMP_WINDOWED_RESAMPLED | IGNORED | USED
77  * CMP_WINDOWED_FILTRED | USED | USED
78  *
79  * Implements : CMP_HAL_SetFunctionalMode_Activity
80  *END**************************************************************************/
81  void CMP_HAL_SetFunctionalMode(CMP_Type* baseAddr, cmp_mode_t mode, uint8_t filter_sample_count, uint8_t filter_sample_period)
82  {
83  uint32_t tmp = baseAddr->C0;
85  baseAddr->C0 = tmp;
86  switch(mode)
87  {
88  case CMP_DISABLED:
89  break;
90  case CMP_CONTINUOUS:
91  tmp |= CMP_C0_EN(1U);
92  break;
94  tmp |= CMP_C0_EN(1U);
95  tmp |= CMP_C0_SE(1U);
96  tmp |= CMP_C0_FILTER_CNT(1U);
97  tmp |= CMP_C0_FPR(filter_sample_period);
98  break;
100  tmp |= CMP_C0_EN(1U);
101  tmp |= CMP_C0_FILTER_CNT(1U);
102  tmp |= CMP_C0_FPR(filter_sample_period);
103  break;
105  tmp |= CMP_C0_EN(1U);
106  tmp |= CMP_C0_FILTER_CNT(filter_sample_count);
107  tmp |= CMP_C0_FPR(filter_sample_period);
108  break;
110  tmp |= CMP_C0_EN(1U);
111  tmp |= CMP_C0_SE(1U);
112  tmp |= CMP_C0_FILTER_CNT(filter_sample_count);
113  tmp |= CMP_C0_FPR(filter_sample_period);
114  break;
115  case CMP_WINDOWED:
116  tmp |= CMP_C0_EN(1U);
117  tmp |= CMP_C0_WE(1U);
118  tmp |= CMP_C0_FILTER_CNT(0U);
119  break;
121  tmp |= CMP_C0_EN(1U);
122  tmp |= CMP_C0_WE(1U);
123  tmp |= CMP_C0_FILTER_CNT(1U);
124  tmp |= CMP_C0_FPR(filter_sample_period);
125  break;
127  tmp |= CMP_C0_EN(1U);
128  tmp |= CMP_C0_WE(1U);
129  tmp |= CMP_C0_FILTER_CNT(filter_sample_count);
130  tmp |= CMP_C0_FPR(filter_sample_period);
131  break;
132  default:
133  /* Impossible case */
134  break;
135  }
136  baseAddr->C0 = tmp;
137  }
138 
139 /*FUNCTION**********************************************************************
140  *
141  * Function Name : CMP_HAL_GetFunctionalMode
142  * Description : This function return current CMP functional mode. CMP module cand be used in
143  * one of this modes: CMP_DISABLED , CMP_CONTINUOUS, CMP_SAMPLED_NONFILTRED_INT_CLK,
144  * CMP_SAMPLED_NONFILTRED_EXT_CLK, CMP_SAMPLED_FILTRED_INT_CLK, CMP_SAMPLED_FILTRED_EXT_CLK,
145  * CMP_WINDOWED, CMP_WINDOWED_RESAMPLED, CMP_WINDOWED_FILTRED
146  *
147  * Implements : CMP_HAL_GetFunctionalMode_Activity
148  *END**************************************************************************/
149 
151 {
152  uint32_t state;
153  uint32_t tmp = baseAddr->C0;
154  cmp_mode_t mode = CMP_DISABLED;
155  state = (((baseAddr->C0) & CMP_C0_EN_MASK) >> CMP_C0_EN_SHIFT) << 2U;
156  state |= (((baseAddr->C0) & CMP_C0_WE_MASK) >> CMP_C0_WE_SHIFT) << 1U;
157  state |= (((baseAddr->C0) & CMP_C0_SE_MASK) >> CMP_C0_SE_SHIFT);
158  uint32_t filter_sample_period = (tmp & CMP_C0_FPR_MASK) >> CMP_C0_FPR_SHIFT;
159  uint32_t filter_sample_count = (tmp & CMP_C0_FILTER_CNT_MASK) >> CMP_C0_FILTER_CNT_SHIFT;
160  if ((state & 0x4U) == 0U)
161  {
162  mode = CMP_DISABLED;
163  }
164  else
165  {
166  switch(state)
167  {
168  case 4:
169  if ((filter_sample_period == 0U) || (filter_sample_count == 0U))
170  {
171  mode = CMP_CONTINUOUS;
172  }
173  else if ((filter_sample_period > 0U) || (filter_sample_count == 1U))
174  {
176  }
177  else if ((filter_sample_period > 4U) || (filter_sample_count > 1U))
178  {
180  }
181  else
182  {
183  /* Nothing */
184  }
185  break;
186  case 5:
187  if (filter_sample_count == 1U)
188  {
190  }
191  else if (filter_sample_count > 1u)
192  {
194  }
195  else
196  {
197  /* Nothing */
198  }
199  break;
200  case 6 :
201  if ((filter_sample_period == 0U) || (filter_sample_count == 0U))
202  {
203  mode = CMP_WINDOWED;
204  }
205  else if ((filter_sample_count == 1U) || (filter_sample_period > 1U))
206  {
207  mode = CMP_WINDOWED_RESAMPLED;
208  }
209  else if ((filter_sample_count > 1U) || (filter_sample_period > 1U))
210  {
211  mode = CMP_WINDOWED_FILTRED;
212  }
213  else
214  {
215  /*Nothing */
216  }
217  break;
218  default:
219  /* Impossible case */
220  break;
221  }
222  }
223  return mode;
224 }
225 
226 /*******************************************************************************
227  * EOF
228  ******************************************************************************/
#define CMP_C2_CH6F(x)
Definition: S32K144.h:1960
#define CMP_C2_FXMP(x)
Definition: S32K144.h:1972
#define CMP_C0_WE_SHIFT
Definition: S32K144.h:1824
#define CMP_C2_FXMXCH(x)
Definition: S32K144.h:1968
#define CMP_C1_INNSEL(x)
Definition: S32K144.h:1915
#define CMP_C0_FILTER_CNT(x)
Definition: S32K144.h:1802
#define CMP_C0_FPR(x)
Definition: S32K144.h:1834
#define CMP_C1_CHN6(x)
Definition: S32K144.h:1907
#define CMP_C0_SE_SHIFT
Definition: S32K144.h:1828
#define CMP_C0_SE(x)
Definition: S32K144.h:1830
#define CMP_C2_NSAM(x)
Definition: S32K144.h:1932
#define CMP_C0_IER(x)
Definition: S32K144.h:1854
#define CMP_C0_FILTER_CNT_MASK
Definition: S32K144.h:1799
#define CMP_C0_FPR_SHIFT
Definition: S32K144.h:1832
#define CMP_C1_MSEL(x)
Definition: S32K144.h:1867
#define CMP_C0_WE_MASK
Definition: S32K144.h:1823
#define CMP_C1_DACEN(x)
Definition: S32K144.h:1879
void CMP_HAL_SetFunctionalMode(CMP_Type *baseAddr, cmp_mode_t mode, uint8_t filter_sample_count, uint8_t filter_sample_period)
Sets the comparator functional mode (mode, filter count, filter period)
Definition: cmp_hal.c:81
#define CMP_C1_CHN1(x)
Definition: S32K144.h:1887
__IO uint32_t C1
Definition: S32K144.h:1757
#define CMP_C1_PSEL(x)
Definition: S32K144.h:1871
#define CMP_C0_EN_MASK
Definition: S32K144.h:1803
cmp_mode_t CMP_HAL_GetFunctionalMode(const CMP_Type *baseAddr)
Gets the comparator functional mode. If you want to get filter count and filter period please use CMP...
Definition: cmp_hal.c:150
#define CMP_C0_CFR(x)
Definition: S32K144.h:1846
#define CMP_C0_IEF(x)
Definition: S32K144.h:1850
#define CMP_C1_CHN7(x)
Definition: S32K144.h:1911
#define CMP_C0_FPR_MASK
Definition: S32K144.h:1831
#define CMP_C1_VRSEL(x)
Definition: S32K144.h:1875
#define CMP_C0_EN_SHIFT
Definition: S32K144.h:1804
#define CMP_C0_HYSTCTR(x)
Definition: S32K144.h:1794
#define CMP_C2_RRIE(x)
Definition: S32K144.h:1976
#define CMP_C0_SE_MASK
Definition: S32K144.h:1827
#define CMP_C1_INPSEL(x)
Definition: S32K144.h:1919
#define CMP_C0_OPE(x)
Definition: S32K144.h:1810
#define CMP_C1_CHN0(x)
Definition: S32K144.h:1883
#define CMP_C0_FILTER_CNT_SHIFT
Definition: S32K144.h:1800
#define CMP_C2_RRE(x)
Definition: S32K144.h:1980
cmp_mode_t
Comparator functional modes Implements : cmp_mode_t_Class.
Definition: cmp_hal.h:161
#define CMP_C2_CH4F(x)
Definition: S32K144.h:1952
#define CMP_C2_CH3F(x)
Definition: S32K144.h:1948
#define CMP_C2_ACOn(x)
Definition: S32K144.h:1924
#define CMP_C1_VOSEL(x)
Definition: S32K144.h:1863
void CMP_HAL_Init(CMP_Type *baseAddr)
Initializes the comparator registers with reset values.
Definition: cmp_hal.c:42
#define CMP_C0_COS(x)
Definition: S32K144.h:1814
#define CMP_C2_CH0F(x)
Definition: S32K144.h:1936
#define CMP_C0_INVT(x)
Definition: S32K144.h:1818
#define CMP_C2_INITMOD(x)
Definition: S32K144.h:1928
#define CMP_C0_OFFSET(x)
Definition: S32K144.h:1798
#define CMP_C0_EN(x)
Definition: S32K144.h:1806
#define CMP_C0_PMODE(x)
Definition: S32K144.h:1822
#define CMP_C1_CHN5(x)
Definition: S32K144.h:1903
#define CMP_C0_WE(x)
Definition: S32K144.h:1826
#define CMP_C2_CH1F(x)
Definition: S32K144.h:1940
__IO uint32_t C0
Definition: S32K144.h:1756
#define CMP_C1_CHN3(x)
Definition: S32K144.h:1895
#define CMP_C2_CH7F(x)
Definition: S32K144.h:1964
#define CMP_C0_CFF(x)
Definition: S32K144.h:1842
#define CMP_C2_CH2F(x)
Definition: S32K144.h:1944
__IO uint32_t C2
Definition: S32K144.h:1758
#define CMP_C1_CHN4(x)
Definition: S32K144.h:1899
#define CMP_C1_CHN2(x)
Definition: S32K144.h:1891
#define CMP_C0_DMAEN(x)
Definition: S32K144.h:1858
#define CMP_C2_CH5F(x)
Definition: S32K144.h:1956