1
0

HAL_TKEY.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. /*
  2. ******************************************************************************
  3. * @file HAL_TKEY.c
  4. * @version V1.0.0
  5. * @date 2020
  6. * @brief DMA HAL module driver.
  7. * This file provides firmware functions to manage the following
  8. * functionalities of the Direct Memory Access (DMA) peripheral:
  9. * @ Initialization and de-initialization functions
  10. * @ IO operation functions
  11. ******************************************************************************
  12. */
  13. #include "ACM32Fxx_HAL.h"
  14. __IO uint32_t u32Regbackup;
  15. /************************************************************************
  16. * function : TKEY_IRQHandler
  17. * Description: tkey interrupt service routine.
  18. * input :
  19. * none
  20. * return: none
  21. ************************************************************************/
  22. void TKEY_IRQHandler(void)
  23. {
  24. TKEY->ISR = 0xFFF;
  25. }
  26. /************************************************************************
  27. * function : HAL_TKEY_MspInit
  28. * Description: Init the hardware, GPIO and clock, etc.
  29. * input : htkey : TKEY handle
  30. * return : none
  31. ************************************************************************/
  32. void HAL_TKEY_MspInit(TKEY_HandleTypeDef* htkey)
  33. {
  34. /* For Example */
  35. GPIO_InitTypeDef GPIO_Handle;
  36. uint8_t ucI;
  37. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  38. {
  39. /* TKEY0 GPIO inition*/
  40. if(htkey->ChannelData[ucI].ChannelId < 4) /*TKEY0-3 -> PA10-13*/
  41. {
  42. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId + 10));
  43. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  44. GPIO_Handle.Pull = GPIO_NOPULL;
  45. HAL_GPIO_Init(GPIOA, &GPIO_Handle);
  46. }
  47. if((htkey->ChannelData[ucI].ChannelId >= 4)&&(htkey->ChannelData[ucI].ChannelId <= 5)) /*TKEY4-5 -> PD6-7*/
  48. {
  49. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId + 2));
  50. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  51. GPIO_Handle.Pull = GPIO_NOPULL;
  52. HAL_GPIO_Init(GPIOD, &GPIO_Handle);
  53. }
  54. if((htkey->ChannelData[ucI].ChannelId >= 6)&&(htkey->ChannelData[ucI].ChannelId <= 7)) /*TKEY6-7 -> PA14-15*/
  55. {
  56. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId + 8));
  57. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  58. GPIO_Handle.Pull = GPIO_NOPULL;
  59. HAL_GPIO_Init(GPIOA, &GPIO_Handle);
  60. }
  61. if((htkey->ChannelData[ucI].ChannelId >= 8)&&(htkey->ChannelData[ucI].ChannelId <= 10)) /*TKEY8-10 -> PC10-12*/
  62. {
  63. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId + 2));
  64. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  65. GPIO_Handle.Pull = GPIO_NOPULL;
  66. HAL_GPIO_Init(GPIOC, &GPIO_Handle);
  67. }
  68. if(htkey->ChannelData[ucI].ChannelId == 11) /*TKEY11 -> PD2*/
  69. {
  70. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId - 9));
  71. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  72. GPIO_Handle.Pull = GPIO_NOPULL;
  73. HAL_GPIO_Init(GPIOD, &GPIO_Handle);
  74. }
  75. if((htkey->ChannelData[ucI].ChannelId >= 12)&&(htkey->ChannelData[ucI].ChannelId <= 15)) /*TKEY12-15 -> PB3-6*/
  76. {
  77. GPIO_Handle.Pin = (uint16_t)(0x0001 << (htkey->ChannelData[ucI].ChannelId - 9));
  78. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  79. GPIO_Handle.Pull = GPIO_NOPULL;
  80. HAL_GPIO_Init(GPIOB, &GPIO_Handle);
  81. }
  82. }
  83. if(htkey->Init.ShieldEn == TKEY_CR_SCAN_ENABLE) /*TKEY_SHIELD -> PB7*/
  84. {
  85. GPIO_Handle.Pin = GPIO_PIN_7;
  86. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  87. GPIO_Handle.Pull = GPIO_NOPULL;
  88. HAL_GPIO_Init(GPIOB, &GPIO_Handle);
  89. }
  90. /*Set the Cs(PB9) and Creg(PB8) pin to analog*/
  91. GPIO_Handle.Pin = GPIO_PIN_8 | GPIO_PIN_9;
  92. GPIO_Handle.Mode = GPIO_MODE_ANALOG;
  93. GPIO_Handle.Pull = GPIO_NOPULL;
  94. HAL_GPIO_Init(GPIOB, &GPIO_Handle);
  95. SCU->RCHCR |= ((15 << 17) | SCU_RCHCR_RC4M_EN); //RC4M TRIM and Enable.
  96. while((SCU->RCHCR & SCU_RCHCR_RC4MRDY) == 0x00);
  97. SCU->CCR2 |= SCU_CCR2_TKSCLK_SEL; //TKEY use the RC4M as clock.
  98. System_Enable_RC32K(); //RC32K Enable.
  99. System_Module_Reset(RST_TKEY);
  100. /* Enable TKEY Clock */
  101. System_Module_Enable(EN_TKEY);
  102. /* Disable TKEY Interrupt */
  103. NVIC_ClearPendingIRQ(TKEY_IRQn);
  104. NVIC_DisableIRQ(TKEY_IRQn);
  105. }
  106. /************************************************************************
  107. * function : HAL_TKEY_Start
  108. * Description: TKEY start to scan
  109. * input : htkey : TKEY handle
  110. * return : HAL_OK: success; HAL_ERROR: failed.
  111. ************************************************************************/
  112. HAL_StatusTypeDef HAL_TKEY_Start(TKEY_HandleTypeDef* htkey)
  113. {
  114. /* Check the parameters */
  115. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  116. /*Enable the Tkey scan*/
  117. SET_BIT(htkey->Instance->CR , TKEY_CR_SCAN);
  118. /*Start the Tkey scan*/
  119. SET_BIT(htkey->Instance->CR, TKEY_CR_START);
  120. /* Return function status */
  121. return HAL_OK;
  122. }
  123. /************************************************************************
  124. * function : HAL_TKEY_Stop
  125. * Description: TKEY stop the scan
  126. * input : htkey : TKEY handle
  127. * return : HAL_OK: success; HAL_ERROR: failed.
  128. ************************************************************************/
  129. HAL_StatusTypeDef HAL_TKEY_Stop(TKEY_HandleTypeDef* htkey)
  130. {
  131. /* Check the parameters */
  132. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  133. /*Check if the Tkey scan is busy*/
  134. while(READ_BIT(htkey->Instance->ISR , TKEY_ISR_BUSY)){}
  135. /*disable the Tkey scan*/
  136. CLEAR_BIT(htkey->Instance->CR, TKEY_CR_SCAN);
  137. /* Return function status */
  138. return HAL_OK;
  139. }
  140. /************************************************************************
  141. * function : HAL_TKEY_Suspend
  142. * Description: Set the sleep parameters.
  143. * input : htkey : TKEY handle
  144. * return : HAL_OK: success; HAL_ERROR: failed.
  145. ************************************************************************/
  146. HAL_StatusTypeDef HAL_TKEY_Suspend(TKEY_HandleTypeDef* htkey)
  147. {
  148. uint8_t ucI;
  149. __IO uint32_t *gu32RegTemp;
  150. /* Check the parameters */
  151. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  152. /* Disable TKEY Interrupt */
  153. NVIC_ClearPendingIRQ(TKEY_IRQn);
  154. NVIC_DisableIRQ(TKEY_IRQn);
  155. u32Regbackup = htkey->Instance->SMPR;
  156. MODIFY_REG(htkey->Instance->SMPR, TKEY_SMPR_SWT_MASK, TKEY_SMPR_SWT(htkey->ScanPara.SleepScanWaitTime)); //Slow down the scan speed.
  157. SET_BIT(htkey->Instance->CR, TKEY_CR_SLEEP); //Enable the wakeup.
  158. SET_BIT(htkey->Instance->IER, TKEY_IER_WAKEUPIE); //Enable the wakeup interrupt.
  159. gu32RegTemp = &htkey->Instance->CH0;
  160. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  161. {
  162. /* Write the base data and the wakeup threshold.*/
  163. *(gu32RegTemp + htkey->ChannelData[ucI].ChannelId) = htkey->ChannelData[ucI].Tkey_Data->Data;
  164. *(gu32RegTemp - 16 + htkey->ChannelData[ucI].ChannelId) = htkey->ChannelData[ucI].Tkey_RefPara->RefDelta*htkey->ScanPara.WakeUpThRatio;
  165. }
  166. /* Enable TKEY Interrupt */
  167. NVIC_ClearPendingIRQ(TKEY_IRQn);
  168. NVIC_EnableIRQ(TKEY_IRQn);
  169. /*Start the Tkey scan*/
  170. SET_BIT(htkey->Instance->CR, TKEY_CR_START);
  171. return HAL_OK;
  172. }
  173. /************************************************************************
  174. * function : HAL_TKEY_Resume
  175. * Description: Resume the wakeup parameters.
  176. * input : htkey : TKEY handle
  177. * return : HAL_OK: success; HAL_ERROR: failed.
  178. ************************************************************************/
  179. HAL_StatusTypeDef HAL_TKEY_Resume(TKEY_HandleTypeDef* htkey)
  180. {
  181. /* Disable TKEY Interrupt */
  182. NVIC_ClearPendingIRQ(TKEY_IRQn);
  183. NVIC_DisableIRQ(TKEY_IRQn);
  184. CLEAR_BIT(htkey->Instance->IER, TKEY_IER_WAKEUPIE); //Disable the wakeup interrupt.
  185. htkey->Instance->SMPR = u32Regbackup; //Use the backup scan value.
  186. CLEAR_BIT(htkey->Instance->CR, TKEY_CR_SLEEP); //Disable the wakeup.
  187. return HAL_OK;
  188. }
  189. /************************************************************************
  190. * function : HAL_TKEY_ReadNr
  191. * Description: Read the count number of the Cr.
  192. * input : htkey : TKEY handle
  193. * return : HAL_OK: success; HAL_ERROR: failed.
  194. ************************************************************************/
  195. HAL_StatusTypeDef HAL_TKEY_ReadNr(TKEY_HandleTypeDef* htkey)
  196. {
  197. HAL_StatusTypeDef Status = HAL_OK;
  198. /* Check the parameters */
  199. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  200. /*Check if the Tkey scan is busy*/
  201. while(READ_BIT(htkey->Instance->ISR , TKEY_ISR_BUSY)){}
  202. /*Set the CREN, enabel the internal channel scan*/
  203. SET_BIT(htkey->Instance->CR, TKEY_CR_CREN);
  204. /*Clear the SLEEP, use normal scan mode*/
  205. CLEAR_BIT(htkey->Instance->CR, TKEY_CR_SLEEP);
  206. /* Clear all flag */
  207. htkey->Instance->ISR = 0x07;
  208. HAL_TKEY_Start(htkey);
  209. while(!READ_BIT(htkey->Instance->ISR, TKEY_ISR_EOC))
  210. {
  211. if(!READ_BIT(htkey->Instance->ISR, TKEY_ISR_BUSY)) //Some times will stop.restart.
  212. SET_BIT(htkey->Instance->CR, TKEY_CR_START);
  213. if(READ_BIT(htkey->Instance->ISR, TKEY_ISR_TIMEOUT))
  214. {
  215. SET_BIT(htkey->Instance->ISR, TKEY_ISR_TIMEOUT); //Clear the timeout flag
  216. Status = HAL_ERROR;
  217. break;
  218. }
  219. }
  220. htkey->Instance->ISR = TKEY_ISR_EOC;
  221. htkey->NrData = htkey->Instance->DR;
  222. return Status;
  223. }
  224. /************************************************************************
  225. * function : HAL_TKEY_ReadChannelData
  226. * Description: Read the count number of the all channels.
  227. * input : htkey : TKEY handle
  228. * return : HAL_OK: success; HAL_ERROR: failed.
  229. ************************************************************************/
  230. HAL_StatusTypeDef HAL_TKEY_ReadChannelData(TKEY_HandleTypeDef* htkey)
  231. {
  232. uint8_t ucI;
  233. __IO uint32_t *gu32RegTemp;
  234. htkey->Instance->ISR = 0x07;
  235. if(!(htkey->Instance->CR & TKEY_CR_CONT))
  236. {
  237. /*Start the Tkey scan*/
  238. SET_BIT(htkey->Instance->CR, TKEY_CR_START);
  239. }
  240. while(!READ_BIT(htkey->Instance->ISR, TKEY_ISR_EOC))
  241. {
  242. if(!READ_BIT(htkey->Instance->ISR, TKEY_ISR_BUSY)) //Some times will stop.restart.
  243. SET_BIT(htkey->Instance->CR, TKEY_CR_START);
  244. if(READ_BIT(htkey->Instance->ISR, TKEY_ISR_TIMEOUT))
  245. {
  246. SET_BIT(htkey->Instance->ISR, TKEY_ISR_TIMEOUT); //Clear the timeout flag
  247. return HAL_ERROR;
  248. }
  249. }
  250. htkey->Instance->ISR = TKEY_ISR_EOC;
  251. gu32RegTemp = &htkey->Instance->CH0;
  252. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  253. {
  254. /* Read the data and calculate the delta.*/
  255. htkey->ChannelData[ucI].Tkey_Data->Data = *(gu32RegTemp + htkey->ChannelData[ucI].ChannelId);
  256. htkey->ChannelData[ucI].Tkey_Data->Delta = (INT32)htkey->ChannelData[ucI].Tkey_Data->RefData - (INT32)htkey->ChannelData[ucI].Tkey_Data->Data;
  257. }
  258. return HAL_OK;
  259. }
  260. /************************************************************************
  261. * function : HAL_TKEY_ReadAllNx
  262. * Description: Read the count number of the all channels first time, and start the scan.
  263. * input : htkey : TKEY handle
  264. * return : HAL_OK: success; HAL_ERROR: failed.
  265. ************************************************************************/
  266. HAL_StatusTypeDef HAL_TKEY_ReadAllNx(TKEY_HandleTypeDef* htkey)
  267. {
  268. uint8_t ucI;
  269. /* Check the parameters */
  270. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  271. /*Clear the CREN, disable the internal channel scan*/
  272. CLEAR_BIT(htkey->Instance->CR, TKEY_CR_CREN);
  273. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  274. {
  275. /*Enable the channels*/
  276. htkey->Instance->CXSELR |= (1<<htkey->ChannelData[ucI].ChannelId);
  277. /*If the channel need compensation*/
  278. if(htkey->ChannelData[ucI].Tkey_RefPara->CrSelect)
  279. htkey->Instance->CRSELR |= (1<<htkey->ChannelData[ucI].ChannelId);
  280. }
  281. /*Clear the SLEEP, use normal scan mode*/
  282. CLEAR_BIT(htkey->Instance->CR, TKEY_CR_SLEEP);
  283. HAL_TKEY_Start(htkey);
  284. HAL_TKEY_ReadChannelData(htkey);
  285. return HAL_OK;
  286. }
  287. /************************************************************************
  288. * function : HAL_TKEY_StartUpStateProcess
  289. * Description: Init the TKEY channel data.
  290. * input : ChannelData : TKEY channel data handle point to TKEY_ChannelDataDef.
  291. * return : None
  292. ************************************************************************/
  293. void HAL_TKEY_StartUpStateProcess(const TKEY_ChannelDataDef *ChannelData)
  294. {
  295. ChannelData->Tkey_Data->DebIn = ChannelData->Tkey_RefPara->DebIn;
  296. ChannelData->Tkey_Data->DebOut = ChannelData->Tkey_RefPara->DebOut;
  297. ChannelData->Tkey_Data->StateId = TKEY_STATEID_RELEASE;
  298. }
  299. /************************************************************************
  300. * function : HAL_TKEY_DebDetectStateProcess
  301. * Description: The TKEY detect action state process.
  302. * input : ChannelData : TKEY channel data handle point to TKEY_ChannelDataDef.
  303. * return : None
  304. ************************************************************************/
  305. void HAL_TKEY_DebDetectStateProcess(const TKEY_ChannelDataDef *ChannelData)
  306. {
  307. if (ChannelData->Tkey_Data->Delta >= ChannelData->Tkey_RefPara->DetectInTH)
  308. {
  309. if (ChannelData->Tkey_Data->DebIn > 0)
  310. {
  311. ChannelData->Tkey_Data->DebIn--;
  312. }
  313. if (ChannelData->Tkey_Data->DebIn == 0)
  314. {
  315. ChannelData->Tkey_Data->StateId = TKEY_STATEID_DETECT;
  316. ChannelData->Tkey_Data->DebOut = ChannelData->Tkey_RefPara->DebOut;
  317. }
  318. // else stay in Debounce Detect
  319. }
  320. else
  321. {
  322. ChannelData->Tkey_Data->StateId = TKEY_STATEID_RELEASE;
  323. ChannelData->Tkey_Data->DebIn = ChannelData->Tkey_RefPara->DebIn;
  324. }
  325. }
  326. /************************************************************************
  327. * function : HAL_TKEY_DebReleaseDetectStateProcess
  328. * Description: The TKEY detect to release state process.
  329. * input : ChannelData : TKEY channel data handle point to TKEY_ChannelDataDef.
  330. * return : None
  331. ************************************************************************/
  332. void HAL_TKEY_DebReleaseDetectStateProcess(const TKEY_ChannelDataDef *ChannelData)
  333. {
  334. if (ChannelData->Tkey_Data->Delta >= ChannelData->Tkey_RefPara->DetectOutTH)
  335. {
  336. ChannelData->Tkey_Data->StateId = TKEY_STATEID_DETECT;
  337. ChannelData->Tkey_Data->DebOut = ChannelData->Tkey_RefPara->DebOut;
  338. }
  339. else
  340. {
  341. if (ChannelData->Tkey_Data->DebOut > 0)
  342. {
  343. ChannelData->Tkey_Data->DebOut--;
  344. }
  345. if (ChannelData->Tkey_Data->DebOut == 0)
  346. {
  347. ChannelData->Tkey_Data->StateId = TKEY_STATEID_RELEASE;
  348. ChannelData->Tkey_Data->DebIn = ChannelData->Tkey_RefPara->DebIn;
  349. }
  350. }
  351. }
  352. /************************************************************************
  353. * function : HAL_TKEY_Init
  354. * Description: Init the TKEY.
  355. * input : htkey : TKEY handle
  356. * return : HAL_OK: success; HAL_ERROR: failed.
  357. ************************************************************************/
  358. HAL_StatusTypeDef HAL_TKEY_Init(TKEY_HandleTypeDef* htkey)
  359. {
  360. uint8_t ucI;
  361. uint32_t u32RegTemp;
  362. /* Check the TKEY handle allocation */
  363. if (htkey == NULL)
  364. {
  365. return HAL_ERROR;
  366. }
  367. /* Check the parameters */
  368. if(!IS_TKEY_ALL_INSTANCE(htkey->Instance)) return HAL_ERROR;
  369. if(!IS_TKEY_ALL_VKEYSEL(htkey->Init.VkeySel)) return HAL_ERROR;
  370. if(!IS_TKEY_ALL_VREFSEL(htkey->Init.VrefSel)) return HAL_ERROR;
  371. if(!IS_TKEY_ALL_SHIELDEN(htkey->Init.ShieldEn)) return HAL_ERROR;
  372. if(!IS_TKEY_ALL_SCANWAITTIME(htkey->Init.ScanWaitTime)) return HAL_ERROR;
  373. if(!IS_TKEY_ALL_CSDISCHARGETIME(htkey->Init.CsDisChargeTime)) return HAL_ERROR;
  374. if(!IS_TKEY_ALL_SW1(htkey->Init.Sw1H)) return HAL_ERROR;
  375. if(!IS_TKEY_ALL_SW1(htkey->Init.Sw1L)) return HAL_ERROR;
  376. /* Init the low level hardware : GPIO, CLOCK, NVIC, DMA */
  377. HAL_TKEY_MspInit(htkey);
  378. /*Check if the Tkey scan is busy*/
  379. while(READ_BIT(htkey->Instance->ISR , TKEY_ISR_BUSY)){}
  380. HAL_TKEY_Stop(htkey);
  381. /*Config the Tkey control register*/
  382. u32RegTemp = ((TKEY_CR_CHARGESEL_LDO << 11)& TKEY_CR_CHARGESEL) | \
  383. (TKEY_CR_VKEYSEL(htkey->Init.VkeySel) & TKEY_CR_VKEYSEL_MASK) | \
  384. (TKEY_CR_VREFSEL(htkey->Init.VrefSel) & TKEY_CR_VREFSEL_MASK) | \
  385. ((TKEY_CR_SPREAD_DISABLE << 5)& TKEY_CR_SPREAD) | \
  386. ((TKEY_CR_CONT_ENABLE << 4)& TKEY_CR_CONT) | \
  387. ((htkey->Init.ShieldEn << 3)& TKEY_CR_SHIELDEN);
  388. WRITE_REG(htkey->Instance->CR,u32RegTemp);
  389. /*Config the Tkey TKEY_SMPR register*/
  390. u32RegTemp = (TKEY_SMPR_SWT(htkey->Init.ScanWaitTime) & TKEY_SMPR_SWT_MASK) | \
  391. (TKEY_SMPR_CST(htkey->Init.CsDisChargeTime) & TKEY_SMPR_CST_MASK);
  392. WRITE_REG(htkey->Instance->SMPR,u32RegTemp);
  393. /*Config the Tkey TKEY_SOFR register*/
  394. u32RegTemp = (TKEY_SOFR_SW1H(htkey->Init.Sw1H) & TKEY_SOFR_SW1H_MASK) | \
  395. (TKEY_SOFR_SW1L(htkey->Init.Sw1L) & TKEY_SOFR_SW1L_MASK);
  396. WRITE_REG(htkey->Instance->SOFR,u32RegTemp);
  397. HAL_TKEY_ReadNr(htkey);
  398. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  399. {
  400. /* if need calibrate , read the data to the reference data.*/
  401. htkey->ChannelData[ucI].Tkey_Data->StateId = TKEY_STATEID_STARTUP;
  402. htkey->ChannelData[ucI].Tkey_Data->ReferenceFlag = 1;
  403. htkey->ChannelData[ucI].Tkey_RefPara->DetectInTH = htkey->ChannelData[ucI].Tkey_RefPara->RefDelta*htkey->ScanPara.DetectInThRatio;
  404. htkey->ChannelData[ucI].Tkey_RefPara->DetectOutTH = htkey->ChannelData[ucI].Tkey_RefPara->RefDelta*htkey->ScanPara.DetectOutThRatio;
  405. htkey->ChannelData[ucI].Tkey_RefPara->CalibratTH = htkey->ChannelData[ucI].Tkey_RefPara->RefDelta*htkey->ScanPara.CalibratThRatio;
  406. }
  407. HAL_TKEY_ReadAllNx(htkey);
  408. /* Clear all keys*/
  409. htkey->ChannelDetected = 0;
  410. htkey->ChannelDetectedNum = 0;
  411. return HAL_OK;
  412. }
  413. /************************************************************************
  414. * function : HAL_TKEY_DetectProcess
  415. * Description: TKEY detect main process.
  416. * input : htkey : TKEY handle
  417. * return : None.
  418. ************************************************************************/
  419. void HAL_TKEY_DetectProcess(TKEY_HandleTypeDef* htkey)
  420. {
  421. uint8_t ucI;
  422. const TKEY_ChannelDataDef *ChannelData;
  423. HAL_TKEY_ReadChannelData(htkey);
  424. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  425. {
  426. ChannelData = &htkey->ChannelData[ucI];
  427. switch(ChannelData->Tkey_Data->StateId)
  428. {
  429. case TKEY_STATEID_STARTUP :
  430. HAL_TKEY_StartUpStateProcess(ChannelData);
  431. break;
  432. case TKEY_STATEID_RELEASE :
  433. HAL_TKEY_DebDetectStateProcess(ChannelData);
  434. break;
  435. case TKEY_STATEID_DETECT :
  436. if(htkey->ScanTimer >= htkey->ScanPara.DetectingTimeout)
  437. htkey->ChannelDetecting |= (1 << ChannelData->ChannelId);
  438. HAL_TKEY_DebReleaseDetectStateProcess(ChannelData);
  439. if(ChannelData->Tkey_Data->StateId == TKEY_STATEID_RELEASE)
  440. {
  441. htkey->ChannelDetected |= (1 << ChannelData->ChannelId);
  442. htkey->ChannelValue = ChannelData->ChannelId;
  443. htkey->ChannelDetectedNum++;
  444. htkey->ChannelDetecting &= ~(1 << ChannelData->ChannelId);
  445. htkey->ScanTimer = 0; //Reset the timer when detect Key release.
  446. }
  447. break;
  448. default :
  449. break;
  450. }
  451. if((htkey->ChannelData[ucI].Tkey_Data->Delta > htkey->ChannelData[ucI].Tkey_RefPara->CalibratTH) \
  452. ||(htkey->ChannelData[ucI].Tkey_Data->Delta < (-htkey->ChannelData[ucI].Tkey_RefPara->CalibratTH)))
  453. {
  454. htkey->ScanTimer++;
  455. if(htkey->ScanTimer >= htkey->ScanPara.CalibratTimeout)
  456. {
  457. htkey->CalFlag = 1; //Need calibrate.
  458. htkey->ScanTimer = 0;
  459. htkey->ChannelDetected = 0;
  460. htkey->ChannelDetecting = 0;
  461. break;
  462. }
  463. }
  464. if((htkey->ChannelData[ucI].Tkey_Data->Delta > 2*htkey->ChannelData[ucI].Tkey_RefPara->RefDelta) \
  465. ||(htkey->ChannelData[ucI].Tkey_Data->Delta < (-htkey->ChannelData[ucI].Tkey_RefPara->RefDelta)))
  466. {
  467. htkey->CalFlag = 1; //Need calibrate.
  468. htkey->ScanTimer = 0;
  469. htkey->ChannelDetected = 0;
  470. htkey->ChannelDetecting = 0;
  471. break;
  472. }
  473. if(htkey->ChannelDetecting) //If don't need detecting.
  474. {
  475. htkey->ChannelDetecting = 0;
  476. htkey->CalFlag = 1; //Need calibrate.
  477. }
  478. }
  479. }
  480. /************************************************************************
  481. * function : HAL_TKEY_Calibrate_RefData
  482. * Description: TKEY Calibrate the base Reference Data.
  483. * input : htkey : TKEY handle
  484. CalTimes: The calibrat times.
  485. * return : None
  486. ************************************************************************/
  487. void HAL_TKEY_Calibrate_RefData(TKEY_HandleTypeDef* htkey, uint8_t CalTimes)
  488. {
  489. uint8_t ucI,ucJ;
  490. uint32_t sum[16];
  491. memset(sum,0,sizeof(sum));
  492. for(ucJ=0; ucJ < CalTimes; ucJ++)
  493. {
  494. HAL_TKEY_ReadChannelData(htkey);
  495. for(ucI = 0; htkey->ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
  496. {
  497. if(htkey->ChannelData[ucI].Tkey_Data->Data)
  498. {
  499. sum[ucI] += htkey->ChannelData[ucI].Tkey_Data->Data;
  500. }
  501. if(ucJ == (CalTimes-1))
  502. {
  503. htkey->ChannelData[ucI].Tkey_Data->RefData = sum[ucI]/CalTimes;
  504. }
  505. }
  506. }
  507. }