ahc32l196_dt.h 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. /*******************************************************************************
  2. * Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
  3. *
  4. * This software is owned and published by:
  5. * Huada Semiconductor Co.,Ltd ("HDSC").
  6. *
  7. * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
  8. * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
  9. *
  10. * This software contains source code for use with HDSC
  11. * components. This software is licensed by HDSC to be adapted only
  12. * for use in systems utilizing HDSC components. HDSC shall not be
  13. * responsible for misuse or illegal use of this software for devices not
  14. * supported herein. HDSC is providing this software "AS IS" and will
  15. * not be responsible for issues arising from incorrect user implementation
  16. * of the software.
  17. *
  18. * Disclaimer:
  19. * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
  20. * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
  21. * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
  22. * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
  23. * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
  24. * WARRANTY OF NONINFRINGEMENT.
  25. * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
  26. * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
  27. * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
  28. * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
  29. * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
  30. * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
  31. * SAVINGS OR PROFITS,
  32. * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  33. * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
  34. * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
  35. * FROM, THE SOFTWARE.
  36. *
  37. * This software may be replicated in part or whole for the licensed use,
  38. * with the restriction that this Disclaimer and Copyright notice must be
  39. * included with each copy of this software, whether used in part or whole,
  40. * at all times.
  41. */
  42. /******************************************************************************/
  43. /** \file adt.h
  44. **
  45. ** Headerfile for Advance Timer functions
  46. ** @link ADT Group Some description @endlink
  47. **
  48. ** - 2018-04-19 Husj First Version
  49. **
  50. ******************************************************************************/
  51. #ifndef __ADT_H__
  52. #define __ADT_H__
  53. /******************************************************************************
  54. * Include files
  55. ******************************************************************************/
  56. #include "ddl.h"
  57. /* C binding of definitions if building with C++ compiler */
  58. #ifdef __cplusplus
  59. extern "C"
  60. {
  61. #endif
  62. /**
  63. ******************************************************************************
  64. ** \defgroup AdtGroup Advance Timer (ADT)
  65. **
  66. ******************************************************************************/
  67. //@{
  68. /******************************************************************************
  69. * Global type definitions
  70. ******************************************************************************/
  71. /**
  72. ******************************************************************************
  73. ** \brief ADT CHx通道定义
  74. *****************************************************************************/
  75. typedef enum en_adt_CHxX_port
  76. {
  77. AdtCHxA = 0u, ///< CHx A通道
  78. AdtCHxB = 1u, ///< CHx B通道
  79. }en_adt_CHxX_port_t;
  80. /**
  81. ******************************************************************************
  82. ** \brief ADT TRIG端口定义
  83. *****************************************************************************/
  84. typedef enum en_adt_trig_port
  85. {
  86. AdtTrigA = 0u, ///< TIMx 触发A端口
  87. AdtTrigB = 1u, ///< TIMx 触发B端口
  88. AdtTrigC = 2u, ///< TIMx 触发C端口
  89. AdtTrigD = 3u, ///< TIMx 触发D端口
  90. }en_adt_trig_port_t;
  91. /**
  92. ******************************************************************************
  93. ** \brief ADT通用控制 - Z相输入屏蔽周期数
  94. **
  95. ** \note
  96. ******************************************************************************/
  97. typedef enum en_adt_gconr_zmsk
  98. {
  99. AdtZMaskDis = 0u, ///< Z相输入屏蔽功能无效
  100. AdtZMask4Cyl = 1u, ///< 位置计数上溢后或下溢后的4个计数周期内的Z相输入被屏蔽
  101. AdtZMask8Cyl = 2u, ///< 位置计数上溢后或下溢后的8个计数周期内的Z相输入被屏蔽
  102. AdtZMask16Cyl = 3u, ///< 位置计数上溢后或下溢后的16个计数周期内的Z相输入被屏蔽
  103. }en_adt_gconr_zmsk_t;
  104. /**
  105. ******************************************************************************
  106. ** \brief ADT通用控制 - 计数时钟选择
  107. **
  108. ** \note
  109. ******************************************************************************/
  110. typedef enum en_adt_cnt_ckdiv
  111. {
  112. AdtClkPClk0 = 0u, ///< PCLK0
  113. AdtClkPClk0Div2 = 1u, ///< PCLK0/2
  114. AdtClkPClk0Div4 = 2u, ///< PCLK0/4
  115. AdtClkPClk0Div8 = 3u, ///< PCLK0/8
  116. AdtClkPClk0Div16 = 4u, ///< PCLK0/16
  117. AdtClkPClk0Div64 = 5u, ///< PCLK0/64
  118. AdtClkPClk0Div256 = 6u, ///< PCLK0/256
  119. AdtClkPClk0Div1024 = 7u, ///< PCLK0/1024
  120. }en_adt_cnt_ckdiv_t;
  121. /**
  122. ******************************************************************************
  123. ** \brief ADT计数模式
  124. **
  125. ** \note
  126. ******************************************************************************/
  127. typedef enum en_adt_cnt_mode
  128. {
  129. AdtSawtoothMode = 0u, ///< 锯齿波模式
  130. AdtTriangleModeA = 4u, ///< 三角波A模式
  131. AdtTriangleModeB = 5u, ///< 三角波B模式
  132. }en_adt_cnt_mode_t;
  133. /**
  134. ******************************************************************************
  135. ** \brief ADT计数方向
  136. **
  137. ** \note
  138. ******************************************************************************/
  139. typedef enum en_adt_cnt_dir
  140. {
  141. AdtCntDown = 0u, ///< 递减计数
  142. AdtCntUp = 1u, ///< 递加计数
  143. }en_adt_cnt_dir_t;
  144. /**
  145. ******************************************************************************
  146. ** \brief ADT通用比较基准
  147. **
  148. ** \note
  149. ******************************************************************************/
  150. typedef enum en_adt_compare
  151. {
  152. AdtCompareA = 0u, ///< 通用比较基准A
  153. AdtCompareB = 1u, ///< 通用比较基准B
  154. AdtCompareC = 2u, ///< 通用比较基准C
  155. AdtCompareD = 3u, ///< 通用比较基准D
  156. }en_adt_compare_t;
  157. /**
  158. ******************************************************************************
  159. ** \brief ADT专用比较基准
  160. **
  161. ** \note
  162. ******************************************************************************/
  163. typedef enum en_adt_special_compare
  164. {
  165. AdtSpclCompA = 0u, ///< 专用比较基准A
  166. AdtSpclCompB = 1u, ///< 专用比较基准B
  167. }en_adt_special_compare_t;
  168. /**
  169. ******************************************************************************
  170. ** \brief ADT端口控制 - TIMx输出状态控制
  171. **
  172. ** \note
  173. ******************************************************************************/
  174. typedef enum en_adt_pconr_disval
  175. {
  176. AdtTIMxDisValNorm = 0u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口正常输出
  177. AdtTIMxDisValHiZ = 1u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出高阻态
  178. AdtTIMxDisValLow = 2u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出低电平
  179. AdtTIMxDisValHigh = 3u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出高电平
  180. }en_adt_pconr_disval_t;
  181. /**
  182. ******************************************************************************
  183. ** \brief ADT端口控制 - CHx强制输出无效条件选择
  184. **
  185. ** \note
  186. ******************************************************************************/
  187. typedef enum en_adt_pconr_dissel
  188. {
  189. AdtCHxDisSel0 = 0u, ///< 选择强制输出无效条件0
  190. AdtCHxDisSel1 = 1u, ///< 选择强制输出无效条件1
  191. AdtCHxDisSel2 = 2u, ///< 选择强制输出无效条件2
  192. AdtCHxDisSel3 = 3u, ///< 选择强制输出无效条件3
  193. }en_adt_pconr_dissel_t;
  194. /**
  195. ******************************************************************************
  196. ** \brief ADT端口控制 - CHx周期值匹配时端口状态设定
  197. **
  198. ** \note
  199. ******************************************************************************/
  200. typedef enum en_adt_pconr_perc
  201. {
  202. AdtCHxPeriodLow = 0u, ///< 计数器计数值与周期值相等时,CHx端口输出保持为低电平
  203. AdtCHxPeriodHigh = 1u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为高电平
  204. AdtCHxPeriodKeep = 2u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为先前状态
  205. AdtCHxPeriodInv = 3u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为反转电平
  206. }en_adt_pconr_perc_t;
  207. /**
  208. ******************************************************************************
  209. ** \brief ADT端口控制 - CHx比较值匹配时端口状态设定
  210. **
  211. ** \note
  212. ******************************************************************************/
  213. typedef enum en_adt_pconr_cmpc
  214. {
  215. AdtCHxCompareLow = 0u, ///< 计数器计数值与GCMxR相等时,CHx端口输出保持为低电平
  216. AdtCHxCompareHigh = 1u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为高电平
  217. AdtCHxCompareKeep = 2u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为先前状态
  218. AdtCHxCompareInv = 3u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为反转电平
  219. }en_adt_pconr_cmpc_t;
  220. /**
  221. ******************************************************************************
  222. ** \brief ADT端口控制 - CHx端口输出
  223. **
  224. ** \note
  225. ******************************************************************************/
  226. typedef enum en_adt_pconr_port_out
  227. {
  228. AdtCHxPortOutLow = 0u, ///< CHx端口输出设定为低电平
  229. AdtCHxPortOutHigh = 1u, ///< CHx端口输出设定为高电平
  230. }en_adt_pconr_port_out_t;
  231. /**
  232. ******************************************************************************
  233. ** \brief ADT端口控制 - CHx端口功能模式选择
  234. **
  235. ** \note
  236. ******************************************************************************/
  237. typedef enum en_adt_pconr_capc
  238. {
  239. AdtCHxCompareOutput = 0u, ///< CHx端口设定为比较输出功能
  240. AdtCHxCompareInput = 1u, ///< CHx端口设定为捕获输入功能
  241. }en_adt_pconr_capc_t;
  242. /**
  243. ******************************************************************************
  244. ** \brief ADT端口控制 - CHx计数开始停止端口状态选择
  245. **
  246. ** \note
  247. ******************************************************************************/
  248. typedef enum en_adt_pconr_stastps
  249. {
  250. AdtCHxStateSelSS = 0u, ///< 计数开始或停止时,CHx端口输出由STACB、STPCB决定
  251. AdtCHxStateSelKeep = 1u, ///< 计数开始或停止时,CHx端口输出设定为先前状态
  252. }en_adt_pconr_stastps_t;
  253. /**
  254. ******************************************************************************
  255. ** \brief ADT死区控制 - CHx死区分离设定
  256. **
  257. ** \note
  258. ******************************************************************************/
  259. typedef enum en_adt_dconr_sepa
  260. {
  261. AdtCHxDtSeperate = 0u, ///< DTUAR和DTDAR分别设定
  262. AdtCHxDtEqual = 1u, ///< DTDAR的值和DTUAR的值自动相等
  263. }en_adt_dconr_sepa_t;
  264. /**
  265. ******************************************************************************
  266. ** \brief ADT滤波控制 - TRIx/TIMxIx端口滤波采样基准时钟选择
  267. **
  268. ** \note
  269. ******************************************************************************/
  270. typedef enum en_adt_fconr_nofick
  271. {
  272. AdtFltClkPclk0 = 0u, ///< PCLK0
  273. AdtFltClkPclk0Div4 = 1u, ///< PCLK0/4
  274. AdtFltClkPclk0Div16 = 2u, ///< PCLK0/16
  275. AdtFltClkPclk0Div64 = 3u, ///< PCLK0/64
  276. }en_adt_fconr_nofick_t;
  277. /**
  278. ******************************************************************************
  279. ** \brief ADT有效周期 - TIMx有效周期选择
  280. **
  281. ** \note
  282. ******************************************************************************/
  283. typedef enum en_adt_vperr_pcnts
  284. {
  285. AdtPeriodCnts0 = 0u, ///< 有效周期选择功能无效
  286. AdtPeriodCnts1 = 1u, ///< 每隔1个周期有效一次
  287. AdtPeriodCnts2 = 2u, ///< 每隔2个周期有效一次
  288. AdtPeriodCnts3 = 3u, ///< 每隔3个周期有效一次
  289. AdtPeriodCnts4 = 4u, ///< 每隔4个周期有效一次
  290. AdtPeriodCnts5 = 5u, ///< 每隔5个周期有效一次
  291. AdtPeriodCnts6 = 6u, ///< 每隔6个周期有效一次
  292. AdtPeriodCnts7 = 7u, ///< 每隔7个周期有效一次
  293. }en_adt_vperr_pcnts_t;
  294. /**
  295. ******************************************************************************
  296. ** \brief ADT有效周期 - 计数条件选择
  297. **
  298. ** \note
  299. ******************************************************************************/
  300. typedef enum en_adt_vperr_pcnte
  301. {
  302. AdtPeriodCnteDisable = 0u, ///< 有效周期选择功能无效
  303. AdtPeriodCnteMin = 1u, ///< 锯齿波计数上、下溢点或三角波波谷做为计数条件
  304. AdtPeriodCnteMax = 2u, ///< 锯齿波计数上、下溢点或三角波波峰做为计数条件
  305. AdtPeriodCnteBoth = 3u, ///< 锯齿波计数上、下溢点或三角波波峰,波谷做为计数条件
  306. }en_adt_vperr_pcnte_t;
  307. /**
  308. ******************************************************************************
  309. ** \brief ADT端口触发控制 - 触发源选择
  310. **
  311. ** \note
  312. ******************************************************************************/
  313. typedef enum en_adt_ttrig_trigxs
  314. {
  315. AdtTrigxSelPA3 = 0u, ///< PA3
  316. AdtTrigxSelPB3 = 1u, ///< PB3
  317. AdtTrigxSelPC3 = 2u, ///< PC3
  318. AdtTrigxSelPD3 = 3u, ///< PD3
  319. AdtTrigxSelPA7 = 4u, ///< PA7
  320. AdtTrigxSelPB7 = 5u, ///< PB7
  321. AdtTrigxSelPC7 = 6u, ///< PC7
  322. AdtTrigxSelPD7 = 7u, ///< PD7
  323. AdtTrigxSelPA11 = 8u, ///< PA11
  324. AdtTrigxSelPB11 = 9u, ///< PB11
  325. AdtTrigxSelPC11 = 10u, ///< PC11
  326. AdtTrigxSelPD1 = 11u, ///< PD1
  327. AdtTrigxSelPA15 = 12u, ///< PA15
  328. AdtTrigxSelPB15 = 13u, ///< PB15
  329. AdtTrigxSelPC5 = 14u, ///< PC5
  330. AdtTrigxSelPD5 = 15u, ///< PD5
  331. }en_adt_ttrig_trigxs_t;
  332. /**
  333. ******************************************************************************
  334. ** \brief ADT AOS触发控制 - AOSx触发源选择
  335. **
  336. ** \note
  337. ******************************************************************************/
  338. typedef enum en_adt_itrig_iaosxs
  339. {
  340. AdtAosxTrigSelTim0Int = 0u, ///< TIM0_INT
  341. AdtAosxTrigSelTim1Int = 1u, ///< TIM1_INT
  342. AdtAosxTrigSelTim2Int = 2u, ///< TIM2_INT
  343. AdtAosxTrigSelLpTimInt = 3u, ///< LPTIMER_INT
  344. AdtAosxTrigSelTim4Int = 4u, ///< TIM4_INT
  345. AdtAosxTrigSelTim5Int = 5u, ///< TIM5_INT
  346. AdtAosxTrigSelTim6Int = 6u, ///< TIM6_INT
  347. AdtAosxTrigSelUart0Int = 7u, ///< UART0_INT
  348. AdtAosxTrigSelUart1Int = 8u, ///< UART1_INT
  349. AdtAosxTrigSelLpUartInt = 9u, ///< LPUART_INT
  350. AdtAosxTrigSelVc0Int = 10u, ///< VC0_INT
  351. AdtAosxTrigSelVc1Int = 11u, ///< VC1_INT
  352. AdtAosxTrigSelRtcInt = 12u, ///< RTC_INT
  353. AdtAosxTrigSelPcaInt = 13u, ///< PCA_INT
  354. AdtAosxTrigSelSpiInt = 14u, ///< SPI_INT
  355. AdtAosxTrigSelAdcInt = 15u, ///< ADC_INT
  356. }en_adt_itrig_iaosxs_t;
  357. /**
  358. ******************************************************************************
  359. ** \brief ADT硬件(启动/停止/清零/捕获)事件触发选择
  360. **
  361. ** \note
  362. ******************************************************************************/
  363. typedef enum en_adt_hw_trig
  364. {
  365. AdtHwTrigAos0 = 0u, ///< 从AOS来的事件触发0有效
  366. AdtHwTrigAos1 = 1u, ///< 从AOS来的事件触发1有效
  367. AdtHwTrigAos2 = 2u, ///< 从AOS来的事件触发2有效
  368. AdtHwTrigAos3 = 3u, ///< 从AOS来的事件触发3有效
  369. AdtHwTrigCHxARise = 4u, ///< CHxA端口上采样到上升沿
  370. AdtHwTrigCHxAFall = 5u, ///< CHxA端口上采样到下降沿
  371. AdtHwTrigCHxBRise = 6u, ///< CHxB端口上采样到上升沿
  372. AdtHwTrigCHxBFall = 7u, ///< CHxB端口上采样到下降沿
  373. AdtHwTrigTimTriARise = 8u, ///< TIMTRIA端口上采样到上升沿
  374. AdtHwTrigTimTriAFall = 9u, ///< TIMTRIA端口上采样到下降沿
  375. AdtHwTrigTimTriBRise = 10u, ///< TIMTRIB端口上采样到上升沿
  376. AdtHwTrigTimTriBFall = 11u, ///< TIMTRIB端口上采样到下降沿
  377. AdtHwTrigTimTriCRise = 12u, ///< TIMTRIC端口上采样到上升沿
  378. AdtHwTrigTimTriCFall = 13u, ///< TIMTRIC端口上采样到下降沿
  379. AdtHwTrigTimTriDRise = 14u, ///< TIMTRID端口上采样到上升沿
  380. AdtHwTrigTimTriDFall = 15u, ///< TIMTRID端口上采样到下降沿
  381. AdtHwTrigEnd = 16u,
  382. }en_adt_hw_trig_t;
  383. /**
  384. ******************************************************************************
  385. ** \brief ADT硬件(递加/递减)事件触发选择
  386. **
  387. ** \note
  388. ******************************************************************************/
  389. typedef enum en_adt_hw_cnt
  390. {
  391. AdtHwCntCHxALowCHxBRise = 0u, ///< CHxA端口为低电平时,CHxB端口上采样到上升沿
  392. AdtHwCntCHxALowCHxBFall = 1u, ///< CHxA端口为低电平时,CHxB端口上采样到下降沿
  393. AdtHwCntCHxAHighCHxBRise = 2u, ///< CHxA端口为高电平时,CHxB端口上采样到上升沿
  394. AdtHwCntCHxAHighCHxBFall = 3u, ///< CHxA端口为高电平时,CHxB端口上采样到下降沿
  395. AdtHwCntCHxBLowCHxARise = 4u, ///< CHxB端口为低电平时,CHxA端口上采样到上升沿
  396. AdtHwCntCHxBLowCHxAFall = 5u, ///< CHxB端口为低电平时,CHxA端口上采样到下降沿
  397. AdtHwCntCHxBHighChxARise = 6u, ///< CHxB端口为高电平时,CHxA端口上采样到上升沿
  398. AdtHwCntCHxBHighCHxAFall = 7u, ///< CHxB端口为高电平时,CHxA端口上采样到下降沿
  399. AdtHwCntTimTriARise = 8u, ///< TIMTRIA端口上采样到上升沿
  400. AdtHwCntTimTriAFall = 9u, ///< TIMTRIA端口上采样到下降沿
  401. AdtHwCntTimTriBRise = 10u, ///< TIMTRIB端口上采样到上升沿
  402. AdtHwCntTimTriBFall = 11u, ///< TIMTRIB端口上采样到下降沿
  403. AdtHwCntTimTriCRise = 12u, ///< TIMTRIC端口上采样到上升沿
  404. AdtHwCntTimTriCFall = 13u, ///< TIMTRIC端口上采样到下降沿
  405. AdtHwCntTimTriDRise = 14u, ///< TIMTRID端口上采样到上升沿
  406. AdtHwCntTimTriDFall = 15u, ///< TIMTRID端口上采样到下降沿
  407. AdtHwCntAos0 = 16u, ///< 从AOS来的事件触发0有效
  408. AdtHwCntAos1 = 17u, ///< 从AOS来的事件触发1有效
  409. AdtHwCntAos2 = 18u, ///< 从AOS来的事件触发2有效
  410. AdtHwCntAos3 = 19u, ///< 从AOS来的事件触发3有效
  411. AdtHwCntMax = 20u,
  412. }en_adt_hw_cnt_t;
  413. /**
  414. ******************************************************************************
  415. ** \brief ADT端口刹车极性控制
  416. **
  417. ** \note
  418. ******************************************************************************/
  419. typedef enum en_adt_ptbrk_polarity
  420. {
  421. AdtPtBrkHigh = 0u, ///< 端口刹车极性高电平有效
  422. AdtPtBrkLow = 1u, ///< 端口刹车极性低电平有效
  423. }en_adt_ptbrk_polarity_t;
  424. /**
  425. ******************************************************************************
  426. ** \brief ADT PWM展频计数选择
  427. **
  428. ** \note
  429. ******************************************************************************/
  430. typedef enum en_adt_pwm_dither_type
  431. {
  432. AdtPwmDitherUnderFlow = 0u, ///< PWM展频计数下溢出
  433. AdtPwmDitherOverFlow = 1u, ///< PWM展频计数上溢出
  434. }en_adt_pwm_dither_type_t;
  435. /**
  436. ******************************************************************************
  437. ** \brief ADT中断类型
  438. **
  439. ** \note
  440. ******************************************************************************/
  441. typedef enum en_adt_irq_type
  442. {
  443. AdtCMAIrq = 0u, ///< 计数匹配A(或捕获输入)中断
  444. AdtCMBIrq = 1u, ///< 计数匹配B(或捕获输入)中断
  445. AdtCMCIrq = 2u, ///< 计数匹配C中断
  446. AdtCMDIrq = 3u, ///< 计数匹配D中断
  447. AdtOVFIrq = 6u, ///< 上溢匹配中断
  448. AdtUDFIrq = 7u, ///< 下溢匹配中断
  449. AdtDTEIrq = 8u, ///< 死区时间错误中断
  450. AdtSAMLIrq = 14u, ///< 同低中断
  451. AdtSAMHIrq = 15u, ///< 同高中断
  452. }en_adt_irq_type_t;
  453. typedef enum en_adt_state_type
  454. {
  455. AdtCMAF = 0, ///< 计数匹配A标志
  456. AdtCMBF = 1, ///< 计数匹配B标志
  457. AdtCMCF = 2, ///< 计数匹配C标志
  458. AdtCMDF = 3, ///< 计数匹配D标志
  459. AdtOVFF = 6, ///< 上溢匹配标志
  460. AdtUDFF = 7, ///< 下溢匹配标志
  461. AdtDTEF = 8, ///< 死区时间错误标志
  462. AdtCMSAUF = 9, ///< 向上计数专用比较基准值匹配A标志
  463. AdtCMSADF = 10, ///< 向下计数专用比较基准值匹配B标志
  464. AdtCMSBUF = 11, ///< 向上计数专用比较基准值匹配A标志
  465. AdtCMSBDF = 12, ///< 向下计数专用比较基准值匹配B标志
  466. AdtCntDir = 31, ///< 计数方向
  467. }en_adt_state_type_t;
  468. /**
  469. ******************************************************************************
  470. ** \brief ADT软件同步配置
  471. ** \note
  472. ******************************************************************************/
  473. typedef struct stc_adt_sw_sync
  474. {
  475. boolean_t bAdTim4; ///< Timer 4
  476. boolean_t bAdTim5; ///< Timer 5
  477. boolean_t bAdTim6; ///< Timer 6
  478. }stc_adt_sw_sync_t;
  479. /**
  480. ******************************************************************************
  481. ** \brief ADT AOS触发配置
  482. ** \note
  483. ******************************************************************************/
  484. typedef struct stc_adt_aos_trig_cfg
  485. {
  486. en_adt_itrig_iaosxs_t enAos0TrigSrc; ///< AOS0触发源选择
  487. en_adt_itrig_iaosxs_t enAos1TrigSrc; ///< AOS1触发源选择
  488. en_adt_itrig_iaosxs_t enAos2TrigSrc; ///< AOS2触发源选择
  489. en_adt_itrig_iaosxs_t enAos3TrigSrc; ///< AOS3触发源选择
  490. }stc_adt_aos_trig_cfg_t;
  491. /**
  492. ******************************************************************************
  493. ** \brief ADT 中断触发配置
  494. ** \note
  495. ******************************************************************************/
  496. typedef struct stc_adt_irq_trig_cfg
  497. {
  498. boolean_t bAdtSpecilMatchBTrigDmaEn; ///< 专用比较基准值匹配B使能触发DMA
  499. boolean_t bAdtSpecilMatchATrigDmaEn; ///< 专用比较基准值匹配A使能触发DMA
  500. boolean_t bAdtUnderFlowTrigDmaEn; ///< 下溢匹配使能触发DMA
  501. boolean_t bAdtOverFlowTrigDmaEn; ///< 上溢匹配使能触发DMA
  502. boolean_t bAdtCntMatchDTrigDmaEn; ///< 计数匹配D使能触发DMA
  503. boolean_t bAdtCntMatchCTrigDmaEn; ///< 计数匹配C使能触发DMA
  504. boolean_t bAdtCntMatchBTrigDmaEn; ///< 计数匹配B使能触发DMA
  505. boolean_t bAdtCntMatchATrigDmaEn; ///< 计数匹配A使能触发DMA
  506. boolean_t bAdtSpecilMatchBTrigEn; ///< 专用比较基准值匹配B使能触发ADC
  507. boolean_t bAdtSpecilMatchATrigEn; ///< 专用比较基准值匹配A使能触发ADC
  508. boolean_t bAdtUnderFlowTrigEn; ///< 下溢匹配使能触发ADC
  509. boolean_t bAdtOverFlowTrigEn; ///< 上溢匹配使能触发ADC
  510. boolean_t bAdtCntMatchDTrigEn; ///< 计数匹配D使能触发ADC
  511. boolean_t bAdtCntMatchCTrigEn; ///< 计数匹配C使能触发ADC
  512. boolean_t bAdtCntMatchBTrigEn; ///< 计数匹配B使能触发ADC
  513. boolean_t bAdtCntMatchATrigEn; ///< 计数匹配A使能触发ADC
  514. }stc_adt_irq_trig_cfg_t;
  515. /**
  516. ******************************************************************************
  517. ** \brief ADT Trig端口配置
  518. ** \note
  519. ******************************************************************************/
  520. typedef struct stc_adt_port_trig_cfg
  521. {
  522. en_adt_ttrig_trigxs_t enTrigSrc; ///< 触发源选择
  523. boolean_t bFltEn; ///< 触发源捕获输入滤波使能
  524. en_adt_fconr_nofick_t enFltClk; ///< 滤波采样基准时钟
  525. }stc_adt_port_trig_cfg_t;
  526. /**
  527. ******************************************************************************
  528. ** \brief ADT Z相输入屏蔽功能配置
  529. ** \note
  530. ******************************************************************************/
  531. typedef struct stc_adt_zmask_cfg
  532. {
  533. en_adt_gconr_zmsk_t enZMaskCycle; ///< Z相输入屏蔽计数周期选择
  534. boolean_t bFltPosCntMaksEn; ///< Z相输入时的屏蔽周期内,位置计数器的清零功能不屏蔽(FALSE)或屏蔽(TRUE)
  535. boolean_t bFltRevCntMaksEn; ///< Z相输入时的屏蔽周期内,公转计数器的计数功能不屏蔽(FALSE)或屏蔽(TRUE)
  536. }stc_adt_zmask_cfg_t;
  537. /**
  538. ******************************************************************************
  539. ** \brief ADT TIMxX端口配置
  540. ** \note
  541. ******************************************************************************/
  542. typedef struct stc_adt_TIMxX_port_cfg
  543. {
  544. en_adt_pconr_capc_t enCap; ///< 端口功能模式
  545. boolean_t bOutEn; ///< 输出使能
  546. en_adt_pconr_perc_t enPerc; ///< 周期值匹配时端口状态
  547. en_adt_pconr_cmpc_t enCmpc; ///< 比较值匹配时端口状态
  548. en_adt_pconr_stastps_t enStaStp; ///< 计数开始停止端口状态选择
  549. en_adt_pconr_port_out_t enStaOut; ///< 计数开始端口输出状态
  550. en_adt_pconr_port_out_t enStpOut; ///< 计数停止端口输出状态
  551. en_adt_pconr_disval_t enDisVal; ///< 强制输出无效时输出状态控制
  552. en_adt_pconr_dissel_t enDisSel; ///< 强制输出无效条件选择
  553. boolean_t bFltEn; ///< 端口捕获输入滤波使能
  554. en_adt_fconr_nofick_t enFltClk; ///< 端口滤波采样基准时钟
  555. }stc_adt_CHxX_port_cfg_t;
  556. /**
  557. ******************************************************************************
  558. ** \brief ADT刹车端口配置
  559. ** \note
  560. ******************************************************************************/
  561. typedef struct stc_adt_break_port_cfg
  562. {
  563. boolean_t bPortEn; ///< 端口使能
  564. en_adt_ptbrk_polarity_t enPol; ///< 极性选择
  565. }stc_adt_break_port_cfg_t;
  566. /**
  567. ******************************************************************************
  568. ** \brief ADT无效条件3配置
  569. ** \note
  570. ******************************************************************************/
  571. typedef struct stc_adt_disable_3_cfg
  572. {
  573. stc_adt_break_port_cfg_t stcBrkPtCfg[16]; ///< 刹车端口配置
  574. boolean_t bFltEn; ///< 刹车端口滤波使能
  575. en_adt_fconr_nofick_t enFltClk; ///< 滤波采样基准时钟
  576. }stc_adt_disable_3_cfg_t;
  577. /**
  578. ******************************************************************************
  579. ** \brief ADT无效条件1配置
  580. ** \note
  581. ******************************************************************************/
  582. typedef struct stc_adt_disable_1_cfg
  583. {
  584. boolean_t bTim6OutSH; ///< TIM6输出同高
  585. boolean_t bTim5OutSH; ///< TIM5输出同高
  586. boolean_t bTim4OutSH; ///< TIM4输出同高
  587. boolean_t bTim6OutSL; ///< TIM6输出同低
  588. boolean_t bTim5OutSL; ///< TIM5输出同低
  589. boolean_t bTim4OutSL; ///< TIM4输出同低
  590. }stc_adt_disable_1_cfg_t;
  591. /**
  592. ******************************************************************************
  593. ** \brief ADT PWM展频计数配置
  594. ** \note
  595. ******************************************************************************/
  596. typedef struct stc_adt_pwm_dither_cfg
  597. {
  598. en_adt_pwm_dither_type_t enAdtPDType; ///< PWM展频计数选择
  599. boolean_t bTimxBPDEn; ///< PWM通道B展频使能
  600. boolean_t bTimxAPDEn; ///< PWM通道A展频使能
  601. }stc_adt_pwm_dither_cfg_t;
  602. /**
  603. ******************************************************************************
  604. ** \brief ADT基本计数配置
  605. ** \note
  606. ******************************************************************************/
  607. typedef struct stc_adt_basecnt_cfg
  608. {
  609. en_adt_cnt_mode_t enCntMode; ///< 计数模式
  610. en_adt_cnt_dir_t enCntDir; ///< 计数方向
  611. en_adt_cnt_ckdiv_t enCntClkDiv; ///< 计数时钟选择
  612. }stc_adt_basecnt_cfg_t;
  613. /**
  614. ******************************************************************************
  615. ** \brief ADT计数状态
  616. ** \note
  617. ******************************************************************************/
  618. typedef struct stc_adt_cntstate_cfg
  619. {
  620. uint16_t u16Counter; ///< 当前计数器的计数值
  621. boolean_t enCntDir; ///< 计数方向
  622. uint8_t u8ValidPeriod; ///< 有效周期计数
  623. boolean_t bCMSBDF; ///< 向下计数专用比较基准值匹配B标志
  624. boolean_t bCMSBUF; ///< 向上计数专用比较基准值匹配A标志
  625. boolean_t bCMSADF; ///< 向下计数专用比较基准值匹配B标志
  626. boolean_t bCMSAUF; ///< 向上计数专用比较基准值匹配A标志
  627. boolean_t bDTEF; ///< 死区时间错误标志
  628. boolean_t bUDFF; ///< 下溢匹配标志
  629. boolean_t bOVFF; ///< 上溢匹配标志
  630. boolean_t bCMDF; ///< 计数匹配D标志
  631. boolean_t bCMCF; ///< 计数匹配C标志
  632. boolean_t bCMBF; ///< 计数匹配B标志
  633. boolean_t bCMAF; ///< 计数匹配A标志
  634. }stc_adt_cntstate_cfg_t;
  635. /**
  636. ******************************************************************************
  637. ** \brief ADT有效计数周期
  638. ** \note
  639. ******************************************************************************/
  640. typedef struct stc_adt_validper_cfg
  641. {
  642. en_adt_vperr_pcnts_t enValidCnt; ///< 有效周期选择
  643. en_adt_vperr_pcnte_t enValidCdt; ///< 有效周期计数条件
  644. boolean_t bPeriodD; ///< 通用信号有效周期选择D
  645. boolean_t bPeriodC; ///< 通用信号有效周期选择C
  646. boolean_t bPeriodB; ///< 通用信号有效周期选择B
  647. boolean_t bPeriodA; ///< 通用信号有效周期选择A
  648. }stc_adt_validper_cfg_t;
  649. /******************************************************************************
  650. * Global definitions
  651. ******************************************************************************/
  652. /******************************************************************************
  653. * Local type definitions ('typedef')
  654. ******************************************************************************/
  655. /******************************************************************************
  656. * Global variable definitions ('extern')
  657. ******************************************************************************/
  658. /******************************************************************************
  659. * Global function prototypes (definition in C source)
  660. ******************************************************************************/
  661. //配置硬件递加事件
  662. en_result_t Adt_CfgHwCntUp(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntUp);
  663. //清除硬件递加事件
  664. en_result_t Adt_ClearHwCntUp(M0P_ADTIM_TypeDef *ADTx);
  665. //配置硬件递减事件
  666. en_result_t Adt_CfgHwCntDwn(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntDwn);
  667. //清除硬件递减事件
  668. en_result_t Adt_ClearHwCntDwn(M0P_ADTIM_TypeDef *ADTx);
  669. //配置硬件启动事件
  670. en_result_t Adt_CfgHwStart(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwStart);
  671. //清除硬件启动事件
  672. en_result_t Adt_ClearHwStart(M0P_ADTIM_TypeDef *ADTx);
  673. //使能硬件启动事件
  674. en_result_t Adt_EnableHwStart(M0P_ADTIM_TypeDef *ADTx);
  675. //禁止硬件启动事件
  676. en_result_t Adt_DisableHwStart(M0P_ADTIM_TypeDef *ADTx);
  677. //配置硬件停止事件
  678. en_result_t Adt_CfgHwStop(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwStop);
  679. //清除硬件停止事件
  680. en_result_t Adt_ClearHwStop(M0P_ADTIM_TypeDef *ADTx);
  681. //使能硬件停止事件
  682. en_result_t Adt_EnableHwStop(M0P_ADTIM_TypeDef *ADTx);
  683. //禁止硬件停止事件
  684. en_result_t Adt_DisableHwStop(M0P_ADTIM_TypeDef *ADTx);
  685. //配置硬件清零事件
  686. en_result_t Adt_CfgHwClear(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwClear);
  687. //清除硬件清零事件
  688. en_result_t Adt_ClearHwClear(M0P_ADTIM_TypeDef *ADTx);
  689. //使能硬件清零事件
  690. en_result_t Adt_EnableHwClear(M0P_ADTIM_TypeDef *ADTx);
  691. //禁止硬件清零事件
  692. en_result_t Adt_DisableHwClear(M0P_ADTIM_TypeDef *ADTx);
  693. //配置A通道硬件捕获事件
  694. en_result_t Adt_CfgHwCaptureA(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwCaptureA);
  695. //清除A通道硬件捕获事件
  696. en_result_t Adt_ClearHwCaptureA(M0P_ADTIM_TypeDef *ADTx);
  697. //配置B通道硬件捕获事件
  698. en_result_t Adt_CfgHwCaptureB(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwCaptureB);
  699. //清除B通道硬件捕获事件
  700. en_result_t Adt_ClearHwCaptureB(M0P_ADTIM_TypeDef *ADTx);
  701. //软件同步启动
  702. en_result_t Adt_SwSyncStart(stc_adt_sw_sync_t* pstcAdtSwSyncStart);
  703. //软件同步停止
  704. en_result_t Adt_SwSyncStop(stc_adt_sw_sync_t* pstcAdtSwSyncStop);
  705. //软件同步清零
  706. en_result_t Adt_SwSyncClear(stc_adt_sw_sync_t* pstcAdtSwSyncClear);
  707. //获取软件同步状态
  708. en_result_t Adt_GetSwSyncState(stc_adt_sw_sync_t* pstcAdtSwSyncState);
  709. //AOS触发配置
  710. en_result_t Adt_AosTrigCfg(stc_adt_aos_trig_cfg_t* pstcAdtAosTrigCfg);
  711. //中断触发配置
  712. en_result_t Adt_IrqTrigCfg(M0P_ADTIM_TypeDef *ADTx,
  713. stc_adt_irq_trig_cfg_t* pstcAdtIrqTrigCfg);
  714. //端口触发配置
  715. en_result_t Adt_PortTrigCfg(en_adt_trig_port_t enAdtTrigPort,
  716. stc_adt_port_trig_cfg_t* pstcAdtPortTrigCfg);
  717. //CHxX端口配置
  718. en_result_t Adt_CHxXPortCfg(M0P_ADTIM_TypeDef *ADTx,
  719. en_adt_CHxX_port_t enAdtCHxXPort,
  720. stc_adt_CHxX_port_cfg_t* pstcAdtCHxXCfg);
  721. //使能端口刹车
  722. en_result_t Adt_EnableBrakePort(uint8_t port, stc_adt_break_port_cfg_t* pstcAdtBrkPtCfg);
  723. //清除端口刹车
  724. void Adt_ClearBrakePort(void);
  725. //无效条件3配置(端口刹车)
  726. en_result_t Adt_Disable3Cfg(stc_adt_disable_3_cfg_t* pstcAdtDisable3);
  727. //软件刹车 Enable/Disable(仅适用于无效条件3使能的情况下)
  728. en_result_t Adt_SwBrake(boolean_t bSwBrk);
  729. //获取端口刹车标志
  730. boolean_t Adt_GetPortBrakeFlag(void);
  731. //清除端口刹车标志
  732. void Adt_ClearPortBrakeFlag(void);
  733. //无效条件1配置(同高同低刹车)
  734. en_result_t Adt_Disable1Cfg(stc_adt_disable_1_cfg_t* pstcAdtDisable1);
  735. //获取同高同低刹车标志
  736. boolean_t Adt_GetSameBrakeFlag(void);
  737. //清除同高同低刹车标志
  738. void Adt_ClearSameBrakeFlag(void);
  739. //PWM展频配置
  740. en_result_t Adt_PwmDitherCfg(M0P_ADTIM_TypeDef *ADTx, stc_adt_pwm_dither_cfg_t* pstcAdtPwmDitherCfg);
  741. //AdvTimer初始化
  742. en_result_t Adt_Init(M0P_ADTIM_TypeDef *ADTx, stc_adt_basecnt_cfg_t* pstcAdtBaseCntCfg);
  743. //AdvTimer去初始化
  744. en_result_t Adt_DeInit(M0P_ADTIM_TypeDef *ADTx);
  745. //AdvTimert启动
  746. en_result_t Adt_StartCount(M0P_ADTIM_TypeDef *ADTx);
  747. //AdvTimert停止
  748. en_result_t Adt_StopCount(M0P_ADTIM_TypeDef *ADTx);
  749. //设置计数值
  750. en_result_t Adt_SetCount(M0P_ADTIM_TypeDef *ADTx, uint16_t u16Value);
  751. //获取计数值
  752. uint16_t Adt_GetCount(M0P_ADTIM_TypeDef *ADTx);
  753. //清除计数值
  754. en_result_t Adt_ClearCount(M0P_ADTIM_TypeDef *ADTx);
  755. //获取有效周期计数值
  756. uint8_t Adt_GetVperNum(M0P_ADTIM_TypeDef *ADTx);
  757. //获取状态标志
  758. boolean_t Adt_GetState(M0P_ADTIM_TypeDef *ADTx, en_adt_state_type_t enstate);
  759. //配置计数周期
  760. en_result_t Adt_SetPeriod(M0P_ADTIM_TypeDef *ADTx, uint16_t u16Period);
  761. //配置计数周期缓冲
  762. en_result_t Adt_SetPeriodBuf(M0P_ADTIM_TypeDef *ADTx, uint16_t u16PeriodBuf);
  763. //清除计数周期缓冲
  764. en_result_t Adt_ClearPeriodBuf(M0P_ADTIM_TypeDef *ADTx);
  765. //配置有效计数周期
  766. en_result_t Adt_SetValidPeriod(M0P_ADTIM_TypeDef *ADTx,
  767. stc_adt_validper_cfg_t* pstcAdtValidPerCfg);
  768. //配置比较输出计数基准值
  769. en_result_t Adt_SetCompareValue(M0P_ADTIM_TypeDef *ADTx,
  770. en_adt_compare_t enAdtCompare,
  771. uint16_t u16Compare);
  772. //配置通用比较值/捕获值的缓存传送
  773. en_result_t Adt_EnableValueBuf(M0P_ADTIM_TypeDef *ADTx,
  774. en_adt_CHxX_port_t enAdtCHxXPort,
  775. boolean_t bCompareBufEn);
  776. //清除比较输出计数值/捕获值缓存
  777. en_result_t Adt_ClearValueBuf(M0P_ADTIM_TypeDef *ADTx,
  778. en_adt_CHxX_port_t enAdtCHxXPort);
  779. //获取捕获值
  780. en_result_t Adt_GetCaptureValue(M0P_ADTIM_TypeDef *ADTx,
  781. en_adt_CHxX_port_t enAdtCHxXPort,
  782. uint16_t* pu16Capture);
  783. //获取捕获缓存值
  784. en_result_t Adt_GetCaptureBuf(M0P_ADTIM_TypeDef *ADTx,
  785. en_adt_CHxX_port_t enAdtCHxXPort,
  786. uint16_t* pu16CaptureBuf);
  787. //设置死区时间上基准值
  788. en_result_t Adt_SetDTUA(M0P_ADTIM_TypeDef *ADTx,
  789. uint16_t u16Value);
  790. //设置死区时间下基准值
  791. en_result_t Adt_SetDTDA(M0P_ADTIM_TypeDef *ADTx,
  792. uint16_t u16Value);
  793. //配置死区时间功能
  794. en_result_t Adt_CfgDT(M0P_ADTIM_TypeDef *ADTx,
  795. boolean_t bDTEn,
  796. boolean_t bEqual);
  797. //配置中断
  798. en_result_t Adt_CfgIrq(M0P_ADTIM_TypeDef *ADTx,
  799. en_adt_irq_type_t enAdtIrq,
  800. boolean_t bEn);
  801. //获取中断标志
  802. boolean_t Adt_GetIrqFlag(M0P_ADTIM_TypeDef *ADTx,
  803. en_adt_irq_type_t enAdtIrq);
  804. //清除中断标志
  805. en_result_t Adt_ClearIrqFlag(M0P_ADTIM_TypeDef *ADTx,
  806. en_adt_irq_type_t enAdtIrq);
  807. //清除所有中断标志
  808. en_result_t Adt_ClearAllIrqFlag(M0P_ADTIM_TypeDef *ADTx);
  809. //Z相输入屏蔽设置
  810. en_result_t Adt_CfgZMask(M0P_ADTIM_TypeDef *ADTx,
  811. stc_adt_zmask_cfg_t* pstcAdtZMaskCfg);
  812. //@} // ADT Group
  813. #ifdef __cplusplus
  814. }
  815. #endif
  816. #endif /* __ADT_H__ */
  817. /******************************************************************************
  818. * EOF (not truncated)
  819. ******************************************************************************/