]> git.sur5r.net Git - freertos/blob
8298c1a9364e8b68e76af5fb8803c0ffe401bd28
[freertos] /
1 /**\r
2   ******************************************************************************\r
3   * @file    tsl_acq_stm32l1xx_sw.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 acquisition\r
8   *          on STM32l1xx products using the software mode.\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_stm32l1xx_sw.h"\r
31 #include "tsl_globals.h"\r
32 \r
33 /* Private typedefs ----------------------------------------------------------*/\r
34 \r
35 // Register configuration\r
36 typedef struct\r
37 {\r
38   unsigned int RI_ASCR     : 3;\r
39   unsigned int RI_ASCR_bit : 5;\r
40 } TSL_RIConf_t;\r
41 \r
42 /* Private defines -----------------------------------------------------------*/\r
43 #define SIZEOFBANKCONF (17) //2 mask RIRs + 5 ports x 3 mask registers(MODER input, output, ODR) => 17 registers\r
44 \r
45 /* Private macros ------------------------------------------------------------*/\r
46 #define IS_BANK_INDEX_OK(INDEX)   (((INDEX) == 0) || (((INDEX) > 0) && ((INDEX) < TSLPRM_TOTAL_BANKS)))\r
47 \r
48 #define TSL_CHANNEL_PORT(channel)  (channel >> 4)\r
49 #define TSL_CHANNEL_IO(channel)    (channel & 0x0F)\r
50 \r
51 \r
52 #define TSL_RI_HYSCR_MASK(channel) (1 << TSL_CHANNEL_IO(channel))\r
53 \r
54 #define TSL_RCC_AHBENR_Config(channel) (RCC->AHBENR |= TSL_GPIO_Clock_LookUpTable[TSL_CHANNEL_PORT(channel)])\r
55 \r
56 #define TSL_RI_HYSCR_Config(channel)       (*TSL_RI_HYSCR_LookUpTable[TSL_CHANNEL_PORT(channel)] |= TSL_RI_HYSCR_MASK(channel))\r
57 \r
58 #define TSL_GPIO_MODER_IN_Config(channel)      (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->MODER &= (uint32_t)(~(3 << (2 * TSL_CHANNEL_IO(channel)))))\r
59 #define TSL_GPIO_MODER_OUT_Config(channel)     (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->MODER = (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->MODER & (uint32_t)(~(3 << (2 * TSL_CHANNEL_IO(channel))))) | (1 << (2 * TSL_CHANNEL_IO(channel))))\r
60 #define TSL_GPIO_PUPDR_NO_PUPD_Config(channel) (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->PUPDR &= (uint32_t)(~(3 << (2 * TSL_CHANNEL_IO(channel)))))\r
61 #define TSL_GPIO_OTYPER_PP_Config(channel)     (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->OTYPER &= (uint32_t)(~(1 << TSL_CHANNEL_IO(channel))))\r
62 #define TSL_GPIO_OSPEEDR_VL_Config(channel)    (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->OSPEEDR &= (uint32_t)~(3 << (2 * TSL_CHANNEL_IO(channel))))\r
63 #define TSL_GPIO_BS_Config(channel)            (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->BSRRL = (uint16_t)(1 << (TSL_CHANNEL_IO(channel))))\r
64 #define TSL_GPIO_BR_Config(channel)            (TSL_GPIO_LookUpTable[TSL_CHANNEL_PORT(channel)]->BSRRH = (uint16_t)(1 << (TSL_CHANNEL_IO(channel))))\r
65 \r
66 \r
67 /* Private variables ---------------------------------------------------------*/\r
68 uint32_t TSL_BankSampleConf[SIZEOFBANKCONF];\r
69 uint32_t TSL_BankChannelConf[SIZEOFBANKCONF];\r
70 uint32_t tab_MeasurementCounter[11];\r
71 extern TSL_Params_T TSL_Params;\r
72 \r
73 CONST TSL_Bank_T *bank;\r
74 TSL_tIndex_T NumberOfChannelOn = 0;\r
75 TSL_tNb_T NumberOfChannels = 0;\r
76 TSL_Status_enum_T TSL_Acq_Status = TSL_STATUS_BUSY;\r
77 uint16_t GroupToCheck = 0;\r
78 \r
79 uint32_t TSL_GPIO_Clock_LookUpTable[] = {RCC_AHBPeriph_GPIOA, RCC_AHBPeriph_GPIOB, RCC_AHBPeriph_GPIOC, RCC_AHBPeriph_GPIOD, RCC_AHBPeriph_GPIOE, RCC_AHBPeriph_GPIOF, RCC_AHBPeriph_GPIOG, RCC_AHBPeriph_GPIOH};\r
80 GPIO_TypeDef *TSL_GPIO_LookUpTable[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH};\r
81 \r
82 uint16_t *TSL_RI_HYSCR_LookUpTable[] =\r
83 {\r
84     (uint16_t *)&RI->HYSCR1, (uint16_t *)&RI->HYSCR1 + 1,\r
85     (uint16_t *)&RI->HYSCR2, (uint16_t *)&RI->HYSCR2 + 1,\r
86     (uint16_t *)&RI->HYSCR3, (uint16_t *)&RI->HYSCR3 + 1,\r
87     (uint16_t *)&RI->HYSCR4, (uint16_t *)&RI->HYSCR4 + 1\r
88 };\r
89 \r
90 CONST TSL_RIConf_t TSL_RI_Conf_LookUpTable[101] =\r
91 {\r
92     {0, 0},\r
93     {0, 1},\r
94     {0, 2},\r
95     {0, 3},\r
96     {0, 0},//padding\r
97     {0, 0},//padding\r
98     {0, 6},\r
99     {0, 7},\r
100     {1, 9},\r
101     {1, 10},\r
102     {1, 11},\r
103     {1, 15},\r
104     {0, 0},//padding\r
105     {1, 6},\r
106     {1, 7},\r
107     {1, 8},\r
108 \r
109     {0, 8},\r
110     {0, 9},\r
111     {1, 16},\r
112     {0, 0},//padding\r
113     {1, 4},\r
114     {1, 5},\r
115     {1, 27},\r
116     {1, 28},\r
117     {0, 0},//padding\r
118     {0, 0},//padding\r
119     {0, 0},//padding\r
120     {0, 0},//padding\r
121     {0, 18},\r
122     {0, 19},\r
123     {0, 20},\r
124     {0, 21},\r
125 \r
126     {0, 10},\r
127     {0, 11},\r
128     {0, 12},\r
129     {0, 13},\r
130     {0, 14},\r
131     {0, 15},\r
132     {1, 0},\r
133     {1, 1},\r
134     {1, 2},\r
135     {1, 3},\r
136     {1, 29},\r
137     {0, 0},//padding\r
138     {0, 0},//padding\r
139     {0, 0},//padding\r
140     {0, 0},//padding\r
141     {0, 0},//padding\r
142 \r
143     {0, 0},//padding\r
144     {0, 0},//padding\r
145     {0, 0},//padding\r
146     {0, 0},//padding\r
147     {0, 0},//padding\r
148     {0, 0},//padding\r
149     {0, 0},//padding\r
150     {0, 0},//padding\r
151     {0, 0},//padding\r
152     {0, 0},//padding\r
153     {0, 0},//padding\r
154     {0, 0},//padding\r
155     {0, 0},//padding\r
156     {0, 0},//padding\r
157     {0, 0},//padding\r
158     {0, 0},//padding\r
159 \r
160     {0, 0},//padding\r
161     {0, 0},//padding\r
162     {0, 0},//padding\r
163     {0, 0},//padding\r
164     {0, 0},//padding\r
165     {0, 0},//padding\r
166     {0, 0},//padding\r
167     {0, 0},//padding\r
168     {0, 0},//padding\r
169     {0, 0},//padding\r
170     {0, 0},//padding\r
171     {0, 0},//padding\r
172     {0, 0},//padding\r
173     {0, 0},//padding\r
174     {0, 0},//padding\r
175     {0, 0},//padding\r
176 \r
177     {0, 0},//padding\r
178     {0, 0},//padding\r
179     {0, 0},//padding\r
180     {0, 0},//padding\r
181     {0, 0},//padding\r
182     {0, 0},//padding\r
183     {0, 27},\r
184     {0, 28},\r
185     {0, 29},\r
186     {0, 30},\r
187     {0, 16},\r
188     {1, 17},\r
189     {1, 18},\r
190     {1, 19},\r
191     {1, 20},\r
192     {1, 21},\r
193 \r
194     {1, 22},\r
195     {1, 23},\r
196     {1, 24},\r
197     {1, 25},\r
198     {1, 26}\r
199 };\r
200 \r
201 #if (TSLPRM_USE_GPIOA)\r
202 uint32_t GPIOA_IDR_Mask = 0;\r
203 #endif\r
204 #if (TSLPRM_USE_GPIOB)\r
205 uint32_t GPIOB_IDR_Mask = 0;\r
206 #endif\r
207 #if (TSLPRM_USE_GPIOC)\r
208 uint32_t GPIOC_IDR_Mask = 0;\r
209 #endif\r
210 #if (TSLPRM_USE_GPIOF)\r
211 uint32_t GPIOF_IDR_Mask = 0;\r
212 #endif\r
213 #if (TSLPRM_USE_GPIOG)\r
214 uint32_t GPIOG_IDR_Mask = 0;\r
215 #endif\r
216 \r
217 /* Private functions prototype -----------------------------------------------*/\r
218 void SoftDelay(uint16_t val);\r
219 void TSL_BankConf(uint32_t * BankConf, TSL_Conf_t Conf);\r
220 void TSL_acq_GroupDone(uint16_t EndedGroup);\r
221 \r
222 /**\r
223   * @brief  Configures the acquisition module.\r
224   * @param[in] BankConf Pointer to the bank to configure\r
225   * @param[in] Conf Configuration\r
226   * @retval None\r
227   */\r
228 void TSL_BankConf(uint32_t *BankConf, TSL_Conf_t Conf)\r
229 {\r
230   BankConf[TSL_RI_Conf_LookUpTable[Conf].RI_ASCR] |= (1 << (TSL_RI_Conf_LookUpTable[Conf].RI_ASCR_bit));\r
231 \r
232   switch (TSL_CHANNEL_PORT(Conf))\r
233   {\r
234     case TSL_BANK_GPIOA: BankConf[2] |= (3 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER input\r
235       BankConf[3] |= (1 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER output\r
236       BankConf[4] |= (1 << (TSL_CHANNEL_IO(Conf))); //ODR\r
237       break;\r
238     case TSL_BANK_GPIOB: BankConf[5] |= (3 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER input\r
239       BankConf[6] |= (1 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER output\r
240       BankConf[7] |= (1 << (TSL_CHANNEL_IO(Conf))); //ODR\r
241       break;\r
242     case TSL_BANK_GPIOC: BankConf[8] |= (3 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER input\r
243       BankConf[9] |= (1 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER output\r
244       BankConf[10] |= (1 << (TSL_CHANNEL_IO(Conf))); //ODR\r
245       break;\r
246     case TSL_BANK_GPIOF: BankConf[11] |= (3 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER input\r
247       BankConf[12] |= (1 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER output\r
248       BankConf[13] |= (1 << (TSL_CHANNEL_IO(Conf))); //ODR\r
249       break;\r
250     case TSL_BANK_GPIOG: BankConf[14] |= (3 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER input\r
251       BankConf[15] |= (1 << (2 * (TSL_CHANNEL_IO(Conf)))); //MODER output\r
252       BankConf[16] |= (1 << (TSL_CHANNEL_IO(Conf))); //ODR\r
253       break;\r
254     default: break;\r
255   }\r
256 }\r
257 \r
258 \r
259 /**\r
260   * @brief  Initializes the acquisition module.\r
261   * @param  None\r
262   * @retval None\r
263   */\r
264 TSL_Status_enum_T TSL_acq_Init(void)\r
265 {\r
266   CONST TSL_Bank_T *LocalBank = &(TSL_Globals.Bank_Array[0]);\r
267   TSL_tNb_T NumberOfBanks = TSLPRM_TOTAL_BANKS;\r
268   TSL_tNb_T LocalNumberOfChannels = 0;\r
269   TSL_tIndex_T idx_bk;\r
270   TSL_tIndex_T idx_ch;\r
271   CONST TSL_ChannelSrc_T *p_chSrc = LocalBank->p_chSrc; // Pointer to the current channel\r
272 \r
273   /* Enables the comparator interface clock */\r
274   RCC->APB1ENR |= RCC_APB1Periph_COMP;\r
275 \r
276   //====================\r
277   // GPIOs configuration\r
278   //====================\r
279   for (idx_bk = 0; idx_bk < NumberOfBanks; idx_bk++)\r
280   {\r
281     LocalBank = &(TSL_Globals.Bank_Array[idx_bk]);\r
282     p_chSrc = LocalBank->p_chSrc;\r
283 \r
284 #if (TSLPRM_USE_SHIELD > 0)\r
285     // Enables GPIOs clock\r
286     TSL_RCC_AHBENR_Config(LocalBank->shield_sample);\r
287 \r
288     // Bank shield configuration\r
289     /* Disables Hysteresis Register */\r
290     TSL_RI_HYSCR_Config(LocalBank->shield_sample);\r
291 \r
292     /* Output PP config */\r
293     TSL_GPIO_OTYPER_PP_Config(p_chSrc->t_sample);\r
294     TSL_GPIO_OTYPER_PP_Config(p_chSrc->t_channel);\r
295     /* 400kHz config */\r
296     TSL_GPIO_OSPEEDR_VL_Config(p_chSrc->t_sample);\r
297     TSL_GPIO_OSPEEDR_VL_Config(p_chSrc->t_channel);\r
298     /* No pull up/pull down config */\r
299     TSL_GPIO_PUPDR_NO_PUPD_Config(LocalBank->shield_sample);\r
300     TSL_GPIO_PUPDR_NO_PUPD_Config(LocalBank->shield_channel);\r
301     /* Set ODR */\r
302     TSL_GPIO_BR_Config(LocalBank->shield_sample);\r
303     TSL_GPIO_BR_Config(LocalBank->shield_channel);\r
304     /* Output mode */\r
305     TSL_GPIO_MODER_OUT_Config(LocalBank->shield_sample);\r
306     TSL_GPIO_MODER_OUT_Config(LocalBank->shield_channel);\r
307 #endif\r
308 \r
309     LocalNumberOfChannels = LocalBank->NbChannels;\r
310 \r
311     for (idx_ch = 0;\r
312          idx_ch < LocalNumberOfChannels;\r
313          idx_ch++)\r
314     {\r
315       /* Enables GPIOs clock */\r
316       TSL_RCC_AHBENR_Config(p_chSrc->t_sample);\r
317       TSL_RCC_AHBENR_Config(p_chSrc->t_channel);\r
318 \r
319       // Bank/channel configuration\r
320       /* Disables Hysteresis Register */\r
321       TSL_RI_HYSCR_Config(p_chSrc->t_sample);\r
322       /* Output PP config */\r
323       TSL_GPIO_OTYPER_PP_Config(p_chSrc->t_sample);\r
324       TSL_GPIO_OTYPER_PP_Config(p_chSrc->t_channel);\r
325       /* 400kHz config */\r
326       TSL_GPIO_OSPEEDR_VL_Config(p_chSrc->t_sample);\r
327       TSL_GPIO_OSPEEDR_VL_Config(p_chSrc->t_channel);\r
328       /* No pull up/pull down config */\r
329       TSL_GPIO_PUPDR_NO_PUPD_Config(p_chSrc->t_sample);\r
330       TSL_GPIO_PUPDR_NO_PUPD_Config(p_chSrc->t_channel);\r
331       /* Set ODR */\r
332       TSL_GPIO_BR_Config(p_chSrc->t_sample);\r
333       TSL_GPIO_BR_Config(p_chSrc->t_channel);\r
334       /* Output mode */\r
335       TSL_GPIO_MODER_OUT_Config(p_chSrc->t_sample);\r
336       TSL_GPIO_MODER_OUT_Config(p_chSrc->t_channel);\r
337 \r
338       p_chSrc++;\r
339     }\r
340   }\r
341 \r
342   /* Enable RI Switch */\r
343   RI->ASCR1 &= (uint32_t)(~0x80000000); // ADC analog switches open !!!\r
344 \r
345   return  TSL_STATUS_OK;\r
346 }\r
347 \r
348 \r
349 /**\r
350   * @brief Configures a Bank.\r
351   * @param[in] idx_bk  Index of the Bank to configure\r
352   * @retval Status\r
353   */\r
354 TSL_Status_enum_T TSL_acq_BankConfig(TSL_tIndex_T idx_bk)\r
355 {\r
356   TSL_tIndex_T index;\r
357   TSL_tIndex_T idx_dest;\r
358   TSL_tIndex_T idx_ch;\r
359   CONST TSL_ChannelDest_T *p_chDest; // Pointer to the current channel\r
360   CONST TSL_ChannelSrc_T *p_chSrc; // Pointer to the current channel\r
361 \r
362   // Check parameters (if USE_FULL_ASSERT is defined)\r
363   assert_param(IS_BANK_INDEX_OK(idx_bk));\r
364 \r
365   bank = &(TSL_Globals.Bank_Array[idx_bk]);\r
366 \r
367   for (index = 0;index < SIZEOFBANKCONF;index++)\r
368   {\r
369     TSL_BankSampleConf[index] = 0x00000000;\r
370     TSL_BankChannelConf[index] = 0x00000000;\r
371   }\r
372 \r
373   NumberOfChannels = bank->NbChannels;\r
374   NumberOfChannelOn = 0;\r
375   GroupToCheck = 0;//init group to check\r
376 \r
377   p_chDest = bank->p_chDest;\r
378   p_chSrc = bank->p_chSrc;\r
379   for (idx_ch = 0; idx_ch < NumberOfChannels; idx_ch++)\r
380   {\r
381     // Get index in the result array associated to the current channel\r
382     idx_dest = p_chDest->IdxDest;\r
383 \r
384     if (bank->p_chData[idx_dest].Flags.ObjStatus != TSL_OBJ_STATUS_OFF)\r
385     {\r
386       TSL_BankConf(TSL_BankSampleConf, p_chSrc->t_sample);\r
387       TSL_BankConf(TSL_BankChannelConf, p_chSrc->t_channel);\r
388       GroupToCheck |= (1 << (p_chSrc->IdxSrc));\r
389       NumberOfChannelOn++;\r
390     }\r
391 \r
392     p_chSrc++;\r
393     p_chDest++;\r
394   }\r
395 \r
396 #if (TSLPRM_USE_GPIOA)\r
397   GPIOA_IDR_Mask = TSL_BankSampleConf[4];\r
398 #endif\r
399 \r
400 #if (TSLPRM_USE_GPIOB)\r
401   GPIOB_IDR_Mask = TSL_BankSampleConf[7];\r
402 #endif\r
403 \r
404 #if (TSLPRM_USE_GPIOC)\r
405   GPIOC_IDR_Mask = TSL_BankSampleConf[10];\r
406 #endif\r
407 \r
408 #if (TSLPRM_USE_GPIOF)\r
409   GPIOF_IDR_Mask = TSL_BankSampleConf[13];\r
410 #endif\r
411 \r
412 #if (TSLPRM_USE_GPIOG)\r
413   GPIOG_IDR_Mask = TSL_BankSampleConf[16];\r
414 #endif\r
415 \r
416 \r
417 #if (TSLPRM_USE_SHIELD > 0)\r
418   if (NumberOfChannelOn != 0)\r
419   {\r
420     TSL_BankConf(TSL_BankSampleConf, bank->shield_sample);\r
421     TSL_BankConf(TSL_BankChannelConf, bank->shield_channel);\r
422   }\r
423 #endif\r
424 \r
425   return TSL_STATUS_OK;\r
426 \r
427 }\r
428 \r
429 \r
430 /**\r
431   * @brief Check which group is not over\r
432   * @param[in] EndedGroup\r
433   * @retval None\r
434   */\r
435 void TSL_acq_GroupDone(uint16_t EndedGroup)\r
436 {\r
437   uint16_t i;\r
438 \r
439   for (i = 0;i < 11;i++)\r
440   {\r
441     if ((EndedGroup & (1 << i)) != (1 << i))\r
442     {\r
443       tab_MeasurementCounter[i] = TSL_Params.AcqMax + 1;\r
444     }\r
445   }\r
446 \r
447 }\r
448 \r
449 \r
450 /**\r
451   * @brief Start acquisition on a previously configured bank\r
452   * @param None\r
453   * @retval None\r
454   */\r
455 void TSL_acq_BankStartAcq(void)\r
456 {\r
457   CONST TSL_Bank_T *LocalBank = &(TSL_Globals.Bank_Array[0]);\r
458   TSL_tNb_T NumberOfBanks = TSLPRM_TOTAL_BANKS;\r
459   TSL_tNb_T LocalNumberOfChannels = 0;\r
460   TSL_tIndex_T BankIndex;\r
461 \r
462   uint16_t MeasurementCounter = 0;\r
463   CONST TSL_ChannelSrc_T *p_chSrc;\r
464   TSL_tIndex_T idx_ch;\r
465   uint16_t GroupToCheckMask = 0;\r
466   uint32_t GPIO_IDR_Mask = 0;\r
467   uint8_t Check_Input = 0;\r
468 \r
469 #if (TSLPRM_USE_GPIOA)\r
470   uint16_t TSL_GPIOA_IDR = 0;\r
471 #endif\r
472 #if (TSLPRM_USE_GPIOB)\r
473   uint16_t TSL_GPIOB_IDR = 0;\r
474 #endif\r
475 #if (TSLPRM_USE_GPIOC)\r
476   uint16_t TSL_GPIOC_IDR = 0;\r
477 #endif\r
478 #if (TSLPRM_USE_GPIOF)\r
479   uint16_t TSL_GPIOF_IDR = 0;\r
480 #endif\r
481 #if (TSLPRM_USE_GPIOG)\r
482   uint16_t TSL_GPIOG_IDR = 0;\r
483 #endif\r
484   uint16_t GPIO_IDR = 0;\r
485 \r
486 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
487   __disable_irq();\r
488 #endif\r
489 #if (TSLPRM_IODEF > 0)\r
490   //============================\r
491   // All GPIOs in Input floating\r
492   //============================\r
493   for (BankIndex = 0; BankIndex < NumberOfBanks; BankIndex++)\r
494   {\r
495     LocalBank = &(TSL_Globals.Bank_Array[BankIndex]);\r
496     p_chSrc = LocalBank->p_chSrc;\r
497 \r
498 #if (TSLPRM_USE_SHIELD > 0)\r
499     TSL_GPIO_MODER_IN_Config(LocalBank->shield_sample);\r
500     TSL_GPIO_MODER_IN_Config(LocalBank->shield_channel);\r
501 #endif\r
502 \r
503     LocalNumberOfChannels = LocalBank->NbChannels;\r
504 \r
505     for (idx_ch = 0;\r
506          idx_ch < LocalNumberOfChannels;\r
507          idx_ch++)\r
508     {\r
509       TSL_GPIO_MODER_IN_Config(p_chSrc->t_sample);\r
510       TSL_GPIO_MODER_IN_Config(p_chSrc->t_channel);\r
511 \r
512       p_chSrc++;\r
513     }\r
514   }\r
515 #endif\r
516 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
517   __enable_irq();\r
518 #endif\r
519 \r
520   /* Open the analog switches */\r
521   RI->ASCR1 &= (uint32_t)(~(TSL_BankSampleConf[0] | TSL_BankChannelConf[0]));\r
522   RI->ASCR2 &= (uint32_t)(~(TSL_BankSampleConf[1] | TSL_BankChannelConf[1]));\r
523 \r
524   /* All IO to pushpull LOW for discharging all capacitors (Ctouch and Csense) */\r
525 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
526   __disable_irq();\r
527 #endif\r
528   /* Discharging sampling capacitor and CTouch */\r
529 #if (TSLPRM_USE_GPIOA)\r
530   GPIOA->ODR &= (uint32_t)(~(TSL_BankSampleConf[4] | TSL_BankChannelConf[4]));\r
531   GPIOA->MODER = (GPIOA->MODER & (uint32_t)(~(TSL_BankSampleConf[2] | TSL_BankChannelConf[2]))) | (TSL_BankSampleConf[3] | TSL_BankChannelConf[3]);\r
532 #endif\r
533 #if (TSLPRM_USE_GPIOB)\r
534   GPIOB->ODR &= (uint32_t)(~(TSL_BankSampleConf[7] | TSL_BankChannelConf[7]));\r
535   GPIOB->MODER = (GPIOB->MODER & (uint32_t)(~(TSL_BankSampleConf[5] | TSL_BankChannelConf[5]))) | (TSL_BankSampleConf[6] | TSL_BankChannelConf[6]);\r
536 #endif\r
537 #if (TSLPRM_USE_GPIOC)\r
538   GPIOC->ODR &= (uint32_t)(~(TSL_BankSampleConf[10] | TSL_BankChannelConf[10]));\r
539   GPIOC->MODER = (GPIOC->MODER & (uint32_t)(~(TSL_BankSampleConf[8] | TSL_BankChannelConf[8]))) | (TSL_BankSampleConf[9] | TSL_BankChannelConf[9]);\r
540 #endif\r
541 #if (TSLPRM_USE_GPIOF)\r
542   GPIOF->ODR &= (uint32_t)(~(TSL_BankSampleConf[13] | TSL_BankChannelConf[13]));\r
543   GPIOF->MODER = (GPIOF->MODER & (uint32_t)(~(TSL_BankSampleConf[11] | TSL_BankChannelConf[11]))) | (TSL_BankSampleConf[12] | TSL_BankChannelConf[12]);\r
544 #endif\r
545 #if (TSLPRM_USE_GPIOG)\r
546   GPIOG->ODR &= (uint32_t)(~(TSL_BankSampleConf[16] | TSL_BankChannelConf[16]));\r
547   GPIOG->MODER = (GPIOG->MODER & (uint32_t)(~(TSL_BankSampleConf[14] | TSL_BankChannelConf[14]))) | (TSL_BankSampleConf[15] | TSL_BankChannelConf[15]);\r
548 #endif\r
549 \r
550 \r
551 \r
552 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
553   __enable_irq();\r
554 #endif\r
555 \r
556   /* Wait a while for a good discharging of all capacitors */\r
557   SoftDelay(50); // ~14µs with fHCLK = 32MHz\r
558   //this time depends of the size of the sampling capacitor\r
559 \r
560 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
561   __disable_irq();\r
562 #endif\r
563   /* All IO in input floating */\r
564 #if (TSLPRM_USE_GPIOA)\r
565   GPIOA->MODER &= (uint32_t)(~(TSL_BankSampleConf[2] | TSL_BankChannelConf[2]));\r
566 #endif\r
567 #if (TSLPRM_USE_GPIOB)\r
568   GPIOB->MODER &= (uint32_t)(~(TSL_BankSampleConf[5] | TSL_BankChannelConf[5]));\r
569 #endif\r
570 #if (TSLPRM_USE_GPIOC)\r
571   GPIOC->MODER &= (uint32_t)(~(TSL_BankSampleConf[8] | TSL_BankChannelConf[8]));\r
572 #endif\r
573 #if (TSLPRM_USE_GPIOF)\r
574   GPIOF->MODER &= (uint32_t)(~(TSL_BankSampleConf[11] | TSL_BankChannelConf[11]));\r
575 #endif\r
576 #if (TSLPRM_USE_GPIOG)\r
577   GPIOG->MODER &= (uint32_t)(~(TSL_BankSampleConf[14] | TSL_BankChannelConf[14]));\r
578 #endif\r
579 \r
580   /* set the IO to Vdd (io in push-pull HIGH when in output mode) */\r
581 #if (TSLPRM_USE_GPIOA)\r
582   GPIOA->ODR |= (TSL_BankSampleConf[4] | TSL_BankChannelConf[4]); /* HIGH level */\r
583 #endif\r
584 #if (TSLPRM_USE_GPIOB)\r
585   GPIOB->ODR |= (TSL_BankSampleConf[7] | TSL_BankChannelConf[7]); /* HIGH level */\r
586 #endif\r
587 #if (TSLPRM_USE_GPIOC)\r
588   GPIOC->ODR |= (TSL_BankSampleConf[10] | TSL_BankChannelConf[10]); /* HIGH level */\r
589 #endif\r
590 #if (TSLPRM_USE_GPIOF)\r
591   GPIOF->ODR |= (TSL_BankSampleConf[13] | TSL_BankChannelConf[13]); /* HIGH level */\r
592 #endif\r
593 #if (TSLPRM_USE_GPIOG)\r
594   GPIOG->ODR |= (TSL_BankSampleConf[16] | TSL_BankChannelConf[16]); /* HIGH level */\r
595 #endif\r
596 \r
597 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
598   __enable_irq();\r
599 #endif\r
600 \r
601   /* Close the sampling capacitor analog switch */\r
602   RI->ASCR1 |= (TSL_BankSampleConf[0]);\r
603   RI->ASCR2 |= (TSL_BankSampleConf[1]);\r
604 \r
605 \r
606   /* Loop while all the 1st channel of each group have not reach the VIH level */\r
607   do\r
608   {\r
609 \r
610 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
611     __disable_irq();\r
612 #endif\r
613     /* Charging Ctouch by connecting the IO to Vdd (io in push-pull HIGH) */\r
614 #if (TSLPRM_USE_GPIOA)\r
615     GPIOA->MODER |= (TSL_BankChannelConf[3]); /* Output push pull config */\r
616 #endif\r
617 #if (TSLPRM_USE_GPIOB)\r
618     GPIOB->MODER |= (TSL_BankChannelConf[6]); /* Output push pull config */\r
619 #endif\r
620 #if (TSLPRM_USE_GPIOC)\r
621     GPIOC->MODER |= (TSL_BankChannelConf[9]); /* Output push pull config */\r
622 #endif\r
623 #if (TSLPRM_USE_GPIOF)\r
624     GPIOF->MODER |= (TSL_BankChannelConf[12]); /* Output push pull config */\r
625 #endif\r
626 #if (TSLPRM_USE_GPIOG)\r
627     GPIOG->MODER |= (TSL_BankChannelConf[15]); /* Output push pull config */\r
628 #endif\r
629 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
630     __enable_irq();\r
631 #endif\r
632 \r
633     /* Wait a while for a good charging (programmable delay) */\r
634     SoftDelay(1);\r
635 \r
636     /* test GPIOx->IDR bit + group configuration for each channel */\r
637 \r
638 #if (TSLPRM_USE_GPIOA)\r
639     TSL_GPIOA_IDR = GPIOA->IDR;\r
640     if ((TSL_GPIOA_IDR & GPIOA_IDR_Mask) != 0)\r
641     {\r
642       Check_Input = 1;\r
643       GPIOA_IDR_Mask &= (uint32_t)(~TSL_GPIOA_IDR);\r
644     }\r
645 #endif\r
646 \r
647 #if (TSLPRM_USE_GPIOB)\r
648     TSL_GPIOB_IDR = GPIOB->IDR;\r
649     if ((TSL_GPIOB_IDR & GPIOB_IDR_Mask) != 0)\r
650     {\r
651       Check_Input = (1 << 1);\r
652       GPIOB_IDR_Mask &= (uint32_t)(~TSL_GPIOB_IDR);\r
653     }\r
654 #endif\r
655 \r
656 #if (TSLPRM_USE_GPIOC)\r
657     TSL_GPIOC_IDR = GPIOC->IDR;\r
658     if ((TSL_GPIOC_IDR & GPIOC_IDR_Mask) != 0)\r
659     {\r
660       Check_Input = (1 << 2);\r
661       GPIOC_IDR_Mask &= (uint32_t)(~TSL_GPIOC_IDR);\r
662     }\r
663 #endif\r
664 \r
665 #if (TSLPRM_USE_GPIOF)\r
666     TSL_GPIOF_IDR = GPIOF->IDR;\r
667     if ((TSL_GPIOF_IDR & GPIOF_IDR_Mask) != 0)\r
668     {\r
669       Check_Input = (1 << 5);\r
670       GPIOF_IDR_Mask &= (uint32_t)(~TSL_GPIOF_IDR);\r
671     }\r
672 #endif\r
673 \r
674 #if (TSLPRM_USE_GPIOG)\r
675     TSL_GPIOG_IDR = GPIOG->IDR;\r
676     if ((TSL_GPIOG_IDR & GPIOG_IDR_Mask) != 0)\r
677     {\r
678       Check_Input = (1 << 6);\r
679       GPIOG_IDR_Mask &= (uint32_t)(~TSL_GPIOG_IDR);\r
680     }\r
681 #endif\r
682 \r
683 \r
684     if (Check_Input)\r
685     {\r
686       p_chSrc = bank->p_chSrc;\r
687       for (idx_ch = 0; idx_ch < NumberOfChannels; idx_ch++)\r
688       {\r
689         GroupToCheckMask = (1 << (p_chSrc->IdxSrc));\r
690         if ((GroupToCheck & GroupToCheckMask) == (GroupToCheckMask))\r
691         {\r
692           GPIO_IDR_Mask = (1 << TSL_CHANNEL_IO(p_chSrc->t_sample));\r
693 \r
694           switch (TSL_CHANNEL_PORT(p_chSrc->t_sample))\r
695           {\r
696 #if (TSLPRM_USE_GPIOA)\r
697             case 0: GPIO_IDR = TSL_GPIOA_IDR; break;\r
698 #endif\r
699 #if (TSLPRM_USE_GPIOB)\r
700             case 1: GPIO_IDR = TSL_GPIOB_IDR; break;\r
701 #endif\r
702 #if (TSLPRM_USE_GPIOC)\r
703             case 2: GPIO_IDR = TSL_GPIOC_IDR; break;\r
704 #endif\r
705 #if (TSLPRM_USE_GPIOF)\r
706             case 5: GPIO_IDR = TSL_GPIOF_IDR; break;\r
707 #endif\r
708 #if (TSLPRM_USE_GPIOG)\r
709             case 6: GPIO_IDR = TSL_GPIOG_IDR; break;\r
710 #endif\r
711             default: break;\r
712           }\r
713 \r
714           if ((GPIO_IDR & GPIO_IDR_Mask) == GPIO_IDR_Mask)\r
715           {\r
716             tab_MeasurementCounter[p_chSrc->IdxSrc] = MeasurementCounter;\r
717             GroupToCheck &= (uint32_t)(~(1 << (p_chSrc->IdxSrc)));\r
718             Check_Input &= (uint32_t)(~(1 << TSL_CHANNEL_PORT(p_chSrc->t_sample)));\r
719           }\r
720         }\r
721         p_chSrc++;\r
722       }\r
723     }\r
724 \r
725     MeasurementCounter++;\r
726 \r
727 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
728     __disable_irq();\r
729 #endif\r
730     /* Configure All channels in input floating */\r
731 #if (TSLPRM_USE_GPIOA)\r
732     GPIOA->MODER &= (uint32_t)(~(TSL_BankChannelConf[2]));\r
733 #endif\r
734 #if (TSLPRM_USE_GPIOB)\r
735     GPIOB->MODER &= (uint32_t)(~(TSL_BankChannelConf[5]));\r
736 #endif\r
737 #if (TSLPRM_USE_GPIOC)\r
738     GPIOC->MODER &= (uint32_t)(~(TSL_BankChannelConf[8]));\r
739 #endif\r
740 #if (TSLPRM_USE_GPIOF)\r
741     GPIOF->MODER &= (uint32_t)(~(TSL_BankChannelConf[11]));\r
742 #endif\r
743 #if (TSLPRM_USE_GPIOG)\r
744     GPIOG->MODER &= (uint32_t)(~(TSL_BankChannelConf[14]));\r
745 #endif\r
746 \r
747 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
748     __enable_irq();\r
749 #endif\r
750 \r
751     /* Charging the Csense cap with connecting it to Ctouch by closing the analog switch */\r
752     RI->ASCR1 |= (TSL_BankChannelConf[0]);\r
753     RI->ASCR2 |= (TSL_BankChannelConf[1]);\r
754 \r
755     /* Wait a while for a good charge transfering (programmable delay) */\r
756     SoftDelay(1);\r
757 \r
758     RI->ASCR1 &= (uint32_t)(~(TSL_BankChannelConf[0]));\r
759     RI->ASCR2 &= (uint32_t)(~(TSL_BankChannelConf[1]));\r
760 \r
761     /*it's better to implement this like that because it's much more faster than to put this test in the "while test" below */\r
762     if (MeasurementCounter > TSL_Params.AcqMax)\r
763     {\r
764       TSL_acq_GroupDone(GroupToCheck);\r
765       __NOP();\r
766       break;\r
767     }\r
768 \r
769   }\r
770   while (GroupToCheck != 0);\r
771 \r
772 \r
773 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
774   __disable_irq();\r
775 #endif\r
776   //====================\r
777   // All GPIOs in PP Low\r
778   //====================\r
779   for (BankIndex = 0; BankIndex < NumberOfBanks; BankIndex++)\r
780   {\r
781     LocalBank = &(TSL_Globals.Bank_Array[BankIndex]);\r
782     p_chSrc = LocalBank->p_chSrc;\r
783 \r
784 #if (TSLPRM_USE_SHIELD > 0)\r
785     TSL_GPIO_BR_Config(LocalBank->shield_sample);\r
786     TSL_GPIO_BR_Config(LocalBank->shield_channel);\r
787     TSL_GPIO_MODER_OUT_Config(LocalBank->shield_sample);\r
788     TSL_GPIO_MODER_OUT_Config(LocalBank->shield_channel);\r
789 #endif\r
790 \r
791     LocalNumberOfChannels = LocalBank->NbChannels;\r
792 \r
793     for (idx_ch = 0;\r
794          idx_ch < LocalNumberOfChannels;\r
795          idx_ch++)\r
796     {\r
797       TSL_GPIO_BR_Config(p_chSrc->t_sample);\r
798       TSL_GPIO_BR_Config(p_chSrc->t_channel);\r
799       TSL_GPIO_MODER_OUT_Config(p_chSrc->t_sample);\r
800       TSL_GPIO_MODER_OUT_Config(p_chSrc->t_channel);\r
801 \r
802       p_chSrc++;\r
803     }\r
804   }\r
805 #if (TSLPRM_PROTECT_IO_ACCESS > 0)\r
806   __enable_irq();\r
807 #endif\r
808 \r
809 \r
810 }\r
811 \r
812 \r
813 /**\r
814   * @brief Wait end of acquisition\r
815   * @param None\r
816   * @retval status\r
817   */\r
818 TSL_Status_enum_T TSL_acq_BankWaitEOC(void)\r
819 {\r
820   TSL_Status_enum_T retval = TSL_STATUS_BUSY;\r
821   retval = TSL_STATUS_OK;\r
822   return retval;\r
823 }\r
824 \r
825 \r
826 /**\r
827   * @brief Return the current measure\r
828   * @param[in] index Index of the measure source\r
829   * @retval Measure\r
830   */\r
831 TSL_tMeas_T TSL_acq_GetMeas(TSL_tIndex_T index)\r
832 {\r
833   return(tab_MeasurementCounter[index]);\r
834 }\r
835 \r
836 \r
837 /**\r
838   * @brief  Check noise (not used)\r
839   * @param  None\r
840   * @retval Status\r
841   */\r
842 TSL_AcqStatus_enum_T TSL_acq_CheckNoise(void)\r
843 {\r
844   return TSL_ACQ_STATUS_OK;\r
845 }\r
846 \r
847 \r
848 /**\r
849   * @brief  Process the TS Interrupt routine\r
850   * @param  None\r
851   * @retval None\r
852   */\r
853 void TSL_acq_ProcessIT(void)\r
854 {\r
855 }\r
856 \r
857 /**\r
858   * @brief Check if a filter must be used on the current channel (not used)\r
859   * @param[in] pCh Pointer on the channel data information\r
860   * @retval Result TRUE if a filter can be applied\r
861   */\r
862 TSL_Bool_enum_T TSL_acq_UseFilter(TSL_ChannelData_T *pCh)\r
863 {\r
864   return TSL_TRUE;\r
865 }\r
866 \r
867 \r
868 /**\r
869   * @brief Compute the Delta value\r
870   * @param[in] ref Reference value\r
871   * @param[in] meas Last Measurement value\r
872   * @retval Delta value\r
873   */\r
874 TSL_tDelta_T TSL_acq_ComputeDelta(TSL_tRef_T ref, TSL_tMeas_T meas)\r
875 {\r
876   return((TSL_tDelta_T)(ref - meas));\r
877 }\r
878 \r
879 \r
880 /**\r
881   * @brief Compute the Measurement value\r
882   * @param[in] ref Reference value\r
883   * @param[in] delta Delta value\r
884   * @retval Measurement value\r
885   */\r
886 TSL_tMeas_T TSL_acq_ComputeMeas(TSL_tRef_T ref, TSL_tDelta_T delta)\r
887 {\r
888   return((TSL_tMeas_T)(ref - delta));\r
889 }\r
890 \r
891 \r
892 /**\r
893   * @brief Test if the Reference is incorrect (not used)\r
894   * @param[in] pCh Pointer on the channel data information\r
895   * @retval Result TRUE if the Reference is out of range\r
896   */\r
897 TSL_Bool_enum_T TSL_acq_TestReferenceOutOfRange(TSL_ChannelData_T *pCh)\r
898 {\r
899   return TSL_FALSE;\r
900 }\r
901 \r
902 \r
903 /**\r
904   * @brief Test if the measure has crossed the reference target (not used)\r
905   * @param[in] pCh Pointer on the channel data information\r
906   * @param[in] new_meas Measure of the last acquisition on this channel\r
907   * @retval Result TRUE if the Reference is valid\r
908   */\r
909 TSL_Bool_enum_T TSL_acq_TestFirstReferenceIsValid(TSL_ChannelData_T *pCh, TSL_tMeas_T new_meas)\r
910 {\r
911   return TSL_TRUE;\r
912 }\r
913 \r
914 \r
915 #if defined(__IAR_SYSTEMS_ICC__) // IAR/EWARM\r
916 #pragma optimize=medium\r
917 #elif defined(__CC_ARM) // Keil/MDK-ARM\r
918 #pragma O1\r
919 #pragma Ospace\r
920 #elif defined(__TASKING__) // Altium/Tasking\r
921 #pragma optimize O0\r
922 #elif defined(__GNUC__) // Atollic/True Studio + Raisonance/RKit\r
923 #pragma GCC push_options\r
924 #pragma GCC optimize ("O0")\r
925 #endif\r
926 /**\r
927   * @brief  Software delay (private routine)\r
928   * @param  val Wait delay\r
929   * With fHCLK = 32MHz: 1 = ~1µs, 50 = ~14µs, 100 = ~25µs, 200 = ~50µs\r
930   * @retval None\r
931   */\r
932 void SoftDelay(uint16_t val)\r
933 {\r
934   __IO uint16_t i;\r
935   for (i = val; i > 0; i--)\r
936   {}\r
937 }\r
938 #if defined(__TASKING__)\r
939 #pragma endoptimize\r
940 #endif\r
941 \r
942 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r