HAL_TIMER.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520
  1. /***********************************************************************
  2. * Filename : hal_lpuart.c
  3. * Description : lpuart driver source file
  4. * Author(s) : xwl
  5. * version : V1.0
  6. * Modify date : 2019-11-19
  7. ***********************************************************************/
  8. #include "ACM32Fxx_HAL.h"
  9. static void TIMER_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler,
  10. uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter);
  11. static void TIMER_TI1FP1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);
  12. static void TIMER_TI2FP2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);
  13. static void TIMER_IC1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter);
  14. static void TIMER_IC2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter);
  15. static void TIMER_IC3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter);
  16. static void TIMER_IC4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter);
  17. /*********************************************************************************
  18. * Function : HAL_TIMER_MSP_Init
  19. * Description : MSP init, mainly about clock, nvic
  20. * Input : timer handler
  21. * Output : 0: success; else:error
  22. * Author : xwl
  23. **********************************************************************************/
  24. __weak uint32_t HAL_TIMER_MSP_Init(TIM_HandleTypeDef * htim)
  25. {
  26. uint32_t Timer_Instance;
  27. if (0 == IS_TIMER_INSTANCE(htim->Instance))
  28. {
  29. return HAL_ERROR; //instance error
  30. }
  31. Timer_Instance = (uint32_t)(htim->Instance);
  32. switch(Timer_Instance)
  33. {
  34. case TIM1_BASE:
  35. System_Module_Reset(RST_TIM1);
  36. System_Module_Enable(EN_TIM1);
  37. NVIC_ClearPendingIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
  38. NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
  39. break;
  40. case TIM3_BASE:
  41. System_Module_Reset(RST_TIM3);
  42. System_Module_Enable(EN_TIM3);
  43. NVIC_ClearPendingIRQ(TIM3_IRQn);
  44. NVIC_EnableIRQ(TIM3_IRQn);
  45. break;
  46. case TIM6_BASE:
  47. System_Module_Reset(RST_TIM6);
  48. System_Module_Enable(EN_TIM6);
  49. NVIC_ClearPendingIRQ(TIM6_IRQn);
  50. NVIC_EnableIRQ(TIM6_IRQn);
  51. break;
  52. case TIM14_BASE:
  53. System_Module_Reset(RST_TIM14);
  54. System_Module_Enable(EN_TIM14);
  55. NVIC_ClearPendingIRQ(TIM14_IRQn);
  56. NVIC_EnableIRQ(TIM14_IRQn);
  57. break;
  58. case TIM15_BASE:
  59. System_Module_Reset(RST_TIM15);
  60. System_Module_Enable(EN_TIM15);
  61. NVIC_ClearPendingIRQ(TIM15_IRQn);
  62. NVIC_EnableIRQ(TIM15_IRQn);
  63. break;
  64. case TIM16_BASE:
  65. System_Module_Reset(RST_TIM16);
  66. System_Module_Enable(EN_TIM16);
  67. NVIC_ClearPendingIRQ(TIM16_IRQn);
  68. NVIC_EnableIRQ(TIM16_IRQn);
  69. break;
  70. case TIM17_BASE:
  71. System_Module_Reset(RST_TIM17);
  72. System_Module_Enable(EN_TIM17);
  73. NVIC_ClearPendingIRQ(TIM17_IRQn);
  74. NVIC_EnableIRQ(TIM17_IRQn);
  75. break;
  76. default:
  77. return HAL_ERROR;
  78. }
  79. return HAL_OK;
  80. }
  81. __weak uint32_t HAL_TIMER_Base_MspDeInit(TIM_HandleTypeDef * htim)
  82. {
  83. uint32_t Timer_Instance;
  84. if (0 == IS_TIMER_INSTANCE(htim->Instance))
  85. {
  86. return HAL_ERROR; //instance error
  87. }
  88. Timer_Instance = (uint32_t)(htim->Instance);
  89. switch(Timer_Instance)
  90. {
  91. case TIM1_BASE:
  92. System_Module_Disable(EN_TIM1);
  93. NVIC_ClearPendingIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
  94. NVIC_DisableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
  95. break;
  96. case TIM3_BASE:
  97. System_Module_Disable(EN_TIM3);
  98. NVIC_ClearPendingIRQ(TIM3_IRQn);
  99. NVIC_DisableIRQ(TIM3_IRQn);
  100. break;
  101. case TIM6_BASE:
  102. System_Module_Disable(EN_TIM6);
  103. NVIC_ClearPendingIRQ(TIM6_IRQn);
  104. NVIC_DisableIRQ(TIM6_IRQn);
  105. break;
  106. case TIM14_BASE:
  107. System_Module_Disable(EN_TIM14);
  108. NVIC_ClearPendingIRQ(TIM14_IRQn);
  109. NVIC_DisableIRQ(TIM14_IRQn);
  110. break;
  111. case TIM15_BASE:
  112. System_Module_Disable(EN_TIM15);
  113. NVIC_ClearPendingIRQ(TIM15_IRQn);
  114. NVIC_DisableIRQ(TIM15_IRQn);
  115. break;
  116. case TIM16_BASE:
  117. System_Module_Disable(EN_TIM16);
  118. NVIC_ClearPendingIRQ(TIM16_IRQn);
  119. NVIC_DisableIRQ(TIM16_IRQn);
  120. break;
  121. case TIM17_BASE:
  122. System_Module_Disable(EN_TIM17);
  123. NVIC_ClearPendingIRQ(TIM17_IRQn);
  124. NVIC_DisableIRQ(TIM17_IRQn);
  125. break;
  126. default:
  127. return HAL_ERROR;
  128. }
  129. return HAL_OK;
  130. }
  131. /*********************************************************************************
  132. * Function : HAL_TIMER_Slave_Mode_Config
  133. * Description : configure timer in slave mode
  134. * Input :
  135. htim: timer handler
  136. sSlaveConfig: slave mode parameter strcture
  137. SlaveMode: TIM_SLAVE_MODE_DIS, TIM_SLAVE_MODE_ENC1...
  138. InputTrigger: TIM_TRIGGER_SOURCE_ITR0, TIM_TRIGGER_SOURCE_ITR1...
  139. TriggerPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  140. TriggerPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2...
  141. * Output : 0: success; else:error
  142. * Author : xwl
  143. **********************************************************************************/
  144. uint32_t HAL_TIMER_Slave_Mode_Config(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig)
  145. {
  146. if (0 == IS_TIM_SLAVE_INSTANCE(htim->Instance) )
  147. {
  148. return 1; // not supported
  149. }
  150. /*reset SMS and TS bits*/
  151. htim->Instance->SMCR &= (~(BIT0|BIT1|BIT2|BIT4|BIT5|BIT6));
  152. /*SET SMS bits*/
  153. htim->Instance->SMCR |= (sSlaveConfig->SlaveMode & (BIT0|BIT1|BIT2) );
  154. /*SET TS bits*/
  155. htim->Instance->SMCR |= (sSlaveConfig->InputTrigger & (BIT4|BIT5|BIT6) );
  156. switch (sSlaveConfig->InputTrigger)
  157. {
  158. case TIM_TRIGGER_SOURCE_TI1FP1:
  159. TIMER_TI1FP1_ConfigInputStage(htim->Instance, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter);
  160. break;
  161. case TIM_TRIGGER_SOURCE_TI2FP2:
  162. TIMER_TI2FP2_ConfigInputStage(htim->Instance, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter);
  163. break;
  164. case TIM_TRIGGER_SOURCE_ETRF:
  165. TIMER_ETR_SetConfig(htim->Instance, sSlaveConfig->TriggerPrescaler, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter);
  166. break;
  167. case TIM_TRIGGER_SOURCE_ITR0:
  168. case TIM_TRIGGER_SOURCE_ITR1:
  169. case TIM_TRIGGER_SOURCE_ITR2:
  170. case TIM_TRIGGER_SOURCE_ITR3:
  171. // don't need do anything here
  172. break;
  173. default:
  174. return 1;
  175. }
  176. return 0;
  177. }
  178. /*********************************************************************************
  179. * Function : HAL_TIMER_Master_Mode_Config
  180. * Description : configure timer in master mode
  181. * Input :
  182. TIMx: timer instance
  183. sMasterConfig: master mode parameter structure
  184. MasterSlaveMode: TIM_TRGO_RESET, TIM_TRGO_ENABLE...
  185. MasterOutputTrigger: TIM_MASTERSLAVEMODE_DISABLE, TIM_MASTERSLAVEMODE_ENABLE
  186. * Output : 0: success; else:error
  187. * Author : xwl
  188. **********************************************************************************/
  189. uint32_t HAL_TIMER_Master_Mode_Config(TIM_TypeDef *TIMx, TIM_MasterConfigTypeDef * sMasterConfig)
  190. {
  191. /*reset bits*/
  192. TIMx->SMCR &= (~BIT7);
  193. TIMx->CR2 &= (~(BIT4|BIT5|BIT6));
  194. TIMx->SMCR |= sMasterConfig->MasterSlaveMode;
  195. TIMx->CR2 |= sMasterConfig->MasterOutputTrigger;
  196. return 0;
  197. }
  198. /*********************************************************************************
  199. * Function : HAL_TIMER_Output_Config
  200. * Description : configure output parameter
  201. * Input :
  202. TIMx: timer instance
  203. Output_Config: output configration parameter structure
  204. OCMode: OUTPUT_MODE_FROZEN, OUTPUT_MODE_MATCH_HIGH...
  205. Pulse: write to ccrx register
  206. OCPolarity: OC channel output polarity: OUTPUT_POL_ACTIVE_HIGH, OUTPUT_POL_ACTIVE_LOW
  207. OCNPolarity: OCN channel output polarity: OUTPUT_POL_ACTIVE_HIGH, OUTPUT_POL_ACTIVE_LOW
  208. OCFastMode: OUTPUT_FAST_MODE_DISABLE, OUTPUT_FAST_MODE_ENABLE
  209. OCIdleState: OC channel idle state, OUTPUT_IDLE_STATE_0, OUTPUT_IDLE_STATE_1
  210. OCNIdleState: OCN channel idle state, OUTPUT_IDLE_STATE_0, OUTPUT_IDLE_STATE_1
  211. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  212. * Output : 0: success; else:error
  213. * Author : xwl
  214. **********************************************************************************/
  215. uint32_t HAL_TIMER_Output_Config(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef * Output_Config, uint32_t Channel)
  216. {
  217. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  218. {
  219. return 1; // error parameter
  220. }
  221. switch(Channel)
  222. {
  223. case TIM_CHANNEL_1:
  224. TIMx->CCER &= (~BIT0); //disable OC1
  225. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity)
  226. {
  227. TIMx->CCER &= (~BIT1);
  228. }
  229. else
  230. {
  231. TIMx->CCER |= (BIT1);
  232. }
  233. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  234. {
  235. TIMx->CCER &= (~BIT2); //disable OC1N
  236. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity)
  237. {
  238. TIMx->CCER &= (~BIT3);
  239. }
  240. else
  241. {
  242. TIMx->CCER |= (BIT3);
  243. }
  244. }
  245. TIMx->CCMR1 &= (~0x00FFU); // reset low 8 bits
  246. TIMx->CCR1 = Output_Config->Pulse;
  247. if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode)
  248. {
  249. TIMx->CCMR1 |= (BIT2);
  250. }
  251. TIMx->CCMR1 |= (BIT3); // preload enable
  252. if (IS_TIM_BREAK_INSTANCE(TIMx))
  253. {
  254. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState)
  255. {
  256. TIMx->CR2 &= (~BIT8);
  257. }
  258. else
  259. {
  260. TIMx->CR2 |= BIT8;
  261. }
  262. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState)
  263. {
  264. TIMx->CR2 &= (~BIT9);
  265. }
  266. else
  267. {
  268. TIMx->CR2 |= BIT9;
  269. }
  270. }
  271. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT4|BIT5|BIT6))) | (Output_Config->OCMode << 4);
  272. break;
  273. case TIM_CHANNEL_2:
  274. TIMx->CCER &= (~BIT4); //disable OC2
  275. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity)
  276. {
  277. TIMx->CCER &= (~BIT5);
  278. }
  279. else
  280. {
  281. TIMx->CCER |= (BIT5);
  282. }
  283. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  284. {
  285. TIMx->CCER &= (~BIT6); //disable OC2N
  286. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity)
  287. {
  288. TIMx->CCER &= (~BIT7);
  289. }
  290. else
  291. {
  292. TIMx->CCER |= (BIT7);
  293. }
  294. }
  295. TIMx->CCMR1 &= (~0xFF00U); // reset high 8 bits
  296. TIMx->CCR2 = Output_Config->Pulse; // write value to ccr before preload enable
  297. if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode)
  298. {
  299. TIMx->CCMR1 |= (BIT10);
  300. }
  301. TIMx->CCMR1 |= (BIT11); // preload enable
  302. if (IS_TIM_BREAK_INSTANCE(TIMx))
  303. {
  304. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState)
  305. {
  306. TIMx->CR2 &= (~BIT10);
  307. }
  308. else
  309. {
  310. TIMx->CR2 |= BIT10;
  311. }
  312. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState)
  313. {
  314. TIMx->CR2 &= (~BIT11);
  315. }
  316. else
  317. {
  318. TIMx->CR2 |= BIT11;
  319. }
  320. }
  321. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT12|BIT13|BIT14))) | (Output_Config->OCMode << 12);
  322. break;
  323. case TIM_CHANNEL_3:
  324. TIMx->CCER &= (~BIT8); //disable OC3
  325. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity)
  326. {
  327. TIMx->CCER &= (~BIT9);
  328. }
  329. else
  330. {
  331. TIMx->CCER |= (BIT9);
  332. }
  333. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  334. {
  335. TIMx->CCER &= (~BIT10); //disable OC3N
  336. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity)
  337. {
  338. TIMx->CCER &= (~BIT11);
  339. }
  340. else
  341. {
  342. TIMx->CCER |= (BIT11);
  343. }
  344. }
  345. TIMx->CCMR2 &= (~0x00FF); // reset low 8 bits
  346. TIMx->CCMR2 |= (BIT3); // preload enable
  347. if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode)
  348. {
  349. TIMx->CCMR2 |= (BIT2);
  350. }
  351. TIMx->CCR3 = Output_Config->Pulse;
  352. if (IS_TIM_BREAK_INSTANCE(TIMx))
  353. {
  354. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState)
  355. {
  356. TIMx->CR2 &= (~BIT12);
  357. }
  358. else
  359. {
  360. TIMx->CR2 |= BIT12;
  361. }
  362. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState)
  363. {
  364. TIMx->CR2 &= (~BIT13);
  365. }
  366. else
  367. {
  368. TIMx->CR2 |= BIT13;
  369. }
  370. }
  371. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT4|BIT5|BIT6))) | (Output_Config->OCMode << 4);
  372. break;
  373. case TIM_CHANNEL_4:
  374. TIMx->CCER &= (~BIT12); //disable OC4
  375. if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity)
  376. {
  377. TIMx->CCER &= (~BIT13);
  378. }
  379. else
  380. {
  381. TIMx->CCER |= (BIT13);
  382. }
  383. TIMx->CCMR2 &= (~0xFF00); // reset high 8 bits
  384. TIMx->CCR4 = Output_Config->Pulse;
  385. if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode)
  386. {
  387. TIMx->CCMR2 |= (BIT10); // fast mode
  388. }
  389. TIMx->CCMR2 |= (BIT11); // preload enable
  390. if (IS_TIM_BREAK_INSTANCE(TIMx))
  391. {
  392. if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState)
  393. {
  394. TIMx->CR2 &= (~BIT14);
  395. }
  396. else
  397. {
  398. TIMx->CR2 |= BIT14;
  399. }
  400. }
  401. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT12|BIT13|BIT14))) | (Output_Config->OCMode << 12);
  402. break;
  403. default:
  404. return 1; // error parameter
  405. }
  406. return 0;
  407. }
  408. /*********************************************************************************
  409. * Function : HAL_TIMER_Capture_Config
  410. * Description : configure capture parameters
  411. * Input :
  412. TIMx: timer instance
  413. Capture_Config: capture configuration parameter strcture
  414. ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  415. ICSelection: TIM_ICSELECTION_DIRECTTI, TIM_ICSELECTION_INDIRECTTI
  416. ICFilter: TIM_IC1_FILTER_LVL(x), TIM_IC2_FILTER_LVL(x), x:0-15
  417. ICPrescaler: TIM_IC1_PRESCALER_1, TIM_IC2_PRESCALER_1...
  418. Channel: channel id, TIM_CHANNEL_1, TIM_CHANNEL_2...
  419. * Output : 0: success; else:error
  420. * Author : xwl
  421. **********************************************************************************/
  422. uint32_t HAL_TIMER_Capture_Config(TIM_TypeDef *TIMx, TIM_IC_InitTypeDef * Capture_Config, uint32_t Channel)
  423. {
  424. switch(Channel)
  425. {
  426. case TIM_CHANNEL_1:
  427. TIMER_IC1_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter);
  428. /* Reset the IC1PSC Bits */
  429. TIMx->CCMR1 &= (~BIT2|BIT3);
  430. /* Set the IC1PSC value */
  431. TIMx->CCMR1 |= Capture_Config->ICPrescaler;
  432. break;
  433. case TIM_CHANNEL_2:
  434. TIMER_IC2_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter);
  435. /* Reset the IC2PSC Bits */
  436. TIMx->CCMR1 &= (~BIT10|BIT11);
  437. /* Set the IC2PSC value */
  438. TIMx->CCMR1 |= Capture_Config->ICPrescaler;
  439. break;
  440. case TIM_CHANNEL_3:
  441. TIMER_IC3_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter);
  442. /* Reset the IC3PSC Bits */
  443. TIMx->CCMR2 &= (~BIT2|BIT3);
  444. /* Set the IC3PSC value */
  445. TIMx->CCMR2 |= Capture_Config->ICPrescaler;
  446. break;
  447. case TIM_CHANNEL_4:
  448. TIMER_IC4_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter);
  449. /* Reset the IC4PSC Bits */
  450. TIMx->CCMR2 &= (~BIT10|BIT11);
  451. /* Set the IC4PSC value */
  452. TIMx->CCMR2 |= Capture_Config->ICPrescaler;
  453. break;
  454. default:
  455. return 1;
  456. }
  457. return 0;
  458. }
  459. /*********************************************************************************
  460. * Function : HAL_TIMER_SelectClockSource
  461. * Description : select timer counter source, internal or external
  462. * Input:
  463. htim : timer handler
  464. sClockSourceConfig: configuration parameters, includes following members:
  465. ClockSource: TIM_CLOCKSOURCE_INT, TIM_CLOCKSOURCE_ETR...
  466. ClockPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  467. ClockPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2...
  468. ClockFilter: TIM_ETR_FILTER_LVL(x), TIM_IC1_FILTER_LVL(x), TIM_IC2_FILTER_LVL(x)
  469. * Output : HAL_ERROR:error, HAL_OK:OK
  470. * Author : xwl
  471. **********************************************************************************/
  472. HAL_StatusTypeDef HAL_TIMER_SelectClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef * sClockSourceConfig)
  473. {
  474. htim->Instance->SMCR &= (~(BIT0|BIT1|BIT2));
  475. switch (sClockSourceConfig->ClockSource)
  476. {
  477. case TIM_CLOCKSOURCE_INT:
  478. {
  479. // do nothing here
  480. break;
  481. }
  482. case TIM_CLOCKSOURCE_ETR:
  483. {
  484. /* Configure the ETR Clock source */
  485. TIMER_ETR_SetConfig(htim->Instance,
  486. sClockSourceConfig->ClockPrescaler,
  487. sClockSourceConfig->ClockPolarity,
  488. sClockSourceConfig->ClockFilter);
  489. /* Enable the External clock mode2 */
  490. htim->Instance->SMCR |= BIT14; // ECE=1,external clock mode 2
  491. break;
  492. }
  493. case TIM_CLOCKSOURCE_TI1FP1:
  494. {
  495. TIMER_TI1FP1_ConfigInputStage(htim->Instance,
  496. sClockSourceConfig->ClockPolarity,
  497. sClockSourceConfig->ClockFilter);
  498. htim->Instance->SMCR &= (~(BIT4|BIT5|BIT6)); // trigger selection
  499. htim->Instance->SMCR |= (5 << 4); // Trigger select TI1FP1
  500. htim->Instance->SMCR |= (BIT0|BIT1|BIT2); // select external clock mode 1
  501. break;
  502. }
  503. case TIM_CLOCKSOURCE_TI2FP2:
  504. {
  505. TIMER_TI2FP2_ConfigInputStage(htim->Instance,
  506. sClockSourceConfig->ClockPolarity,
  507. sClockSourceConfig->ClockFilter);
  508. htim->Instance->SMCR &= (~(BIT4|BIT5|BIT6)); // trigger selection
  509. htim->Instance->SMCR |= (6 << 4); // Trigger select TI2FP2
  510. htim->Instance->SMCR |= (BIT0|BIT1|BIT2); // select external clock mode 1
  511. break;
  512. }
  513. case TIM_CLOCKSOURCE_ITR0:
  514. case TIM_CLOCKSOURCE_ITR1:
  515. case TIM_CLOCKSOURCE_ITR2:
  516. case TIM_CLOCKSOURCE_ITR3:
  517. {
  518. htim->Instance->SMCR &= (~(BIT4|BIT5|BIT6));
  519. htim->Instance->SMCR |= ( (sClockSourceConfig->ClockSource - TIM_CLOCKSOURCE_ITR0) << 4);
  520. htim->Instance->SMCR |= (BIT0|BIT1|BIT2); // select external clock mode 1
  521. break;
  522. }
  523. default:
  524. return HAL_ERROR;
  525. }
  526. return HAL_OK;
  527. }
  528. /*********************************************************************************
  529. * Function : HAL_TIMER_Base_Init
  530. * Description : timer base initiation
  531. * Input : timer handler
  532. * Output : 0: success; else:error
  533. * Author : xwl
  534. **********************************************************************************/
  535. uint32_t HAL_TIMER_Base_Init(TIM_HandleTypeDef * htim)
  536. {
  537. if (0 == IS_TIMER_INSTANCE(htim->Instance))
  538. {
  539. return 1; //instance error
  540. }
  541. htim->Instance->CR1 = BIT2; // CEN=0, URS=1, OPM = 0
  542. if (htim->Init.ARRPreLoadEn)
  543. {
  544. htim->Instance->CR1 |= (BIT7);
  545. }
  546. else
  547. {
  548. htim->Instance->CR1 &= (~BIT7);
  549. }
  550. htim->Instance->ARR = htim->Init.Period;
  551. htim->Instance->PSC = htim->Init.Prescaler;
  552. if (IS_TIM_REPETITION_COUNTER_INSTANCE(htim->Instance))
  553. {
  554. htim->Instance->RCR = htim->Init.RepetitionCounter;
  555. }
  556. htim->Instance->EGR = BIT0; // no UIF generated because URS=1
  557. if (IS_TIM_CLOCK_DIVISION_INSTANCE(htim->Instance))
  558. {
  559. htim->Instance->CR1 = (htim->Instance->CR1 & (~(BIT8|BIT9))) | ((htim->Init.ClockDivision) & (BIT8|BIT9));
  560. }
  561. //up/down/center mode
  562. htim->Instance->CR1 = (htim->Instance->CR1 & (~(BIT4|BIT5|BIT6))) | ((htim->Init.CounterMode) & (BIT4|BIT5|BIT6));
  563. htim->Instance->CR1 &= (~BIT2); //URS = 0
  564. return 0;
  565. }
  566. /*********************************************************************************
  567. * Function : HAL_TIMER_Base_DeInit
  568. * Description : timer base deinitiation, disable Timer, turn off module clock and nvic
  569. * Input : timer handler
  570. * Output : HAL_OK: success; HAL_ERROR:error
  571. * Author : xwl
  572. **********************************************************************************/
  573. HAL_StatusTypeDef HAL_TIMER_Base_DeInit(TIM_HandleTypeDef *htim)
  574. {
  575. htim->Instance->CR1 &= (~BIT0);
  576. HAL_TIMER_Base_MspDeInit(htim);
  577. return HAL_OK;
  578. }
  579. /*********************************************************************************
  580. * Function : HAL_TIMER_Base_Start
  581. * Description : start timer
  582. * Input : timer instance
  583. * Output : none
  584. * Author : xwl
  585. **********************************************************************************/
  586. void HAL_TIMER_Base_Start(TIM_TypeDef *TIMx)
  587. {
  588. if (0 == IS_TIM_SLAVE_INSTANCE(TIMx) )
  589. {
  590. TIMx->CR1 |= BIT0;
  591. return;
  592. }
  593. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  594. {
  595. TIMx->CR1 |= BIT0;
  596. return;
  597. }
  598. return;
  599. }
  600. /*********************************************************************************
  601. * Function : HAL_TIMER_Base_Stop
  602. * Description : stop timer
  603. * Input : timer handler
  604. * Output : none
  605. * Author : xwl
  606. **********************************************************************************/
  607. HAL_StatusTypeDef HAL_TIMER_Base_Stop(TIM_TypeDef *TIMx)
  608. {
  609. TIMx->CR1 &= (~BIT0);
  610. HAL_TIM_DISABLE_IT_EX(TIMx, TIM_IT_UPDATE);
  611. return HAL_OK;
  612. }
  613. /*********************************************************************************
  614. * Function : HAL_TIMER_OnePulse_Init
  615. * Description : start timer with one pulse mode
  616. * Input :
  617. htim: timer handler
  618. mode: 0 means normal mode, 1 means one pulse mode
  619. * Output : HAL_OK, success; HAL_ERROR, fail
  620. * Author : xwl
  621. **********************************************************************************/
  622. HAL_StatusTypeDef HAL_TIMER_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t mode)
  623. {
  624. /* Check the TIM handle allocation */
  625. if(htim == NULL)
  626. {
  627. return HAL_ERROR;
  628. }
  629. HAL_TIMER_Base_Init(htim);
  630. /*reset the OPM Bit */
  631. htim->Instance->CR1 &= (~BIT3);
  632. if (0 != mode)
  633. {
  634. /*set the OPM Bit */
  635. htim->Instance->CR1 |= BIT3;
  636. }
  637. return HAL_OK;
  638. }
  639. /*********************************************************************************
  640. * Function : HAL_TIM_PWM_Output_Start
  641. * Description : start timer output
  642. * Input :
  643. TIMx: timer instance
  644. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  645. * Output : : 0: success; else:error
  646. * Author : xwl
  647. **********************************************************************************/
  648. uint32_t HAL_TIM_PWM_Output_Start(TIM_TypeDef *TIMx, uint32_t Channel)
  649. {
  650. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  651. {
  652. return 1; // error parameter
  653. }
  654. switch(Channel)
  655. {
  656. case TIM_CHANNEL_1:
  657. TIMx->CCER |= BIT0;
  658. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  659. {
  660. TIMx->CCER |= BIT2;
  661. }
  662. break;
  663. case TIM_CHANNEL_2:
  664. TIMx->CCER |= BIT4;
  665. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  666. {
  667. TIMx->CCER |= BIT6;
  668. }
  669. break;
  670. case TIM_CHANNEL_3:
  671. TIMx->CCER |= BIT8;
  672. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  673. {
  674. TIMx->CCER |= BIT10;
  675. }
  676. break;
  677. case TIM_CHANNEL_4:
  678. TIMx->CCER |= BIT12;
  679. break;
  680. default:
  681. return 1;
  682. }
  683. if(IS_TIM_BREAK_INSTANCE(TIMx) != 0)
  684. {
  685. /* Enable the main output */
  686. TIMx->BDTR |= BIT15;
  687. }
  688. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  689. {
  690. TIMx->CR1 |= BIT0;
  691. }
  692. return 0;
  693. }
  694. /*********************************************************************************
  695. * Function : HAL_TIM_PWM_Output_Stop
  696. * Description : stop timer pwm output
  697. * Input :
  698. TIMx: timer instance
  699. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  700. * Output : : 0: success; else:error
  701. * Author : xwl
  702. **********************************************************************************/
  703. HAL_StatusTypeDef HAL_TIM_PWM_Output_Stop(TIM_TypeDef *TIMx, uint32_t Channel)
  704. {
  705. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  706. {
  707. return HAL_ERROR; // error parameter
  708. }
  709. switch(Channel)
  710. {
  711. case TIM_CHANNEL_1:
  712. TIMx->CCER &= (~(BIT0 | BIT2));
  713. break;
  714. case TIM_CHANNEL_2:
  715. TIMx->CCER &= (~(BIT4 | BIT6));
  716. break;
  717. case TIM_CHANNEL_3:
  718. TIMx->CCER &= (~(BIT8 | BIT10));
  719. break;
  720. case TIM_CHANNEL_4:
  721. TIMx->CCER &= (~(BIT12));
  722. break;
  723. default:
  724. return HAL_ERROR;
  725. }
  726. if(IS_TIM_BREAK_INSTANCE(TIMx) != 0)
  727. {
  728. /* Enable the main output */
  729. TIMx->BDTR &= (~BIT15);
  730. }
  731. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  732. {
  733. TIMx->CR1 &= (~BIT0);
  734. }
  735. /* Return function status */
  736. return HAL_OK;
  737. }
  738. /*********************************************************************************
  739. * Function : HAL_TIMER_OC_Start
  740. * Description : start timer output
  741. * Input :
  742. TIMx: timer instance
  743. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  744. * Output : : 0: success; else:error
  745. * Author : xwl
  746. **********************************************************************************/
  747. uint32_t HAL_TIMER_OC_Start(TIM_TypeDef *TIMx, uint32_t Channel)
  748. {
  749. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  750. {
  751. return 1; // error parameter
  752. }
  753. switch(Channel)
  754. {
  755. case TIM_CHANNEL_1:
  756. TIMx->CCER |= BIT0;
  757. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  758. {
  759. TIMx->CCER |= BIT2;
  760. }
  761. break;
  762. case TIM_CHANNEL_2:
  763. TIMx->CCER |= BIT4;
  764. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  765. {
  766. TIMx->CCER |= BIT6;
  767. }
  768. break;
  769. case TIM_CHANNEL_3:
  770. TIMx->CCER |= BIT8;
  771. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  772. {
  773. TIMx->CCER |= BIT10;
  774. }
  775. break;
  776. case TIM_CHANNEL_4:
  777. TIMx->CCER |= BIT12;
  778. break;
  779. default:
  780. return 1;
  781. }
  782. if(IS_TIM_BREAK_INSTANCE(TIMx) != 0)
  783. {
  784. /* Enable the main output */
  785. TIMx->BDTR |= BIT15;
  786. }
  787. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  788. {
  789. TIMx->CR1 |= BIT0;
  790. }
  791. return 0;
  792. }
  793. /*********************************************************************************
  794. * Function : HAL_TIMER_OCxN_Start
  795. * Description : start timer OCxN output
  796. * Input :
  797. TIMx: timer instance
  798. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  799. * Output : : 0: success; else:error
  800. * Author : xwl
  801. **********************************************************************************/
  802. uint32_t HAL_TIMER_OCxN_Start(TIM_TypeDef *TIMx, uint32_t Channel)
  803. {
  804. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  805. {
  806. return 1; // error parameter
  807. }
  808. switch(Channel)
  809. {
  810. case TIM_CHANNEL_1:
  811. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  812. {
  813. TIMx->CCER |= BIT2;
  814. }
  815. break;
  816. case TIM_CHANNEL_2:
  817. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  818. {
  819. TIMx->CCER |= BIT6;
  820. }
  821. break;
  822. case TIM_CHANNEL_3:
  823. if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) )
  824. {
  825. TIMx->CCER |= BIT10;
  826. }
  827. break;
  828. case TIM_CHANNEL_4:
  829. TIMx->CCER |= BIT12;
  830. break;
  831. default:
  832. return 1;
  833. }
  834. if(IS_TIM_BREAK_INSTANCE(TIMx) != 0)
  835. {
  836. /* Enable the main output */
  837. TIMx->BDTR |= BIT15;
  838. }
  839. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  840. {
  841. TIMx->CR1 |= BIT0;
  842. }
  843. return 0;
  844. }
  845. /*********************************************************************************
  846. * Function : HAL_TIMER_OC_Stop
  847. * Description : stop timer output
  848. * Input :
  849. TIMx: timer instance
  850. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  851. * Output : : 0: success; else:error
  852. * Author : xwl
  853. **********************************************************************************/
  854. HAL_StatusTypeDef HAL_TIMER_OC_Stop(TIM_TypeDef *TIMx, uint32_t Channel)
  855. {
  856. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  857. {
  858. return HAL_ERROR; // error parameter
  859. }
  860. switch(Channel)
  861. {
  862. case TIM_CHANNEL_1:
  863. TIMx->CCER &= (~(BIT0 | BIT2));
  864. break;
  865. case TIM_CHANNEL_2:
  866. TIMx->CCER &= (~(BIT4 | BIT6));
  867. break;
  868. case TIM_CHANNEL_3:
  869. TIMx->CCER &= (~(BIT8 | BIT10));
  870. break;
  871. case TIM_CHANNEL_4:
  872. TIMx->CCER &= (~(BIT12));
  873. break;
  874. default:
  875. return HAL_ERROR;
  876. }
  877. if(IS_TIM_BREAK_INSTANCE(TIMx) != 0)
  878. {
  879. /* Enable the main output */
  880. TIMx->BDTR &= (~BIT15);
  881. }
  882. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  883. {
  884. TIMx->CR1 &= (~BIT0);
  885. }
  886. /* Return function status */
  887. return HAL_OK;
  888. }
  889. /*********************************************************************************
  890. * Function : HAL_TIM_Capture_Start
  891. * Description : start timer capture
  892. * Input :
  893. TIMx: timer instance
  894. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  895. * Output : : 0: success; else:error
  896. * Author : xwl
  897. **********************************************************************************/
  898. uint32_t HAL_TIM_Capture_Start(TIM_TypeDef *TIMx, uint32_t Channel)
  899. {
  900. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  901. {
  902. return 1; // error parameter
  903. }
  904. switch(Channel)
  905. {
  906. case TIM_CHANNEL_1:
  907. TIMx->CCER |= BIT0;
  908. break;
  909. case TIM_CHANNEL_2:
  910. TIMx->CCER |= BIT4;
  911. break;
  912. case TIM_CHANNEL_3:
  913. TIMx->CCER |= BIT8;
  914. break;
  915. case TIM_CHANNEL_4:
  916. TIMx->CCER |= BIT12;
  917. break;
  918. default:
  919. return 1;
  920. }
  921. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  922. {
  923. TIMx->CR1 |= BIT0;
  924. }
  925. return 0;
  926. }
  927. /*********************************************************************************
  928. * Function : HAL_TIM_Capture_Stop
  929. * Description : stop timer capture
  930. * Input :
  931. TIMx: timer instance
  932. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  933. * Output : : 0: success; else:error
  934. * Author : xwl
  935. **********************************************************************************/
  936. uint32_t HAL_TIM_Capture_Stop(TIM_TypeDef *TIMx, uint32_t Channel)
  937. {
  938. if (0 == IS_TIM_CCX_INSTANCE(TIMx, Channel) )
  939. {
  940. return 1; // error parameter
  941. }
  942. switch(Channel)
  943. {
  944. case TIM_CHANNEL_1:
  945. TIMx->CCER &= (~BIT0);
  946. break;
  947. case TIM_CHANNEL_2:
  948. TIMx->CCER &= (~BIT4);
  949. break;
  950. case TIM_CHANNEL_3:
  951. TIMx->CCER &= (~BIT8);
  952. break;
  953. case TIM_CHANNEL_4:
  954. TIMx->CCER &= (~BIT12);
  955. break;
  956. default:
  957. return 1;
  958. }
  959. if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) )
  960. {
  961. TIMx->CR1 &= (~BIT0);
  962. }
  963. return 0;
  964. }
  965. /*********************************************************************************
  966. * Function : HAL_TIMEx_ETRSelection
  967. * Description : select ETR signal, it can ben GPIO, COMP1_OUT, COMP2_OUT, ADC analog watchdog output
  968. * Input :
  969. htim: timer handler
  970. ETRSelection: ETR_SELECT_GPIO, ETR_SELECT_COMP1_OUT...
  971. * Output : HAL_OK, Success; HAL_ERROR:Fail
  972. * Author : xwl
  973. **********************************************************************************/
  974. HAL_StatusTypeDef HAL_TIMEx_ETRSelection(TIM_HandleTypeDef *htim, uint32_t ETRSelection)
  975. {
  976. HAL_StatusTypeDef status = HAL_OK;
  977. htim->Instance->AF1 &= (~ETR_SELECT_MASK);
  978. htim->Instance->AF1 |= ETRSelection;
  979. return status;
  980. }
  981. /*********************************************************************************
  982. * Function : HAL_TIMER_ReadCapturedValue
  983. * Description : read capture value as channel
  984. * Input :
  985. htim: timer handler
  986. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  987. * Output : capture value
  988. * Author : xwl
  989. **********************************************************************************/
  990. uint32_t HAL_TIMER_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)
  991. {
  992. uint32_t capture_data = 0U;
  993. switch (Channel)
  994. {
  995. case TIM_CHANNEL_1:
  996. {
  997. /* Return the capture 1 value */
  998. capture_data = htim->Instance->CCR1;
  999. break;
  1000. }
  1001. case TIM_CHANNEL_2:
  1002. {
  1003. /* Return the capture 2 value */
  1004. capture_data = htim->Instance->CCR2;
  1005. break;
  1006. }
  1007. case TIM_CHANNEL_3:
  1008. {
  1009. /* Return the capture 3 value */
  1010. capture_data = htim->Instance->CCR3;
  1011. break;
  1012. }
  1013. case TIM_CHANNEL_4:
  1014. {
  1015. /* Return the capture 4 value */
  1016. capture_data = htim->Instance->CCR4;
  1017. break;
  1018. }
  1019. default:
  1020. break;
  1021. }
  1022. return capture_data;
  1023. }
  1024. /*********************************************************************************
  1025. * Function : HAL_TIMER_GenerateEvent
  1026. * Description : Generate event by software
  1027. * Input:
  1028. htim : timer handler
  1029. EventSource: TIM_EVENTSOURCE_UPDATE, TIM_EVENTSOURCE_CC1...
  1030. * Output : HAL_ERROR:error, HAL_OK:OK
  1031. * Author : xwl
  1032. **********************************************************************************/
  1033. HAL_StatusTypeDef HAL_TIMER_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource)
  1034. {
  1035. htim->Instance->EGR = EventSource;
  1036. return HAL_OK;
  1037. }
  1038. /*********************************************************************************
  1039. * Function : HAL_TIMER_Clear_Capture_Flag
  1040. * Description : clear capture flag as channel id
  1041. * Input :
  1042. htim: timer handler
  1043. Channel: TIM_CHANNEL_1, TIM_CHANNEL_2...
  1044. * Output : capture value
  1045. * Author : xwl
  1046. **********************************************************************************/
  1047. void HAL_TIMER_Clear_Capture_Flag(TIM_HandleTypeDef *htim, uint32_t Channel)
  1048. {
  1049. switch (Channel)
  1050. {
  1051. case TIM_CHANNEL_1:
  1052. {
  1053. htim->Instance->SR &= (~(BIT1|BIT9));
  1054. break;
  1055. }
  1056. case TIM_CHANNEL_2:
  1057. {
  1058. htim->Instance->SR &= (~(BIT2|BIT10));
  1059. break;
  1060. }
  1061. case TIM_CHANNEL_3:
  1062. {
  1063. htim->Instance->SR &= (~(BIT3|BIT11));
  1064. break;
  1065. }
  1066. case TIM_CHANNEL_4:
  1067. {
  1068. htim->Instance->SR &= (~(BIT4|BIT12));
  1069. break;
  1070. }
  1071. default:
  1072. break;
  1073. }
  1074. }
  1075. /*********************************************************************************
  1076. * Function : TIMER_ETR_SetConfig
  1077. * Description : configure ETR channel polarity, prescaler and filter
  1078. * Input:
  1079. TIMx : timer instance
  1080. TIM_ExtTRGPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2...
  1081. TIM_ExtTRGPolarity: TIM_ETR_POLAIRTY_HIGH, TIM_ETR_POLAIRTY_LOW
  1082. ExtTRGFilter: TIM_ETR_FILTER_LVL(x), x=0-15
  1083. * Output : none
  1084. * Author : xwl
  1085. **********************************************************************************/
  1086. static void TIMER_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)
  1087. {
  1088. /* Reset the ETR Bits */
  1089. TIMx->SMCR &= (~0xFF00U);
  1090. /* Set the Prescaler, the Filter value and the Polarity */
  1091. TIMx->SMCR |= (TIM_ExtTRGPrescaler | TIM_ExtTRGPolarity | ExtTRGFilter);
  1092. }
  1093. /*********************************************************************************
  1094. * Function : TIMER_TI1FP1_ConfigInputStage
  1095. * Description : configure TI1FP1 channel polarity and filter
  1096. * Input:
  1097. TIMx : timer instance
  1098. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1099. Filter: TIM_TI1_FILTER_LVL(x), x=0-15
  1100. * Output : none
  1101. * Author : xwl
  1102. **********************************************************************************/
  1103. static void TIMER_TI1FP1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t Filter)
  1104. {
  1105. TIMx->CCER &= (~BIT0); //Disable the Channel 1: Reset the CC1E Bit
  1106. TIMx->CCMR1 = ((TIMx->CCMR1 & (~(BIT0|BIT1))) | BIT0); // CH1 as input
  1107. TIMx->CCMR1 &= (~0xF0U); // reset TI1 filter
  1108. TIMx->CCMR1 |= Filter;
  1109. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1110. {
  1111. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_RISING;
  1112. }
  1113. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1114. {
  1115. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_FALLING;
  1116. }
  1117. else
  1118. {
  1119. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_BOTH;
  1120. }
  1121. }
  1122. /*********************************************************************************
  1123. * Function : TIMER_TI2FP2_ConfigInputStage
  1124. * Description : configure TI2FP2 channel polarity and filter
  1125. * Input:
  1126. TIMx : timer instance
  1127. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1128. Filter: TIM_TI2_FILTER_LVL(x), x=0-15
  1129. * Output : none
  1130. * Author : xwl
  1131. **********************************************************************************/
  1132. static void TIMER_TI2FP2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t Filter)
  1133. {
  1134. TIMx->CCER &= (~BIT4); //Disable the Channel 2: Reset the CC2E Bit
  1135. TIMx->CCMR1 = ((TIMx->CCMR1 & (~(BIT8|BIT9))) | BIT8); // CH2 as input
  1136. TIMx->CCMR1 &= (~0xF000U); // reset TI2 filter
  1137. TIMx->CCMR1 |= Filter;
  1138. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1139. {
  1140. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_RISING;
  1141. }
  1142. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1143. {
  1144. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_FALLING;
  1145. }
  1146. else
  1147. {
  1148. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_BOTH;
  1149. }
  1150. }
  1151. /*********************************************************************************
  1152. * Function : TIMER_IC1_SetConfig
  1153. * Description : configure TI1FP1 or TI2FP1 channel polarity and filter
  1154. * Input:
  1155. TIMx : timer instance
  1156. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1157. Filter: TIM_TI1_FILTER_LVL(x), x=0-15
  1158. * Output : none
  1159. * Author : xwl
  1160. **********************************************************************************/
  1161. void TIMER_IC1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter)
  1162. {
  1163. /* Disable the Channel 1: Reset the CC1E Bit */
  1164. TIMx->CCER &= (~BIT0);
  1165. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1166. {
  1167. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_RISING;
  1168. }
  1169. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1170. {
  1171. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_FALLING;
  1172. }
  1173. else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity)
  1174. {
  1175. TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_BOTH;
  1176. }
  1177. if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection)
  1178. {
  1179. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT0|BIT1))) | BIT0;
  1180. TIMx->CCMR1 &= (~0xF0U);
  1181. }
  1182. else
  1183. {
  1184. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT0|BIT1))) | BIT1;
  1185. TIMx->CCMR1 &= (~0xF000U);
  1186. }
  1187. TIMx->CCMR1 |= Filter;
  1188. }
  1189. /*********************************************************************************
  1190. * Function : TIMER_IC2_SetConfig
  1191. * Description : configure TI1FP2 or TI2FP2 channel polarity and filter
  1192. * Input:
  1193. TIMx : timer instance
  1194. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1195. Filter: TIM_TI2_FILTER_LVL(x), x=0-15
  1196. * Output : none
  1197. * Author : xwl
  1198. **********************************************************************************/
  1199. static void TIMER_IC2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter)
  1200. {
  1201. /* Disable the Channel 2, Reset the CC2E Bit */
  1202. TIMx->CCER &= (~BIT4);
  1203. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1204. {
  1205. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_RISING;
  1206. }
  1207. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1208. {
  1209. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_FALLING;
  1210. }
  1211. else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity)
  1212. {
  1213. TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_BOTH;
  1214. }
  1215. if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection)
  1216. {
  1217. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT8|BIT9))) | BIT8;
  1218. TIMx->CCMR1 &= (~0xF000U);
  1219. }
  1220. else
  1221. {
  1222. TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT8|BIT9))) | BIT9;
  1223. TIMx->CCMR1 &= (~0xF0U);
  1224. }
  1225. TIMx->CCMR1 |= Filter;
  1226. }
  1227. /*********************************************************************************
  1228. * Function : TIMER_IC3_SetConfig
  1229. * Description : configure TI3FP3 or TI4FP3 channel polarity and filter
  1230. * Input:
  1231. TIMx : timer instance
  1232. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1233. Filter: TIM_TI3_FILTER_LVL(x), x=0-15
  1234. * Output : none
  1235. * Author : xwl
  1236. **********************************************************************************/
  1237. static void TIMER_IC3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter)
  1238. {
  1239. /* Disable the Channel 3, Reset the CC3E Bit */
  1240. TIMx->CCER &= (~BIT8);
  1241. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1242. {
  1243. TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_RISING;
  1244. }
  1245. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1246. {
  1247. TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_FALLING;
  1248. }
  1249. else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity)
  1250. {
  1251. TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_BOTH;
  1252. }
  1253. if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection)
  1254. {
  1255. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT0|BIT1))) | BIT0;
  1256. TIMx->CCMR2 &= (~0xF0U);
  1257. }
  1258. else
  1259. {
  1260. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT0|BIT1))) | BIT1;
  1261. TIMx->CCMR2 &= (~0xF000U);
  1262. }
  1263. TIMx->CCMR2 |= Filter;
  1264. }
  1265. /*********************************************************************************
  1266. * Function : TIMER_IC4_SetConfig
  1267. * Description : configure TI3FP4 or TI4FP4 channel polarity and filter
  1268. * Input:
  1269. TIMx : timer instance
  1270. TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING...
  1271. Filter: TIM_TI4_FILTER_LVL(x), x=0-15
  1272. * Output : none
  1273. * Author : xwl
  1274. **********************************************************************************/
  1275. static void TIMER_IC4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter)
  1276. {
  1277. /* Disable the Channel 3, Reset the CC3E Bit */
  1278. TIMx->CCER &= (~BIT12);
  1279. if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity)
  1280. {
  1281. TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_RISING;
  1282. }
  1283. else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity)
  1284. {
  1285. TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_FALLING;
  1286. }
  1287. else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity)
  1288. {
  1289. TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_BOTH;
  1290. }
  1291. if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection)
  1292. {
  1293. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT8|BIT9))) | BIT8;
  1294. TIMx->CCMR2 &= (~0xF000U);
  1295. }
  1296. else
  1297. {
  1298. TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT8|BIT9))) | BIT9;
  1299. TIMx->CCMR2 &= (~0xF0U);
  1300. }
  1301. TIMx->CCMR2 |= Filter;
  1302. }