[demo程序] NV32F100x 库文件etm.c中文注释

[复制链接]
 楼主| jp_chen 发表于 2017-7-26 16:41 | 显示全部楼层 |阅读模式

  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] providing APIs for configuring ETM.
  3. *
  4. *******************************************************************************
  5. *
  6. * provide APIs for configuring ETM
  7. ******************************************************************************/
  8. #include "common.h"
  9. #include "ETM.h"

  10. /******************************************************************************
  11. * Global variables
  12. ******************************************************************************/

  13. /******************************************************************************
  14. * Constants and macros
  15. ******************************************************************************/

  16. /******************************************************************************
  17. * Local types
  18. ******************************************************************************/

  19. /******************************************************************************
  20. * Local function prototypes
  21. ******************************************************************************/

  22. /******************************************************************************
  23. * Local variables
  24. ******************************************************************************/

  25. /******************************************************************************
  26. * Local functions
  27. ******************************************************************************/

  28. /******************************************************************************
  29. * Global functions
  30. ******************************************************************************/
  31. ETM_CallbackPtr ETM_Callback[3] = {(ETM_CallbackPtr)NULL};


  32. /******************************************************************************
  33. * ETM api lists
  34. *
  35. *//*! @addtogroup ETM_api_list
  36. * @{
  37. *******************************************************************************/
  38. /*******************************************************************************//*!
  39. *
  40. * @设置时钟资源及分频系数   
  41. * @输入     pETM                 指向三个ETM定时器其中一个的基址
  42. * @输入     ClockSource           ETM 时钟资源
  43. * @输入     ClockPrescale          分频系数
  44. *
  45. * [url=home.php?mod=space&uid=266161]@return[/url] none.  无返回
  46. *
  47. *********************************************************************************/


  48. void ETM_ClockSet(ETM_Type *pETM, uint8_t u8ClockSource, uint8_t u8ClockPrescale)
  49. {
  50. uint8_t   u8Temp;
  51.    //pETM指向的SC寄存器低5位清0,即未选择时钟,时钟输入采取1分频
  52.   u8Temp  = (pETM->SC & 0xE0);
  53.    //时钟选择,及预分频因子选择
  54.    u8Temp |= (ETM_SC_CLKS(u8ClockSource & 0x3) | ETM_SC_PS(u8ClockPrescale & 0x7));
  55. //配置该ETM的状态与控制寄存器ETMx_SC
  56.    pETM->SC = u8Temp;
  57. }

  58. /*********************************************************************************//*!
  59. * @ETM中TOF频率大小的设置功能函数
  60. *        
  61. * @输入    pETM              指向三个ETM定时器其中一个的基址
  62. * @输入    u8TOFNUM         TOF频率数,大小0和31之间
  63. *
  64. * @无返回
  65. *
  66. *********************************************************************************/
  67. void ETM_SetTOFFrequency(ETM_Type *pETM, uint8_t u8TOFNUM)
  68. {
  69.     ASSERT((ETM2 == pETM));
  70.     pETM->CONF &= ~ETM_CONF_NUMTOF_MASK;
  71.     pETM->CONF |= ETM_CONF_NUMTOF(u8TOFNUM);
  72. }

  73. /******************************************************************************************
  74. * @ETM中PWM的初始化函数      
  75. * @输入        pETM                 指向三个ETM定时器其中一个的基址
  76. * @输入        PWMModeSelect       居中对齐CPWM(10)、边沿对齐EPWM(01)以及级联模式PWM(11)
  77. * @输入        PWMEdgeSelect        边沿选择
  78. *
  79. * @无返回
  80. *
  81. ******************************************************************************************/
  82. void ETM_PWMInit(ETM_Type *pETM, uint8_t u8PWMModeSelect, uint8_t u8PWMEdgeSelect)
  83. {
  84.     uint8_t  channels, i;
  85.     ASSERT((ETM0== pETM) || (ETM1== pETM) || (ETM2== pETM)); //断言来检测ETM是否正确
  86.     /* open the clock gate */
  87.         if (ETM0 == pETM)
  88.     {
  89.         channels = 2;
  90.         SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  91.     }
  92.     else if(ETM1 == pETM)
  93.     {
  94.         channels = 2;
  95.     }        
  96.     else
  97.     {
  98.         channels = 6;
  99.         SIM->SCGC  |= SIM_SCGC_ETM2_MASK;
  100.     }
  101.     pETM->SC  = 0x0;                                    /* 关闭计数器 */  
  102.         pETM->MOD = ETM_MOD_INIT;
  103.     if(ETM_PWMMODE_CENTERALLIGNED == u8PWMModeSelect)   /*打开CPWM*/
  104.     {
  105.         pETM->SC |= ETM_SC_CPWMS_MASK;
  106.     }
  107.     else if(ETM_PWMMODE_COMBINE == u8PWMModeSelect)     /* 打开级联PWM模式 */
  108.     {
  109.         ASSERT(ETM2 == pETM);
  110.       pETM->MODE|= ETM_MODE_WPDIS_MASK | ETM_MODE_ETMEN_MASK;
  111.                         pETM->COMBINE = ETM_COMBINE_COMBINE0_MASK | ETM_COMBINE_COMP0_MASK | ETM_COMBINE_SYNCEN0_MASK | ETM_COMBINE_DTEN0_MASK |
  112.                         ETM_COMBINE_COMBINE1_MASK | ETM_COMBINE_COMP1_MASK | ETM_COMBINE_SYNCEN1_MASK | ETM_COMBINE_DTEN1_MASK |
  113.                         ETM_COMBINE_COMBINE2_MASK | ETM_COMBINE_COMP2_MASK | ETM_COMBINE_SYNCEN2_MASK | ETM_COMBINE_DTEN2_MASK
  114.                         ;     
  115.       pETM->SC &= ~ETM_SC_CPWMS_MASK;
  116.     }
  117.     if(ETM_PWM_HIGHTRUEPULSE == u8PWMEdgeSelect)
  118.     {
  119.         /* 配置ETMers 寄存器 */
  120.         for(i=0; i<channels; i++)
  121.         {
  122.             pETM->CONTROLS[i].CnSC = ETM_CnSC_MSB_MASK | ETM_CnSC_ELSB_MASK;  
  123.             pETM->CONTROLS[i].CnV  = ETM_C0V_INIT + i*100;
  124.         }
  125.     }
  126.     else if(ETM_PWM_LOWTRUEPULSE == u8PWMEdgeSelect)
  127.     {
  128.         for(i=0; i<channels; i++)
  129.         {
  130.             pETM->CONTROLS[i].CnSC = ETM_CnSC_MSB_MASK | ETM_CnSC_ELSA_MASK;
  131.             pETM->CONTROLS[i].CnV  = ETM_C0V_INIT + i*100 ;
  132.         }
  133.     }  
  134. }

  135. /*********************************************************************************
  136. *
  137. * @设置通道输出极性的功能函数
  138. *        
  139. * @输入     pETM                 指向三个ETM定时器其中一个的基址
  140. * @输入     Channel                PWM波的通道选择
  141. * @输入     ActiveValue             极性的选择,0为高电平,1为低电平
  142. *
  143. * @无返回
  144. *
  145. *********************************************************************************/
  146. void ETM_PolaritySet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ActiveValue)
  147. {
  148.     ASSERT((ETM2 == pETM) && (u8ETM_Channel < 6));
  149.    
  150.     if(ETM_POLARITY_HIGHACTIVE == u8ActiveValue)
  151.     {
  152.         pETM->POL &=  ~(1 << u8ETM_Channel);
  153.     }
  154.     else if(ETM_POLARITY_LOWACTIVE == u8ActiveValue)
  155.     {
  156.         pETM->POL |=  (1 << u8ETM_Channel);
  157.     }
  158. }

  159. /*****************************************************************************//*!
  160. *
  161. *        必须设置奇数通道数,且偶数通道的值不变
  162. *
  163. * @输入        pETM            指向三个ETM定时器其中一个的基址
  164. * @输入        ETM_Channel     奇通道数:1、3、5
  165. * @输入        dutyCycle         设置占空比,若DutyCycle为10,那么占空比就为10%
  166. *
  167. * @return none.
  168. *
  169. * [url=home.php?mod=space&uid=72445]@[/url] Pass/ Fail criteria: none.
  170. *
  171. *****************************************************************************/
  172. void  ETM_SetDutyCycleCombine(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8DutyCycle)
  173. {
  174.     uint16_t   cnv = pETM->CONTROLS[u8ETM_Channel-1].CnV;
  175.     uint16_t   modulo = pETM->MOD;
  176.    
  177.     ASSERT((1 == u8ETM_Channel) || (3 == u8ETM_Channel) || (5 == u8ETM_Channel));
  178.    
  179.     cnv += (u8DutyCycle * (modulo+1))  / 100;
  180.     if(cnv > modulo)
  181.     {
  182.         cnv = modulo - 1;
  183.     }
  184.     pETM->CONTROLS[u8ETM_Channel].CnV = cnv ;   
  185.    
  186. pETM->PWMLOAD |= ETM_PWMLOAD_LDOK_MASK | (1<<u8ETM_Channel);     
  187. }


  188. /*********************************************************************************
  189. *
  190. * @输入捕捉初始化函数
  191. *        
  192. * @输入        pETM                  指向三个ETM定时器其中一个的基址
  193. * @输入        Channel                配置通道号
  194. * @输入        CaptureMode           选择捕捉方式:上升沿, 下降沿或跳变沿.
  195. *
  196. * @无返回
  197. *
  198. *********************************************************************************/
  199. void ETM_InputCaptureInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CaptureMode)
  200. {
  201.     ASSERT(((ETM0 == pETM) && (u8ETM_Channel < 2)) || ((ETM1 == pETM) && (u8ETM_Channel < 2)) || ((ETM2 == pETM) && (u8ETM_Channel < 6)));
  202.     /* open the clock gate */
  203.         if ((ETM0 == pETM) && (u8ETM_Channel < 2))
  204.     {
  205.         SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  206.         NVIC_EnableIRQ(ETM0_IRQn);
  207.     }
  208.     else if((ETM1 == pETM)  && (u8ETM_Channel < 2))
  209.     {
  210.     }        
  211.     else
  212.     {
  213.         SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  214.         NVIC_EnableIRQ(ETM2_IRQn);
  215.     }
  216.     pETM->SC  = 0x0;     //关闭计数器/
  217.     pETM->MOD = 0xFFFF;  
  218.     if(ETM_INPUTCAPTURE_RISINGEDGE == u8CaptureMode)  //开启中断,捕获上升沿
  219.     {
  220.         pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSA_MASK;
  221.     }
  222.     else if(ETM_INPUTCAPTURE_FALLINGEDGE == u8CaptureMode)  //捕获下降沿
  223.     {
  224.         pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSB_MASK;
  225.     }
  226.     else if(ETM_INPUTCAPTURE_BOTHEDGE == u8CaptureMode)     //接受跳变沿
  227.     {
  228.         pETM->CONTROLS[u8ETM_Channel].CnSC = ETM_CnSC_CHIE_MASK | ETM_CnSC_ELSA_MASK | ETM_CnSC_ELSB_MASK;      
  229.     }
  230. }

  231. /*********************************************************************************//*!
  232. *
  233. * @对ETM_No t配置双边捕获模式来测量一个脉冲的宽度或周期
  234. *        
  235. * @输入        pETM                指向三个ETM定时器其中一个的基址
  236. * @输入        ChannelPair           频道配对数的配置为: 0, 2, 4.
  237. * @输入        CaptureMode           select capture edge: one shot and continuous mode.
  238. * @输入        Channel_N_Edge        频道N边沿检测
  239. * @输入        Channel_Np1_Edge      频道N+1边沿检测.
  240. *
  241. * @无返回
  242. *
  243. *********************************************************************************/
  244. void ETM_DualEdgeCaptureInit(ETM_Type *pETM, uint8_t u8ChannelPair, uint8_t u8CaptureMode,
  245.                                  uint8_t u8Channel_N_Edge, uint8_t u8Channel_Np1_Edge)
  246. {
  247.     ASSERT((ETM2 == pETM)  && (u8ChannelPair < 6) && !(u8ChannelPair & 1) );
  248.    
  249.     SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  250.     if((0 == u8ChannelPair) || (2== u8ChannelPair))
  251.     {
  252.                                         /* channel filter is active */
  253.     }
  254.       
  255.     pETM->SC    = 0x0;                  /* diable counter */
  256.     pETM->MOD   = 0xFFFF;
  257.     pETM->MODE |= ETM_MODE_ETMEN_MASK;  /* ETMEN = 1 */  
  258.     /* DECAPEN = 1,  ChannelPair/2 * 8 */
  259.     pETM->COMBINE |=  ((ETM_COMBINE_DECAPEN0_MASK) << (u8ChannelPair * 4));
  260.    
  261.     pETM->CONTROLS[u8ChannelPair].CnSC &= ~ETM_CnSC_CHF_MASK;       /* CH(n)F and CH(n+1)F bits must be cleared first */
  262.     pETM->CONTROLS[u8ChannelPair + 1].CnSC &= ~ETM_CnSC_CHF_MASK;
  263.    
  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.    
  275.     pETM->CONTROLS[u8ChannelPair].CnSC |= (u8Channel_N_Edge << 2);   /* select detec edge */
  276.     pETM->CONTROLS[u8ChannelPair + 1].CnSC |= (u8Channel_Np1_Edge << 2);   
  277.    
  278.     pETM->COMBINE |=  (ETM_COMBINE_DECAP0_MASK << (u8ChannelPair * 4));
  279. }
