etm.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. 
  2. /******************************************************************************
  3. * @brief providing APIs for configuring ETM.
  4. *
  5. *******************************************************************************
  6. *
  7. * provide APIs for configuring ETM
  8. ******************************************************************************/
  9. #include "common.h"
  10. #include "ETM.h"
  11. /******************************************************************************
  12. * Global variables
  13. ******************************************************************************/
  14. /******************************************************************************
  15. * Constants and macros
  16. ******************************************************************************/
  17. /******************************************************************************
  18. * Local types
  19. ******************************************************************************/
  20. /******************************************************************************
  21. * Local function prototypes
  22. ******************************************************************************/
  23. /******************************************************************************
  24. * Local variables
  25. ******************************************************************************/
  26. /******************************************************************************
  27. * Local functions
  28. ******************************************************************************/
  29. /******************************************************************************
  30. * Global functions
  31. ******************************************************************************/
  32. ETM_CallbackPtr ETM_Callback[3] = {(ETM_CallbackPtr)NULL};
  33. /******************************************************************************
  34. * ETM api lists
  35. *
  36. *//*! @addtogroup ETM_api_list
  37. * @{
  38. *******************************************************************************/
  39. /*******************************************************************************//*!
  40. *
  41. * @brief set the ETM moule clock source and prescale.
  42. *
  43. * @param[in] pETM pointer to one of three ETM base register address.
  44. * @param[in] ClockSource ETM clock source.
  45. * @param[in] ClockPrescale prescale factor.
  46. *
  47. * @return none.
  48. *
  49. * @ Pass/ Fail criteria: none.
  50. *
  51. *********************************************************************************/
  52. /*******************************************************************************//*!
  53. *
  54. * @设置时钟资源及分频系数
  55. * @输入 pETM 指向三个ETM定时器其中一个的基址
  56. * @输入 ClockSource ETM 时钟资源
  57. * @输入 ClockPrescale 分频系数
  58. *
  59. * @无返回
  60. *
  61. *********************************************************************************/
  62. void ETM_ClockSet(ETM_Type *pETM, uint8_t u8ClockSource, uint8_t u8ClockPrescale)
  63. {
  64. uint8_t u8Temp;
  65. //pETM指向的SC寄存器低5位清0,即未选择时钟,时钟输入采取1分频
  66. u8Temp = (pETM->SC & 0xE0);
  67. //时钟选择,及预分频因子选择
  68. u8Temp |= (ETM_SC_CLKS(u8ClockSource & 0x3) | ETM_SC_PS(u8ClockPrescale & 0x7));
  69. //配置该ETM的状态与控制寄存器ETMx_SC
  70. pETM->SC = u8Temp;
  71. }
  72. /*********************************************************************************//*!
  73. *
  74. * @brief general configuration to ETM_No to high ture EPWM mode, clock soure is the
  75. * system clock, MOD, CnV are the initial value.
  76. *
  77. * @param[in] pETM pointer to one of three ETM base register address.
  78. * @param[in] PWMModeSelect select CPWM , EPWM or combine pwm mode.
  79. * @param[in] PWMEdgeSelect select high true or low true pulse.
  80. *
  81. * @return none.
  82. *
  83. * @ Pass/ Fail criteria: none.
  84. *
  85. *********************************************************************************/
  86. /******************************************************************************************
  87. *
  88. * @ETM中PWM的初始化函数
  89. * @输入 pETM 指向三个ETM定时器其中一个的基址
  90. * @输入 PWMModeSelect 居中对齐CPWM(10)、边沿对齐EPWM(01)以及级联模式PWM(11)
  91. * @输入 PWMEdgeSelect 高真脉冲(01)、低真脉冲(10)
  92. *
  93. * @无返回
  94. *
  95. ******************************************************************************************/
  96. void ETM_PWMInit(ETM_Type *pETM, uint8_t u8PWMModeSelect, uint8_t u8PWMEdgeSelect)
  97. {
  98. uint8_t channels, i;
  99. ASSERT((ETM0== pETM) || (ETM1== pETM) || (ETM2== pETM));//断言检测通道合法性
  100. /* open the clock gate */
  101. //使能ETM的时钟
  102. if (ETM0 == pETM)
  103. {
  104. channels = 2;
  105. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  106. }
  107. else if(ETM1 == pETM)
  108. {
  109. channels = 2;
  110. #if !defined(CPU_NV32M3)
  111. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  112. #endif
  113. }
  114. else
  115. {
  116. channels = 6;
  117. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  118. }
  119. pETM->SC = 0x0; //关闭计数器 /* disable counter */
  120. pETM->MOD = ETM_MOD_INIT;
  121. if(ETM_PWMMODE_CENTERALLIGNED == u8PWMModeSelect) //使能CPWM /* enable CPWM */
  122. {
  123. pETM->SC |= ETM_SC_CPWMS_MASK;
  124. }
  125. else if(ETM_PWMMODE_COMBINE == u8PWMModeSelect) // 打开级联PWM模式 /* enable combine pwm mode */
  126. {
  127. ASSERT(ETM2 == pETM);
  128. pETM->MODE |= ETM_MODE_WPDIS_MASK | ETM_MODE_ETMEN_MASK;
  129. pETM->COMBINE = ETM_COMBINE_COMBINE0_MASK | ETM_COMBINE_COMP0_MASK | ETM_COMBINE_SYNCEN0_MASK | ETM_COMBINE_DTEN0_MASK |
  130. ETM_COMBINE_COMBINE1_MASK | ETM_COMBINE_COMP1_MASK | ETM_COMBINE_SYNCEN1_MASK | ETM_COMBINE_DTEN1_MASK |
  131. ETM_COMBINE_COMBINE2_MASK | ETM_COMBINE_COMP2_MASK | ETM_COMBINE_SYNCEN2_MASK | ETM_COMBINE_DTEN2_MASK
  132. ;
  133. pETM->SC &= ~ETM_SC_CPWMS_MASK;
  134. }
  135. if(ETM_PWM_HIGHTRUEPULSE == u8PWMEdgeSelect)
  136. {
  137. /* Configure ETMers PWM High True Pulses */
  138. /* 配置通道寄存器,设置通道状态及通道计数值 */
  139. for(i=0; i<channels; i++)
  140. {
  141. pETM->CONTROLS[i].CnSC = ETM_CnSC_MSB_MASK | ETM_CnSC_ELSB_MASK;
  142. pETM->CONTROLS[i].CnV = ETM_C0V_INIT + i*100;
  143. }
  144. }
  145. else if(ETM_PWM_LOWTRUEPULSE == u8PWMEdgeSelect)
  146. {
  147. /* Configure ETMers for PWM Low True Pulses */
  148. for(i=0; i<channels; i++)
  149. {
  150. pETM->CONTROLS[i].CnSC = ETM_CnSC_MSB_MASK | ETM_CnSC_ELSA_MASK;
  151. pETM->CONTROLS[i].CnV = ETM_C0V_INIT + i*100 ;
  152. }
  153. }
  154. }
  155. /*********************************************************************************//*!
  156. *
  157. * @brief general configuration to ETM_No to input capture mode, enable interrupt.
  158. *
  159. * @param[in] pETM pointer to one of three ETM base register address.
  160. * @param[in] Channel channel number to be configured.
  161. * @param[in] CaptureMode select capture edge: rising, falling or both.
  162. *
  163. * @return none.
  164. *
  165. * @ Pass/ Fail criteria: none.
  166. *
  167. *********************************************************************************/
  168. /*********************************************************************************
  169. *
  170. * @输入捕捉初始化函数
  171. *
  172. * @输入 pETM 指向三个ETM定时器其中一个的基址
  173. * @输入 Channel 配置通道号
  174. * @输入 CaptureMode 选择捕捉方式:上升沿, 下降沿或跳变沿.
  175. *
  176. * @无返回
  177. *
  178. *********************************************************************************/
  179. void ETM_InputCaptureInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CaptureMode)
  180. {
  181. ASSERT(((ETM0 == pETM) && (u8ETM_Channel < 2)) ||
  182. ((ETM1 == pETM) && (u8ETM_Channel < 2)) ||
  183. ((ETM2 == pETM) && (u8ETM_Channel < 6))
  184. );
  185. /* open the clock gate */
  186. /* 使能ETM的时钟 */
  187. if ((ETM0 == pETM) && (u8ETM_Channel < 2))
  188. {
  189. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  190. NVIC_EnableIRQ(ETM0_IRQn);
  191. }
  192. else if((ETM1 == pETM) && (u8ETM_Channel < 2))
  193. {
  194. #if !defined(CPU_NV32M3)
  195. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  196. NVIC_EnableIRQ(ETM1_IRQn);
  197. #endif
  198. }
  199. else
  200. {
  201. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  202. NVIC_EnableIRQ(ETM2_IRQn);
  203. }
  204. pETM->SC = 0x0; //关闭计数器 /* diable counter */
  205. pETM->MOD = 0xFFFF; /* free running */
  206. if(ETM_INPUTCAPTURE_RISINGEDGE == u8CaptureMode) //使能中断,在上升沿捕捉 /* enable interrupt, Capture on rising edge */
  207. {
  208. pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSA_MASK;
  209. }
  210. else if(ETM_INPUTCAPTURE_FALLINGEDGE == u8CaptureMode) //在下降沿捕捉 /* Capture on falling edge */
  211. {
  212. pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSB_MASK;
  213. }
  214. else if(ETM_INPUTCAPTURE_BOTHEDGE == u8CaptureMode) //在上升沿或下降沿捕捉 /* Capture on rising or falling edge */
  215. {
  216. pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSA_MASK | ETM_CnSC_ELSB_MASK;
  217. }
  218. }
  219. /*********************************************************************************//*!
  220. *
  221. * @brief general configuration to ETM_No to Dual Edge Capture mode to measure the
  222. * width or the period of a pulse.
  223. *
  224. * @param[in] pETM pointer to one of three ETM base register address.
  225. * @param[in] ChannelPair ChannelPair number to be configured: 0, 2, 4.
  226. * @param[in] CaptureMode select capture edge: one shot and continuous mode.
  227. * @param[in] Channel_N_Edge channel N detect edge.
  228. * @param[in] Channel_Np1_Edge channel N+1 detect edge.
  229. *
  230. * @return none.
  231. *
  232. * @ Pass/ Fail criteria: none.
  233. *
  234. *********************************************************************************/
  235. /*********************************************************************************//*!
  236. *
  237. * @对ETM配置双边捕获模式来测量一个脉冲的宽度或周期
  238. *
  239. * @输入 pETM 指向三个ETM定时器其中一个的基址
  240. * @输入 ChannelPair 频道配对数的配置为: 0, 2, 4.
  241. * @输入 CaptureMode 选择单周期捕捉,和连续捕捉方式
  242. * @输入 Channel_N_Edge 频道N边沿检测
  243. * @输入 Channel_Np1_Edge 频道N+1边沿检测.
  244. *
  245. * @无返回
  246. *
  247. *********************************************************************************/
  248. void ETM_DualEdgeCaptureInit(ETM_Type *pETM, uint8_t u8ChannelPair, uint8_t u8CaptureMode,
  249. uint8_t u8Channel_N_Edge, uint8_t u8Channel_Np1_Edge)
  250. {
  251. ASSERT((ETM2 == pETM) && (u8ChannelPair < 6) && !(u8ChannelPair & 1) );
  252. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  253. if((0 == u8ChannelPair) || (2== u8ChannelPair))
  254. {
  255. //通道滤波 /* channel filter is active */
  256. }
  257. pETM->SC = 0x0; //关闭计数器 /* diable counter */
  258. pETM->MOD = 0xFFFF;
  259. pETM->MODE |= ETM_MODE_ETMEN_MASK; /* ETMEN = 1 */
  260. /* DECAPEN = 1, ChannelPair/2 * 8 */
  261. pETM->COMBINE |= ((ETM_COMBINE_DECAPEN0_MASK) << (u8ChannelPair * 4));
  262. pETM->CONTROLS[u8ChannelPair].CnSC &= ~ETM_CnSC_CHF_MASK; //清除相关位 /* CH(n)F and CH(n+1)F bits must be cleared first */
  263. pETM->CONTROLS[u8ChannelPair + 1].CnSC &= ~ETM_CnSC_CHF_MASK;
  264. if(ETM_INPUTCAPTURE_DUALEDGE_ONESHOT == u8CaptureMode) //单周期模式 /* oneshot mode */
  265. {
  266. pETM->CONTROLS[u8ChannelPair].CnSC &= ~ETM_CnSC_MSA_MASK;
  267. pETM->CONTROLS[u8ChannelPair+1].CnSC &= ~ETM_CnSC_MSA_MASK;
  268. }
  269. else if(ETM_INPUTCAPTURE_DUALEDGE_CONTINUOUS == u8CaptureMode) //连续模式 /* continuouse mode */
  270. {
  271. pETM->CONTROLS[u8ChannelPair].CnSC |= ETM_CnSC_MSA_MASK;
  272. pETM->CONTROLS[u8ChannelPair+1].CnSC |= ETM_CnSC_MSA_MASK;
  273. }
  274. pETM->CONTROLS[u8ChannelPair].CnSC |= (u8Channel_N_Edge << 2); //选择检测边沿 /* select detec edge */
  275. pETM->CONTROLS[u8ChannelPair + 1].CnSC |= (u8Channel_Np1_Edge << 2);
  276. pETM->COMBINE |= (ETM_COMBINE_DECAP0_MASK << (u8ChannelPair * 4));
  277. }
  278. /*********************************************************************************//*!
  279. *
  280. * @brief general configuration to ETM_No to input capture mode.
  281. *
  282. * @param[in] pETM pointer to one of three ETM base register address.
  283. * @param[in] Channel channel number to be configured.
  284. * @param[in] CompareMode select compare edge: toggle, set and clear.
  285. *
  286. * @return none.
  287. *
  288. * @ Pass/ Fail criteria: none.
  289. *
  290. *********************************************************************************/
  291. /*********************************************************************************//*!
  292. *
  293. * @输出对比初始化
  294. *
  295. * @输入 pETM 指向三个ETM定时器其中一个的基址
  296. * @输入 Channel 必须完成配置通道即通道号
  297. * @输入 CompareMode 选择模式:翻转(01)、置位(11)、清0(10)
  298. *
  299. * @无返回
  300. *
  301. *********************************************************************************/
  302. void ETM_OutputCompareInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CompareMode)
  303. {
  304. ASSERT(((ETM0 == pETM) && (u8ETM_Channel < 2)) ||
  305. ((ETM1 == pETM) && (u8ETM_Channel < 2)) ||
  306. ((ETM2 == pETM) && (u8ETM_Channel < 6))
  307. );
  308. /* open the clock gate */
  309. /* 使能ETM的时钟 */
  310. if(ETM0 == pETM)
  311. {
  312. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  313. }
  314. else if(ETM1 == pETM)
  315. {
  316. #if !defined(CPU_NV32M3)
  317. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  318. #endif
  319. }
  320. else
  321. {
  322. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  323. }
  324. pETM->SC = 0x0; //关闭计数器 /* diable counter */
  325. pETM->MOD = ETM_MOD_INIT;
  326. pETM->CONTROLS[u8ETM_Channel].CnSC = (ETM_CnSC_MSA_MASK | (u8CompareMode << 2)); //选择检测边沿 /* select detec edge */
  327. pETM->CONTROLS[u8ETM_Channel].CnV = ETM_C0V_INIT;
  328. }
  329. /*********************************************************************************//*!
  330. *
  331. * @brief general configuration to ETM2 to start software synchronization.
  332. *
  333. * @param[in] pETM pointer to one of three ETM base register address.
  334. *
  335. * @return none.
  336. *
  337. * @ Pass/ Fail criteria: none.
  338. *
  339. *********************************************************************************/
  340. /*********************************************************************************//*!
  341. *
  342. * @运用ETM2来实现软件同步
  343. *
  344. * @输入 pETM 指向三个ETM定时器其中一个的基址
  345. *
  346. * @无返回
  347. *
  348. *********************************************************************************/
  349. void ETM_SoftwareSync(ETM_Type *pETM)
  350. {
  351. ASSERT(ETM2 == pETM);
  352. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; // 选择增强PWM同步 /* recommend enhanced sync mode */
  353. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK;
  354. }
  355. /*********************************************************************************//*!
  356. *
  357. * @brief general configuration to ETM to enable hardware synchronization.
  358. *
  359. * @param[in] pETM pointer to one of three ETM base register address.
  360. * @param[in] u8TriggerN select the hardware trigger source.
  361. *
  362. * @return none.
  363. *
  364. * @ Pass/ Fail criteria: none.
  365. *
  366. *********************************************************************************/
  367. /********************************************************************
  368. * @ETM中配置ETMx_SYNC 寄存器来保证软件同步
  369. *
  370. * @输入 pETM 指向三个ETM定时器其中一个的基址
  371. * @输入 u8TriggerN 选择硬件触发资源
  372. *
  373. * @无返回
  374. *
  375. *********************************************************************************/
  376. void ETM_HardwareSync(ETM_Type *pETM, uint8_t u8TriggerN)
  377. {
  378. ASSERT(ETM2 == pETM);
  379. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; //选择增强PWM同步 /* recommend enhanced sync mode */
  380. switch(u8TriggerN)
  381. {
  382. case ETM_SYNC_TRIGGER_TRIGGER2:
  383. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;
  384. break;
  385. case ETM_SYNC_TRIGGER_TRIGGER1:
  386. pETM->SYNC |= ETM_SYNC_TRIG1_MASK;
  387. break; //首先配置ETM0CH0 /* need configure ETM0CH0 first */
  388. case ETM_SYNC_TRIGGER_TRIGGER0:
  389. pETM->SYNC |= ETM_SYNC_TRIG0_MASK;
  390. break; //首先配置CMP0 /* need configure CMP0 first */
  391. default:
  392. break;
  393. }
  394. }
  395. /*********************************************************************************//*!
  396. *
  397. * @brief general configuration to ETM to enable hardware synchronization, more then 1 trigger.
  398. *
  399. * @param[in] pETM pointer to one of three ETM base register address.
  400. * @param[in] u8TriggerMask select the hardware trigger source. combine TRIG0~TREG2.(x000xxxx~x111xxxx)
  401. *
  402. * @return none.
  403. *
  404. * @ Pass/ Fail criteria: none.
  405. *
  406. *********************************************************************************/
  407. /*********************************************************************************//*!
  408. *
  409. * @通过配置ETM保证硬件同步,产生触发
  410. *
  411. * @输入 pETM 指向三个ETM定时器其中一个的基址
  412. * @输入 u8TriggerMask 选择硬件触发资源.
  413. *
  414. * @无返回.
  415. *
  416. *********************************************************************************/
  417. void ETM_HardwareSyncCombine(ETM_Type *pETM, uint8_t u8TriggerMask)
  418. {
  419. ASSERT(ETM2 == pETM);
  420. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; //选择增强PWM同步 /* recommend enhanced sync mode */
  421. pETM->SYNC &= 0x8F;
  422. pETM->SYNC |= (u8TriggerMask & 0x70);
  423. }
  424. /*********************************************************************************//*!
  425. *
  426. * @brief generate ETM2 hardware trigger 2,Note: please call ETM_HardwareSyncCombine first.
  427. *
  428. * @param[in] pETM pointer to one of three ETM base register address.
  429. *
  430. * @return none.
  431. *
  432. * @ Pass/ Fail criteria: none.
  433. *
  434. *********************************************************************************/
  435. /*********************************************************************************//*!
  436. *
  437. * @产生ETM2硬件触发
  438. *
  439. * @输入 pETM 指向三个ETM定时器其中一个的基址
  440. *
  441. * @无返回
  442. *
  443. *********************************************************************************/
  444. void ETM_GenerateTrig2(ETM_Type *pETM)
  445. {
  446. ASSERT(ETM2 == pETM);
  447. if(pETM->SYNC & ETM_SYNC_TRIG2_MASK)
  448. {
  449. #if defined(CPU_NV32)
  450. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK;
  451. #elif defined(CPU_NV32M3)
  452. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK;
  453. #elif defined(CPU_NV32M4)
  454. SIM->SOPT0 |= SIM_SOPT0_ETMSYNC_MASK;
  455. #endif
  456. }
  457. }
  458. /*********************************************************************************//*!
  459. *
  460. * @brief general configuration to ETM_No to start software synchronization.
  461. *
  462. * @param[in] pETM pointer to one of three ETM base register address.
  463. * @param[in] PrescalerValue system clock divide value, 0 to 3.
  464. * @param[in] DeadETMeValue n count clock is inserted, 0 to 63.
  465. *
  466. * @return none.
  467. *
  468. * @ Pass/ Fail criteria: none.
  469. *
  470. *********************************************************************************/
  471. /*********************************************************************************//*!
  472. *
  473. * @ETM死区时间插入设置.
  474. *
  475. * @输入 pETM 指向三个ETM定时器其中一个的基址
  476. * @输入 PrescalerValue 系统时钟分频值
  477. * @输入 DeadETMeValue 死去插入时间值,0-63可选
  478. *
  479. * @无返回
  480. *
  481. *********************************************************************************/
  482. void ETM_PWMDeadETMeSet(ETM_Type *pETM, uint8_t u8PrescalerValue, uint8_t u8DeadETMeValue)
  483. {
  484. ASSERT(ETM2 == pETM);
  485. pETM->COMBINE |= 0x101010; //使能死区时间插入 /* enable dead ETMe insertion */
  486. if(!(pETM->MODE & ETM_MODE_WPDIS_MASK)) //如果开启了写保护/* if write protection is enabled */
  487. {
  488. pETM->MODE |= ETM_MODE_WPDIS_MASK; //禁用写保护 /* disable the write protection */
  489. pETM->DEADETME = (ETM_DEADETME_DTVAL(u8DeadETMeValue & 0x3F) | ETM_DEADETME_DTPS(u8PrescalerValue & 0x3));
  490. pETM->MODE &= ~ETM_MODE_WPDIS_MASK;//使能写保护 /* enable the write protection */
  491. }
  492. else
  493. {
  494. //如果没有开启写保护 /* if no protection */
  495. pETM->DEADETME = (ETM_DEADETME_DTVAL(u8DeadETMeValue & 0x3F) | ETM_DEADETME_DTPS(u8PrescalerValue & 0x3));
  496. }
  497. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK; //软件同步 /* software sync */
  498. }
  499. /*********************************************************************************//*!
  500. *
  501. * @brief set output mask.
  502. *
  503. * @param[in] pETM pointer to one of three ETM base register address.
  504. * @param[in] Channel pwm channel needed to be masked.
  505. *
  506. * @return none.
  507. *
  508. * @ Pass/ Fail criteria: none.
  509. *
  510. *********************************************************************************/
  511. /*********************************************************************************//*!
  512. *
  513. * @设置输出标志位
  514. *
  515. * @输入 pETM 指向三个ETM定时器其中一个的基址
  516. * @输入 Channel PWM通道位需要被置标志
  517. *
  518. * @无返回
  519. *
  520. *********************************************************************************/
  521. void ETM_OutputMaskSet(ETM_Type *pETM, uint8_t u8ETM_Channel)
  522. {
  523. ASSERT((ETM2 == pETM) && (u8ETM_Channel < 6));
  524. pETM->OUTMASK |= (1 << u8ETM_Channel);
  525. if(pETM->SYNC & ETM_SYNC_SYNCHOM_MASK) //如果需要PWM同步更新 /* if PWM sync is needed */
  526. {
  527. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; //选择增强PWM同步 /* recommend enhanced sync mode */
  528. if(pETM->SYNCONF & ETM_SYNCONF_SWOM_MASK) //如果需要软件同步 /* if software sync is needed*/
  529. {
  530. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK;
  531. }
  532. else if(pETM->SYNCONF & ETM_SYNCONF_HWOM_MASK)//如果需要硬件同步 /* if hardware sync is needed*/
  533. {
  534. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;
  535. #if defined(CPU_NV32)
  536. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; //硬件同步 /* hardware sync */
  537. #elif defined(CPU_NV32M3)
  538. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  539. #elif defined(CPU_NV32M4)
  540. SIM->SOPT0 |= SIM_SOPT0_ETMSYNC_MASK; /* hardware sync */
  541. #endif
  542. }
  543. else
  544. {
  545. }
  546. }
  547. else /* no need to sync, update on the next rising edge of system clock */
  548. {
  549. }
  550. }
  551. /*********************************************************************************//*!
  552. *
  553. * @brief general configuration to ETM_No to start software synchronization.
  554. *
  555. * @param[in] pETM pointer to one of three ETM base register address.
  556. * @param[in] Channel pwm channel needed to be controlled by software.
  557. * @param[in] ChannelValue the value to be set, 0 or 1.
  558. *
  559. * @return none.
  560. *
  561. * @ Pass/ Fail criteria: none.
  562. *
  563. *********************************************************************************/
  564. /*********************************************************************************//*!
  565. *
  566. * @配置软件输出控制SWOCTRL寄存器的同步是否由软件触发
  567. *
  568. * @输入 pETM 指向三个ETM定时器其中一个的基址
  569. * @输入 Channel PWM波的通道选择
  570. * @输入 ChannelValue 0或1,0不触发;1触发
  571. *
  572. * @无返回
  573. *
  574. *********************************************************************************/
  575. void ETM_SWOutputControlSet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ChannelValue)
  576. {
  577. ASSERT((ETM2 == pETM) && (u8ETM_Channel < 6));
  578. if(ETM_SWOCTRL_HIGH == u8ChannelValue)
  579. {
  580. pETM->SWOCTRL |= (0x0101 << u8ETM_Channel);
  581. }
  582. else if(ETM_SWOCTRL_LOW == u8ChannelValue)
  583. {
  584. pETM->SWOCTRL |= (1 << u8ETM_Channel);
  585. pETM->SWOCTRL &= ~(0x100 << u8ETM_Channel);
  586. }
  587. if(pETM->SYNCONF & ETM_SYNCONF_SWOC_MASK) /* if PWM sync is needed */
  588. {
  589. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; /* recommend enhanced sync mode */
  590. if(pETM->SYNCONF & ETM_SYNCONF_SWSOC_MASK) /* if software sync is needed*/
  591. {
  592. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK; /* software sync */
  593. }
  594. else if(pETM->SYNCONF & ETM_SYNCONF_HWSOC_MASK) /* if hardware sync is needed*/
  595. {
  596. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;
  597. #if defined(CPU_NV32)
  598. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  599. #elif defined(CPU_NV32M3)
  600. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  601. #elif defined(CPU_NV32M4)
  602. SIM->SOPT0 |= SIM_SOPT0_ETMSYNC_MASK; /* hardware sync */
  603. #endif
  604. }
  605. }
  606. else /* no need to sync, update on the next rising edge of system clock */
  607. {
  608. }
  609. }
  610. /*********************************************************************************//*!
  611. *
  612. * @brief set PWM polarity.
  613. *
  614. * @param[in] pETM pointer to one of three ETM base register address.
  615. * @param[in] Channel pwm channel needed to be controlled by software.
  616. * @param[in] ActiveValue the value to be set, 0 or 1.
  617. *
  618. * @return none.
  619. *
  620. * @ Pass/ Fail criteria: none.
  621. *
  622. *********************************************************************************/
  623. /*********************************************************************************
  624. *
  625. * @设置通道输出极性的功能函数
  626. *
  627. * @输入 pETM 指向三个ETM定时器其中一个的基址
  628. * @输入 Channel PWM波的通道选择
  629. * @输入 ActiveValue 极性的选择,0为高电平,1为低电平
  630. *
  631. * @无返回
  632. *
  633. *********************************************************************************/
  634. void ETM_PolaritySet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ActiveValue)
  635. {
  636. ASSERT((ETM2 == pETM) && (u8ETM_Channel < 6));
  637. if(ETM_POLARITY_HIGHACTIVE == u8ActiveValue)
  638. {
  639. pETM->POL &= ~(1 << u8ETM_Channel);
  640. }
  641. else if(ETM_POLARITY_LOWACTIVE == u8ActiveValue)
  642. {
  643. pETM->POL |= (1 << u8ETM_Channel);
  644. }
  645. }
  646. /*********************************************************************************//*!
  647. *
  648. * @brief set ETM behavior in debug mode.
  649. *
  650. * @param[in] pETM pointer to one of three ETM base register address.
  651. * @param[in] u8DebugMode debug mode select from 00 to 11.
  652. *
  653. * @return none.
  654. *
  655. * @ Pass/ Fail criteria: none.
  656. *
  657. *********************************************************************************/
  658. /*********************************************************************************
  659. *
  660. * @选择BDM模式下的ETM行为
  661. *
  662. * @输入 pETM 指向三个ETM定时器其中一个的基址
  663. * @输入 u8DebugMode debug 的模式从00-11之间选择
  664. *
  665. * @无返回
  666. *
  667. *********************************************************************************/
  668. void ETM_SetDebugModeBehavior(ETM_Type *pETM, uint8_t u8DebugMode)
  669. {
  670. ASSERT((ETM2 == pETM));
  671. pETM->CONF &= ~ETM_CONF_BDMMODE_MASK;
  672. pETM->CONF |= ETM_CONF_BDMMODE(u8DebugMode);
  673. }
  674. /*********************************************************************************//*!
  675. *
  676. * @brief Selects the ratio between the number of counter overflows to the number of ETMes the TOF bit is set.
  677. *
  678. * @param[in] pETM pointer to one of three ETM base register address.
  679. * @param[in] u8TOFNUM TOF numbers before setting TOF bit, 0~31.
  680. *
  681. * @return none.
  682. *
  683. * @ Pass/ Fail criteria: none.
  684. *
  685. *********************************************************************************/
  686. /*********************************************************************************//*!
  687. *
  688. * @ETM中TOF频率大小的设置功能函数
  689. *
  690. * @输入 pETM 指向三个ETM定时器其中一个的基址
  691. * @输入 u8TOFNUM TOF频率数,大小0和31之间
  692. *
  693. * @无返回
  694. *
  695. *********************************************************************************/
  696. void ETM_SetTOFFrequency(ETM_Type *pETM, uint8_t u8TOFNUM)
  697. {
  698. ASSERT((ETM2 == pETM));
  699. pETM->CONF &= ~ETM_CONF_NUMTOF_MASK;
  700. pETM->CONF |= ETM_CONF_NUMTOF(u8TOFNUM);
  701. }
  702. /*********************************************************************************//*!
  703. *
  704. * @brief swap the output of CH(n) and CH(n+1).
  705. *
  706. * @param[in] pETM pointer to one of three ETM base register address.
  707. * @param[in] ChannelPair the pair to be swapped, 0,1,2.
  708. *
  709. * @return none.
  710. *
  711. * @ Pass/ Fail criteria: none.
  712. *
  713. *********************************************************************************/
  714. /*********************************************************************************
  715. *
  716. * @交换通道CH(n)和通道CH(n+1)的输出结果
  717. *
  718. * @输入 pETM 其中一个ETM定时器的基址
  719. * @输入 ChannelPair 要被交换的通道数号,即n可为0,1,2,
  720. *
  721. *********************************************************************************/
  722. void ETM_InvertChannel(ETM_Type *pETM, uint8_t u8ChannelPair)
  723. {
  724. ASSERT((ETM2 == pETM) && u8ChannelPair <= 2);
  725. pETM->INVCTRL |= 1<<u8ChannelPair;
  726. if(pETM->SYNCONF & ETM_SYNCONF_INVC_MASK) //如果需要PWM同步 /* if PWM sync is needed */
  727. {
  728. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; //选择增强PWM同步 /* recommend enhanced sync mode */
  729. if(pETM->SYNCONF & ETM_SYNCONF_SWINVC_MASK)//如果需要软件同步 /* if software sync is needed*/
  730. {
  731. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK; //开启软件同步 /* software sync */
  732. }
  733. else if(pETM->SYNCONF & ETM_SYNCONF_HWINVC_MASK) //如果需要硬件同步 /* if hardware sync is needed*/
  734. {
  735. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;
  736. #if defined(CPU_NV32)
  737. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; //硬件同步 /* hardware sync */
  738. #elif defined(CPU_NV32M3)
  739. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  740. #elif defined(CPU_NV32M4)
  741. SIM->SOPT0 |= SIM_SOPT0_ETMSYNC_MASK; /* hardware sync */
  742. #endif
  743. }
  744. }
  745. else
  746. {
  747. }
  748. }
  749. /*****************************************************************************//*!
  750. *
  751. * @brief configure the ETM as specified control parameters, CnSC and CnV not
  752. * included.
  753. *
  754. * @param[in] pETM pointer to one of three ETM base register address.
  755. * @param[in] pConfig pointer to ETM general parameters.
  756. *
  757. * @return none.
  758. *
  759. * @ Pass/ Fail criteria: none.
  760. *
  761. *****************************************************************************/
  762. /*****************************************************************************//*!
  763. *
  764. * @ETM初始化函数
  765. *
  766. * @输入 pETM 指向三个ETM定时器其中一个的基址
  767. * @输入 pConfig 指向ETM的一些基本参数
  768. * @无返回值
  769. *
  770. *****************************************************************************/
  771. void ETM_Init(ETM_Type *pETM, ETM_ConfigType *pConfig)
  772. {
  773. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM));
  774. if(ETM0 == pETM)
  775. {
  776. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  777. }
  778. #if !defined(CPU_NV32M3)
  779. else if(ETM1 == pETM)
  780. {
  781. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  782. }
  783. #endif
  784. else
  785. {
  786. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  787. }
  788. /* diable counter */
  789. pETM->SC = 0;
  790. pETM->MODE = pConfig->mode;
  791. pETM->MOD = pConfig->modulo;
  792. pETM->CNT = pConfig->cnt;
  793. if( pETM->MODE & ETM_MODE_ETMEN_MASK )
  794. {
  795. /* when ETMEN = 1, all other registers can be written */
  796. /* 当 ETMEN = 1, 所有寄存器都可以被写入 */
  797. pETM->COMBINE = pConfig->combine;
  798. pETM->CNTIN = pConfig->cntin;
  799. pETM->SYNC = pConfig->sync;
  800. pETM->OUTINIT = pConfig->outinit;
  801. pETM->OUTMASK = pConfig->outmask;
  802. pETM->DEADETME = pConfig->deadETMe;
  803. pETM->EXTTRIG = pConfig->exttrig;
  804. pETM->POL = pConfig->pol;
  805. pETM->FMS = pConfig->fms;
  806. pETM->FILTER = pConfig->filter;
  807. pETM->FLTCTRL = pConfig->fltctrl; /* fault control */
  808. pETM->FLTPOL = pConfig->fltpol;
  809. pETM->CONF = pConfig->conf;
  810. pETM->SYNCONF = pConfig->synconf;
  811. pETM->SWOCTRL = pConfig->swoctrl;
  812. pETM->PWMLOAD = pConfig->pwmload;
  813. }
  814. /* write SC to enable clock */
  815. /*通过写入状态控制寄存器SC来使能ETM时钟 */
  816. pETM->SC = pConfig->sc;
  817. }
  818. /*****************************************************************************//*!
  819. *
  820. * @brief close the ETM moudle.
  821. *
  822. * @param[in] pETM pointer to one of three ETM base register address.
  823. *
  824. * @return none.
  825. *
  826. * @ Pass/ Fail criteria: none.
  827. *
  828. *****************************************************************************/
  829. /*****************************************************************************
  830. *
  831. *关闭相应的ETM功能组件函数
  832. *
  833. *****************************************************************************/
  834. void ETM_DeInit(ETM_Type *pETM)
  835. {
  836. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM));
  837. pETM->SC = 0;
  838. pETM->MOD = 0;
  839. pETM->CNT = 0;
  840. if(ETM2 == pETM)
  841. {
  842. pETM->MODE = 0x4;
  843. pETM->COMBINE = 0;
  844. pETM->CNTIN = 0;
  845. pETM->SYNC = 0;
  846. pETM->OUTINIT = 0;
  847. pETM->OUTMASK = 0;
  848. pETM->DEADETME = 0;
  849. pETM->EXTTRIG = 0;
  850. pETM->POL = 0;
  851. pETM->FMS = 0;
  852. pETM->FILTER = 0;
  853. pETM->FLTCTRL = 0;
  854. pETM->FLTPOL = 0;
  855. pETM->CONF = 0;
  856. pETM->SYNCONF = 0;
  857. pETM->SWOCTRL = 0;
  858. pETM->PWMLOAD = 0;
  859. }
  860. /* close the clock gate */
  861. /* 禁用时钟 */
  862. if (ETM0 == pETM)
  863. {
  864. SIM->SCGC &= ~SIM_SCGC_ETM0_MASK;
  865. NVIC_DisableIRQ(ETM0_IRQn);
  866. }
  867. #if !defined(CPU_NV32M3)
  868. else if(ETM1 == pETM)
  869. {
  870. SIM->SCGC &= ~SIM_SCGC_ETM1_MASK;
  871. NVIC_DisableIRQ(ETM1_IRQn);
  872. }
  873. #endif
  874. else if (ETM2 == pETM)
  875. {
  876. SIM->SCGC &= ~SIM_SCGC_ETM2_MASK;
  877. NVIC_DisableIRQ(ETM2_IRQn);
  878. }
  879. }
  880. /*****************************************************************************//*!
  881. *
  882. * @brief configure the ETM channels, CnSC and CnV are included.
  883. *
  884. * @param[in] pETM pointer to one of three ETM base register address.
  885. * @param[in] ETM_Channel ETM channel number.
  886. * @param[in] pTETMCH_Params pointer to ETM channel general parameters.
  887. *
  888. * @return none.
  889. *
  890. * @ Pass/ Fail criteria: none.
  891. *
  892. *****************************************************************************/
  893. /*****************************************************************************//*!
  894. *
  895. * @本函数用来配置ETM通道, 包括通道状态及控制寄存器CnSC和通道计数值寄存器CnV
  896. * @输入 pETM 指向三个ETM定时器其中一个的基址
  897. * @输入 ETM_Channel ETM的通道号
  898. * @输入 pTETMCH_Params 指向ETM通道一般参数的指针
  899. *
  900. * @无返回值
  901. *
  902. *****************************************************************************/
  903. void ETM_ChannelInit(ETM_Type *pETM, uint8_t u8ETM_Channel, ETM_ChParamsType *pTETMCH_Params)
  904. {
  905. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM));
  906. if (ETM0 == pETM)
  907. {
  908. ASSERT(u8ETM_Channel < 2);
  909. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  910. }
  911. #if !defined(CPU_NV32M3)
  912. else if(ETM1 == pETM)
  913. {
  914. ASSERT(u8ETM_Channel < 2);
  915. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  916. }
  917. #endif
  918. else
  919. {
  920. ASSERT(u8ETM_Channel < 6);
  921. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  922. }
  923. pETM->CONTROLS[u8ETM_Channel].CnSC = pTETMCH_Params->u8CnSC;
  924. pETM->CONTROLS[u8ETM_Channel].CnV = pTETMCH_Params->u16CnV;
  925. return;
  926. }
  927. /*****************************************************************************//*!
  928. *
  929. * @brief set the ETM channel value register per duty cycle and modulo for combine mode
  930. * odd channel no must be provided and even channel value register is not changed.
  931. *
  932. * @param[in] pETM pointer to one of three ETM base register address.
  933. * @param[in] ETM_Channel odd channel no:1,3,5.
  934. * @param[in] dutyCycle duty cycle in percentage. e.g. 10, means 10%.
  935. *
  936. * @return none.
  937. *
  938. * @ Pass/ Fail criteria: none.
  939. *
  940. *****************************************************************************/
  941. /*****************************************************************************//*!
  942. *
  943. * 必须设置奇数通道数,且偶数通道的值不变
  944. *
  945. * @输入 pETM 指向三个ETM定时器其中一个的基址
  946. * @输入 ETM_Channel 奇通道数:1、3、5
  947. * @输入 dutyCycle 设置占空比,若DutyCycle为10,那么占空比就为10%
  948. *
  949. * @return none.
  950. *
  951. *****************************************************************************/
  952. void ETM_SetDutyCycleCombine(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8DutyCycle)
  953. {
  954. uint16_t cnv = pETM->CONTROLS[u8ETM_Channel-1].CnV;
  955. uint16_t modulo = pETM->MOD;
  956. ASSERT((1 == u8ETM_Channel) || (3 == u8ETM_Channel) || (5 == u8ETM_Channel));
  957. cnv += (u8DutyCycle * (modulo+1)) / 100;
  958. if(cnv > modulo)
  959. {
  960. cnv = modulo - 1;
  961. }
  962. pETM->CONTROLS[u8ETM_Channel].CnV = cnv ;
  963. pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK | (1<<u8ETM_Channel);
  964. }
  965. /*****************************************************************************//*!
  966. *
  967. * @brief configure the ETMx_SYNCONF register including SW and HW Sync selection.
  968. *
  969. * @param[in] pETM pointer to one of three ETM base register address.
  970. * @param[in] u32ConfigValue ETMx_SYNCONF register config value.
  971. *
  972. * @return none.
  973. *
  974. * @ Pass/ Fail criteria: none.
  975. *
  976. *****************************************************************************/
  977. /*****************************************************************************
  978. *
  979. * @配置寄存器 ETMx_SYNCONF,其中里面包含了软件输出的控制是否由硬件触发HW或是否有软件出发SW
  980. *
  981. * @输入 pETM 指向三个ETM定时器其中一个的基址
  982. * @输入 u32ConfigValue ETMx_SYNCONF这个寄存器的值
  983. *
  984. * @无返回
  985. *
  986. *****************************************************************************/
  987. void ETM_SyncConfigActivate(ETM_Type *pETM, uint32_t u32ConfigValue)
  988. {
  989. ASSERT((ETM2 == pETM));
  990. pETM->SYNCONF |= u32ConfigValue;
  991. }
  992. /*****************************************************************************//*!
  993. *
  994. * @brief configure the ETMx_SYNCONF register including SW and HW Sync selection.
  995. *
  996. * @param[in] pETM pointer to one of three ETM base register address.
  997. * @param[in] u32ConfigValue ETMx_SYNCONF register config value.
  998. *
  999. * @return none.
  1000. *
  1001. * @ Pass/ Fail criteria: none.
  1002. *
  1003. *****************************************************************************/
  1004. /*****************************************************************************
  1005. *
  1006. * @恢复配置寄存器 ETMx_SYNCONF,其中里面包含了软件输出的控制是否由硬件触发HW或是否有软件出发SW
  1007. *
  1008. * @输入 pETM 指向三个ETM定时器其中一个的基址
  1009. * @输入 u32ConfigValue ETMx_SYNCONF这个寄存器的值
  1010. *
  1011. * @无返回
  1012. *
  1013. *****************************************************************************/
  1014. void ETM_SyncConfigDeactivate(ETM_Type *pETM, uint32_t u32ConfigValue)
  1015. {
  1016. ASSERT((ETM2 == pETM));
  1017. pETM->SYNCONF &= ~u32ConfigValue;
  1018. }
  1019. /*****************************************************************************//*!
  1020. *
  1021. * @brief This function sets the callback function.
  1022. *
  1023. * @param[in] pETM pointer to one of three ETM base register address.
  1024. * @param[in] pfnCallback functon address.
  1025. *
  1026. * @return none.
  1027. *
  1028. * @ Pass/ Fail criteria: none
  1029. *
  1030. *****************************************************************************/
  1031. /*****************************************************************************//*!
  1032. *
  1033. * @设置中断回调函数入口
  1034. *
  1035. * @输入 pETM 指向三个ETM中其中一个的基址
  1036. * @输入 pfnCallback 功能函数的地址
  1037. *
  1038. * @无返回.
  1039. *
  1040. *****************************************************************************/
  1041. void ETM_SetCallback(ETM_Type *pETM, ETM_CallbackPtr pfnCallback)
  1042. {
  1043. ETM_Callback[((uint32_t)pETM - (uint32_t)ETM0_BASE)>>12] = pfnCallback;
  1044. }
  1045. /*! @} End of ETM_api_list */
  1046. /*****************************************************************************//*!
  1047. *
  1048. * @brief ETM0_Isr interrupt service routine.
  1049. *
  1050. * @param none.
  1051. *
  1052. * @return none.
  1053. *
  1054. * @ Pass/ Fail criteria: none.
  1055. *
  1056. *****************************************************************************/
  1057. /*********************************************************************************//*!
  1058. *
  1059. * @ETM0中断服务函数
  1060. *
  1061. * @无输入
  1062. *
  1063. * @无返回
  1064. *
  1065. *********************************************************************************/
  1066. void ETM0_Isr(void)
  1067. {
  1068. if(ETM_Callback[0])
  1069. {
  1070. ETM_Callback[0]();
  1071. }
  1072. }
  1073. /*****************************************************************************//*!
  1074. *
  1075. * @brief ETM1_Isr interrupt service routine.
  1076. *
  1077. * @param none.
  1078. *
  1079. * @return none.
  1080. *
  1081. * @ Pass/ Fail criteria: none.
  1082. *
  1083. *****************************************************************************/
  1084. /*********************************************************************************//*!
  1085. *
  1086. * @ETM1中断服务函数
  1087. *
  1088. * @无输入
  1089. *
  1090. * @无返回
  1091. *
  1092. *********************************************************************************/
  1093. void ETM1_Isr(void)
  1094. {
  1095. if(ETM_Callback[1])
  1096. {
  1097. ETM_Callback[1]();
  1098. }
  1099. }
  1100. /*****************************************************************************//*!
  1101. *
  1102. * @brief ETM2_Isr interrupt service routine.
  1103. *
  1104. * @param none.
  1105. *
  1106. * @return none.
  1107. *
  1108. * @ Pass/ Fail criteria: none.
  1109. *
  1110. *****************************************************************************/
  1111. /*********************************************************************************//*!
  1112. *
  1113. * @ETM2中断服务函数
  1114. *
  1115. * @无输入
  1116. *
  1117. * @无返回
  1118. *
  1119. *********************************************************************************/
  1120. void ETM2_Isr(void)
  1121. {
  1122. if(ETM_Callback[2])
  1123. {
  1124. ETM_Callback[2]();
  1125. }
  1126. }