adt.c 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952
  1. /******************************************************************************
  2. * Copyright (C) 2017, 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.c
  44. **
  45. ** Low Voltage Detect driver API.
  46. ** @link Lvd Group Some description @endlink
  47. **
  48. ** - 2018-04-18 Husj First Version
  49. **
  50. ******************************************************************************/
  51. /******************************************************************************
  52. * Include files
  53. ******************************************************************************/
  54. #include "adt.h"
  55. /**
  56. ******************************************************************************
  57. ** \addtogroup AdtGroup
  58. ******************************************************************************/
  59. //@{
  60. /******************************************************************************
  61. * Local pre-processor symbols/macros ('#define')
  62. ******************************************************************************/
  63. /******************************************************************************
  64. * Global variable definitions (declared in header file with 'extern') *
  65. ******************************************************************************/
  66. /******************************************************************************
  67. * Local type definitions ('typedef')
  68. ******************************************************************************/
  69. /******************************************************************************
  70. * Local function prototypes ('static')
  71. ******************************************************************************/
  72. /******************************************************************************
  73. * Local variable definitions ('static')
  74. ******************************************************************************/
  75. static func_ptr_t pfnAdtIrqCbk[3][16] = {NULL};
  76. /*****************************************************************************
  77. * Function implementation - global ('extern') and local ('static')
  78. *****************************************************************************/
  79. /*************************************************
  80. * \brief
  81. * 使能NVIC中ADT中断
  82. *
  83. * \param [in] enIrqn 中断号
  84. *
  85. * \retval 无
  86. **************************************************/
  87. static void AdtEnableNvic(IRQn_Type enIrqn)
  88. {
  89. NVIC_ClearPendingIRQ(enIrqn);
  90. NVIC_EnableIRQ(enIrqn);
  91. NVIC_SetPriority(enIrqn, DDL_IRQ_LEVEL_DEFAULT);
  92. }
  93. /**************************************************
  94. * \brief
  95. * 除能NVIC中ADT中断
  96. *
  97. * \param [in] enIrqn 中断号
  98. *
  99. * \retval 无
  100. **************************************************/
  101. static void AdtDisableNvic(IRQn_Type enIrqn)
  102. {
  103. NVIC_ClearPendingIRQ(enIrqn);
  104. NVIC_DisableIRQ(enIrqn);
  105. NVIC_SetPriority(enIrqn, DDL_IRQ_LEVEL_DEFAULT);
  106. }
  107. /***************************************************
  108. * \brief
  109. * ADT中断服务程序
  110. *
  111. * \param [in] u8Param 未使用
  112. *
  113. * \retval 无
  114. ****************************************************/
  115. void Adt_IRQHandler(uint8_t u8Param)
  116. {
  117. uint8_t u8Adt = u8Param - 4;
  118. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*u8Adt);
  119. if (TRUE == pstcM0PAdt->IFR_f.CMAF)
  120. {
  121. if (NULL != pfnAdtIrqCbk[u8Adt][AdtCMAIrq])
  122. {
  123. pfnAdtIrqCbk[u8Adt][AdtCMAIrq]();
  124. }
  125. pstcM0PAdt->ICLR = ~(1<<AdtCMAIrq);
  126. }
  127. if (TRUE == pstcM0PAdt->IFR_f.CMBF)
  128. {
  129. if (NULL != pfnAdtIrqCbk[u8Adt][AdtCMBIrq])
  130. {
  131. pfnAdtIrqCbk[u8Adt][AdtCMBIrq]();
  132. }
  133. pstcM0PAdt->ICLR = ~(1<<AdtCMBIrq);
  134. }
  135. if (TRUE == pstcM0PAdt->IFR_f.CMCF)
  136. {
  137. if (NULL != pfnAdtIrqCbk[u8Adt][AdtCMCIrq])
  138. {
  139. pfnAdtIrqCbk[u8Adt][AdtCMCIrq]();
  140. }
  141. pstcM0PAdt->ICLR = ~(1<<AdtCMCIrq);
  142. }
  143. if (TRUE == pstcM0PAdt->IFR_f.CMDF)
  144. {
  145. if (NULL != pfnAdtIrqCbk[u8Adt][AdtCMDIrq])
  146. {
  147. pfnAdtIrqCbk[u8Adt][AdtCMDIrq]();
  148. }
  149. pstcM0PAdt->ICLR = ~(1<<AdtCMDIrq);
  150. }
  151. if (TRUE == pstcM0PAdt->IFR_f.OVFF)
  152. {
  153. if (NULL != pfnAdtIrqCbk[u8Adt][AdtOVFIrq])
  154. {
  155. pfnAdtIrqCbk[u8Adt][AdtOVFIrq]();
  156. }
  157. pstcM0PAdt->ICLR = ~(1<<AdtOVFIrq);
  158. }
  159. if (TRUE == pstcM0PAdt->IFR_f.UDFF)
  160. {
  161. if (NULL != pfnAdtIrqCbk[u8Adt][AdtUDFIrq])
  162. {
  163. pfnAdtIrqCbk[u8Adt][AdtUDFIrq]();
  164. }
  165. pstcM0PAdt->ICLR = ~(1<<AdtUDFIrq);
  166. }
  167. if (TRUE == pstcM0PAdt->IFR_f.DTEF)
  168. {
  169. if (NULL != pfnAdtIrqCbk[u8Adt][AdtDTEIrq])
  170. {
  171. pfnAdtIrqCbk[u8Adt][AdtDTEIrq]();
  172. }
  173. pstcM0PAdt->ICLR = ~(1<<AdtDTEIrq);
  174. }
  175. if (TRUE == pstcM0PAdt->IFR_f.SAMLF)
  176. {
  177. if (NULL != pfnAdtIrqCbk[u8Adt][AdtSAMLIrq])
  178. {
  179. pfnAdtIrqCbk[u8Adt][AdtSAMLIrq]();
  180. }
  181. pstcM0PAdt->ICLR = ~(1<<AdtSAMLIrq);
  182. }
  183. if (TRUE == pstcM0PAdt->IFR_f.SAMHF)
  184. {
  185. if (NULL != pfnAdtIrqCbk[u8Adt][AdtSAMHIrq])
  186. {
  187. pfnAdtIrqCbk[u8Adt][AdtSAMHIrq]();
  188. }
  189. pstcM0PAdt->ICLR = ~(1<<AdtSAMHIrq);
  190. }
  191. }
  192. /*****************************************************************
  193. * \brief
  194. * 配置中断
  195. *
  196. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  197. * \param [in] enAdtIrq 中断类型
  198. * \param [in] bEn 中断使能/禁止
  199. * \param [in] pfnIrqCalbak 回调函数指针
  200. *
  201. * \retval en_result_t Ok: 配置成功
  202. * \retval en_result_t ErrorInvalidParameter: 无效参数
  203. ****************************************************************/
  204. en_result_t Adt_ConfigIrq(en_adt_unit_t enAdtUnit,
  205. en_adt_irq_type_t enAdtIrq,
  206. boolean_t bEn,
  207. func_ptr_t pfnIrqCalbak)
  208. {
  209. uint32_t u32Val;
  210. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  211. if (AdtTIM6 < enAdtUnit)
  212. {
  213. return ErrorInvalidParameter;
  214. }
  215. pfnAdtIrqCbk[enAdtUnit][enAdtIrq] = pfnIrqCalbak;
  216. u32Val = pstcM0PAdt->ICONR;
  217. if (bEn)
  218. {
  219. u32Val |= 1u<<enAdtIrq;
  220. }
  221. else
  222. {
  223. u32Val &= ~(1u<<enAdtIrq);
  224. }
  225. pstcM0PAdt->ICONR = u32Val;
  226. return Ok;
  227. }
  228. /*******************************************************************
  229. * \brief
  230. * 获取中断标志
  231. *
  232. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  233. * \param [in] enAdtIrq 中断类型
  234. * \param [in] pbFlag 中断标志指针
  235. *
  236. * \retval en_result_t Ok: 配置成功
  237. * \retval en_result_t ErrorInvalidParameter: 无效参数
  238. *****************************************************************/
  239. en_result_t Adt_GetIrqFlag(en_adt_unit_t enAdtUnit,
  240. en_adt_irq_type_t enAdtIrq,
  241. boolean_t* pbFlag)
  242. {
  243. uint32_t u32Val;
  244. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  245. if (AdtTIM6 < enAdtUnit)
  246. {
  247. return ErrorInvalidParameter;
  248. }
  249. u32Val = pstcM0PAdt->IFR;
  250. *pbFlag = (u32Val>>enAdtIrq) & 0x1;
  251. return Ok;
  252. }
  253. /****************************************************************
  254. * \brief
  255. * 清除中断标志
  256. *
  257. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  258. * \param [in] enAdtIrq 中断类型
  259. *
  260. * \retval en_result_t Ok: 配置成功
  261. * \retval en_result_t ErrorInvalidParameter: 无效参数
  262. ****************************************************************/
  263. en_result_t Adt_ClearIrqFlag(en_adt_unit_t enAdtUnit,
  264. en_adt_irq_type_t enAdtIrq)
  265. {
  266. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  267. if (AdtTIM6 < enAdtUnit)
  268. {
  269. return ErrorInvalidParameter;
  270. }
  271. pstcM0PAdt->ICLR = ~(1u<<enAdtIrq);
  272. return Ok;
  273. }
  274. /**************************************************************
  275. * \brief
  276. * 配置硬件递加事件
  277. *
  278. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  279. * \param [in] enAdtHwCntUp 硬件递加事件
  280. *
  281. * \retval en_result_t Ok: 设置成功
  282. * \retval en_result_t ErrorInvalidParameter: 无效参数
  283. ****************************************************************/
  284. en_result_t Adt_ConfigHwCntUp(en_adt_unit_t enAdtUnit, en_adt_hw_cnt_t enAdtHwCntUp)
  285. {
  286. uint32_t u32Val;
  287. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  288. if ((AdtTIM6 < enAdtUnit) || (AdtHwCntMax <= enAdtHwCntUp))
  289. {
  290. return ErrorInvalidParameter;
  291. }
  292. u32Val = pstcM0PAdt->HCUPR;
  293. pstcM0PAdt->HCUPR = u32Val | (1u<<enAdtHwCntUp);
  294. return Ok;
  295. }
  296. /**************************************************************
  297. * \brief
  298. * 清除硬件递加事件
  299. *
  300. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  301. *
  302. * \retval en_result_t Ok: 设置成功
  303. * \retval en_result_t ErrorInvalidParameter: 无效参数
  304. ************************************************************/
  305. en_result_t Adt_ClearHwCntUp(en_adt_unit_t enAdtUnit)
  306. {
  307. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  308. if (AdtTIM6 < enAdtUnit)
  309. {
  310. return ErrorInvalidParameter;
  311. }
  312. pstcM0PAdt->HCUPR = 0;
  313. return Ok;
  314. }
  315. /**
  316. * \brief
  317. * 配置硬件递减事件
  318. *
  319. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  320. * \param [in] enAdtHwCntDwn 硬件递减事件
  321. *
  322. * \retval en_result_t Ok: 设置成功
  323. * \retval en_result_t ErrorInvalidParameter: 无效参数
  324. */
  325. en_result_t Adt_ConfigHwCntDwn(en_adt_unit_t enAdtUnit, en_adt_hw_cnt_t enAdtHwCntDwn)
  326. {
  327. uint32_t u32Val;
  328. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  329. if ((AdtTIM6 < enAdtUnit) || (AdtHwCntMax <= enAdtHwCntDwn))
  330. {
  331. return ErrorInvalidParameter;
  332. }
  333. u32Val = pstcM0PAdt->HCDOR;
  334. pstcM0PAdt->HCDOR = u32Val | (1u<<enAdtHwCntDwn);
  335. return Ok;
  336. }
  337. /******************************************************************
  338. * \brief
  339. * 清除硬件递减事件
  340. *
  341. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  342. *
  343. * \retval en_result_t Ok: 设置成功
  344. * \retval en_result_t ErrorInvalidParameter: 无效参数
  345. *****************************************************************/
  346. en_result_t Adt_ClearHwCntDwn(en_adt_unit_t enAdtUnit)
  347. {
  348. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  349. if (AdtTIM6 < enAdtUnit)
  350. {
  351. return ErrorInvalidParameter;
  352. }
  353. pstcM0PAdt->HCDOR = 0;
  354. return Ok;
  355. }
  356. /******************************************************************
  357. * \brief
  358. * 配置硬件启动事件
  359. *
  360. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  361. * \param [in] enAdtHwStart 硬件启动事件
  362. *
  363. * \retval en_result_t Ok: 设置成功
  364. * \retval en_result_t ErrorInvalidParameter: 无效参数
  365. *******************************************************************/
  366. en_result_t Adt_ConfigHwStart(en_adt_unit_t enAdtUnit, en_adt_hw_trig_t enAdtHwStart)
  367. {
  368. uint32_t u32Val;
  369. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  370. if ((AdtTIM6 < enAdtUnit) || (AdtHwTrigEnd <= enAdtHwStart))
  371. {
  372. return ErrorInvalidParameter;
  373. }
  374. u32Val = pstcM0PAdt->HSTAR;
  375. pstcM0PAdt->HSTAR = u32Val | (1u<<enAdtHwStart);
  376. return Ok;
  377. }
  378. /************************************************************************
  379. * \brief
  380. * 清除硬件启动事件
  381. *
  382. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  383. *
  384. * \retval en_result_t Ok: 设置成功
  385. * \retval en_result_t ErrorInvalidParameter: 无效参数
  386. ***********************************************************************/
  387. en_result_t Adt_ClearHwStart(en_adt_unit_t enAdtUnit)
  388. {
  389. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  390. if (AdtTIM6 < enAdtUnit)
  391. {
  392. return ErrorInvalidParameter;
  393. }
  394. pstcM0PAdt->HSTAR = 0;
  395. return Ok;
  396. }
  397. /*********************************************************************
  398. * \brief
  399. * 使能硬件启动
  400. *
  401. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  402. *
  403. * \retval en_result_t Ok: 设置成功
  404. * \retval en_result_t ErrorInvalidParameter: 无效参数
  405. *********************************************************************/
  406. en_result_t Adt_EnableHwStart(en_adt_unit_t enAdtUnit)
  407. {
  408. uint32_t u32Val;
  409. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  410. if (AdtTIM6 < enAdtUnit)
  411. {
  412. return ErrorInvalidParameter;
  413. }
  414. u32Val = pstcM0PAdt->HSTAR;
  415. pstcM0PAdt->HSTAR = u32Val | (1u<<31);
  416. return Ok;
  417. }
  418. /*************************************************************************
  419. * \brief
  420. * 除能硬件启动
  421. *
  422. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  423. *
  424. * \retval en_result_t Ok: 设置成功
  425. * \retval en_result_t ErrorInvalidParameter: 无效参数
  426. ************************************************************************/
  427. en_result_t Adt_DisableHwStart(en_adt_unit_t enAdtUnit)
  428. {
  429. uint32_t u32Val;
  430. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  431. if (AdtTIM6 < enAdtUnit)
  432. {
  433. return ErrorInvalidParameter;
  434. }
  435. u32Val = pstcM0PAdt->HSTAR;
  436. pstcM0PAdt->HSTAR = u32Val & 0x7FFFFFFF;
  437. return Ok;
  438. }
  439. /****************************************************************
  440. * \brief
  441. * 配置硬件停止事件
  442. *
  443. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  444. * \param [in] enAdtHwStop 硬件停止事件
  445. *
  446. * \retval en_result_t Ok: 设置成功
  447. * \retval en_result_t ErrorInvalidParameter: 无效参数
  448. ***************************************************************/
  449. en_result_t Adt_ConfigHwStop(en_adt_unit_t enAdtUnit, en_adt_hw_trig_t enAdtHwStop)
  450. {
  451. uint32_t u32Val;
  452. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  453. if ((AdtTIM6 < enAdtUnit) || (AdtHwTrigEnd <= enAdtHwStop))
  454. {
  455. return ErrorInvalidParameter;
  456. }
  457. u32Val = pstcM0PAdt->HSTPR;
  458. pstcM0PAdt->HSTPR = u32Val | (1u<<enAdtHwStop);
  459. return Ok;
  460. }
  461. /***************************************************************
  462. * \brief
  463. * 清除硬件停止事件
  464. *
  465. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  466. *
  467. * \retval en_result_t Ok: 设置成功
  468. * \retval en_result_t ErrorInvalidParameter: 无效参数
  469. ***************************************************************/
  470. en_result_t Adt_ClearHwStop(en_adt_unit_t enAdtUnit)
  471. {
  472. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  473. if (AdtTIM6 < enAdtUnit)
  474. {
  475. return ErrorInvalidParameter;
  476. }
  477. pstcM0PAdt->HSTPR = 0;
  478. return Ok;
  479. }
  480. /*************************************************************
  481. * \brief
  482. * 使能硬件停止
  483. *
  484. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  485. *
  486. * \retval en_result_t Ok: 设置成功
  487. * \retval en_result_t ErrorInvalidParameter: 无效参数
  488. **********************************************************/
  489. en_result_t Adt_EnableHwStop(en_adt_unit_t enAdtUnit)
  490. {
  491. uint32_t u32Val;
  492. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  493. if (AdtTIM6 < enAdtUnit)
  494. {
  495. return ErrorInvalidParameter;
  496. }
  497. u32Val = pstcM0PAdt->HSTPR;
  498. pstcM0PAdt->HSTPR = u32Val | (1u<<31);
  499. return Ok;
  500. }
  501. /*****************************************************************************
  502. * \brief
  503. * 除能硬件停止
  504. *
  505. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  506. *
  507. * \retval en_result_t Ok: 设置成功
  508. * \retval en_result_t ErrorInvalidParameter: 无效参数
  509. ***************************************************************************/
  510. en_result_t Adt_DisableHwStop(en_adt_unit_t enAdtUnit)
  511. {
  512. uint32_t u32Val;
  513. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  514. if (AdtTIM6 < enAdtUnit)
  515. {
  516. return ErrorInvalidParameter;
  517. }
  518. u32Val = pstcM0PAdt->HSTPR;
  519. pstcM0PAdt->HSTPR = u32Val & 0x7FFFFFFF;
  520. return Ok;
  521. }
  522. /**************************************************************************
  523. * \brief
  524. * 配置硬件清零事件
  525. *
  526. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  527. * \param [in] enAdtHwClear 硬件清零事件
  528. *
  529. * \retval en_result_t Ok: 设置成功
  530. * \retval en_result_t ErrorInvalidParameter: 无效参数
  531. *************************************************************************/
  532. en_result_t Adt_ConfigHwClear(en_adt_unit_t enAdtUnit, en_adt_hw_trig_t enAdtHwClear)
  533. {
  534. uint32_t u32Val;
  535. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  536. if ((AdtTIM6 < enAdtUnit) || (AdtHwTrigEnd <= enAdtHwClear))
  537. {
  538. return ErrorInvalidParameter;
  539. }
  540. u32Val = pstcM0PAdt->HCELR & (1u<<31);
  541. pstcM0PAdt->HCELR = u32Val | (1u<<enAdtHwClear);
  542. return Ok;
  543. }
  544. /**************************************************************************
  545. * \brief
  546. * 清除硬件清零事件
  547. *
  548. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  549. *
  550. * \retval en_result_t Ok: 设置成功
  551. * \retval en_result_t ErrorInvalidParameter: 无效参数
  552. **************************************************************************/
  553. en_result_t Adt_ClearHwClear(en_adt_unit_t enAdtUnit)
  554. {
  555. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  556. if (AdtTIM6 < enAdtUnit)
  557. {
  558. return ErrorInvalidParameter;
  559. }
  560. pstcM0PAdt->HCELR = 0;
  561. return Ok;
  562. }
  563. /***************************************************************************
  564. * \brief
  565. * 使能硬件清零
  566. *
  567. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  568. *
  569. * \retval en_result_t Ok: 设置成功
  570. * \retval en_result_t ErrorInvalidParameter: 无效参数
  571. *************************************************************************/
  572. en_result_t Adt_EnableHwClear(en_adt_unit_t enAdtUnit)
  573. {
  574. uint32_t u32Val;
  575. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  576. if (AdtTIM6 < enAdtUnit)
  577. {
  578. return ErrorInvalidParameter;
  579. }
  580. u32Val = pstcM0PAdt->HCELR;
  581. pstcM0PAdt->HCELR = u32Val | (1u<<31);
  582. return Ok;
  583. }
  584. /************************************************************************
  585. * \brief
  586. * 除能硬件清零
  587. *
  588. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  589. *
  590. * \retval en_result_t Ok: 设置成功
  591. * \retval en_result_t ErrorInvalidParameter: 无效参数
  592. **********************************************************************/
  593. en_result_t Adt_DisableHwClear(en_adt_unit_t enAdtUnit)
  594. {
  595. uint32_t u32Val;
  596. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  597. if (AdtTIM6 < enAdtUnit)
  598. {
  599. return ErrorInvalidParameter;
  600. }
  601. u32Val = pstcM0PAdt->HCELR;
  602. pstcM0PAdt->HCELR = u32Val & 0x7FFFFFFF;
  603. return Ok;
  604. }
  605. /*******************************************************************
  606. * \brief
  607. * 配置硬件捕获A事件
  608. *
  609. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  610. * \param [in] enAdtHwCaptureA 硬件捕获A事件选择
  611. *
  612. * \retval en_result_t Ok: 设置成功
  613. * \retval en_result_t ErrorInvalidParameter: 无效参数
  614. *******************************************************************/
  615. en_result_t Adt_ConfigHwCaptureA(en_adt_unit_t enAdtUnit, en_adt_hw_trig_t enAdtHwCaptureA)
  616. {
  617. uint32_t u32Val;
  618. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  619. if ((AdtTIM6 < enAdtUnit) || (AdtHwTrigEnd <= enAdtHwCaptureA))
  620. {
  621. return ErrorInvalidParameter;
  622. }
  623. u32Val = pstcM0PAdt->HCPAR;
  624. pstcM0PAdt->HCPAR = u32Val | (1u<<enAdtHwCaptureA);
  625. pstcM0PAdt->PCONR_f.CAPCA = 1;
  626. return Ok;
  627. }
  628. /************************************************************************
  629. * \brief
  630. * 清除硬件捕获A事件
  631. *
  632. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  633. *
  634. * \retval en_result_t Ok: 设置成功
  635. * \retval en_result_t ErrorInvalidParameter: 无效参数
  636. ***********************************************************************/
  637. en_result_t Adt_ClearHwCaptureA(en_adt_unit_t enAdtUnit)
  638. {
  639. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  640. if (AdtTIM6 < enAdtUnit)
  641. {
  642. return ErrorInvalidParameter;
  643. }
  644. pstcM0PAdt->HCPAR = 0;
  645. return Ok;
  646. }
  647. /*********************************************************************
  648. * \brief
  649. * 配置硬件捕获B事件
  650. *
  651. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  652. * \param [in] enAdtHwCaptureB 硬件捕获B事件选择
  653. *
  654. * \retval en_result_t Ok: 设置成功
  655. * \retval en_result_t ErrorInvalidParameter: 无效参数
  656. ********************************************************************/
  657. en_result_t Adt_ConfigHwCaptureB(en_adt_unit_t enAdtUnit, en_adt_hw_trig_t enAdtHwCaptureB)
  658. {
  659. uint32_t u32Val;
  660. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  661. if ((AdtTIM6 < enAdtUnit) || (AdtHwTrigEnd <= enAdtHwCaptureB))
  662. {
  663. return ErrorInvalidParameter;
  664. }
  665. u32Val = pstcM0PAdt->HCPBR;
  666. pstcM0PAdt->HCPBR = u32Val | (1u<<enAdtHwCaptureB);
  667. pstcM0PAdt->PCONR_f.CAPCB = 1;
  668. return Ok;
  669. }
  670. /********************************************************************
  671. * \brief
  672. * 清除硬件捕获B事件
  673. *
  674. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  675. *
  676. * \retval en_result_t Ok: 设置成功
  677. * \retval en_result_t ErrorInvalidParameter: 无效参数
  678. *******************************************************************/
  679. en_result_t Adt_ClearHwCaptureB(en_adt_unit_t enAdtUnit)
  680. {
  681. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  682. if (AdtTIM6 < enAdtUnit)
  683. {
  684. return ErrorInvalidParameter;
  685. }
  686. pstcM0PAdt->HCPBR = 0;
  687. return Ok;
  688. }
  689. /*****************************************************************
  690. * \brief
  691. * 软件同步开始
  692. *
  693. * \param [in] pstcAdtSwSyncStart 软件同步开始指针
  694. *
  695. * \retval en_result_t Ok: 设置成功
  696. * \retval en_result_t ErrorInvalidParameter: 无效参数
  697. ***************************************************************/
  698. en_result_t Adt_SwSyncStart(stc_adt_sw_sync_t* pstcAdtSwSyncStart)
  699. {
  700. uint32_t u32Val = 0;
  701. if (NULL == pstcAdtSwSyncStart)
  702. {
  703. return ErrorInvalidParameter;
  704. }
  705. if (pstcAdtSwSyncStart->bAdTim4)
  706. {
  707. u32Val |= 0x1;
  708. }
  709. if (pstcAdtSwSyncStart->bAdTim5)
  710. {
  711. u32Val |= 0x2;
  712. }
  713. if (pstcAdtSwSyncStart->bAdTim6)
  714. {
  715. u32Val |= 0x4;
  716. }
  717. M0P_TIM4->SSTAR = u32Val;
  718. return Ok;
  719. }
  720. /***************************************************************
  721. * \brief
  722. * 软件同步停止
  723. *
  724. * \param [in] pstcAdtSwSyncStop 软件同步停止指针
  725. *
  726. * \retval en_result_t Ok: 设置成功
  727. * \retval en_result_t ErrorInvalidParameter: 无效参数
  728. ***************************************************************/
  729. en_result_t Adt_SwSyncStop(stc_adt_sw_sync_t* pstcAdtSwSyncStop)
  730. {
  731. uint32_t u32Val = 0;
  732. if (NULL == pstcAdtSwSyncStop)
  733. {
  734. return ErrorInvalidParameter;
  735. }
  736. if (pstcAdtSwSyncStop->bAdTim4)
  737. {
  738. u32Val |= 0x1;
  739. }
  740. if (pstcAdtSwSyncStop->bAdTim5)
  741. {
  742. u32Val |= 0x2;
  743. }
  744. if (pstcAdtSwSyncStop->bAdTim6)
  745. {
  746. u32Val |= 0x4;
  747. }
  748. M0P_TIM4->SSTPR = u32Val;
  749. return Ok;
  750. }
  751. /*****************************************************************
  752. * \brief
  753. * 软件同步清零
  754. *
  755. * \param [in] pstcAdtSwSyncClear 软件同步清零指针
  756. *
  757. * \retval en_result_t Ok: 设置成功
  758. * \retval en_result_t ErrorInvalidParameter: 无效参数
  759. *******************************************************************/
  760. en_result_t Adt_SwSyncClear(stc_adt_sw_sync_t* pstcAdtSwSyncClear)
  761. {
  762. uint32_t u32Val = 0;
  763. if (NULL == pstcAdtSwSyncClear)
  764. {
  765. return ErrorInvalidParameter;
  766. }
  767. if (pstcAdtSwSyncClear->bAdTim4)
  768. {
  769. u32Val |= 0x1;
  770. }
  771. if (pstcAdtSwSyncClear->bAdTim5)
  772. {
  773. u32Val |= 0x2;
  774. }
  775. if (pstcAdtSwSyncClear->bAdTim6)
  776. {
  777. u32Val |= 0x4;
  778. }
  779. M0P_TIM4->SCLRR = u32Val;
  780. return Ok;
  781. }
  782. /*******************************************************************
  783. * \brief
  784. * 获取软件同步运行状态
  785. *
  786. * \param [in] pstcAdtSwSyncState ADV Timer软件同步运行状态指针
  787. *
  788. * \retval en_result_t Ok: 设置成功
  789. * \retval en_result_t ErrorInvalidParameter: 无效参数
  790. *******************************************************************/
  791. en_result_t Adt_GetSwSyncState(stc_adt_sw_sync_t* pstcAdtSwSyncState)
  792. {
  793. if (NULL == pstcAdtSwSyncState)
  794. {
  795. return ErrorInvalidParameter;
  796. }
  797. if (M0P_TIM4->SSTAR & 0x1)
  798. {
  799. pstcAdtSwSyncState->bAdTim4 = TRUE;
  800. }
  801. else
  802. {
  803. pstcAdtSwSyncState->bAdTim4 = FALSE;
  804. }
  805. if (M0P_TIM4->SSTAR & 0x2)
  806. {
  807. pstcAdtSwSyncState->bAdTim5 = TRUE;
  808. }
  809. else
  810. {
  811. pstcAdtSwSyncState->bAdTim5 = FALSE;
  812. }
  813. if (M0P_TIM4->SSTAR & 0x4)
  814. {
  815. pstcAdtSwSyncState->bAdTim6 = TRUE;
  816. }
  817. else
  818. {
  819. pstcAdtSwSyncState->bAdTim6 = FALSE;
  820. }
  821. return Ok;
  822. }
  823. /************************************************************************
  824. * \brief
  825. * AOS触发配置
  826. *
  827. * \param [in] pstcAdtAosTrigCfg 触发配置指针
  828. *
  829. * \retval en_result_t Ok: 配置成功
  830. * \retval en_result_t ErrorInvalidParameter: 无效参数
  831. ************************************************************************/
  832. en_result_t Adt_AosTrigConfig(stc_adt_aos_trig_cfg_t* pstcAdtAosTrigCfg)
  833. {
  834. if (NULL == pstcAdtAosTrigCfg)
  835. {
  836. return ErrorInvalidParameter;
  837. }
  838. M0P_TIM4->ITRIG_f.IAOS0S = pstcAdtAosTrigCfg->enAos0TrigSrc;
  839. M0P_TIM4->ITRIG_f.IAOS1S = pstcAdtAosTrigCfg->enAos1TrigSrc;
  840. M0P_TIM4->ITRIG_f.IAOS2S = pstcAdtAosTrigCfg->enAos2TrigSrc;
  841. M0P_TIM4->ITRIG_f.IAOS3S = pstcAdtAosTrigCfg->enAos3TrigSrc;
  842. return Ok;
  843. }
  844. /**********************************************************************
  845. * \brief
  846. * 中断触发配置
  847. *
  848. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  849. * \param [in] pstcAdtIrqTrigCfg 触发配置指针
  850. *
  851. * \retval en_result_t Ok: 配置成功
  852. * \retval en_result_t ErrorInvalidParameter: 无效参数
  853. ***********************************************************************/
  854. en_result_t Adt_IrqTrigConfig(en_adt_unit_t enAdtUnit,
  855. stc_adt_irq_trig_cfg_t* pstcAdtIrqTrigCfg)
  856. {
  857. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  858. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtIrqTrigCfg))
  859. {
  860. return ErrorInvalidParameter;
  861. }
  862. pstcM0PAdt->CR_f.CMAE = pstcAdtIrqTrigCfg->bAdtCntMatchATrigEn;
  863. pstcM0PAdt->CR_f.CMBE = pstcAdtIrqTrigCfg->bAdtCntMatchBTrigEn;
  864. pstcM0PAdt->CR_f.CMCE = pstcAdtIrqTrigCfg->bAdtCntMatchCTrigEn;
  865. pstcM0PAdt->CR_f.CMDE = pstcAdtIrqTrigCfg->bAdtCntMatchDTrigEn;
  866. pstcM0PAdt->CR_f.OVFE = pstcAdtIrqTrigCfg->bAdtOverFlowTrigEn;
  867. pstcM0PAdt->CR_f.UDFE = pstcAdtIrqTrigCfg->bAdtUnderFlowTrigEn;
  868. pstcM0PAdt->CR_f.DMA_G_CMA = pstcAdtIrqTrigCfg->bAdtCntMatchATrigDmaEn;
  869. pstcM0PAdt->CR_f.DMA_G_CMB = pstcAdtIrqTrigCfg->bAdtCntMatchBTrigDmaEn;
  870. pstcM0PAdt->CR_f.DMA_G_CMC = pstcAdtIrqTrigCfg->bAdtCntMatchCTrigDmaEn;
  871. pstcM0PAdt->CR_f.DMA_G_CMD = pstcAdtIrqTrigCfg->bAdtCntMatchDTrigDmaEn;
  872. pstcM0PAdt->CR_f.DMA_G_OVF = pstcAdtIrqTrigCfg->bAdtOverFlowTrigDmaEn;
  873. pstcM0PAdt->CR_f.DMA_G_UDF = pstcAdtIrqTrigCfg->bAdtUnderFlowTrigDmaEn;
  874. pstcM0PAdt->CR_f.DMA_S_CMA = pstcAdtIrqTrigCfg->bAdtSpecilMatchATrigDmaEn;
  875. pstcM0PAdt->CR_f.DMA_S_CMB = pstcAdtIrqTrigCfg->bAdtSpecilMatchBTrigDmaEn;
  876. return Ok;
  877. }
  878. /*************************************************************************
  879. * \brief
  880. * 端口触发配置
  881. *
  882. * \param [in] enAdtTrigPort 触发端口
  883. * \param [in] pstcAdtPortTrigCfg 触发配置指针
  884. *
  885. * \retval en_result_t Ok: 配置成功
  886. * \retval en_result_t ErrorInvalidParameter: 无效参数
  887. *************************************************************************/
  888. en_result_t Adt_PortTrigConfig(en_adt_trig_port_t enAdtTrigPort,
  889. stc_adt_port_trig_cfg_t* pstcAdtPortTrigCfg)
  890. {
  891. if (NULL == pstcAdtPortTrigCfg)
  892. {
  893. return ErrorInvalidParameter;
  894. }
  895. switch (enAdtTrigPort)
  896. {
  897. case AdtTrigA:
  898. M0P_TIM4->TTRIG_f.TRIGAS = pstcAdtPortTrigCfg->enTrigSrc;
  899. M0P_TIM4->FCONR_f.NOFIENTA = pstcAdtPortTrigCfg->bFltEn;
  900. M0P_TIM4->FCONR_f.NOFICKTA = pstcAdtPortTrigCfg->enFltClk;
  901. break;
  902. case AdtTrigB:
  903. M0P_TIM4->TTRIG_f.TRIGBS = pstcAdtPortTrigCfg->enTrigSrc;
  904. M0P_TIM4->FCONR_f.NOFIENTB = pstcAdtPortTrigCfg->bFltEn;
  905. M0P_TIM4->FCONR_f.NOFICKTB = pstcAdtPortTrigCfg->enFltClk;
  906. break;
  907. case AdtTrigC:
  908. M0P_TIM4->TTRIG_f.TRIGCS = pstcAdtPortTrigCfg->enTrigSrc;
  909. M0P_TIM4->FCONR_f.NOFIENTC = pstcAdtPortTrigCfg->bFltEn;
  910. M0P_TIM4->FCONR_f.NOFICKTC = pstcAdtPortTrigCfg->enFltClk;
  911. break;
  912. case AdtTrigD:
  913. M0P_TIM4->TTRIG_f.TRIGDS = pstcAdtPortTrigCfg->enTrigSrc;
  914. M0P_TIM4->FCONR_f.NOFIENTD = pstcAdtPortTrigCfg->bFltEn;
  915. M0P_TIM4->FCONR_f.NOFICKTD = pstcAdtPortTrigCfg->enFltClk;
  916. break;
  917. default:
  918. return ErrorInvalidParameter;
  919. }
  920. return Ok;
  921. }
  922. /***********************************************************************
  923. * \brief
  924. * CHxX端口配置
  925. *
  926. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  927. * \param [in] enAdtCHxXPort CHxX端口
  928. * \param [in] pstcAdtCHxXCfg CHxX端口配置指针
  929. *
  930. * \retval en_result_t Ok: 配置成功
  931. * \retval en_result_t ErrorInvalidParameter: 无效参数
  932. *********************************************************************/
  933. en_result_t Adt_CHxXPortConfig(en_adt_unit_t enAdtUnit,
  934. en_adt_CHxX_port_t enAdtCHxXPort,
  935. stc_adt_CHxX_port_cfg_t* pstcAdtCHxXCfg)
  936. {
  937. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  938. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtCHxXCfg))
  939. {
  940. return ErrorInvalidParameter;
  941. }
  942. switch (enAdtCHxXPort)
  943. {
  944. case AdtCHxA:
  945. pstcM0PAdt->PCONR_f.CAPCA = pstcAdtCHxXCfg->enCap;
  946. pstcM0PAdt->PCONR_f.STACA = pstcAdtCHxXCfg->enStaOut;
  947. pstcM0PAdt->PCONR_f.STPCA = pstcAdtCHxXCfg->enStpOut;
  948. pstcM0PAdt->PCONR_f.STASTPSA = pstcAdtCHxXCfg->enStaStp;
  949. pstcM0PAdt->PCONR_f.CMPCA = pstcAdtCHxXCfg->enCmpc;
  950. pstcM0PAdt->PCONR_f.PERCA = pstcAdtCHxXCfg->enPerc;
  951. pstcM0PAdt->PCONR_f.OUTENA = pstcAdtCHxXCfg->bOutEn;
  952. pstcM0PAdt->PCONR_f.DISSELA = pstcAdtCHxXCfg->enDisSel;
  953. pstcM0PAdt->PCONR_f.DISVALA = pstcAdtCHxXCfg->enDisVal;
  954. pstcM0PAdt->FCONR_f.NOFIENGA = pstcAdtCHxXCfg->bFltEn;
  955. pstcM0PAdt->FCONR_f.NOFICKGA = pstcAdtCHxXCfg->enFltClk;
  956. break;
  957. case AdtCHxB:
  958. pstcM0PAdt->PCONR_f.CAPCB = pstcAdtCHxXCfg->enCap;
  959. pstcM0PAdt->PCONR_f.STACB = pstcAdtCHxXCfg->enStaOut;
  960. pstcM0PAdt->PCONR_f.STPCB = pstcAdtCHxXCfg->enStpOut;
  961. pstcM0PAdt->PCONR_f.STASTPSB = pstcAdtCHxXCfg->enStaStp;
  962. pstcM0PAdt->PCONR_f.CMPCB = pstcAdtCHxXCfg->enCmpc;
  963. pstcM0PAdt->PCONR_f.PERCB = pstcAdtCHxXCfg->enPerc;
  964. pstcM0PAdt->PCONR_f.OUTENB = pstcAdtCHxXCfg->bOutEn;
  965. pstcM0PAdt->PCONR_f.DISSELB = pstcAdtCHxXCfg->enDisSel;
  966. pstcM0PAdt->PCONR_f.DISVALB = pstcAdtCHxXCfg->enDisVal;
  967. pstcM0PAdt->FCONR_f.NOFIENGB = pstcAdtCHxXCfg->bFltEn;
  968. pstcM0PAdt->FCONR_f.NOFICKGB = pstcAdtCHxXCfg->enFltClk;
  969. break;
  970. default:
  971. return ErrorInvalidParameter;
  972. }
  973. return Ok;
  974. }
  975. /************************************************************************
  976. * \brief
  977. * 使能端口刹车
  978. *
  979. * \param [in] port 端口
  980. * \param [in] pstcAdtBrkPtCfg 端口刹车配置指针
  981. *
  982. * \retval en_result_t Ok: 配置成功
  983. * \retval en_result_t ErrorInvalidParameter: 无效参数
  984. ************************************************************************/
  985. en_result_t Adt_EnableBrakePort(uint8_t port, stc_adt_break_port_cfg_t* pstcAdtBrkPtCfg)
  986. {
  987. uint32_t u32Val;
  988. if (NULL == pstcAdtBrkPtCfg)
  989. {
  990. return ErrorInvalidParameter;
  991. }
  992. u32Val = M0P_TIM4->PTBKP;
  993. u32Val &= ~(1u<<port);
  994. M0P_TIM4->PTBKP = u32Val | (pstcAdtBrkPtCfg->enPol<<port);
  995. u32Val = M0P_TIM4->PTBKS;
  996. M0P_TIM4->PTBKS = u32Val | (1u<<port);
  997. return Ok;
  998. }
  999. /**********************************************************************
  1000. * \brief
  1001. * 清除端口刹车
  1002. *
  1003. * \param none
  1004. *
  1005. * \retval none
  1006. **********************************************************************/
  1007. void Adt_ClearBrakePort(void)
  1008. {
  1009. M0P_TIM4->PTBKS = 0;
  1010. }
  1011. /*********************************************************************
  1012. * \brief
  1013. * 无效条件3配置
  1014. *
  1015. * \param [in] pstcAdtDisable3 无效条件3配置指针
  1016. *
  1017. * \retval en_result_t Ok: 配置成功
  1018. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1019. ********************************************************************/
  1020. en_result_t Adt_Disable3Cfg(stc_adt_disable_3_cfg_t* pstcAdtDisable3)
  1021. {
  1022. uint8_t i;
  1023. if (NULL == pstcAdtDisable3)
  1024. {
  1025. return ErrorInvalidParameter;
  1026. }
  1027. Adt_ClearBrakePort();
  1028. for (i = 0; i <= 15; i++)
  1029. {
  1030. if (TRUE == pstcAdtDisable3->stcBrkPtCfg[i].bPortEn)
  1031. {
  1032. Adt_EnableBrakePort(i, &pstcAdtDisable3->stcBrkPtCfg[i]);
  1033. }
  1034. }
  1035. M0P_TIM4->AOSSR_f.BFILTEN = pstcAdtDisable3->bFltEn;
  1036. M0P_TIM4->AOSSR_f.BFILTS = pstcAdtDisable3->enFltClk;
  1037. M0P_TIM4->AOSSR_f.SOFTBK = pstcAdtDisable3->bSwBrk;
  1038. return Ok;
  1039. }
  1040. /*******************************************************************
  1041. * \brief
  1042. * 获取端口刹车标志
  1043. *
  1044. * \param none
  1045. *
  1046. * \retval TRUE or FALSE
  1047. ******************************************************************/
  1048. boolean_t Adt_GetPortBrakeFlag(void)
  1049. {
  1050. return M0P_TIM4->AOSSR_f.FBRAKE;
  1051. }
  1052. /******************************************************************
  1053. * \brief
  1054. * 清除端口刹车标志
  1055. *
  1056. * \param none
  1057. *
  1058. * \retval none
  1059. ******************************************************************/
  1060. void Adt_ClearPortBrakeFlag(void)
  1061. {
  1062. M0P_TIM4->AOSCL_f.FBRAKE = 0;
  1063. }
  1064. /********************************************************************
  1065. * \brief
  1066. * 无效条件1配置
  1067. *
  1068. * \param [in] pstcAdtDisable1 无效条件1配置指针
  1069. *
  1070. * \retval en_result_t Ok: 配置成功
  1071. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1072. ********************************************************************/
  1073. en_result_t Adt_Disable1Cfg(stc_adt_disable_1_cfg_t* pstcAdtDisable1)
  1074. {
  1075. if (NULL == pstcAdtDisable1)
  1076. {
  1077. return ErrorInvalidParameter;
  1078. }
  1079. M0P_TIM4->AOSSR_f.SMH2 = pstcAdtDisable1->bTim6OutSH;
  1080. M0P_TIM4->AOSSR_f.SMH1 = pstcAdtDisable1->bTim5OutSH;
  1081. M0P_TIM4->AOSSR_f.SMH0 = pstcAdtDisable1->bTim4OutSH;
  1082. M0P_TIM4->AOSSR_f.SML2 = pstcAdtDisable1->bTim6OutSL;
  1083. M0P_TIM4->AOSSR_f.SML1 = pstcAdtDisable1->bTim5OutSL;
  1084. M0P_TIM4->AOSSR_f.SML0 = pstcAdtDisable1->bTim4OutSL;
  1085. return Ok;
  1086. }
  1087. /********************************************************************
  1088. * \brief
  1089. * 获取同高同低刹车标志
  1090. *
  1091. * \param none
  1092. *
  1093. * \retval TRUE or FALSE
  1094. ********************************************************************/
  1095. boolean_t Adt_GetSameBrakeFlag(void)
  1096. {
  1097. return M0P_TIM4->AOSSR_f.FSAME;
  1098. }
  1099. /*********************************************************************
  1100. * \brief
  1101. * 清除同高同低刹车标志
  1102. *
  1103. * \param none
  1104. *
  1105. * \retval none
  1106. *********************************************************************/
  1107. void Adt_ClearSameBrakeFlag(void)
  1108. {
  1109. M0P_TIM4->AOSCL_f.FSAME = 0;
  1110. }
  1111. /********************************************************************
  1112. * \brief
  1113. * PWM展频配置
  1114. *
  1115. * \param [in] pstcAdtPwmDitherCfg PWM展频配置指针
  1116. *
  1117. * \retval en_result_t Ok: 配置成功
  1118. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1119. *********************************************************************/
  1120. en_result_t Adt_PwmDitherConfig(en_adt_unit_t enAdtUnit, stc_adt_pwm_dither_cfg_t* pstcAdtPwmDitherCfg)
  1121. {
  1122. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1123. if (NULL == pstcAdtPwmDitherCfg)
  1124. {
  1125. return ErrorInvalidParameter;
  1126. }
  1127. pstcM0PAdt->CR_f.DITENS = pstcAdtPwmDitherCfg->enAdtPDType;
  1128. pstcM0PAdt->CR_f.DITENB = pstcAdtPwmDitherCfg->bTimxBPDEn;
  1129. pstcM0PAdt->CR_f.DITENA = pstcAdtPwmDitherCfg->bTimxAPDEn;
  1130. return Ok;
  1131. }
  1132. /**********************************************************************
  1133. * \brief
  1134. * ADT初始化
  1135. *
  1136. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1137. * \param [in] pstcAdtBaseCntCfg 计数配置指针
  1138. *
  1139. * \retval en_result_t Ok: 配置成功
  1140. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1141. **********************************************************************/
  1142. en_result_t Adt_Init(en_adt_unit_t enAdtUnit, stc_adt_basecnt_cfg_t* pstcAdtBaseCntCfg)
  1143. {
  1144. int32_t i;
  1145. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1146. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtBaseCntCfg))
  1147. {
  1148. return ErrorInvalidParameter;
  1149. }
  1150. if (AdtTriangleModeB < pstcAdtBaseCntCfg->enCntMode)
  1151. {
  1152. return ErrorInvalidParameter;
  1153. }
  1154. pstcM0PAdt->GCONR_f.MODE = pstcAdtBaseCntCfg->enCntMode;
  1155. pstcM0PAdt->GCONR_f.DIR = pstcAdtBaseCntCfg->enCntDir;
  1156. pstcM0PAdt->GCONR_f.CKDIV = pstcAdtBaseCntCfg->enCntClkDiv;
  1157. for (i = 0; i < 16; i++)
  1158. {
  1159. pfnAdtIrqCbk[enAdtUnit][i] = NULL;
  1160. }
  1161. AdtEnableNvic((IRQn_Type)((int32_t)TIM4_IRQn + (int32_t)enAdtUnit));
  1162. return Ok;
  1163. }
  1164. /************************************************************************
  1165. * \brief
  1166. * ADT Deinit
  1167. *
  1168. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1169. *
  1170. * \retval en_result_t Ok: 配置成功
  1171. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1172. ***********************************************************************/
  1173. en_result_t Adt_DeInit(en_adt_unit_t enAdtUnit)
  1174. {
  1175. int32_t i;
  1176. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1177. if (AdtTIM6 < enAdtUnit)
  1178. {
  1179. return ErrorInvalidParameter;
  1180. }
  1181. pstcM0PAdt->GCONR_f.START = 0;
  1182. AdtDisableNvic((IRQn_Type)((int32_t)TIM4_IRQn + (int32_t)enAdtUnit));
  1183. for (i = 0; i < 16; i++)
  1184. {
  1185. pfnAdtIrqCbk[enAdtUnit][i] = NULL;
  1186. }
  1187. return Ok;
  1188. }
  1189. /***********************************************************************
  1190. * \brief
  1191. * 开始计数
  1192. *
  1193. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1194. *
  1195. * \retval en_result_t Ok: 配置成功
  1196. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1197. ***********************************************************************/
  1198. en_result_t Adt_StartCount(en_adt_unit_t enAdtUnit)
  1199. {
  1200. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1201. if (AdtTIM6 < enAdtUnit)
  1202. {
  1203. return ErrorInvalidParameter;
  1204. }
  1205. pstcM0PAdt->GCONR_f.START = 1;
  1206. return Ok;
  1207. }
  1208. /***********************************************************************
  1209. * \brief
  1210. * 停止计数
  1211. *
  1212. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1213. *
  1214. * \retval en_result_t Ok: 配置成功
  1215. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1216. **********************************************************************/
  1217. en_result_t Adt_StopCount(en_adt_unit_t enAdtUnit)
  1218. {
  1219. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1220. if (AdtTIM6 < enAdtUnit)
  1221. {
  1222. return ErrorInvalidParameter;
  1223. }
  1224. pstcM0PAdt->GCONR_f.START = 0;
  1225. return Ok;
  1226. }
  1227. /********************************************************************
  1228. * \brief
  1229. * 设置计数值
  1230. *
  1231. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1232. * \param [in] u16Value 计数值
  1233. *
  1234. * \retval en_result_t Ok: 配置成功
  1235. * ErrorInvalidParameter: 无效参数
  1236. *******************************************************************/
  1237. en_result_t Adt_SetCount(en_adt_unit_t enAdtUnit, uint16_t u16Value)
  1238. {
  1239. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1240. if (AdtTIM6 < enAdtUnit)
  1241. {
  1242. return ErrorInvalidParameter;
  1243. }
  1244. pstcM0PAdt->CNTER_f.CNT = u16Value;
  1245. return Ok;
  1246. }
  1247. /********************************************************************
  1248. * \brief
  1249. * 获取计数值
  1250. *
  1251. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1252. * \param [in] u16Value 计数值
  1253. *
  1254. * \retval en_result_t Ok: 配置成功
  1255. * ErrorInvalidParameter: 无效参数
  1256. *******************************************************************/
  1257. uint16_t Adt_GetCount(en_adt_unit_t enAdtUnit)
  1258. {
  1259. uint16_t u16Value;
  1260. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1261. if (AdtTIM6 < enAdtUnit)
  1262. {
  1263. return ErrorInvalidParameter;
  1264. }
  1265. u16Value = pstcM0PAdt->CNTER_f.CNT;
  1266. return u16Value;
  1267. }
  1268. /**************************************************************************
  1269. * \brief
  1270. * 清除计数值
  1271. *
  1272. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1273. * \param [in] u16Value 计数值
  1274. *
  1275. * \retval en_result_t Ok: 配置成功
  1276. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1277. **************************************************************************/
  1278. en_result_t Adt_ClearCount(en_adt_unit_t enAdtUnit)
  1279. {
  1280. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1281. if (AdtTIM6 < enAdtUnit)
  1282. {
  1283. return ErrorInvalidParameter;
  1284. }
  1285. pstcM0PAdt->CNTER_f.CNT = 0;
  1286. return Ok;
  1287. }
  1288. /*************************************************************************
  1289. * \brief
  1290. * 获取计数状态
  1291. *
  1292. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1293. * \param [in] pstcAdtCntState 计数状态指针
  1294. *
  1295. * \retval en_result_t Ok: 配置成功
  1296. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1297. *************************************************************************/
  1298. en_result_t Adt_GetCntState(en_adt_unit_t enAdtUnit, stc_adt_cntstate_cfg_t* pstcAdtCntState)
  1299. {
  1300. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1301. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtCntState))
  1302. {
  1303. return ErrorInvalidParameter;
  1304. }
  1305. pstcAdtCntState->u16Counter = pstcM0PAdt->CNTER_f.CNT;
  1306. pstcAdtCntState->enCntDir = pstcM0PAdt->STFLR_f.DIRF;
  1307. pstcAdtCntState->u8ValidPeriod = pstcM0PAdt->STFLR_f.VPERNUM;
  1308. pstcAdtCntState->bCMSBDF = pstcM0PAdt->STFLR_f.CMSBDF;
  1309. pstcAdtCntState->bCMSBUF = pstcM0PAdt->STFLR_f.CMSBUF;
  1310. pstcAdtCntState->bCMSADF = pstcM0PAdt->STFLR_f.CMSADF;
  1311. pstcAdtCntState->bCMSAUF = pstcM0PAdt->STFLR_f.CMSAUF;
  1312. pstcAdtCntState->bDTEF = pstcM0PAdt->STFLR_f.DTEF;
  1313. pstcAdtCntState->bUDFF = pstcM0PAdt->STFLR_f.UDFF;
  1314. pstcAdtCntState->bOVFF = pstcM0PAdt->STFLR_f.OVFF;
  1315. pstcAdtCntState->bCMDF = pstcM0PAdt->STFLR_f.CMDF;
  1316. pstcAdtCntState->bCMCF = pstcM0PAdt->STFLR_f.CMCF;
  1317. pstcAdtCntState->bCMBF = pstcM0PAdt->STFLR_f.CMBF;
  1318. pstcAdtCntState->bCMAF = pstcM0PAdt->STFLR_f.CMAF;
  1319. return Ok;
  1320. }
  1321. /***********************************************************************
  1322. * \brief
  1323. * 配置计数周期
  1324. *
  1325. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1326. * \param [in] u16Period 计数周期值
  1327. *
  1328. * \retval en_result_t Ok: 配置成功
  1329. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1330. ***********************************************************************/
  1331. en_result_t Adt_SetPeriod(en_adt_unit_t enAdtUnit, uint16_t u16Period)
  1332. {
  1333. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1334. if (AdtTIM6 < enAdtUnit)
  1335. {
  1336. return ErrorInvalidParameter;
  1337. }
  1338. pstcM0PAdt->PERAR = u16Period;
  1339. return Ok;
  1340. }
  1341. /***********************************************************************
  1342. * \brief
  1343. * 配置计数周期缓冲
  1344. *
  1345. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1346. * \param [in] u16PeriodBuf 计数周期缓冲值
  1347. *
  1348. * \retval en_result_t Ok: 配置成功
  1349. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1350. ***********************************************************************/
  1351. en_result_t Adt_SetPeriodBuf(en_adt_unit_t enAdtUnit, uint16_t u16PeriodBuf)
  1352. {
  1353. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1354. if (AdtTIM6 < enAdtUnit)
  1355. {
  1356. return ErrorInvalidParameter;
  1357. }
  1358. pstcM0PAdt->PERBR = u16PeriodBuf;
  1359. pstcM0PAdt->BCONR_f.BENP = 1u;
  1360. return Ok;
  1361. }
  1362. /**********************************************************************
  1363. * \brief
  1364. * 清除计数周期缓冲
  1365. *
  1366. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1367. *
  1368. * \retval en_result_t Ok: 配置成功
  1369. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1370. **********************************************************************/
  1371. en_result_t Adt_ClearPeriodBuf(en_adt_unit_t enAdtUnit)
  1372. {
  1373. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1374. if (AdtTIM6 < enAdtUnit)
  1375. {
  1376. return ErrorInvalidParameter;
  1377. }
  1378. pstcM0PAdt->BCONR_f.BENP = 0;
  1379. pstcM0PAdt->PERBR = 0;
  1380. return Ok;
  1381. }
  1382. /***********************************************************************
  1383. * \brief
  1384. * 配置有效计数周期
  1385. *
  1386. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1387. * \param [in] pstcAdtValidPerCfg 有效计数周期配置指针
  1388. *
  1389. * \retval en_result_t Ok: 配置成功
  1390. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1391. ***********************************************************************/
  1392. en_result_t Adt_SetValidPeriod(en_adt_unit_t enAdtUnit,
  1393. stc_adt_validper_cfg_t* pstcAdtValidPerCfg)
  1394. {
  1395. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1396. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtValidPerCfg))
  1397. {
  1398. return ErrorInvalidParameter;
  1399. }
  1400. pstcM0PAdt->VPERR_f.PCNTS = pstcAdtValidPerCfg->enValidCnt;
  1401. pstcM0PAdt->VPERR_f.PCNTE = pstcAdtValidPerCfg->enValidCdt;
  1402. pstcM0PAdt->VPERR_f.GEPERID = pstcAdtValidPerCfg->bPeriodD;
  1403. pstcM0PAdt->VPERR_f.GEPERIC = pstcAdtValidPerCfg->bPeriodC;
  1404. pstcM0PAdt->VPERR_f.GEPERIB = pstcAdtValidPerCfg->bPeriodB;
  1405. pstcM0PAdt->VPERR_f.GEPERIA = pstcAdtValidPerCfg->bPeriodA;
  1406. return Ok;
  1407. }
  1408. /************************************************************************
  1409. * \brief
  1410. * 配置比较输出计数基准值
  1411. *
  1412. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1413. * \param [in] enAdtCompare 比较基准
  1414. * \param [in] u16Compare 比较基准值
  1415. *
  1416. * \retval en_result_t Ok: 配置成功
  1417. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1418. *************************************************************************/
  1419. en_result_t Adt_SetCompareValue(en_adt_unit_t enAdtUnit,
  1420. en_adt_compare_t enAdtCompare,
  1421. uint16_t u16Compare)
  1422. {
  1423. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1424. if (AdtTIM6 < enAdtUnit)
  1425. {
  1426. return ErrorInvalidParameter;
  1427. }
  1428. if (AdtCompareA == enAdtCompare)
  1429. {
  1430. pstcM0PAdt->GCMAR = u16Compare;
  1431. }
  1432. else if (AdtCompareB == enAdtCompare)
  1433. {
  1434. pstcM0PAdt->GCMBR = u16Compare;
  1435. }
  1436. else if (AdtCompareC == enAdtCompare)
  1437. {
  1438. pstcM0PAdt->GCMCR = u16Compare;
  1439. }
  1440. else if (AdtCompareD == enAdtCompare)
  1441. {
  1442. pstcM0PAdt->GCMDR = u16Compare;
  1443. }
  1444. else
  1445. {
  1446. return ErrorInvalidParameter;
  1447. }
  1448. return Ok;
  1449. }
  1450. /************************************************************************
  1451. * \brief
  1452. * 配置专用比较计数基准值
  1453. *
  1454. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1455. * \param [in] enAdtSpclCmp 专用比较基准值寄存器
  1456. * \param [in] u16SpclCmp 比较基准值
  1457. *
  1458. * \retval en_result_t Ok: 配置成功
  1459. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1460. *************************************************************************/
  1461. en_result_t Adt_SetSpecilCompareValue(en_adt_unit_t enAdtUnit,
  1462. en_adt_special_compare_t enAdtSpclCmp,
  1463. uint16_t u16SpclCmp)
  1464. {
  1465. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1466. if (AdtTIM6 < enAdtUnit)
  1467. {
  1468. return ErrorInvalidParameter;
  1469. }
  1470. if (AdtSpclCompA == enAdtSpclCmp)
  1471. {
  1472. pstcM0PAdt->SCMAR_f.SCMA = u16SpclCmp;
  1473. }
  1474. else if (AdtSpclCompB == enAdtSpclCmp)
  1475. {
  1476. pstcM0PAdt->SCMBR_f.SCMB = u16SpclCmp;
  1477. }
  1478. else
  1479. {
  1480. return ErrorInvalidParameter;
  1481. }
  1482. return Ok;
  1483. }
  1484. /**********************************************************************
  1485. * \brief
  1486. * 配置通用比较值/捕获值缓存传送
  1487. *
  1488. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1489. * \param [in] enAdtCHxXPort TIMxX端口
  1490. * \param [in] bCompareBufEn 通用比较值缓存传送使能
  1491. *
  1492. * \retval en_result_t Ok: 配置成功
  1493. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1494. **********************************************************************/
  1495. en_result_t Adt_EnableValueBuf(en_adt_unit_t enAdtUnit,
  1496. en_adt_CHxX_port_t enAdtCHxXPort,
  1497. boolean_t bCompareBufEn)
  1498. {
  1499. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1500. if (AdtTIM6 < enAdtUnit)
  1501. {
  1502. return ErrorInvalidParameter;
  1503. }
  1504. if (AdtCHxA == enAdtCHxXPort)
  1505. {
  1506. pstcM0PAdt->BCONR_f.BENA = bCompareBufEn;
  1507. }
  1508. else if (AdtCHxB == enAdtCHxXPort)
  1509. {
  1510. pstcM0PAdt->BCONR_f.BENB = bCompareBufEn;
  1511. }
  1512. else
  1513. {
  1514. return ErrorInvalidParameter;
  1515. }
  1516. return Ok;
  1517. }
  1518. /***********************************************************************
  1519. * \brief
  1520. * 清除比较输出计数值/捕获值缓存
  1521. *
  1522. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1523. * \param [in] enAdtCHxXPort TIMxX端口
  1524. *
  1525. * \retval en_result_t Ok: 配置成功
  1526. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1527. **********************************************************************/
  1528. en_result_t Adt_ClearValueBuf(en_adt_unit_t enAdtUnit,
  1529. en_adt_CHxX_port_t enAdtCHxXPort)
  1530. {
  1531. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1532. if (AdtTIM6 < enAdtUnit)
  1533. {
  1534. return ErrorInvalidParameter;
  1535. }
  1536. if (AdtCHxA == enAdtCHxXPort)
  1537. {
  1538. pstcM0PAdt->GCMCR = 0;
  1539. pstcM0PAdt->BCONR_f.BENA = 0;
  1540. }
  1541. else if (AdtCHxB == enAdtCHxXPort)
  1542. {
  1543. pstcM0PAdt->GCMDR = 0;
  1544. pstcM0PAdt->BCONR_f.BENB = 0;
  1545. }
  1546. else
  1547. {
  1548. return ErrorInvalidParameter;
  1549. }
  1550. return Ok;
  1551. }
  1552. /***********************************************************************
  1553. * \brief
  1554. * 获取捕获值
  1555. *
  1556. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1557. * \param [in] enAdtCHxXPort TIMxX端口
  1558. * \param [in] pu16Capture 捕获值指针
  1559. *
  1560. * \retval en_result_t Ok: 配置成功
  1561. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1562. ***********************************************************************/
  1563. en_result_t Adt_GetCaptureValue(en_adt_unit_t enAdtUnit,
  1564. en_adt_CHxX_port_t enAdtCHxXPort,
  1565. uint16_t* pu16Capture)
  1566. {
  1567. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1568. if (AdtTIM6 < enAdtUnit)
  1569. {
  1570. return ErrorInvalidParameter;
  1571. }
  1572. if (AdtCHxA == enAdtCHxXPort)
  1573. {
  1574. *pu16Capture = pstcM0PAdt->GCMAR_f.GCMA;
  1575. }
  1576. else if (AdtCHxB == enAdtCHxXPort)
  1577. {
  1578. *pu16Capture = pstcM0PAdt->GCMBR_f.GCMB;
  1579. }
  1580. else
  1581. {
  1582. return ErrorInvalidParameter;
  1583. }
  1584. return Ok;
  1585. }
  1586. /**********************************************************************
  1587. * \brief
  1588. * 获取捕获缓存值
  1589. *
  1590. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1591. * \param [in] enAdtCHxXPort TIMxX端口
  1592. * \param [in] pu16CaptureBuf 捕获缓存值指针
  1593. *
  1594. * \retval en_result_t Ok: 配置成功
  1595. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1596. ***********************************************************************/
  1597. en_result_t Adt_GetCaptureBuf(en_adt_unit_t enAdtUnit,
  1598. en_adt_CHxX_port_t enAdtCHxXPort,
  1599. uint16_t* pu16CaptureBuf)
  1600. {
  1601. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1602. if (AdtTIM6 < enAdtUnit)
  1603. {
  1604. return ErrorInvalidParameter;
  1605. }
  1606. if (AdtCHxA == enAdtCHxXPort)
  1607. {
  1608. *pu16CaptureBuf = pstcM0PAdt->GCMCR_f.GCMC;
  1609. }
  1610. else if (AdtCHxB == enAdtCHxXPort)
  1611. {
  1612. *pu16CaptureBuf = pstcM0PAdt->GCMDR_f.GCMD;
  1613. }
  1614. else
  1615. {
  1616. return ErrorInvalidParameter;
  1617. }
  1618. return Ok;
  1619. }
  1620. /***********************************************************************
  1621. * \brief
  1622. * 设置死区时间上基准值
  1623. *
  1624. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1625. * \param [in] u16Value 死区时间上基准值
  1626. *
  1627. * \retval en_result_t Ok: 配置成功
  1628. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1629. ************************************************************************/
  1630. en_result_t Adt_SetDTUA(en_adt_unit_t enAdtUnit,
  1631. uint16_t u16Value)
  1632. {
  1633. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1634. if (AdtTIM6 < enAdtUnit)
  1635. {
  1636. return ErrorInvalidParameter;
  1637. }
  1638. pstcM0PAdt->DTUAR = u16Value;
  1639. return Ok;
  1640. }
  1641. /***********************************************************************
  1642. * \brief
  1643. * 设置死区时间下基准值
  1644. *
  1645. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1646. * \param [in] u16Value 死区时间下基准值
  1647. *
  1648. * \retval en_result_t Ok: 配置成功
  1649. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1650. ***********************************************************************/
  1651. en_result_t Adt_SetDTDA(en_adt_unit_t enAdtUnit,
  1652. uint16_t u16Value)
  1653. {
  1654. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1655. if (AdtTIM6 < enAdtUnit)
  1656. {
  1657. return ErrorInvalidParameter;
  1658. }
  1659. pstcM0PAdt->DTDAR = u16Value;
  1660. return Ok;
  1661. }
  1662. /******************************************************************
  1663. * \brief
  1664. * 配置死区时间功能
  1665. *
  1666. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1667. * \param [in] bDTEn 死区功能使能
  1668. * \param [in] bEqual DTDAR的值和DTUAR的值自动相等
  1669. *
  1670. * \retval en_result_t Ok: 配置成功
  1671. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1672. *****************************************************************/
  1673. en_result_t Adt_ConfigDT(en_adt_unit_t enAdtUnit,
  1674. boolean_t bDTEn,
  1675. boolean_t bEqual)
  1676. {
  1677. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1678. if (AdtTIM6 < enAdtUnit)
  1679. {
  1680. return ErrorInvalidParameter;
  1681. }
  1682. pstcM0PAdt->DCONR_f.DTCEN = bDTEn;
  1683. pstcM0PAdt->DCONR_f.SEPA = bEqual;
  1684. return Ok;
  1685. }
  1686. /*************************************************************************
  1687. * \brief
  1688. * Z相输入屏蔽设置
  1689. *
  1690. * \param [in] enAdtUnit ADV Timer通道选择(TIM4、TIM5、TIM6)
  1691. * \param [in] pstcAdtZMaskCfg Z相输入屏蔽功能配置指针
  1692. *
  1693. * \retval en_result_t Ok: 配置成功
  1694. * \retval en_result_t ErrorInvalidParameter: 无效参数
  1695. *************************************************************************/
  1696. en_result_t Adt_ConfigZMask(en_adt_unit_t enAdtUnit, stc_adt_zmask_cfg_t* pstcAdtZMaskCfg)
  1697. {
  1698. volatile M0P_TIM4_TypeDef *pstcM0PAdt = (M0P_TIM4_TypeDef *)((uint32_t)M0P_TIM4+0x400*enAdtUnit);
  1699. if ((AdtTIM6 < enAdtUnit) || (NULL == pstcAdtZMaskCfg))
  1700. {
  1701. return ErrorInvalidParameter;
  1702. }
  1703. pstcM0PAdt->GCONR_f.ZMSK = pstcAdtZMaskCfg->enZMaskCycle;
  1704. pstcM0PAdt->GCONR_f.ZMSKPOS = pstcAdtZMaskCfg->bFltPosCntMaksEn;
  1705. pstcM0PAdt->GCONR_f.ZMSKREV = pstcAdtZMaskCfg->bFltRevCntMaksEn;
  1706. return Ok;
  1707. }
  1708. //@} // AdtGroup
  1709. /******************************************************************************
  1710. * EOF (not truncated)
  1711. ******************************************************************************/