复制代码

 楼主| jp_chen 发表于 2017-7-26 16:42 | 显示全部楼层
  1. /*********************************************************************************//*!
  2. *
  3. * @用ETM完成捕捉
  4. *
  5. * @ 输入 pETM 指向三个ETM定时器其中一个的基址
  6. * @输入 Channel 必须完成配置通道即通道号
  7. * @ 输入 CompareMode 选择模式:翻转(01)、置位(11)、清0(10)
  8. *
  9. * @无返回
  10. *
  11. *********************************************************************************/
  12. void ETM_OutputCompareInit(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8CompareMode)
  13. {
  14. ASSERT(((ETM0 == pETM) && (u8ETM_Channel < 2)) ||
  15. ((ETM1 == pETM) && (u8ETM_Channel < 2)) ||
  16. ((ETM2 == pETM) && (u8ETM_Channel < 6))
  17. );
  18. /* open the clock gate */
  19. if(ETM0 == pETM)
  20. {
  21. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  22. }
  23. else if(ETM1 == pETM)
  24. {
  25. SIM->SCGC |= SIM_SCGC_ETM1_MASK;
  26. }
  27. else
  28. {
  29. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  30. }
  31. pETM->SC = 0x0; //关闭计数器
  32. pETM->MOD = ETM_MOD_INIT;
  33. pETM->CONTROLS[u8ETM_Channel].CnSC=(ETM_CnSC_MSA_MASK|(u8CompareMode<<2));
  34. pETM->CONTROLS[u8ETM_Channel].CnV = ETM_C0V_INIT;
  35. }

  36. /*****************************************************************************
  37. *
  38. * @配置寄存器 ETMx_SYNCONF,其中里面包含了软件输出的控制是否由硬件触发HW或是否有软件出发SW
  39. * @param[in] pETM 指向三个ETM定时器其中一个的基址
  40. * @param[in] u32ConfigValue ETMx_SYNCONF这个寄存器的值
  41. *
  42. * @无返回
  43. *
  44. *****************************************************************************/
  45. void ETM_SyncConfigDeactivate(ETM_Type *pETM, uint32_t u32ConfigValue)
  46. {
  47. ASSERT((ETM2 == pETM));
  48. pETM->SYNCONF &= ~u32ConfigValue;
  49. }


  50. /*********************************************************************************
  51. * @ETM中配置ETMx_SYNC 寄存器来保证软件同步
  52. *
  53. * @输入 pETM 指向三个ETM定时器其中一个的基址
  54. * @输入 u8TriggerN 选择硬件触发资源
  55. *
  56. * @无返回
  57. *
  58. *********************************************************************************/
  59. void ETM_HardwareSync(ETM_Type *pETM, uint8_t u8TriggerN)
  60. {
  61. ASSERT(ETM2 == pETM);

  62. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK;

  63. switch(u8TriggerN)
  64. {
  65. case ETM_SYNC_TRIGGER_TRIGGER2:
  66. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;
  67. break;
  68. case ETM_SYNC_TRIGGER_TRIGGER1:
  69. pETM->SYNC |= ETM_SYNC_TRIG1_MASK;
  70. break;
  71. case ETM_SYNC_TRIGGER_TRIGGER0:
  72. pETM->SYNC |= ETM_SYNC_TRIG0_MASK;
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. /*********************************************************************************//*!
  79. *
  80. * @配置软件输出控制SWOCTRL寄存器的同步是否由软件触发
  81. *
  82. * @输入 pETM 指向三个ETM定时器其中一个的基址
  83. * @输入 Channel PWM波的通道选择
  84. * @输入 ChannelValue 0或1,0不触发;1触发
  85. *
  86. * @无返回
  87. *
  88. *********************************************************************************/
  89. void ETM_SWOutputControlSet(ETM_Type *pETM, uint8_t u8ETM_Channel, uint8_t u8ChannelValue)
  90. {
  91. ASSERT((ETM2 == pETM) && (u8ETM_Channel < 6));

  92. if(ETM_SWOCTRL_HIGH == u8ChannelValue)
  93. {
  94. pETM->SWOCTRL |= (0x0101 << u8ETM_Channel);
  95. }
  96. else if(ETM_SWOCTRL_LOW == u8ChannelValue)
  97. {
  98. pETM->SWOCTRL |= (1 << u8ETM_Channel);
  99. pETM->SWOCTRL &= ~(0x100 << u8ETM_Channel);
  100. }
  101. if(pETM->SYNCONF & ETM_SYNCONF_SWOC_MASK) /* if PWM sync is needed */
  102. {
  103. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; /* recommend enhanced sync mode */
  104. if(pETM->SYNCONF & ETM_SYNCONF_SWSOC_MASK) /* if software sync is needed*/
  105. {
  106. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK; /* software sync */
  107. }
  108. else if(pETM->SYNCONF & ETM_SYNCONF_HWSOC_MASK) /* if hardware sync is needed*/
  109. {
  110. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;

  111. #if defined(CPU_NV32)
  112. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  113. #elif defined(CPU_NV32M3)
  114. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  115. #elif defined(CPU_NV32M4)
  116. SIM->SOPT0 |= SIM_SOPT0_ETMSYNC_MASK; /* hardware sync */
  117. #endif
  118. }
  119. }
  120. else /* no need to sync, update on the next rising edge of system clock */
  121. {
  122. }
  123. }



  124. /*********************************************************************************//*!
  125. *
  126. * @通过配置ETM保证硬件同步,产生触发
  127. *
  128. * @输入 pETM 指向三个ETM定时器其中一个的基址
  129. *@输入 u8TriggerMask 选择硬件触发资源. combine TRIG0~TREG2.(x000xxxx~x111xxxx)
  130. *
  131. * @无返回.
  132. *
  133. *********************************************************************************/
  134. void ETM_HardwareSyncCombine(ETM_Type *pETM, uint8_t u8TriggerMask)
  135. {
  136. ASSERT(ETM2 == pETM);

  137. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK;
  138. pETM->SYNC &= 0x8F;
  139. pETM->SYNC |= (u8TriggerMask & 0x70);
  140. }

  141. /*****************************************************************************//*!
  142. *
  143. * @ETM初始化函数
  144. *
  145. * @输入 pETM 指向三个ETM定时器其中一个的基址
  146. * @输入 pConfig 指向ETM的一些基本参数
  147. * @无返回值
  148. *
  149. *****************************************************************************/
  150. void ETM_Init(ETM_Type *pETM, ETM_ConfigType *pConfig)
  151. {
  152. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM));
  153. if(ETM0 == pETM)
  154. {
  155. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  156. }
  157. else
  158. {
  159. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  160. }

  161. /* diable counter */
  162. pETM->SC = 0;
  163. pETM->MODE = pConfig->mode;
  164. pETM->MOD = pConfig->modulo;
  165. pETM->CNT = pConfig->cnt;

  166. if( pETM->MODE & ETM_MODE_ETMEN_MASK )
  167. {
  168. /* when ETMEN = 1, all other registers can be written */
  169. pETM->COMBINE = pConfig->combine;
  170. pETM->CNTIN = pConfig->cntin;
  171. pETM->SYNC = pConfig->sync;
  172. pETM->OUTINIT = pConfig->outinit;
  173. pETM->OUTMASK = pConfig->outmask;
  174. pETM->DEADETME = pConfig->deadETMe;
  175. pETM->EXTTRIG = pConfig->exttrig;
  176. pETM->POL = pConfig->pol;
  177. pETM->FMS = pConfig->fms;
  178. pETM->FILTER = pConfig->filter;
  179. pETM->FLTCTRL = pConfig->fltctrl;
  180. pETM->FLTPOL = pConfig->fltpol;
  181. pETM->CONF = pConfig->conf;
  182. pETM->SYNCONF = pConfig->synconf;
  183. pETM->SWOCTRL = pConfig->swoctrl;
  184. pETM->PWMLOAD = pConfig->pwmload;
  185. }
  186. /* write SC to enable clock */
  187. pETM->SC = pConfig->sc;
  188. }

  189. /*****************************************************************************
  190. 关闭相应的ETM功能组件函数
  191. *****************************************************************************/
  192. void ETM_DeInit(ETM_Type *pETM)
  193. {
  194. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM));
  195. pETM->SC = 0;
  196. pETM->MOD = 0;
  197. pETM->CNT = 0;
  198. if(ETM2 == pETM)
  199. { pETM->MODE = 0x4;
  200. pETM->COMBINE = 0;
  201. pETM->CNTIN = 0;
  202. pETM->SYNC = 0;
  203. pETM->OUTINIT = 0;
  204. pETM->OUTMASK = 0;
  205. pETM->DEADETME = 0;
  206. pETM->EXTTRIG = 0;
  207. pETM->POL = 0;
  208. pETM->FMS = 0;
  209. pETM->FILTER = 0;
  210. pETM->FLTCTRL = 0;
  211. pETM->FLTPOL = 0;
  212. pETM->CONF = 0;
  213. pETM->SYNCONF = 0;
  214. pETM->SWOCTRL = 0;
  215. pETM->PWMLOAD = 0;
  216. }
  217. if (ETM0 == pETM)
  218. {
  219. SIM->SCGC &= ~SIM_SCGC_ETM0_MASK;
  220. NVIC_DisableIRQ(ETM0_IRQn);
  221. }
  222. else if (ETM2 == pETM)
  223. SIM->SCGC &= ~SIM_SCGC_ETM2_MASK;
  224. NVIC_DisableIRQ(ETM2_IRQn);
  225. }



  226. /*********************************************************************************//*!
  227. *
  228. * @运用ETM2来实现软件同步
  229. *
  230. * @输入 pETM 指向三个ETM定时器其中一个的基址
  231. *
  232. * @无返回
  233. *
  234. *********************************************************************************/
  235. void ETM_SoftwareSync(ETM_Type *pETM)
  236. {
  237. ASSERT(ETM2 == pETM);

  238. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK;
  239. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK;
  240. }

  241. /**********************************************************************************
  242. *
  243. * @产生ETM2硬件触发,Note: please call ETM_HardwareSyncCombine first.
  244. *
  245. * @输入 pETM 指向三个ETM定时器其中一个的基址
  246. *
  247. * @无返回
  248. *
  249. *********************************************************************************/
  250. void ETM_GenerateTrig2(ETM_Type *pETM)
  251. {
  252. ASSERT(ETM2 == pETM);

  253. if(pETM->SYNC & ETM_SYNC_TRIG2_MASK)
  254. {
  255. #if defined(CPU_NV32)
  256. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK;
  257. #endif
  258. }
  259. }


  260. /*********************************************************************************
  261. *
  262. * @选择BDM模式下的ETM行为
  263. *
  264. * @输入 pETM 指向三个ETM定时器其中一个的基址
  265. * @输入 u8DebugMode debug 的模式从00-11之间选择
  266. *
  267. * @无返回
  268. *
  269. *********************************************************************************/
  270. void ETM_SetDebugModeBehavior(ETM_Type *pETM, uint8_t u8DebugMode)
  271. {
  272. ASSERT((ETM2 == pETM));
  273. pETM->CONF &= ~ETM_CONF_BDMMODE_MASK;
  274. pETM->CONF |= ETM_CONF_BDMMODE(u8DebugMode);
  275. }

  276. /*********************************************************************************
  277. * @交换通道CH(n)和通道CH(n+1)的输出结果
  278. * @输入 pETM 其中一个ETM定时器的基址
  279. * @输入 ChannelPair 要被交换的通道数号,即n可为0,1,2,
  280. *********************************************************************************/
  281. void ETM_InvertChannel(ETM_Type *pETM, uint8_t u8ChannelPair)
  282. {
  283. ASSERT((ETM2 == pETM) && u8ChannelPair <= 2);

  284. pETM->INVCTRL |= 1<<u8ChannelPair;
  285. if(pETM->SYNCONF & ETM_SYNCONF_INVC_MASK) /* if PWM sync is needed */
  286. {
  287. pETM->SYNCONF |= ETM_SYNCONF_SYNCMODE_MASK; /* recommend enhanced sync mode */
  288. if(pETM->SYNCONF & ETM_SYNCONF_SWINVC_MASK) /* if software sync is needed*/
  289. {
  290. pETM->SYNC |= ETM_SYNC_SWSYNC_MASK; /* software sync */
  291. }
  292. else if(pETM->SYNCONF & ETM_SYNCONF_HWINVC_MASK) /* if hardware sync is needed*/
  293. {
  294. pETM->SYNC |= ETM_SYNC_TRIG2_MASK;

  295. #if defined(CPU_NV32)
  296. SIM->SOPT |= SIM_SOPT_ETMSYNC_MASK; /* hardware sync */
  297. #endif
  298. }
  299. }
  300. else
  301. {
  302. }
  303. }


  304. /*****************************************************************************//*!
  305. *
  306. * @本函数用来配置ETM通道, 包括通道状态及控制寄存器CnSC和通道计数值寄存器CnV
  307. * @输入 pETM 指向三个ETM定时器其中一个的基址
  308. * @输入 ETM_Channel ETM的通道号
  309. * @输入 pTETMCH_Params 指向ETM通道一般参数的指针
  310. *
  311. * @无返回值
  312. *
  313. *****************************************************************************/
  314. void ETM_ChannelInit(ETM_Type *pETM, uint8_t u8ETM_Channel, ETM_ChParamsType *pTETMCH_Params)
  315. {
  316. ASSERT((ETM0 == pETM) || (ETM1 == pETM) || (ETM2 == pETM)); //断言检测定时器号是否正确

  317. if (ETM0 == pETM)
  318. {
  319. ASSERT(u8ETM_Channel < 2);
  320. SIM->SCGC |= SIM_SCGC_ETM0_MASK;
  321. }
  322. else
  323. {
  324. ASSERT(u8ETM_Channel < 6);
  325. SIM->SCGC |= SIM_SCGC_ETM2_MASK;
  326. }

  327. pETM->CONTROLS[u8ETM_Channel].CnSC = pTETMCH_Params->u8CnSC;
  328. pETM->CONTROLS[u8ETM_Channel].CnV = pTETMCH_Params->u16CnV;

  329. return;
  330. }



  331. /*****************************************************************************//*!
  332. *
  333. * @brief This function sets the callback function.
  334. *
  335. * @param[in] pETM pointer to one of three ETM base register address.
  336. * @param[in] pfnCallback functon address.
  337. *
  338. * @return none.
  339. *
  340. * @ Pass/ Fail criteria: none
  341. *
  342. *****************************************************************************/
  343. void ETM_SetCallback(ETM_Type *pETM, ETM_CallbackPtr pfnCallback)
  344. {
  345. ETM_Callback[((uint32_t)pETM - (uint32_t)ETM0_BASE)>>12] = pfnCallback;
  346. }

  347. /*! @} End of ETM_api_list */


  348. /*****************************************************************************//*!
  349. *
  350. * @brief ETM0_Isr interrupt service routine.
  351. *
  352. * @param none.
  353. *
  354. * @return none.
  355. *
  356. * @ Pass/ Fail criteria: none.
  357. *
  358. *****************************************************************************/
  359. void ETM0_Isr(void)
  360. {
  361. if(ETM_Callback[0])
  362. {
  363. ETM_Callback[0]();
  364. }
  365. }

  366. /*****************************************************************************//*!
  367. *
  368. * @brief ETM1_Isr interrupt service routine.
  369. *
  370. * @param none.
  371. *
  372. * @return none.
  373. *
  374. * @ Pass/ Fail criteria: none.
  375. *
  376. *****************************************************************************/
  377. void ETM1_Isr(void)
  378. {
  379. if(ETM_Callback[1])
  380. {
  381. ETM_Callback[1]();
  382. }
  383. }

  384. /*****************************************************************************//*!
  385. *
  386. * @brief ETM2_Isr interrupt service routine.
  387. *
  388. * @param none.
  389. *
  390. * @return none.
  391. *
  392. * @ Pass/ Fail criteria: none.
  393. *
  394. *****************************************************************************/
  395. void ETM2_Isr(void)
  396. {
  397. if(ETM_Callback[2])
  398. {
  399. ETM_Callback[2]();
  400. }
  401. }
复制代码
没有六一了 发表于 2017-11-27 21:53 | 显示全部楼层
好长的程序,没有太看明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

113

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部