]> git.sur5r.net Git - freertos/blob
11097731d0cf7e818b3ad4c273cd78a653bd0abb
[freertos] /
1 /**\r
2   ******************************************************************************\r
3   * @file    tsl_acq_stm32f0xx.c\r
4   * @author  MCD Application Team\r
5   * @version V1.3.2\r
6   * @date    22-January-2013\r
7   * @brief   This file contains all functions to manage the TSC acquisition\r
8   *          on STM32F0xx products.\r
9   ******************************************************************************\r
10   * @attention\r
11   *\r
12   * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
13   *\r
14   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
15   * You may not use this file except in compliance with the License.\r
16   * You may obtain a copy of the License at:\r
17   *\r
18   *        http://www.st.com/software_license_agreement_liberty_v2\r
19   *\r
20   * Unless required by applicable law or agreed to in writing, software\r
21   * distributed under the License is distributed on an "AS IS" BASIS,\r
22   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
23   * See the License for the specific language governing permissions and\r
24   * limitations under the License.\r
25   *\r
26   ******************************************************************************\r
27   */\r
28 \r
29 /* Includes ------------------------------------------------------------------*/\r
30 #include "tsl_acq_stm32f0xx.h"\r
31 #include "tsl_globals.h"\r
32 #include "stm32f0xx_it.h"\r
33 \r
34 /* Private typedefs ----------------------------------------------------------*/\r
35 /* Private defines -----------------------------------------------------------*/\r
36 #define TSL_DELAY_DISCHARGE (1000)\r
37 \r
38 #define NU      (0) // Not Used IO\r
39 #define CHANNEL (1) // Channel IO\r
40 #define SHIELD  (2) // Shield IO (= Channel IO but not acquired)\r
41 #define SAMPCAP (3) // Sampling Capacitor IO\r
42 \r
43 /* Private macros ------------------------------------------------------------*/\r
44 #define IS_BANK_INDEX_OK(INDEX)   (((INDEX) == 0) || (((INDEX) > 0) && ((INDEX) < TSLPRM_TOTAL_BANKS)))\r
45 #define IS_SOURCE_INDEX_OK(INDEX) (((INDEX) == 0) || (((INDEX) > 0) && ((INDEX) < TSLPRM_TOTAL_CHANNELS)))\r
46 \r
47 /* Private variables ---------------------------------------------------------*/\r
48 \r
49 /* Private functions prototype -----------------------------------------------*/\r
50 void SoftDelay(uint32_t val);\r
51 \r
52 /**\r
53   * @brief  Initializes the TouchSensing GPIOs.\r
54   * @param  None\r
55   * @retval None\r
56   */\r
57 void TSL_acq_InitGPIOs(void)\r
58 {\r
59 \r
60   GPIO_InitTypeDef GPIO_InitStructure;\r
61   uint32_t tmp_value_0;\r
62   uint32_t tmp_value_1;\r
63 \r
64   //====================\r
65   // GPIOs configuration\r
66   //====================\r
67 \r
68   // Enable GPIOs clocks\r
69   RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN);\r
70 \r
71   // Alternate function Output Open-Drain for Sampling Capacitor IOs\r
72   //----------------------------------------------------------------\r
73 \r
74   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
75   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;\r
76   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;\r
77   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
78 \r
79   // GPIOA\r
80   GPIO_InitStructure.GPIO_Pin = 0;\r
81 #if TSLPRM_TSC_GROUP1_IO1 == SAMPCAP\r
82   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_0;\r
83 #endif\r
84 #if TSLPRM_TSC_GROUP1_IO2 == SAMPCAP\r
85   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;\r
86 #endif\r
87 #if TSLPRM_TSC_GROUP1_IO3 == SAMPCAP\r
88   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_2;\r
89 #endif\r
90 #if TSLPRM_TSC_GROUP1_IO4 == SAMPCAP\r
91   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_3;\r
92 #endif\r
93 #if TSLPRM_TSC_GROUP2_IO1 == SAMPCAP\r
94   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_4;\r
95 #endif\r
96 #if TSLPRM_TSC_GROUP2_IO2 == SAMPCAP\r
97   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_5;\r
98 #endif\r
99 #if TSLPRM_TSC_GROUP2_IO3 == SAMPCAP\r
100   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_6;\r
101 #endif\r
102 #if TSLPRM_TSC_GROUP2_IO4 == SAMPCAP\r
103   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_7;\r
104 #endif\r
105 #if TSLPRM_TSC_GROUP4_IO1 == SAMPCAP\r
106   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_9;\r
107 #endif\r
108 #if TSLPRM_TSC_GROUP4_IO2 == SAMPCAP\r
109   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_10;\r
110 #endif\r
111 #if TSLPRM_TSC_GROUP4_IO3 == SAMPCAP\r
112   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_11;\r
113 #endif\r
114 #if TSLPRM_TSC_GROUP4_IO4 == SAMPCAP\r
115   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_12;\r
116 #endif\r
117   if (GPIO_InitStructure.GPIO_Pin != 0)\r
118   {\r
119     GPIO_Init(GPIOA, &GPIO_InitStructure);\r
120   }\r
121 \r
122   // GPIOB\r
123   GPIO_InitStructure.GPIO_Pin = 0;\r
124 #if TSLPRM_TSC_GROUP3_IO2 == SAMPCAP\r
125   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_0;\r
126 #endif\r
127 #if TSLPRM_TSC_GROUP3_IO3 == SAMPCAP\r
128   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;\r
129 #endif\r
130 #if TSLPRM_TSC_GROUP3_IO4 == SAMPCAP\r
131   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_2;\r
132 #endif\r
133 #if TSLPRM_TSC_GROUP5_IO1 == SAMPCAP\r
134   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_3;\r
135 #endif\r
136 #if TSLPRM_TSC_GROUP5_IO2 == SAMPCAP\r
137   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_4;\r
138 #endif\r
139 #if TSLPRM_TSC_GROUP5_IO3 == SAMPCAP\r
140   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_6;\r
141 #endif\r
142 #if TSLPRM_TSC_GROUP5_IO4 == SAMPCAP\r
143   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_7;\r
144 #endif\r
145 #if TSLPRM_TSC_GROUP6_IO1 == SAMPCAP\r
146   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_11;\r
147 #endif\r
148 #if TSLPRM_TSC_GROUP6_IO2 == SAMPCAP\r
149   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_12;\r
150 #endif\r
151 #if TSLPRM_TSC_GROUP6_IO3 == SAMPCAP\r
152   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_13;\r
153 #endif\r
154 #if TSLPRM_TSC_GROUP6_IO4 == SAMPCAP\r
155   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_14;\r
156 #endif\r
157   if (GPIO_InitStructure.GPIO_Pin != 0)\r
158   {\r
159     GPIO_Init(GPIOB, &GPIO_InitStructure);\r
160   }\r
161 \r
162   // GPIOC\r
163 #if TSLPRM_TSC_GROUP3_IO1 == SAMPCAP\r
164   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;\r
165   GPIO_Init(GPIOC, &GPIO_InitStructure);\r
166 #endif\r
167 \r
168   // Alternate function Output Push-Pull for Channel and Shield IOs\r
169   //---------------------------------------------------------------\r
170 \r
171   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
172 \r
173   // GPIOA\r
174   GPIO_InitStructure.GPIO_Pin = 0;\r
175 #if (TSLPRM_TSC_GROUP1_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP1_IO1 == SHIELD)\r
176   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_0;\r
177 #endif\r
178 #if (TSLPRM_TSC_GROUP1_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP1_IO2 == SHIELD)\r
179   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;\r
180 #endif\r
181 #if (TSLPRM_TSC_GROUP1_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP1_IO3 == SHIELD)\r
182   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_2;\r
183 #endif\r
184 #if (TSLPRM_TSC_GROUP1_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP1_IO4 == SHIELD)\r
185   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_3;\r
186 #endif\r
187 #if (TSLPRM_TSC_GROUP2_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP2_IO1 == SHIELD)\r
188   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_4;\r
189 #endif\r
190 #if (TSLPRM_TSC_GROUP2_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP2_IO2 == SHIELD)\r
191   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_5;\r
192 #endif\r
193 #if (TSLPRM_TSC_GROUP2_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP2_IO3 == SHIELD)\r
194   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_6;\r
195 #endif\r
196 #if (TSLPRM_TSC_GROUP2_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP2_IO4 == SHIELD)\r
197   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_7;\r
198 #endif\r
199 #if (TSLPRM_TSC_GROUP4_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP4_IO1 == SHIELD)\r
200   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_9;\r
201 #endif\r
202 #if (TSLPRM_TSC_GROUP4_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP4_IO2 == SHIELD)\r
203   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_10;\r
204 #endif\r
205 #if (TSLPRM_TSC_GROUP4_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP4_IO3 == SHIELD)\r
206   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_11;\r
207 #endif\r
208 #if (TSLPRM_TSC_GROUP4_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP4_IO4 == SHIELD)\r
209   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_12;\r
210 #endif\r
211   if (GPIO_InitStructure.GPIO_Pin != 0)\r
212   {\r
213     GPIO_Init(GPIOA, &GPIO_InitStructure);\r
214   }\r
215 \r
216   // GPIOB\r
217   GPIO_InitStructure.GPIO_Pin = 0;\r
218 #if (TSLPRM_TSC_GROUP3_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP3_IO2 == SHIELD)\r
219   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_0;\r
220 #endif\r
221 #if (TSLPRM_TSC_GROUP3_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP3_IO3 == SHIELD)\r
222   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;\r
223 #endif\r
224 #if (TSLPRM_TSC_GROUP3_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP3_IO4 == SHIELD)\r
225   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_2;\r
226 #endif\r
227 #if (TSLPRM_TSC_GROUP5_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP5_IO1 == SHIELD)\r
228   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_3;\r
229 #endif\r
230 #if (TSLPRM_TSC_GROUP5_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP5_IO2 == SHIELD)\r
231   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_4;\r
232 #endif\r
233 #if (TSLPRM_TSC_GROUP5_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP5_IO3 == SHIELD)\r
234   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_6;\r
235 #endif\r
236 #if (TSLPRM_TSC_GROUP5_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP5_IO4 == SHIELD)\r
237   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_7;\r
238 #endif\r
239 #if (TSLPRM_TSC_GROUP6_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP6_IO1 == SHIELD)\r
240   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_11;\r
241 #endif\r
242 #if (TSLPRM_TSC_GROUP6_IO2 == CHANNEL) || (TSLPRM_TSC_GROUP6_IO2 == SHIELD)\r
243   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_12;\r
244 #endif\r
245 #if (TSLPRM_TSC_GROUP6_IO3 == CHANNEL) || (TSLPRM_TSC_GROUP6_IO3 == SHIELD)\r
246   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_13;\r
247 #endif\r
248 #if (TSLPRM_TSC_GROUP6_IO4 == CHANNEL) || (TSLPRM_TSC_GROUP6_IO4 == SHIELD)\r
249   GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_14;\r
250 #endif\r
251   if (GPIO_InitStructure.GPIO_Pin != 0)\r
252   {\r
253     GPIO_Init(GPIOB, &GPIO_InitStructure);\r
254   }\r
255 \r
256   // GPIOC\r
257 #if (TSLPRM_TSC_GROUP3_IO1 == CHANNEL) || (TSLPRM_TSC_GROUP3_IO1 == SHIELD)\r
258   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;\r
259   GPIO_Init(GPIOC, &GPIO_InitStructure);\r
260 #endif\r
261 \r
262   // Set Alternate-Function AF3 for GPIOA and GPIOB\r
263   //-----------------------------------------------\r
264 \r
265   // GPIOA\r
266   tmp_value_0 = 0;\r
267   tmp_value_1 = 0;\r
268 #if TSLPRM_TSC_GROUP1_IO1 != NU\r
269   tmp_value_0 |= (uint32_t)((uint32_t)3 << (0 * 4));\r
270 #endif\r
271 #if TSLPRM_TSC_GROUP1_IO2 != NU\r
272   tmp_value_0 |= (uint32_t)((uint32_t)3 << (1 * 4));\r
273 #endif\r
274 #if TSLPRM_TSC_GROUP1_IO3 != NU\r
275   tmp_value_0 |= (uint32_t)((uint32_t)3 << (2 * 4));\r
276 #endif\r
277 #if TSLPRM_TSC_GROUP1_IO4 != NU\r
278   tmp_value_0 |= (uint32_t)((uint32_t)3 << (3 * 4));\r
279 #endif\r
280 #if TSLPRM_TSC_GROUP2_IO1 != NU\r
281   tmp_value_0 |= (uint32_t)((uint32_t)3 << (4 * 4));\r
282 #endif\r
283 #if TSLPRM_TSC_GROUP2_IO2 != NU\r
284   tmp_value_0 |= (uint32_t)((uint32_t)3 << (5 * 4));\r
285 #endif\r
286 #if TSLPRM_TSC_GROUP2_IO3 != NU\r
287   tmp_value_0 |= (uint32_t)((uint32_t)3 << (6 * 4));\r
288 #endif\r
289 #if TSLPRM_TSC_GROUP2_IO4 != NU\r
290   tmp_value_0 |= (uint32_t)((uint32_t)3 << (7 * 4));\r
291 #endif\r
292 #if TSLPRM_TSC_GROUP4_IO1 != NU\r
293   tmp_value_1 |= (uint32_t)((uint32_t)3 << (1 * 4));\r
294 #endif\r
295 #if TSLPRM_TSC_GROUP4_IO2 != NU\r
296   tmp_value_1 |= (uint32_t)((uint32_t)3 << (2 * 4));\r
297 #endif\r
298 #if TSLPRM_TSC_GROUP4_IO3 != NU\r
299   tmp_value_1 |= (uint32_t)((uint32_t)3 << (3 * 4));\r
300 #endif\r
301 #if TSLPRM_TSC_GROUP4_IO4 != NU\r
302   tmp_value_1 |= (uint32_t)((uint32_t)3 << (4 * 4));\r
303 #endif\r
304   if (tmp_value_0 != 0) {GPIOA->AFR[0] |= tmp_value_0;}\r
305   if (tmp_value_1 != 0) {GPIOA->AFR[1] |= tmp_value_1;}\r
306 \r
307   // GPIOB\r
308   tmp_value_0 = 0;\r
309   tmp_value_1 = 0;\r
310 #if TSLPRM_TSC_GROUP3_IO2 != NU\r
311   tmp_value_0 |= (uint32_t)((uint32_t)3 << (0 * 4));\r
312 #endif\r
313 #if TSLPRM_TSC_GROUP3_IO3 != NU\r
314   tmp_value_0 |= (uint32_t)((uint32_t)3 << (1 * 4));\r
315 #endif\r
316 #if TSLPRM_TSC_GROUP3_IO4 != NU\r
317   tmp_value_0 |= (uint32_t)((uint32_t)3 << (2 * 4));\r
318 #endif\r
319 #if TSLPRM_TSC_GROUP5_IO1 != NU\r
320   tmp_value_0 |= (uint32_t)((uint32_t)3 << (3 * 4));\r
321 #endif\r
322 #if TSLPRM_TSC_GROUP5_IO2 != NU\r
323   tmp_value_0 |= (uint32_t)((uint32_t)3 << (4 * 4));\r
324 #endif\r
325 #if TSLPRM_TSC_GROUP5_IO3 != NU\r
326   tmp_value_0 |= (uint32_t)((uint32_t)3 << (6 * 4));\r
327 #endif\r
328 #if TSLPRM_TSC_GROUP5_IO4 != NU\r
329   tmp_value_0 |= (uint32_t)((uint32_t)3 << (7 * 4));\r
330 #endif\r
331 #if TSLPRM_TSC_GROUP6_IO1 != NU\r
332   tmp_value_1 |= (uint32_t)((uint32_t)3 << (3 * 4));\r
333 #endif\r
334 #if TSLPRM_TSC_GROUP6_IO2 != NU\r
335   tmp_value_1 |= (uint32_t)((uint32_t)3 << (4 * 4));\r
336 #endif\r
337 #if TSLPRM_TSC_GROUP6_IO3 != NU\r
338   tmp_value_1 |= (uint32_t)((uint32_t)3 << (5 * 4));\r
339 #endif\r
340 #if TSLPRM_TSC_GROUP6_IO4 != NU\r
341   tmp_value_1 |= (uint32_t)((uint32_t)3 << (6 * 4));\r
342 #endif\r
343   if (tmp_value_0 != 0) {GPIOB->AFR[0] |= tmp_value_0;}\r
344   if (tmp_value_1 != 0) {GPIOB->AFR[1] |= tmp_value_1;}\r
345 \r
346   //==================\r
347   // TSC configuration\r
348   //==================\r
349 \r
350   // Enable TSC clock\r
351   RCC->AHBENR |= RCC_AHBENR_TSEN;\r
352 \r
353   // Disable Schmitt trigger hysteresis on all used TS IOs (Channel, Shield and Sampling IOs)\r
354   //-----------------------------------------------------------------------------------------\r
355 \r
356   tmp_value_0 = 0xFFFFFFFF;\r
357 #if TSLPRM_TSC_GROUP1_IO1 != NU\r
358   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 0);\r
359 #endif\r
360 #if TSLPRM_TSC_GROUP1_IO2 != NU\r
361   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 1);\r
362 #endif\r
363 #if TSLPRM_TSC_GROUP1_IO3 != NU\r
364   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 2);\r
365 #endif\r
366 #if TSLPRM_TSC_GROUP1_IO4 != NU\r
367   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 3);\r
368 #endif\r
369 #if TSLPRM_TSC_GROUP2_IO1 != NU\r
370   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 4);\r
371 #endif\r
372 #if TSLPRM_TSC_GROUP2_IO2 != NU\r
373   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 5);\r
374 #endif\r
375 #if TSLPRM_TSC_GROUP2_IO3 != NU\r
376   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 6);\r
377 #endif\r
378 #if TSLPRM_TSC_GROUP2_IO4 != NU\r
379   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 7);\r
380 #endif\r
381 #if TSLPRM_TSC_GROUP3_IO1 != NU\r
382   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 8);\r
383 #endif\r
384 #if TSLPRM_TSC_GROUP3_IO2 != NU\r
385   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 9);\r
386 #endif\r
387 #if TSLPRM_TSC_GROUP3_IO3 != NU\r
388   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 10);\r
389 #endif\r
390 #if TSLPRM_TSC_GROUP3_IO4 != NU\r
391   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 11);\r
392 #endif\r
393 #if TSLPRM_TSC_GROUP4_IO1 != NU\r
394   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 12);\r
395 #endif\r
396 #if TSLPRM_TSC_GROUP4_IO2 != NU\r
397   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 13);\r
398 #endif\r
399 #if TSLPRM_TSC_GROUP4_IO3 != NU\r
400   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 14);\r
401 #endif\r
402 #if TSLPRM_TSC_GROUP4_IO4 != NU\r
403   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 15);\r
404 #endif\r
405 #if TSLPRM_TSC_GROUP5_IO1 != NU\r
406   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 16);\r
407 #endif\r
408 #if TSLPRM_TSC_GROUP5_IO2 != NU\r
409   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 17);\r
410 #endif\r
411 #if TSLPRM_TSC_GROUP5_IO3 != NU\r
412   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 18);\r
413 #endif\r
414 #if TSLPRM_TSC_GROUP5_IO4 != NU\r
415   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 19);\r
416 #endif\r
417 #if TSLPRM_TSC_GROUP6_IO1 != NU\r
418   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 20);\r
419 #endif\r
420 #if TSLPRM_TSC_GROUP6_IO2 != NU\r
421   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 21);\r
422 #endif\r
423 #if TSLPRM_TSC_GROUP6_IO3 != NU\r
424   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 22);\r
425 #endif\r
426 #if TSLPRM_TSC_GROUP6_IO4 != NU\r
427   tmp_value_0 &= (uint32_t)~((uint32_t)1 << 23);\r
428 #endif\r
429   if (tmp_value_0 != 0xFFFFFFFF) {TSC->IOHCR &= tmp_value_0;}\r
430 \r
431   // Set Sampling Capacitor IOs\r
432   //---------------------------\r
433 \r
434   tmp_value_0 = 0;\r
435 #if TSLPRM_TSC_GROUP1_IO1 == SAMPCAP\r
436   tmp_value_0 |= (uint32_t)((uint32_t)1 << 0);\r
437 #endif\r
438 #if TSLPRM_TSC_GROUP1_IO2 == SAMPCAP\r
439   tmp_value_0 |= (uint32_t)((uint32_t)1 << 1);\r
440 #endif\r
441 #if TSLPRM_TSC_GROUP1_IO3 == SAMPCAP\r
442   tmp_value_0 |= (uint32_t)((uint32_t)1 << 2);\r
443 #endif\r
444 #if TSLPRM_TSC_GROUP1_IO4 == SAMPCAP\r
445   tmp_value_0 |= (uint32_t)((uint32_t)1 << 3);\r
446 #endif\r
447 #if TSLPRM_TSC_GROUP2_IO1 == SAMPCAP\r
448   tmp_value_0 |= (uint32_t)((uint32_t)1 << 4);\r
449 #endif\r
450 #if TSLPRM_TSC_GROUP2_IO2 == SAMPCAP\r
451   tmp_value_0 |= (uint32_t)((uint32_t)1 << 5);\r
452 #endif\r
453 #if TSLPRM_TSC_GROUP2_IO3 == SAMPCAP\r
454   tmp_value_0 |= (uint32_t)((uint32_t)1 << 6);\r
455 #endif\r
456 #if TSLPRM_TSC_GROUP2_IO4 == SAMPCAP\r
457   tmp_value_0 |= (uint32_t)((uint32_t)1 << 7);\r
458 #endif\r
459 #if TSLPRM_TSC_GROUP3_IO1 == SAMPCAP\r
460   tmp_value_0 |= (uint32_t)((uint32_t)1 << 8);\r
461 #endif\r
462 #if TSLPRM_TSC_GROUP3_IO2 == SAMPCAP\r
463   tmp_value_0 |= (uint32_t)((uint32_t)1 << 9);\r
464 #endif\r
465 #if TSLPRM_TSC_GROUP3_IO3 == SAMPCAP\r
466   tmp_value_0 |= (uint32_t)((uint32_t)1 << 10);\r
467 #endif\r
468 #if TSLPRM_TSC_GROUP3_IO4 == SAMPCAP\r
469   tmp_value_0 |= (uint32_t)((uint32_t)1 << 11);\r
470 #endif\r
471 #if TSLPRM_TSC_GROUP4_IO1 == SAMPCAP\r
472   tmp_value_0 |= (uint32_t)((uint32_t)1 << 12);\r
473 #endif\r
474 #if TSLPRM_TSC_GROUP4_IO2 == SAMPCAP\r
475   tmp_value_0 |= (uint32_t)((uint32_t)1 << 13);\r
476 #endif\r
477 #if TSLPRM_TSC_GROUP4_IO3 == SAMPCAP\r
478   tmp_value_0 |= (uint32_t)((uint32_t)1 << 14);\r
479 #endif\r
480 #if TSLPRM_TSC_GROUP4_IO4 == SAMPCAP\r
481   tmp_value_0 |= (uint32_t)((uint32_t)1 << 15);\r
482 #endif\r
483 #if TSLPRM_TSC_GROUP5_IO1 == SAMPCAP\r
484   tmp_value_0 |= (uint32_t)((uint32_t)1 << 16);\r
485 #endif\r
486 #if TSLPRM_TSC_GROUP5_IO2 == SAMPCAP\r
487   tmp_value_0 |= (uint32_t)((uint32_t)1 << 17);\r
488 #endif\r
489 #if TSLPRM_TSC_GROUP5_IO3 == SAMPCAP\r
490   tmp_value_0 |= (uint32_t)((uint32_t)1 << 18);\r
491 #endif\r
492 #if TSLPRM_TSC_GROUP5_IO4 == SAMPCAP\r
493   tmp_value_0 |= (uint32_t)((uint32_t)1 << 19);\r
494 #endif\r
495 #if TSLPRM_TSC_GROUP6_IO1 == SAMPCAP\r
496   tmp_value_0 |= (uint32_t)((uint32_t)1 << 20);\r
497 #endif\r
498 #if TSLPRM_TSC_GROUP6_IO2 == SAMPCAP\r
499   tmp_value_0 |= (uint32_t)((uint32_t)1 << 21);\r
500 #endif\r
501 #if TSLPRM_TSC_GROUP6_IO3 == SAMPCAP\r
502   tmp_value_0 |= (uint32_t)((uint32_t)1 << 22);\r
503 #endif\r
504 #if TSLPRM_TSC_GROUP6_IO4 == SAMPCAP\r
505   tmp_value_0 |= (uint32_t)((uint32_t)1 << 23);\r
506 #endif\r
507   if (tmp_value_0 != 0) {TSC->IOSCR |= tmp_value_0;}\r
508 \r
509 }\r
510 \r
511 \r
512 /**\r
513   * @brief  Initializes the acquisition module.\r
514   * @param  None\r
515   * @retval Status\r
516   */\r
517 TSL_Status_enum_T TSL_acq_Init(void)\r
518 {\r
519 \r
520 #if TSLPRM_TSC_GPIO_CONFIG > 0\r
521   TSL_acq_InitGPIOs();\r
522 #endif\r
523 \r
524   // Enable TSC clock\r
525   RCC->AHBENR |= RCC_AHBENR_TSEN;\r
526 \r
527   // TSC enabled\r
528   TSC->CR = 0x01;\r
529 \r
530   // Set CTPH\r
531   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_CTPH << 28) & 0xF0000000;\r
532 \r
533   // Set CTPL\r
534   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_CTPL << 24) & 0x0F000000;\r
535 \r
536   // Set SpreadSpectrum\r
537   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_USE_SS << 16) & 0x00010000;\r
538   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_SSD << 17) & 0x00FE0000;\r
539   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_SSPSC << 15) & 0x00008000;\r
540 \r
541   // Set Prescaler\r
542   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_PGPSC << 12) & 0x00007000;\r
543 \r
544   // Set Max Count\r
545   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_MCV << 5) & 0x000000E0;\r
546 \r
547   // Set IO default in Output PP Low to discharge all capacitors\r
548   TSC->CR &= (uint32_t)(~(1 << 4));\r
549 \r
550   // Set Synchronization Mode\r
551 #if TSLPRM_TSC_AM > 0\r
552 \r
553   // Set Synchronization Pin in Alternate-Function mode\r
554   RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // Set GPIOB clock\r
555 \r
556 #if TSLPRM_TSC_SYNC_PIN == 0 // PB08\r
557   GPIOB->MODER  &= 0xFFFCFFFF;\r
558   GPIOB->MODER  |= 0x00020000;\r
559   GPIOB->AFR[1] |= 0x00000003;\r
560 #else // PB10\r
561   GPIOB->MODER  &= 0xFFCFFFFF;\r
562   GPIOB->MODER  |= 0x00200000;\r
563   GPIOB->AFR[1] |= 0x00000300;\r
564 #endif\r
565 \r
566   // Set Synchronization Polarity\r
567   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_SYNC_POL << 3) & 0x00000008;\r
568 \r
569 #endif\r
570 \r
571   // Set acquisition mode\r
572   TSC->CR |= (uint32_t)((uint32_t)TSLPRM_TSC_AM << 2) & 0x00000004;\r
573 \r
574 #if TSLPRM_USE_ACQ_INTERRUPT > 0\r
575 \r
576   // Set both EOA and MCE interrupts\r
577   TSC->IER |= 0x03;\r
578 \r
579   // Configure NVIC\r
580   NVIC_SetPriority(TS_IRQn, 0);\r
581   NVIC_EnableIRQ(TS_IRQn);\r
582 \r
583 #endif\r
584 \r
585   return TSL_STATUS_OK;\r
586 \r
587 }\r
588 \r
589 \r
590 /**\r
591   * @brief Configures a Bank.\r
592   * @param[in] idx_bk  Index of the Bank to configure\r
593   * @retval Status\r
594   */\r
595 TSL_Status_enum_T TSL_acq_BankConfig(TSL_tIndex_T idx_bk)\r
596 {\r
597   TSL_tIndex_T idx_ch;\r
598   uint32_t objs; /* bit field of TSL_ObjStatus_enum_T type */\r
599   uint32_t gx;\r
600   uint32_t ioy;\r
601   CONST TSL_Bank_T *bank = &(TSL_Globals.Bank_Array[idx_bk]);\r
602   CONST TSL_ChannelSrc_T *pchSrc = bank->p_chSrc;\r
603   CONST TSL_ChannelDest_T *pchDest = bank->p_chDest;\r
604 \r
605   // Check parameters (if USE_FULL_ASSERT is defined)\r
606   assert_param(IS_BANK_INDEX_OK(idx_bk));\r
607 \r
608   // Mark the current bank processed\r
609   TSL_Globals.This_Bank = idx_bk;\r
610 \r
611   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
612   // Enable the Gx_IOy used as channels (channels + shield)\r
613   TSC->IOCCR = bank->msk_IOCCR_channels;\r
614   // Enable acquisition on selected Groups\r
615   TSC->IOGCSR = bank->msk_IOGCSR_groups;\r
616   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
617 \r
618   // For all channels of the bank check if they are OFF or BURST_ONLY\r
619   // and set acquisition status flag\r
620   for (idx_ch = 0; idx_ch < bank->NbChannels; idx_ch++)\r
621   {\r
622 \r
623     // Check Object status flag\r
624     objs = bank->p_chData[pchDest->IdxDest].Flags.ObjStatus;\r
625 \r
626     if (objs != TSL_OBJ_STATUS_ON)\r
627     {\r
628       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
629       // Get the Channel Group mask\r
630       gx = pchSrc->msk_IOGCSR_group;\r
631       // Stop acquisition of the Group\r
632       TSC->IOGCSR &= (uint32_t)~gx;\r
633       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
634 \r
635       if (objs == TSL_OBJ_STATUS_OFF)\r
636       {\r
637         //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
638         // Get the Channel IO mask\r
639         ioy = pchSrc->msk_IOCCR_channel;\r
640         // Stop Burst of the Channel\r
641         TSC->IOCCR &= (uint32_t)~ioy;\r
642         //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r
643       }\r
644     }\r
645 \r
646     // Next channel\r
647     pchSrc++;\r
648     pchDest++;\r
649   }\r
650 \r
651   return TSL_STATUS_OK;\r
652 }\r
653 \r
654 \r
655 /**\r
656   * @brief Start acquisition on a previously configured bank\r
657   * @param None\r
658   * @retval None\r
659   */\r
660 void TSL_acq_BankStartAcq(void)\r
661 {\r
662   // Clear both EOAIC and MCEIC flags\r
663   TSC->ICR |= 0x03;\r
664 \r
665   // Wait capacitors discharge\r
666   SoftDelay(TSL_DELAY_DISCHARGE);\r
667 \r
668 #if TSLPRM_TSC_IODEF > 0 // Default = Input Floating\r
669   // Set IO default in Input Floating\r
670   TSC->CR |= (1 << 4);\r
671 #endif\r
672 \r
673   // Start acquisition\r
674   TSC->CR |= 0x02;\r
675 }\r
676 \r
677 \r
678 /**\r
679   * @brief Wait end of acquisition\r
680   * @param None\r
681   * @retval Status\r
682   */\r
683 TSL_Status_enum_T TSL_acq_BankWaitEOC(void)\r
684 {\r
685   TSL_Status_enum_T retval = TSL_STATUS_BUSY;\r
686 \r
687   // Check EOAF flag\r
688   if (TSC->ISR & 0x01)\r
689   {\r
690 \r
691 #if TSLPRM_TSC_IODEF > 0 // Default = Input Floating\r
692     // Set IO default in Output PP Low to discharge all capacitors\r
693     TSC->CR &= (uint32_t)(~(1 << 4));\r
694 #endif\r
695 \r
696     // Check MCEF flag\r
697     if (TSC->ISR & 0x02)\r
698     {\r
699       retval = TSL_STATUS_ERROR;\r
700     }\r
701     else\r
702     {\r
703       retval = TSL_STATUS_OK;\r
704     }\r
705   }\r
706 \r
707   return retval;\r
708 }\r
709 \r
710 \r
711 /**\r
712   * @brief Return the current measure\r
713   * @param[in] index Index of the measure source\r
714   * @retval Measure\r
715   */\r
716 TSL_tMeas_T TSL_acq_GetMeas(TSL_tIndex_T index)\r
717 {\r
718   return(TSC->IOGXCR[index]);\r
719 }\r
720 \r
721 \r
722 /**\r
723   * @brief Compute the Delta value\r
724   * @param[in] ref Reference value\r
725   * @param[in] meas Last Measurement value\r
726   * @retval Delta value\r
727   */\r
728 TSL_tDelta_T TSL_acq_ComputeDelta(TSL_tRef_T ref, TSL_tMeas_T meas)\r
729 {\r
730   return((TSL_tDelta_T)(ref - meas));\r
731 }\r
732 \r
733 \r
734 /**\r
735   * @brief Compute the Measurement value\r
736   * @param[in] ref Reference value\r
737   * @param[in] delta Delta value\r
738   * @retval Measurement value\r
739   */\r
740 TSL_tMeas_T TSL_acq_ComputeMeas(TSL_tRef_T ref, TSL_tDelta_T delta)\r
741 {\r
742   return((TSL_tMeas_T)(ref - delta));\r
743 }\r
744 \r
745 \r
746 /**\r
747   * @brief  Check noise (not used)\r
748   * @param  None\r
749   * @retval Status\r
750   */\r
751 TSL_AcqStatus_enum_T TSL_acq_CheckNoise(void)\r
752 {\r
753   return TSL_ACQ_STATUS_OK;\r
754 }\r
755 \r
756 \r
757 /**\r
758   * @brief Check if a filter must be used on the current channel (not used)\r
759   * @param[in] pCh Pointer on the channel data information\r
760   * @retval Result TRUE if a filter can be applied\r
761   */\r
762 TSL_Bool_enum_T TSL_acq_UseFilter(TSL_ChannelData_T *pCh)\r
763 {\r
764   return TSL_TRUE;\r
765 }\r
766 \r
767 \r
768 /**\r
769   * @brief Test if the Reference is incorrect (not used)\r
770   * @param[in] pCh Pointer on the channel data information\r
771   * @retval Result TRUE if the Reference is out of range\r
772   */\r
773 TSL_Bool_enum_T TSL_acq_TestReferenceOutOfRange(TSL_ChannelData_T *pCh)\r
774 {\r
775   return TSL_FALSE;\r
776 }\r
777 \r
778 \r
779 /**\r
780   * @brief Test if the measure has crossed the reference target (not used)\r
781   * @param[in] pCh Pointer on the channel data information\r
782   * @param[in] new_meas Measure of the last acquisition on this channel\r
783   * @retval Result TRUE if the Reference is valid\r
784   */\r
785 TSL_Bool_enum_T TSL_acq_TestFirstReferenceIsValid(TSL_ChannelData_T *pCh, TSL_tMeas_T new_meas)\r
786 {\r
787   return TSL_TRUE;\r
788 }\r
789 \r
790 \r
791 #if defined(__IAR_SYSTEMS_ICC__) // IAR/EWARM\r
792 #pragma optimize=low\r
793 #elif defined(__CC_ARM) // Keil/MDK-ARM\r
794 #pragma O1\r
795 #pragma Ospace\r
796 #elif defined(__TASKING__) // Altium/Tasking\r
797 #pragma optimize O0\r
798 #elif defined(__GNUC__) // Atollic/True Studio + Raisonance/RKit\r
799 #pragma GCC push_options\r
800 #pragma GCC optimize ("O0")\r
801 #endif\r
802 /**\r
803   * @brief  Software delay (private routine)\r
804   * @param  val Wait delay\r
805   * @retval None\r
806   */\r
807 void SoftDelay(uint32_t val)\r
808 {\r
809   __IO uint32_t i;\r
810   for (i = val; i > 0; i--)\r
811   {}\r
812 }\r
813 #if defined(__TASKING__)\r
814 #pragma endoptimize\r
815 #endif\r
816 \r
817 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r