n32xx_tsc_alg_api.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/
  27. /**
  28. * @brief 触控算法头文件.
  29. * 大概流程:(配置TIMER->定义回调API->初始化->启动)
  30. * @file n32xx_tsc_alg_api.h
  31. * @author Nations
  32. * @version v1.0.1
  33. * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  34. */
  35. #ifndef __N32XX_TSC_ALG_API__
  36. #define __N32XX_TSC_ALG_API__
  37. #ifdef __cplusplus
  38. extern "C" {
  39. #endif // defined __cplusplus
  40. #define TSC_ALG_VERSION_NUMBER "Ver1.0.4" //算法库版本号
  41. #define TSC_ALG_HANDLER_STOP2_DATA_SIZE (144) //用于在STOP2模式下保存触控唤醒功能相关的TSC数据。
  42. #define TSC_ALG_HANDLER_PERIOD_PER_CHN (400) //触控算法单通道的处理周期因子。
  43. #define TSC_ALG_WAKEUP_TIMES (1000) //有关TSC唤醒功能的时间配置,不要随意修改
  44. #define TSC_ALG_DEBUG_BUF_SIZE (260) //定义调试模式下的BUF大小
  45. #define TSC_ALG_REF_SIZE_PER_CHN (430) //触控每通道的参考大小,实际大小以tsc_alg_need_sramsize()计算为准
  46. /**
  47. * @brief 定义触控类型
  48. */
  49. typedef enum tsc_alg_type_e
  50. {
  51. TSC_ALG_BUTTON_TYPE = 0, ///< tsc application of simple button
  52. TSC_ALG_TYPE_MAX ///<
  53. } tsc_alg_type;
  54. /**
  55. * @brief 按键事件
  56. */
  57. typedef enum tsc_press_key_event_e
  58. {
  59. TSC_PRESS_KEY_NORMAL = 0, //正常短按事件
  60. TSC_PRESS_KEY_MAX ///<
  61. } tsc_press_key_event;
  62. /**
  63. * @brief 错误类型定义
  64. */
  65. typedef enum tsc_ret_code_e
  66. {
  67. TSC_SUCCESS = 0, ///< 成功
  68. TSC_NOT_INIT_ERR, ///< 模块未初始化错误
  69. TSC_NOT_REG_CHN_ERR, ///< 模块注册无效的触控通道错误
  70. TSC_NOT_ACCORD_LIB_ERR, ///< 算法库版本错误
  71. TSC_POINTER_NULL_ERR, ///< 指针为空错误
  72. TSC_PARAM_ZERO_ERR, ///< 参数错误
  73. TSC_REPEAT_REG_ERR, ///< 重复注册错误
  74. TSC_CHN_NUM_ERR, ///< 与初始化的通道总数不一致错误
  75. TSC_REG_CHANNEL_ENOUGH_ERR, ///< 注册的通道号错误或超出系统总通道数
  76. TSC_REG_TIMX_ERR, ///< 注册的Timer资源错误
  77. TSC_REG_DMA_ERR, ///< 注册的DMA资源错误
  78. TSC_SOURCE_NOT_ENOUGH_ERR, ///< 资源不足错误
  79. TSC_NOT_SUPPORT_ERR, ///< 未实现或操作不支持错误
  80. TSC_LEVEL_CFG_ERR, ///< 通道的灵明度配置错误
  81. TSC_AUTO_CALIB_TIMER_ERR, ///< 自动校准时间小于2倍通道按键保持时间.
  82. TSC_DISTURB_ERR, ///< 干扰错误.
  83. TSC_CHN_RAM_NOT_ENOUGH_ERR, ///< 提供的TSC通道RAM为NULL或空间不足错误
  84. TSC_STOP2_NULL_OR_INVALID_ERR, ///< 提供的Stop2Data数据空间为NULL或不在16K retention区域内。
  85. TSC_DEBUG_BUF_ENOUGH_ERR ///< 提供的调试缓存空间不足错误
  86. } tsc_ret_code;
  87. /**
  88. * @brief 触控按键持续等级
  89. * 持续等级越小:反应速度越快,抗瞬间的干扰也越弱;
  90. * 持续等级越大:反应速度相对弱,抗瞬间干扰能力越强
  91. */
  92. typedef enum tsc_hld_lev_e
  93. {
  94. TSC_HOLD_LEV1 = 1, // HOLD等级1(5ms)
  95. TSC_HOLD_LEV2 = 2, // HOLD等级2(7ms)
  96. TSC_HOLD_LEV3 = 3, // HOLD等级3(11ms)
  97. TSC_HOLD_LEV4 = 4, // HOLD等级4(17ms)
  98. TSC_HOLD_LEV5 = 5, // HOLD等级5(25ms)
  99. TSC_HOLD_LEV6 = 6, // HOLD等级6(35ms)
  100. TSC_HOLD_LEV7 = 7, // HOLD等级7(47ms)
  101. TSC_HOLD_LEV8 = 8, // HOLD等级8(61ms)
  102. TSC_HOLD_LEV9 = 9, // HOLD等级9(77ms)
  103. TSC_HOLD_LEV10 = 10, // HOLD等级10(95ms)
  104. TSC_HOLD_LEV11 = 11, // HOLD等级11(115ms)
  105. TSC_HOLD_LEV12 = 12, // HOLD等级12(137ms)
  106. TSC_HOLD_LEV13 = 13, // HOLD等级13(161ms)
  107. TSC_HOLD_LEV14 = 14, // HOLD等级14(187ms)
  108. TSC_HOLD_LEV15 = 15, // HOLD等级15(215ms)
  109. TSC_HOLD_LEV16 = 16, // HOLD等级16(245ms)
  110. TSC_HOLD_LEV17 = 17, // HOLD等级17(277ms)
  111. TSC_HOLD_LEV18 = 18, // HOLD等级18(311ms)
  112. TSC_HOLD_LEV19 = 19, // HOLD等级19(347ms)
  113. TSC_HOLD_LEV20 = 20, // HOLD等级20(385ms)
  114. TSC_HOLD_MAX ///< 无效
  115. } tsc_hld_lev;
  116. /**
  117. * @brief 在低功耗模式下,随环境变化而更新唤醒门限。
  118. * 因此设置一个变化量因子。
  119. * 小于此变化量因子的delta则认为是有效变化,则通过此接口更新TSC唤醒门限;
  120. * 大于此变化量因子的delta则认为是无效变化,则此接口忽略之,不更新唤醒门限。
  121. * 变化量因子越大,则表示变化量越大。一般设置为LEV15。
  122. */
  123. typedef enum tsc_delta_limit_lev_e
  124. {
  125. TSC_DELTA_LIMIT_LEV1 = 1, //
  126. TSC_DELTA_LIMIT_LEV2 = 2, //
  127. TSC_DELTA_LIMIT_LEV3 = 3, //
  128. TSC_DELTA_LIMIT_LEV4 = 4, //
  129. TSC_DELTA_LIMIT_LEV5 = 5, //
  130. TSC_DELTA_LIMIT_LEV6 = 6, //
  131. TSC_DELTA_LIMIT_LEV7 = 7, //
  132. TSC_DELTA_LIMIT_LEV8 = 8, //
  133. TSC_DELTA_LIMIT_LEV9 = 9, //
  134. TSC_DELTA_LIMIT_LEV10 = 10, //
  135. TSC_DELTA_LIMIT_LEV11 = 11, //
  136. TSC_DELTA_LIMIT_LEV12 = 12, //
  137. TSC_DELTA_LIMIT_LEV13 = 13, //
  138. TSC_DELTA_LIMIT_LEV14 = 14, //
  139. TSC_DELTA_LIMIT_LEV15 = 15, //
  140. TSC_DELTA_LIMIT_LEV16 = 16, //
  141. TSC_DELTA_LIMIT_LEV17 = 17, //
  142. TSC_DELTA_LIMIT_LEV18 = 18, //
  143. TSC_DELTA_LIMIT_LEV19 = 19, //
  144. TSC_DELTA_LIMIT_LEV20 = 20, //
  145. TSC_DELTA_LIMIT_MAX ///< 无效
  146. } tsc_delta_limit_lev;
  147. /**
  148. * @brief 抗干扰等级
  149. * 抗干扰等级,等级越高抗干扰越强,但也对板级环境要求越严苛.
  150. */
  151. typedef enum tsc_resist_disturb_lev_e
  152. {
  153. TSC_RESIST_DIS_LEV0 = 0, //默认等级,抗外部干扰一般。支持PCBA&亚克力触摸。
  154. TSC_RESIST_DIS_LEV1 = 1, //增强等级,抗外部干扰增强。亚克力情况下体验更好。
  155. TSC_RESIST_DIS_LEV2 = 2, //暂保留。
  156. TSC_RESIST_DIS_MAX ///< 无效
  157. } tsc_resist_disturb_lev;
  158. /**
  159. * @brief TSC触控通道初始门限值配置
  160. */
  161. typedef struct TSC_AlgInitThreValue_t
  162. {
  163. uint16_t hold_level; /* 按键触发持续等级 */
  164. uint16_t rate_of_change; /* 该通道按键变化率(如无压下为70,压下为77,则变化率为(77-70)/70 = 0.1即%10(注意:适当降低为8%)。默认为5,则变化率%5 */
  165. uint32_t chn; /* 通道 */
  166. } TSC_AlgInitThreValue;
  167. /**
  168. * @brief TSC初始化配置参数
  169. */
  170. typedef struct TSC_AlgInitTypeDef_t
  171. {
  172. TIM_Module* TIMx; /* 触控算法使用的TIMER资源(仅支持TIMER2) */
  173. DMA_ChannelType* DMAyChx; /* 触控算法使用的DMA资源(仅支持DMA1_CH5) */
  174. uint32_t DMARemapEnable; /* 是否使能DMA 全局REMAP功能(如DMA1中其他通道有使能REMAP功能,则此处需配置为1) */
  175. TSC_AlgInitThreValue* pTScChannelList; /* 由触控通道组成列表的数组。目前暂支持1个列(可通过位或运算,将多个TSC通道组成一个列表)。 */
  176. uint32_t AutoCalibrateTimer; /* 配置有覆盖物情况下的自动校准时间(无覆盖物或干扰时不会校准),一般设置1000ms即可,最大65535。单位ms。此值必须大于按键保持时间的2倍以上,否则初始化错误 */
  177. uint32_t ResistDisturbLev; /* 抗干扰等级(tsc_resist_disturb_lev),等级越高抗干扰越强,但也对板级装配环境要求越高. */
  178. uint8_t* pTscSramAddr; /* 应用程序提供给TSC驱动库的触控通道RAM空间地址*/
  179. uint32_t TscSramSize; /* 应用程序提供给TSC驱动库的触控通道RAM空间大小.单位(bytes) */
  180. uint16_t* LogBuf; /* 用于调试模式下的buf缓存,非调试模式下则为0 */
  181. uint16_t LogBufSize; /* 每通道大小为u16 * 256.单位(bytes) */
  182. uint8_t* Stop2Data; /* 用于在STOP2模式下保存触控唤醒功能相关的TSC数据BUF。 */
  183. uint16_t Stop2DataSize; /* 用于在STOP2模式下保存触控唤醒功能相关的TSC数据BUF大小。单位(bytes) */
  184. } TSC_AlgInitTypeDef;
  185. /**
  186. * @brief 触控算法实时分析处理函数(必须放在TIMER中断函数中)
  187. * @TIMER定时周期参考周期因子,定时器周期参考DEMO范例.
  188. * @param void
  189. * @return void
  190. */
  191. void tsc_alg_analyze_handler(void);
  192. /**
  193. * @brief 低功耗校准
  194. * @param uint32_t delta_limit_level 变化量限值等级tsc_delta_limit_lev
  195. * @uint32_t hse_or_hsi 0:HSI, 1:HSE;
  196. * @return
  197. * - `TSC_SUCCESS: 表示操作成功
  198. * - 其它值表示出错
  199. * - 注意:用于在STOP2低功耗模式下,定时校准。
  200. */
  201. int32_t tsc_alg_set_powerdown_calibrate(tsc_delta_limit_lev delta_limit_level, uint32_t hse_or_hsi);
  202. /**
  203. * @brief 低功耗模式下,检测是否被干扰唤醒
  204. * @param void
  205. * @return 0:正常唤醒;1:干扰唤醒
  206. */
  207. int32_t tsc_alg_wakeup_disturb_check(uint32_t* wakeup_src);
  208. /**
  209. * @brief 获取算法版本
  210. * @param void
  211. * @return void
  212. */
  213. char* tsc_alg_get_version(void);
  214. /**
  215. * @brief 触控算法系统滴答,默认1ms
  216. * @param void
  217. * @return void
  218. */
  219. void tsc_alg_tick_count(void);
  220. /**
  221. * @brief 获取TSC触控算法需要的SRAM大小
  222. * uint32_t chn_totals; // 使用的TSC触控通道数
  223. * @return
  224. * - 0: 表示失败
  225. * - 非0: 表示成功
  226. */
  227. uint32_t tsc_alg_need_sramsize(uint32_t chn_totals);
  228. /**
  229. * @brief 触控算法初始化
  230. * @param tsc_init_parameter *ptsc_init_parameter 触控算法初始化结构体地址.
  231. * @param void
  232. * @return
  233. * - `TSC_SUCCESS: 表示操作成功
  234. * - 其它值表示出错
  235. */
  236. int32_t tsc_alg_init(TSC_AlgInitTypeDef* TSC_AlgInitStruct);
  237. /**
  238. * @brief 启动触控开始工作
  239. * @param void
  240. * @return
  241. * - `TSC_SUCCESS: 表示操作成功
  242. * - 其它值表示出错
  243. */
  244. int32_t tsc_alg_start(void);
  245. /**
  246. * @brief 设置TSC进入低功耗(用于低功耗唤醒模式)
  247. * @param uint32_t TScChannelList 保留参数。设置为0表示使能已注册的所有通道
  248. * @return
  249. * - `TSC_SUCCESS: 表示操作成功
  250. * - 其它值表示出错
  251. * - 注意:STOP2低功耗模式使用,正常模式下不关注。
  252. */
  253. int32_t tsc_alg_set_powerdown(uint32_t TscChannelList);
  254. ////////////////////////////////////////////////////////////
  255. /*****************上层应用提供的按键回调处理函数*********
  256. * @brief 注册按钮型、滑条型、转轮型触控的回调函数
  257. * @param tsc_touch_type type 产生的触控类型(暂只支持按键型)
  258. * @param uint32_t event 0:正常触摸事件;
  259. * @param uint32_t chn 表示触摸通道号;
  260. * @param uint32_t value 触摸状态:1压下;0松开;
  261. * @return
  262. * - `TSC_SUCCESS: 表示操作成功
  263. * - 其它值表示出错
  264. * 注意:此回调函数将在中断中调用,因此尽量减少回调函数的处理时间。
  265. ********************************************************/
  266. int32_t tsc_alg_isr_callback(tsc_alg_type type, uint32_t event, uint32_t chn, uint32_t value);
  267. /**
  268. * @brief 触控数据输出到PC的接口,以便于PC端工具观察,设定合理的触控阈值
  269. * @param uint32_t chn 触控通道
  270. * @return uint8_t data 该触控通道数据
  271. */
  272. void tsc_alg_debug_output(uint32_t chn, uint8_t data);
  273. #ifdef __cplusplus
  274. }
  275. #endif // defined __cplusplus
  276. #endif //__N32XX_TSC_ALG_API__