HAL_TIMER.c 45 KB

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