ciu32f003_std_tim.h 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_tim.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief TIM STD库驱动头文件。
  6. * 提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /*避免头文件重复引用*/
  16. #ifndef CIU32F003_STD_TIM_H
  17. #define CIU32F003_STD_TIM_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup TIM TIM
  25. * @brief 高级控制定时器/通用定时器的STD库驱动
  26. * @{
  27. *
  28. */
  29. /************************************************************************************************/
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33. /*------------------------------------------includes--------------------------------------------*/
  34. #include "ciu32f003_std_common.h"
  35. /*-----------------------------------------type define------------------------------------------*/
  36. /************************************************************************************************/
  37. /**
  38. * @defgroup TIM_Types TIM Types
  39. * @brief TIM数据类型定义
  40. * @{
  41. */
  42. /************************************************************************************************/
  43. /**
  44. * @brief TIM基本参数配置结构体定义
  45. */
  46. typedef struct
  47. {
  48. uint32_t prescaler; /**< TIM时钟的预分频参数
  49. @note TIM1预分频参数范围为:0x0000~0xFFFF
  50. TIM3预分频参数范围为:0x0000~0x000F */
  51. uint32_t counter_mode; /**< 计数器模式选择
  52. @arg TIM_COUNTER_MODE_UP ... */
  53. uint32_t period; /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
  54. 其值必须在0x0000~0xFFFF之间 */
  55. uint32_t clock_div; /**< TIM时钟分频参数
  56. @arg TIM_CLOCK_DTS_DIV1 ... */
  57. uint8_t repeat_counter; /**< 重复计数器参数定义,每当RCR向下计数达到0时,会产出一个更新事件,
  58. 并从RCR的值(N)开始重新计数,该参数必须在0x0000~0x00FF之间。 */
  59. }std_tim_basic_init_t;
  60. /**
  61. * @brief TIM输入捕获参数配置结构体定义
  62. */
  63. typedef struct
  64. {
  65. uint32_t input_capture_pol; /**< 输入信号的有效边沿选择
  66. @arg TIM_INPUT_POL_RISING ... */
  67. uint32_t input_capture_sel; /**< 输入模式定义
  68. @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ... */
  69. uint32_t input_capture_prescaler; /**< 输入捕获预分频定义
  70. @arg TIM_INPUT_CAPTURE_PSC_DIV1 ... */
  71. uint32_t input_capture_filter; /**< 输入捕获滤波器定义,其值必须在0x0~0x7之间 */
  72. }std_tim_input_capture_init_t;
  73. /**
  74. * @brief TIM输出比较参数配置结构体定义
  75. */
  76. typedef struct
  77. {
  78. uint32_t output_compare_mode; /**< TIM输出比较模式定义
  79. @arg TIM_OUTPUT_MODE_ACTIVE ... */
  80. uint32_t output_state; /**< 输出使能定义
  81. @arg TIM_OUTPUT_DISABLE ... */
  82. uint32_t output_negtive_state; /**< 互补输出使能定义
  83. @arg TIM_OUTPUT_NEGTIVE_DISABLE ... */
  84. uint32_t pulse; /**< TIM载入捕获比较寄存器的脉冲值,其值必须在0x0000~0xFFFF之间 */
  85. uint32_t output_pol; /**< 输出极性定义
  86. @arg TIM_OUTPUT_POL_HIGH ... */
  87. uint32_t output_negtive_pol; /**< 互补输出极性定义
  88. @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ... */
  89. uint32_t output_idle_state; /**< TIM空闲状态下输出状态定义
  90. @arg TIM_OUTPUT_IDLE_SET ...
  91. @note 该参数仅对支持Break功能的定时器实例有效 */
  92. uint32_t output_negtive_idle_state; /**< TIM空闲状态下互补输出状态定义
  93. @arg TIM_OUTPUT_NEGTIVE_IDLE_SET ...
  94. @note 该参数仅对支持Break功能的定时器实例有效 */
  95. }std_tim_output_compare_init_t;
  96. /**
  97. * @brief TIM断路输入和死区参数配置结构体定义
  98. */
  99. typedef struct
  100. {
  101. uint32_t off_state_run_mode; /**< 运行模式下的关闭状态
  102. @arg TIM_OSSR_ENABLE ... */
  103. uint32_t off_state_idle_mode; /**< 空闲模式下的关闭状态
  104. @arg TIM_OSSI_ENABLE ... */
  105. uint32_t lock_level; /**< LOCK级别
  106. @arg TIM_LOCK_LEVEL1 ... */
  107. uint32_t dead_time; /**< 死区参数定义,其值必须在0x00~0xFF之间 */
  108. uint32_t break_state; /**< 断路功能使能控制
  109. @arg TIM_BREAK_ENABLE
  110. @arg TIM_BREAK_DISABLE */
  111. }std_tim_break_init_t;
  112. /**
  113. * @}
  114. */
  115. /*--------------------------------------------define--------------------------------------------*/
  116. /************************************************************************************************/
  117. /**
  118. * @defgroup TIM_Constants TIM Constants
  119. * @brief TIM常量定义及宏定义
  120. * @{
  121. *
  122. */
  123. /************************************************************************************************/
  124. /* TIM计数模式定义 */
  125. #define TIM_COUNTER_MODE_UP (0x00000000U) /**< 向上计数 */
  126. #define TIM_COUNTER_MODE_DOWN TIM_CR1_DIR /**< 向下计数 */
  127. #define TIM_COUNTER_MODE_CENT_MODE1 TIM_CR1_CMS_CENTER_UP /**< 中心对齐模式1 */
  128. #define TIM_COUNTER_MODE_CENT_MODE2 TIM_CR1_CMS_CENTER_DOWN /**< 中心对齐模式2 */
  129. #define TIM_COUNTER_MODE_CENT_MODE3 TIM_CR1_CMS_CENTER_UP_DOWN /**< 中心对齐模式3 */
  130. /* TIM更新事件源选择 */
  131. #define TIM_UPDATE_SOURCE_REGULAR (0x00000000U) /**< 计数上溢或下溢触发 */
  132. #define TIM_UPDATE_SOURCE_COUNTER TIM_CR1_URS /**< 计数上溢或下溢、UG置位、从模式控制器触发 */
  133. /* TIM时钟分频 */
  134. #define TIM_CLOCK_DTS_DIV1 (0x00000000U) /**< tDTS=tTIMx_KCLK */
  135. #define TIM_CLOCK_DTS_DIV2 TIM_CR1_CLK_DIV2 /**< tDTS=2*tTIMx_KCLK */
  136. #define TIM_CLOCK_DTS_DIV4 TIM_CR1_CLK_DIV4 /**< tDTS=4*tTIMx_KCLK */
  137. /* TIM通道定义 */
  138. #define TIM_CHANNEL_1 (0x00U) /**< 通道1定义 */
  139. #define TIM_CHANNEL_2 (0x01U) /**< 通道2定义 */
  140. #define TIM_CHANNEL_3 (0x02U) /**< 通道3定义 */
  141. #define TIM_CHANNEL_4 (0x03U) /**< 通道4定义 */
  142. /* TIM输入通道极性定义 */
  143. #define TIM_INPUT_POL_RISING (0x00000000U) /**< 未反向/上升沿触发 */
  144. #define TIM_INPUT_POL_FALLING TIM_CCEN_CC1P /**< 反向/下降沿触发 */
  145. #define TIM_INPUT_POL_BOTH (TIM_CCEN_CC1P | TIM_CCEN_CC1NP) /**< 未反向/上升下降均触发 */
  146. /* TIM输入捕获选择 */
  147. #define TIM_INPUT_CAPTURE_SEL_DIRECTTI TIM_CCM1_CC1S_DIRECTTI /**< TIM输入1, 2, 3 or 4,且被映射到IC1, IC2, IC3 or IC4(一一对应) */
  148. #define TIM_INPUT_CAPTURE_SEL_INDIRECTTI TIM_CCM1_CC1S_INDIRECTTI /**< TIM输入1, 2, 3 or 4,且被映射到IC2, IC1, IC4 or IC3(一一对应) */
  149. #define TIM_INPUT_CAPTURE_SEL_TRC TIM_CCM1_CC1S_TRC /**< TIM输入1, 2, 3 or 4,且被映射到TRC */
  150. /* TIM输入捕获预分频参数定义 */
  151. #define TIM_INPUT_CAPTURE_PSC_DIV1 (0x00000000U) /**< 无预分频器,捕获输入上每检测到一个边沿便执行捕获 */
  152. #define TIM_INPUT_CAPTURE_PSC_DIV2 TIM_CCM1_IC1PSC_DIV2 /**< 每发生2个事件执行一次捕获 */
  153. #define TIM_INPUT_CAPTURE_PSC_DIV4 TIM_CCM1_IC1PSC_DIV4 /**< 每发生4个事件执行一次捕获 */
  154. #define TIM_INPUT_CAPTURE_PSC_DIV8 TIM_CCM1_IC1PSC_DIV8 /**< 每发生8个事件执行一次捕获 */
  155. /* TIM输出比较极性定义 */
  156. #define TIM_OUTPUT_POL_HIGH (0x00000000U) /**< 比较输出极性:高电平为有效电平 */
  157. #define TIM_OUTPUT_POL_LOW TIM_CCEN_CC1P /**< 比较输出极性:低电平为有效电平 */
  158. /* TIM输出比较输出使能定义 */
  159. #define TIM_OUTPUT_DISABLE (0x00000000U) /**< 比较通道输出禁止 */
  160. #define TIM_OUTPUT_ENABLE TIM_CCEN_CC1E /**< 比较通道输出使能 */
  161. /* TIM输出比较参数定义*/
  162. #define TIM_OUTPUT_MODE_FROZEN (0x00000000U) /**< 冻结 */
  163. #define TIM_OUTPUT_MODE_ACTIVE TIM_CCM1_OC1M_ACTIVE /**< 通道1设置为匹配时输出有效电平 */
  164. #define TIM_OUTPUT_MODE_INACTIVE TIM_CCM1_OC1M_INACTIVE /**< 通道1设置为匹配时输出无效电平 */
  165. #define TIM_OUTPUT_MODE_TOGGLE TIM_CCM1_OC1M_TOGGLE /**< 翻转 */
  166. #define TIM_OUTPUT_MODE_FORCED_INACTIVE TIM_CCM1_OC1M_FORCED_INACTIVE /**< 强制变为无效电平 */
  167. #define TIM_OUTPUT_MODE_FORCED_ACTIVE TIM_CCM1_OC1M_FORCED_ACTIVE /**< 强制变为有效电平 */
  168. #define TIM_OUTPUT_MODE_PWM1 TIM_CCM1_OC1M_PWM1 /**< PWM模式1 */
  169. #define TIM_OUTPUT_MODE_PWM2 TIM_CCM1_OC1M_PWM2 /**< PWM模式2 */
  170. /* TIM时钟源选择 */
  171. #define TIM_CLKSRC_INT (0x00000000U) /**< TIM时钟源:内部时钟 */
  172. #define TIM_CLKSRC_MODE1 TIM_SMC_SM_SEL_EXT_MODE1 /**< TIM时钟源:外部时钟源模式1 */
  173. /* TIM时钟极性定义 */
  174. #define TIM_CLK_TIX_POL_RISING (0x00000000U) /**< TIx时钟源的极性:上升沿有效 */
  175. #define TIM_CLK_TIX_POL_FALLING TIM_CCEN_CC1P /**< TIx时钟源的极性:下降沿有效 */
  176. #define TIM_CLK_TIX_POL_BOTH (TIM_CCEN_CC1P | TIM_CCEN_CC1NP) /**< TIx时钟源的极性:双沿有效 */
  177. /* TIM事件源 */
  178. #define TIM_EVENT_SRC_UPDATE TIM_EVTG_UG /**< 重新初始化计数器并生成一个更新事件 */
  179. #define TIM_EVENT_SRC_CC1 TIM_EVTG_CC1G /**< 在通道1上生成一个捕获/比较事件 */
  180. #define TIM_EVENT_SRC_CC2 TIM_EVTG_CC2G /**< 在通道2上生成一个捕获/比较事件 */
  181. #define TIM_EVENT_SRC_CC3 TIM_EVTG_CC3G /**< 在通道3上生成一个捕获/比较事件 */
  182. #define TIM_EVENT_SRC_CC4 TIM_EVTG_CC4G /**< 在通道4上生成一个捕获/比较事件 */
  183. #define TIM_EVENT_SRC_COM TIM_EVTG_COMG /**< 生成一个换相事件 */
  184. #define TIM_EVENT_SRC_TRIG TIM_EVTG_TG /**< 生成一个触发事件 */
  185. #define TIM_EVENT_SRC_BREAK TIM_EVTG_BG /**< 生成一个断路事件 */
  186. /* TIM中断定义 */
  187. #define TIM_INTERRUPT_UPDATE TIM_DIER_UIE /**< 更新中断 */
  188. #define TIM_INTERRUPT_CC1 TIM_DIER_CC1IE /**< 捕获/比较1中断 */
  189. #define TIM_INTERRUPT_CC2 TIM_DIER_CC2IE /**< 捕获/比较1中断2 */
  190. #define TIM_INTERRUPT_CC3 TIM_DIER_CC3IE /**< 捕获/比较1中断3 */
  191. #define TIM_INTERRUPT_CC4 TIM_DIER_CC4IE /**< 捕获/比较1中断4 */
  192. #define TIM_INTERRUPT_COM TIM_DIER_COMIE /**< 换相中断 */
  193. #define TIM_INTERRUPT_TRIG TIM_DIER_TIE /**< 触发中断 */
  194. #define TIM_INTERRUPT_BREAK TIM_DIER_BIE /**< 断路中断 */
  195. /* TIM标志定义 */
  196. #define TIM_FLAG_UPDATE TIM_SR_UIF /**< 更新中断标志 */
  197. #define TIM_FLAG_CC1 TIM_SR_CC1IF /**< 捕获/比较1事件标志 */
  198. #define TIM_FLAG_CC2 TIM_SR_CC2IF /**< 捕获/比较2事件标志 */
  199. #define TIM_FLAG_CC3 TIM_SR_CC3IF /**< 捕获/比较3事件标志 */
  200. #define TIM_FLAG_CC4 TIM_SR_CC4IF /**< 捕获/比较4事件标志 */
  201. #define TIM_FLAG_COM TIM_SR_COMIF /**< 换相事件标志 */
  202. #define TIM_FLAG_TRIG TIM_SR_TIF /**< 触发事件标志 */
  203. #define TIM_FLAG_BREAK TIM_SR_BIF /**< 断路事件标志 */
  204. #define TIM_FLAG_CC1OF TIM_SR_CC1OF /**< 捕获/比较1重复捕获标志 */
  205. #define TIM_FLAG_CC2OF TIM_SR_CC2OF /**< 捕获/比较2重复捕获标志 */
  206. #define TIM_FLAG_ALL (0xFFFF) /**< TIM事件标志 */
  207. #define TIM_FLAG_CCX_ALL (0x001E) /**< 全通道捕获/比较事件标志 */
  208. /* TIM清除OCxREF输出的输入源 */
  209. #define TIM_CLEAR_INPUT_SRC_COMP1 (0x00000000U) /**< OCREF_CLR_INPUT连接到COMP1的输出 */
  210. #define TIM_CLEAR_INPUT_SRC_COMP2 TIM_CFG_OCREF_CLR /**< OCREF_CLR_INPUT连接到COMP2的输出 */
  211. /* TIM换相事件源 */
  212. #define TIM_COM_SOFTWARE (0x00000000U) /**< 如果捕获/比较控制位进行预装载(CCPC=1),仅通过将COMG位置1触发换相事件 */
  213. #define TIM_COM_TRGI TIM_CR2_CCU_SEL /**< 如果捕获/比较控制位进行预装载(CCPC=1),可通过将COMG位置1或TRIG的上升沿触发换相事件 */
  214. /* TIM主模式选择(TRIG_OUT)参数定义*/
  215. #define TIM_TRIG_OUT_RESET (0x00000000U) /**< TIM1_EVTG寄存器中的UG位用作触发输出(TRIG_OUT) */
  216. #define TIM_TRIG_OUT_ENABLE TIM_CR2_MM_SEL_ENABLE /**< 计数器使能信号CEN用作触发输出(TRIG_OUT) */
  217. #define TIM_TRIG_OUT_UPDATE TIM_CR2_MM_SEL_UPDATE /**< 选择更新事件作为触发输出(TRIG_OUT) */
  218. #define TIM_TRIG_OUT_CC1 TIM_CR2_MM_SEL_CC1IF /**< 捕获或比较匹配,触发输出(TRIG_OUT) */
  219. #define TIM_TRIG_OUT_OC1REF TIM_CR2_MM_SEL_OC1REF /**< OC1REF信号用作触发输出(TRIG_OUT) */
  220. #define TIM_TRIG_OUT_OC2REF TIM_CR2_MM_SEL_OC2REF /**< OC2REF信号用作触发输出(TRIG_OUT) */
  221. #define TIM_TRIG_OUT_OC3REF TIM_CR2_MM_SEL_OC3REF /**< OC3REF信号用作触发输出(TRIG_OUT) */
  222. #define TIM_TRIG_OUT_OC4REF TIM_CR2_MM_SEL_OC4REF /**< OC4REF信号用作触发输出(TRIG_OUT) */
  223. /* TIM从模式参数定义*/
  224. #define TIM_SLAVE_MODE_DISABLE (0x00000000U) /**< 禁止从模式 */
  225. #define TIM_SLAVE_MODE_RESET TIM_SMC_SM_SEL_RESET /**< 复位模式 */
  226. #define TIM_SLAVE_MODE_GATED TIM_SMC_SM_SEL_GATED /**< 门控模式 */
  227. #define TIM_SLAVE_MODE_TRIG TIM_SMC_SM_SEL_TRIG /**< 触发模式 */
  228. /* TIM触发选择参数定义*/
  229. #define TIM_TRIG_SOURCE_ITR0 TIM_SMC_TS_ITR0 /**< 内部触发0(ITR0) */
  230. #define TIM_TRIG_SOURCE_TI1F_ED TIM_SMC_TS_TI1F_ED /**< TI1边沿检测器(TI1F_ED) */
  231. #define TIM_TRIG_SOURCE_TI1FP1 TIM_SMC_TS_TI1FP1 /**< 滤波后的定时器输入1(TI1FP1) */
  232. #define TIM_TRIG_SOURCE_TI2FP2 TIM_SMC_TS_TI2FP2 /**< 滤波后的定时器输入2(TI1FP2) */
  233. /* TIM触发极性参数定义*/
  234. #define TIM_TRIG_TIX_POL_RISING (0x00000000U) /**< TIxFPx或TI1F_ED触发极性:高电平或上升沿有效 */
  235. #define TIM_TRIG_TIX_POL_FALLING TIM_CCEN_CC1P /**< TIxFPx或TI1F_ED触发极性:低电平或下降沿有效 */
  236. #define TIM_TRIG_TIX_POL_BOTH (TIM_CCEN_CC1P | TIM_CCEN_CC1NP) /**< TIxFPx或TI1F_ED触发极性:上升下降均触发 */
  237. /* TIM输出比较互补输出极性定义 */
  238. #define TIM_OUTPUT_NEGTIVE_POL_HIGH (0x00000000U) /**< 互补输出极性为高电平有效 */
  239. #define TIM_OUTPUT_NEGTIVE_POL_LOW TIM_CCEN_CC1NP /**< 互补输出极性为低电平有效 */
  240. /* TIM输出比较互补输出使能定义 */
  241. #define TIM_OUTPUT_NEGTIVE_DISABLE (0x00000000U) /**< 互补输出通道输出禁止 */
  242. #define TIM_OUTPUT_NEGTIVE_ENABLE TIM_CCEN_CC1NE /**< 互补输出通道输出使能 */
  243. /* TIM空闲状态下输出状态定义 */
  244. #define TIM_OUTPUT_IDLE_RESET (0x00000000U) /**< 空闲状态为: 当MOEN=0时OCx输出低电平 */
  245. #define TIM_OUTPUT_IDLE_SET TIM_CR2_OIS1 /**< 空闲状态为: 当MOEN=0时OCx输出高电平 */
  246. /* TIM空闲状态下互补输出状态定义 */
  247. #define TIM_OUTPUT_NEGTIVE_IDLE_RESET (0x00000000U) /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平 */
  248. #define TIM_OUTPUT_NEGTIVE_IDLE_SET TIM_CR2_OIS1N /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平 */
  249. /* TIM运行模式下关闭状态选择参数定义 */
  250. #define TIM_OSSR_DISABLE (0x00000000U) /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制) */
  251. #define TIM_OSSR_ENABLE TIM_BDT_OSSR /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制) */
  252. /* TIM空闲模式下关闭状态选择参数定义 */
  253. #define TIM_OSSI_DISABLE (0x00000000U) /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制) */
  254. #define TIM_OSSI_ENABLE TIM_BDT_OSSI /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制) */
  255. /* TIM锁级别定义*/
  256. #define TIM_LOCK_LEVEL_OFF (0x00000000U) /**< 锁级别0 */
  257. #define TIM_LOCK_LEVEL1 TIM_BDT_LOCK_LEVEL1 /**< 锁级别1 */
  258. #define TIM_LOCK_LEVEL2 TIM_BDT_LOCK_LEVEL2 /**< 锁级别2 */
  259. #define TIM_LOCK_LEVEL3 TIM_BDT_LOCK_LEVEL3 /**< 锁级别3 */
  260. /* TIM断路输入使能*/
  261. #define TIM_BREAK_DISABLE (0x00000000U) /**< 禁止断路输入 */
  262. #define TIM_BREAK_ENABLE TIM_BDT_BKEN /**< 使能断路输入 */
  263. /* TIM断路输入源定义 */
  264. #define TIM_BREAK_INPUT_SRC_GPIO TIM1_AF1_BKINE /**< GPIO接到BKIN引脚上 */
  265. #define TIM_BREAK_INPUT_SRC_COMP1 TIM1_AF1_BKCMP1E /**< COMP1输出接到断路输入 */
  266. #define TIM_BREAK_INPUT_SRC_COMP2 TIM1_AF1_BKCMP2E /**< COMP2输出接到断路输入 */
  267. /* TIM断路输入极性定义 */
  268. #define TIM_BREAK_INPUT_POL_HIGH TIM1_AF1_BKINP /**< 断路输入源为高电平 */
  269. #define TIM_BREAK_INPUT_POL_LOW (0x00000000U) /**< 断路输入源为低电平 */
  270. /* TIM外部时钟输入选择 */
  271. #define TIM_TIM3_TI1_GPIO TIM_TISEL_TI1_SEL_CH1 /**< TIM3_TI1连接到GPIO */
  272. #define TIM_TIM3_TI1_COMP1 TIM_TISEL_TI1_SEL_COMP1 /**< TIM3_TI1连接到COMP1输出 */
  273. #define TIM_TIM3_TI2_GPIO TIM_TISEL_TI2_SEL_CH2 /**< TIM3_TI2连接到GPIO */
  274. #define TIM_TIM3_TI2_COMP2 TIM_TISEL_TI2_SEL_COMP2 /**< TIM3_TI2连接到COMP2输出 */
  275. /**
  276. * @}
  277. */
  278. /*-------------------------------------------functions------------------------------------------*/
  279. /************************************************************************************************/
  280. /**
  281. * @defgroup TIM_External_Functions TIM External Functions
  282. * @brief TIM对外函数
  283. * @{
  284. *
  285. */
  286. /************************************************************************************************/
  287. /**
  288. * @brief TIM启动计数
  289. * @param timx TIM外设
  290. * @retval 无
  291. */
  292. __STATIC_INLINE void std_tim_enable(TIM_t *timx)
  293. {
  294. timx->CR1 |= TIM_CR1_CEN;
  295. }
  296. /**
  297. * @brief TIM停止计数
  298. * @param timx TIM外设
  299. * @retval 无
  300. */
  301. __STATIC_INLINE void std_tim_disable(TIM_t *timx)
  302. {
  303. timx->CR1 &= (~TIM_CR1_CEN);
  304. }
  305. /**
  306. * @brief 设置TIM预分频参数
  307. * @param timx TIM外设
  308. * @param presc 预分频新值
  309. * @note TIM1预分频参数范围为:0x0000~0xFFFF
  310. * TIM3预分频参数范围为:0x0000~0x000F
  311. * @retval 无
  312. */
  313. __STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)
  314. {
  315. timx->PSC = (presc);
  316. }
  317. /**
  318. * @brief 获取TIM预分频参数
  319. * @param timx TIM外设
  320. * @retval uint32_t TIM预分频值
  321. */
  322. __STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)
  323. {
  324. return (timx->PSC);
  325. }
  326. /**
  327. * @brief 设置TIM计数值
  328. * @param timx TIM外设
  329. * @param counter 计数新值
  330. * @retval 无
  331. */
  332. __STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)
  333. {
  334. timx->CNT = (counter);
  335. }
  336. /**
  337. * @brief 获取TIM计数值
  338. * @param timx TIM外设
  339. * @retval uint32_t TIM计数值
  340. */
  341. __STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)
  342. {
  343. return (timx->CNT);
  344. }
  345. /**
  346. * @brief 设置TIM ARR值
  347. * @param timx TIM外设
  348. * @param autoreload ARR值
  349. * @retval 无
  350. */
  351. __STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
  352. {
  353. timx->ARR = (autoreload);
  354. }
  355. /**
  356. * @brief 获取TIM ARR值
  357. * @param timx TIM外设
  358. * @retval uint32_t TIM ARR值
  359. */
  360. __STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
  361. {
  362. return (timx->ARR);
  363. }
  364. /**
  365. * @brief 设置TIM RCR值
  366. * @param timx TIM外设
  367. * @param rcr TIM RCR值
  368. * @retval 无
  369. */
  370. __STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
  371. {
  372. timx->RCR = (rcr);
  373. }
  374. /**
  375. * @brief 获取TIM RCR值
  376. * @param timx TIM外设
  377. * @retval uint32_t TIM RCR值
  378. */
  379. __STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
  380. {
  381. return (timx->RCR);
  382. }
  383. /**
  384. * @brief 设置TIM时钟分频值
  385. * @param timx TIM外设
  386. * @param clk_div 时钟分频值
  387. * @arg TIM_CLOCK_DTS_DIV1: tDTS=tTIM_KCLK
  388. * @arg TIM_CLOCK_DTS_DIV2: tDTS=2*tTIM_KCLK
  389. * @arg TIM_CLOCK_DTS_DIV4: tDTS=4*tTIM_KCLK
  390. * @retval 无
  391. */
  392. __STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div)
  393. {
  394. MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);
  395. }
  396. /**
  397. * @brief 获取TIM时钟分频值
  398. * @param timx TIM外设
  399. * @retval uint32_t 时钟分频值
  400. * @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
  401. * @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
  402. * @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
  403. */
  404. __STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)
  405. {
  406. return (timx->CR1 & TIM_CR1_CLK_DIV);
  407. }
  408. /**
  409. * @brief 使能自动重载功能
  410. * @param timx TIM外设
  411. * @retval 无
  412. */
  413. __STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)
  414. {
  415. timx->CR1 |= TIM_CR1_ARPE;
  416. }
  417. /**
  418. * @brief 禁止自动重载功能
  419. * @param timx TIM外设
  420. * @retval 无
  421. */
  422. __STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)
  423. {
  424. timx->CR1 &= (~TIM_CR1_ARPE);
  425. }
  426. /**
  427. * @brief 使能更新事件
  428. * @param timx TIM外设
  429. * @retval 无
  430. */
  431. __STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
  432. {
  433. timx->CR1 |= TIM_CR1_UDIS;
  434. }
  435. /**
  436. * @brief 禁止更新事件
  437. * @param timx TIM外设
  438. * @retval 无
  439. */
  440. __STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
  441. {
  442. timx->CR1 &= (~TIM_CR1_UDIS);
  443. }
  444. /**
  445. * @brief 设置更新事件源
  446. * @param timx TIM外设
  447. * @param update_source 更新事件源选择
  448. * @arg TIM_UPDATE_SOURCE_REGULAR
  449. * @arg TIM_UPDATE_SOURCE_COUNTER
  450. * @retval 无
  451. */
  452. __STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
  453. {
  454. MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
  455. }
  456. /**
  457. * @brief 获取更新事件源
  458. * @param timx TIM外设
  459. * @retval uint32_t 更新事件源选择
  460. * @arg TIM_UPDATE_SOURCE_REGULAR
  461. * @arg TIM_UPDATE_SOURCE_COUNTER
  462. */
  463. __STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
  464. {
  465. return (timx->CR1 & TIM_CR1_URS);
  466. }
  467. /**
  468. * @brief 使能工作模式1
  469. * @param timx TIM外设
  470. * @retval 无
  471. */
  472. __STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
  473. {
  474. timx->CR1 |= TIM_CR1_MODE;
  475. }
  476. /**
  477. * @brief 禁止工作模式1
  478. * @param timx TIM外设
  479. * @retval 无
  480. */
  481. __STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
  482. {
  483. timx->CR1 &= (~TIM_CR1_MODE);
  484. }
  485. /**
  486. * @brief 设置计数模式
  487. * @param timx TIM外设
  488. * @param counter_mode 计数方式
  489. * @arg TIM_COUNTER_MODE_UP
  490. * @arg TIM_COUNTER_MODE_DOWN
  491. * @arg TIM_COUNTER_MODE_CENT_MODE1
  492. * @arg TIM_COUNTER_MODE_CENT_MODE2
  493. * @arg TIM_COUNTER_MODE_CENT_MODE3
  494. * @note 由于DIR控制位在中心对齐模式下为只读权限,当从中心对齐模式切换到边沿模式时,避免计数方向修改异常,应先复位一次TIM
  495. * @retval 无
  496. */
  497. __STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
  498. {
  499. MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
  500. }
  501. /**
  502. * @brief 获取计数模式
  503. * @param timx TIM外设
  504. * @retval uint32_t 计数方式
  505. * @arg TIM_COUNTER_MODE_UP
  506. * @arg TIM_COUNTER_MODE_DOWN
  507. * @arg TIM_COUNTER_MODE_CENT_MODE1
  508. * @arg TIM_COUNTER_MODE_CENT_MODE2
  509. * @arg TIM_COUNTER_MODE_CENT_MODE3
  510. */
  511. __STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
  512. {
  513. if(timx->CR1 & TIM_CR1_CMS)
  514. {
  515. return (timx->CR1 & TIM_CR1_CMS);
  516. }
  517. else
  518. {
  519. return (timx->CR1 & TIM_CR1_DIR);
  520. }
  521. }
  522. /**
  523. * @brief 获取TIM计数方向
  524. * @param timx TIM外设
  525. * @retval uint32_t 返回TIM计数方向标志
  526. * @arg 非0: 当前计数方向为向下计数
  527. * @arg 0:当前计数方向为向上计数
  528. */
  529. __STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)
  530. {
  531. return (timx->CR1 & TIM_CR1_DIR);
  532. }
  533. /**
  534. * @brief 使能单脉冲模式
  535. * @param timx TIM外设
  536. * @retval 无
  537. */
  538. __STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
  539. {
  540. timx->CR1 |= TIM_CR1_OPM;
  541. }
  542. /**
  543. * @brief 禁止单脉冲模式
  544. * @param timx TIM外设
  545. * @retval 无
  546. */
  547. __STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
  548. {
  549. timx->CR1 &= (~TIM_CR1_OPM);
  550. }
  551. /**
  552. * @brief 获取单脉冲模式
  553. * @param timx TIM外设
  554. * @retval uint32_t 返回单脉冲计数模式
  555. * @arg 非0: 当前配置为单脉冲模式
  556. * @arg 0:当前配置为连续计数模式
  557. */
  558. __STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
  559. {
  560. return (timx->CR1 & (TIM_CR1_OPM));
  561. }
  562. /**
  563. * @brief 设置计数时钟源参数
  564. * @param timx TIM外设
  565. * @param clock_source 时钟源选择
  566. * @arg TIM_CLKSRC_INT: 内部时钟源
  567. * @arg TIM_CLKSRC_MODE1: 外部时钟模式1
  568. * @retval 无
  569. */
  570. __STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
  571. {
  572. MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
  573. }
  574. /**
  575. * @brief 生成一个软件事件
  576. * @param timx TIM外设
  577. * @param event_src 事件源
  578. * @arg TIM_EVENT_SRC_UPDATE:更新事件源
  579. * @arg TIM_EVENT_SRC_CC1: 捕获比较1事件源
  580. * @arg TIM_EVENT_SRC_CC2: 捕获比较2事件源
  581. * @arg TIM_EVENT_SRC_CC3: 捕获比较3事件源
  582. * @arg TIM_EVENT_SRC_CC4: 捕获比较4事件源
  583. * @arg TIM_EVENT_SRC_COM: 换相事件源
  584. * @arg TIM_EVENT_SRC_TRIG: 触发事件源
  585. * @arg TIM_EVENT_SRC_BREAK: 断路事件源
  586. * @retval 无
  587. */
  588. __STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
  589. {
  590. timx->EVTG = event_src;
  591. }
  592. /**
  593. * @brief TIM中断使能
  594. * @param timx TIM外设
  595. * @param interrupt TIM中断源
  596. * @arg TIM_INTERRUPT_UPDATE: 更新中断
  597. * @arg TIM_INTERRUPT_CC1: 捕获/比较1中断
  598. * @arg TIM_INTERRUPT_CC2: 捕获/比较2中断
  599. * @arg TIM_INTERRUPT_CC3: 捕获/比较3中断
  600. * @arg TIM_INTERRUPT_CC4: 捕获/比较4中断
  601. * @arg TIM_INTERRUPT_COM: 换相中断
  602. * @arg TIM_INTERRUPT_TRIG: 触发中断
  603. * @arg TIM_INTERRUPT_BREAK: 断路中断
  604. * @retval 无
  605. */
  606. __STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)
  607. {
  608. timx->DIER |= (interrupt);
  609. }
  610. /**
  611. * @brief TIM中断禁止
  612. * @param timx TIM外设
  613. * @param interrupt TIM中断源
  614. * @arg TIM_INTERRUPT_UPDATE: 更新中断
  615. * @arg TIM_INTERRUPT_CC1: 捕获/比较1中断
  616. * @arg TIM_INTERRUPT_CC2: 捕获/比较2中断
  617. * @arg TIM_INTERRUPT_CC3: 捕获/比较3中断
  618. * @arg TIM_INTERRUPT_CC4: 捕获/比较4中断
  619. * @arg TIM_INTERRUPT_COM: 换相中断
  620. * @arg TIM_INTERRUPT_TRIG: 触发中断
  621. * @arg TIM_INTERRUPT_BREAK: 断路中断
  622. * @retval 无
  623. */
  624. __STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)
  625. {
  626. timx->DIER &= (~(interrupt));
  627. }
  628. /**
  629. * @brief 获取TIM中断源的状态
  630. * @param timx TIM外设
  631. * @param interrupt TIM中断源信息
  632. * @arg TIM_INTERRUPT_UPDATE: 更新中断
  633. * @arg TIM_INTERRUPT_CC1: 捕获/比较1中断
  634. * @arg TIM_INTERRUPT_CC2: 捕获/比较2中断
  635. * @arg TIM_INTERRUPT_CC3: 捕获/比较3中断
  636. * @arg TIM_INTERRUPT_CC4: 捕获/比较4中断
  637. * @arg TIM_INTERRUPT_COM: 换相中断
  638. * @arg TIM_INTERRUPT_TRIG: 触发中断
  639. * @arg TIM_INTERRUPT_BREAK: 断路中断
  640. * @retval uint32_t 返回中断请求源的状态
  641. */
  642. __STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)
  643. {
  644. return (timx->DIER & (interrupt));
  645. }
  646. /**
  647. * @brief 获取TIM标志状态
  648. * @param timx TIM外设
  649. * @param flag TIM标志信息
  650. * @arg TIM_FLAG_UPDATE: 更新事件标志
  651. * @arg TIM_FLAG_CC1: 捕获/比较1事件标志
  652. * @arg TIM_FLAG_CC2: 捕获/比较2事件标志
  653. * @arg TIM_FLAG_CC3: 捕获/比较3事件标志
  654. * @arg TIM_FLAG_CC4: 捕获/比较4事件标志
  655. * @arg TIM_FLAG_COM: 换相事件标志
  656. * @arg TIM_FLAG_TRIG: 触发事件标志
  657. * @arg TIM_FLAG_BREAK: 断路事件标志
  658. * @arg TIM_FLAG_CC1OF: 捕获/比较1重复捕获标志
  659. * @arg TIM_FLAG_CC2OF: 捕获/比较2重复捕获标志
  660. * @arg TIM_FLAG_CCX_ALL: 全通道捕获/比较事件标志
  661. * @arg TIM_FLAG_ALL: TIM事件标志
  662. * @retval uint32_t 返回标志的状态
  663. * @arg 非0: 当前标志为置起状态
  664. * @arg 0:当前标志为清除状态
  665. */
  666. __STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)
  667. {
  668. return (timx->SR &(flag));
  669. }
  670. /**
  671. * @brief 清除TIM标志
  672. * @param timx TIM外设
  673. * @param flag 清除TIM标志
  674. * @arg TIM_FLAG_UPDATE: 更新事件标志
  675. * @arg TIM_FLAG_CC1: 捕获/比较1事件标志
  676. * @arg TIM_FLAG_CC2: 捕获/比较2事件标志
  677. * @arg TIM_FLAG_CC3: 捕获/比较3事件标志
  678. * @arg TIM_FLAG_CC4: 捕获/比较4事件标志
  679. * @arg TIM_FLAG_COM: 换相事件标志
  680. * @arg TIM_FLAG_TRIG: 触发事件标志
  681. * @arg TIM_FLAG_BREAK: 断路事件标志
  682. * @arg TIM_FLAG_CC1OF: 捕获/比较1重复捕获标志
  683. * @arg TIM_FLAG_CC2OF: 捕获/比较2重复触发标志
  684. * @arg TIM_FLAG_CCX_ALL: 全通道捕获/比较事件标志
  685. * @arg TIM_FLAG_ALL: TIM事件标志
  686. * @retval 无
  687. */
  688. __STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
  689. {
  690. timx->SR = (~(flag));
  691. }
  692. /**
  693. * @brief 使能TIM比较/匹配通道
  694. * @param timx TIM外设
  695. * @param channel_id 指定TIM通道
  696. * @arg TIM_CHANNEL_1
  697. * @arg TIM_CHANNEL_2
  698. * @arg TIM_CHANNEL_3
  699. * @arg TIM_CHANNEL_4
  700. * @retval 无
  701. */
  702. __STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
  703. {
  704. timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
  705. }
  706. /**
  707. * @brief 禁止TIM比较/匹配通道
  708. * @param timx TIM外设
  709. * @param channel_id 指定TIM通道
  710. * @arg TIM_CHANNEL_1
  711. * @arg TIM_CHANNEL_2
  712. * @arg TIM_CHANNEL_3
  713. * @arg TIM_CHANNEL_4
  714. * @retval 无
  715. */
  716. __STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
  717. {
  718. timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
  719. }
  720. /**
  721. * @brief 使能TIM互补输出通道
  722. * @param timx TIM外设
  723. * @param channel_id 指定TIM通道
  724. * @arg TIM_CHANNEL_1
  725. * @arg TIM_CHANNEL_2
  726. * @arg TIM_CHANNEL_3
  727. * @retval 无
  728. */
  729. __STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
  730. {
  731. timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
  732. }
  733. /**
  734. * @brief 禁止TIM互补输出通道
  735. * @param timx TIM外设
  736. * @param channel_id 指定TIM通道
  737. * @arg TIM_CHANNEL_1
  738. * @arg TIM_CHANNEL_2
  739. * @arg TIM_CHANNEL_3
  740. * @retval 无
  741. */
  742. __STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
  743. {
  744. timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
  745. }
  746. /**
  747. * @brief 配置TIM输入捕获通道极性
  748. * @param timx TIM外设
  749. * @param channel_id 指定TIM通道
  750. * @arg TIM_CHANNEL_1
  751. * @arg TIM_CHANNEL_2
  752. * @param input_capture_pol 输入极性
  753. * @arg TIM_INPUT_POL_RISING
  754. * @arg TIM_INPUT_POL_FALLING
  755. * @arg TIM_INPUT_POL_BOTH
  756. * @retval 无
  757. */
  758. __STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
  759. {
  760. MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
  761. }
  762. /**
  763. * @brief 获取TIM输入捕获通道极性
  764. * @param timx TIM外设
  765. * @param channel_id 指定TIM通道
  766. * @arg TIM_CHANNEL_1
  767. * @arg TIM_CHANNEL_2
  768. * @retval uint32_t 输入极性
  769. * @arg TIM_INPUT_POL_RISING
  770. * @arg TIM_INPUT_POL_FALLING
  771. * @arg TIM_INPUT_POL_BOTH
  772. */
  773. __STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
  774. {
  775. return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
  776. }
  777. /**
  778. * @brief 配置TIM通道输出的极性
  779. * @param timx TIM外设
  780. * @param channel_id 指定TIM通道
  781. * @arg TIM_CHANNEL_1
  782. * @arg TIM_CHANNEL_2
  783. * @arg TIM_CHANNEL_3
  784. * @arg TIM_CHANNEL_4
  785. * @param output_commpare_pol 输出极性
  786. * @arg TIM_OUTPUT_POL_HIGH
  787. * @arg TIM_OUTPUT_POL_LOW
  788. * @retval 无
  789. */
  790. __STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
  791. {
  792. MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
  793. }
  794. /**
  795. * @brief 获取TIM通道输出的极性
  796. * @param timx TIM外设
  797. * @param channel_id 指定TIM通道
  798. * @arg TIM_CHANNEL_1
  799. * @arg TIM_CHANNEL_2
  800. * @arg TIM_CHANNEL_3
  801. * @arg TIM_CHANNEL_4
  802. * @retval uint32_t 输出极性
  803. * @arg TIM_OUTPUT_POL_HIGH
  804. * @arg TIM_OUTPUT_POL_LOW
  805. */
  806. __STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
  807. {
  808. return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
  809. }
  810. /**
  811. * @brief 配置TIM互补通道的输出极性
  812. * @param timx TIM外设
  813. * @param channel_id 指定TIM通道
  814. * @arg TIM_CHANNEL_1
  815. * @arg TIM_CHANNEL_2
  816. * @arg TIM_CHANNEL_3
  817. * @param negtive_output_pol 互补通道的输出极性
  818. * @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
  819. * @arg TIM_OUTPUT_NEGTIVE_POL_LOW
  820. * @retval 无
  821. */
  822. __STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
  823. {
  824. MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
  825. }
  826. /**
  827. * @brief 获取TIM互补通道的输出极性
  828. * @param timx TIM外设
  829. * @param channel_id 指定TIM通道
  830. * @arg TIM_CHANNEL_1
  831. * @arg TIM_CHANNEL_2
  832. * @arg TIM_CHANNEL_3
  833. * @retval uint32_t 互补通道的输出极性
  834. * @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
  835. * @arg TIM_OUTPUT_NEGTIVE_POL_LOW
  836. */
  837. __STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
  838. {
  839. return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
  840. }
  841. /**
  842. * @brief 配置TIM通道的空闲状态
  843. * @param timx TIM外设
  844. * @param channel_id 指定TIM通道
  845. * @arg TIM_CHANNEL_1
  846. * @arg TIM_CHANNEL_2
  847. * @arg TIM_CHANNEL_3
  848. * @arg TIM_CHANNEL_4
  849. * @param idle_state 通道空闲状态
  850. * @arg TIM_OUTPUT_IDLE_RESET
  851. * @arg TIM_OUTPUT_IDLE_SET
  852. * @retval 无
  853. */
  854. __STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
  855. {
  856. MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
  857. }
  858. /**
  859. * @brief 获取TIM通道的空闲状态
  860. * @param timx TIM外设
  861. * @param channel_id 指定TIM通道
  862. * @arg TIM_CHANNEL_1
  863. * @arg TIM_CHANNEL_2
  864. * @arg TIM_CHANNEL_3
  865. * @arg TIM_CHANNEL_4
  866. * @retval uint32_t 通道空闲状态
  867. * @arg TIM_OUTPUT_IDLE_RESET
  868. * @arg TIM_OUTPUT_IDLE_SET
  869. */
  870. __STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
  871. {
  872. return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);
  873. }
  874. /**
  875. * @brief 配置TIM互补通道的空闲状态
  876. * @param timx TIM外设
  877. * @param channel_id 指定TIM通道
  878. * @arg TIM_CHANNEL_1
  879. * @arg TIM_CHANNEL_2
  880. * @arg TIM_CHANNEL_3
  881. * @param negtive_idlestate 互补通道空闲状态
  882. * @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
  883. * @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
  884. * @retval 无
  885. */
  886. __STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
  887. {
  888. MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
  889. }
  890. /**
  891. * @brief 获取TIM互补通道的空闲状态
  892. * @param timx TIM外设
  893. * @param channel_id 指定TIM通道
  894. * @arg TIM_CHANNEL_1
  895. * @arg TIM_CHANNEL_2
  896. * @arg TIM_CHANNEL_3
  897. * @retval uint32_t 互补通道空闲状态
  898. * @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
  899. * @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
  900. */
  901. __STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
  902. {
  903. return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);
  904. }
  905. /**
  906. * @brief 使能清除OCxREF功能
  907. * @param timx TIM外设
  908. * @param channel_id 指定TIM通道
  909. * @arg TIM_CHANNEL_1
  910. * @arg TIM_CHANNEL_2
  911. * @arg TIM_CHANNEL_3
  912. * @arg TIM_CHANNEL_4
  913. * @retval 无
  914. */
  915. __STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
  916. {
  917. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  918. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  919. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  920. /* 使能清除OCxREF */
  921. *preg |= (TIM_CCM1_OC1CE << tmp_value);
  922. }
  923. /**
  924. * @brief 禁止清除OCxREF功能
  925. * @param timx TIM外设
  926. * @param channel_id 指定TIM通道
  927. * @arg TIM_CHANNEL_1
  928. * @arg TIM_CHANNEL_2
  929. * @arg TIM_CHANNEL_3
  930. * @arg TIM_CHANNEL_4
  931. * @retval 无
  932. */
  933. __STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
  934. {
  935. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  936. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  937. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  938. /* 禁止清除OCxREF */
  939. *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
  940. }
  941. /**
  942. * @brief 设置输入捕获预分频值
  943. * @param timx TIM外设
  944. * @param channel_id 指定TIM通道
  945. * @arg TIM_CHANNEL_1
  946. * @arg TIM_CHANNEL_2
  947. * @param icxpsc_num 输入捕获预分频值
  948. * @arg TIM_INPUT_CAPTURE_PSC_DIV1
  949. * @arg TIM_INPUT_CAPTURE_PSC_DIV2
  950. * @arg TIM_INPUT_CAPTURE_PSC_DIV4
  951. * @arg TIM_INPUT_CAPTURE_PSC_DIV8
  952. * @retval 无
  953. */
  954. __STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
  955. {
  956. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  957. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  958. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  959. /* 设置输入捕获预分频 */
  960. MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
  961. }
  962. /**
  963. * @brief 获取输入捕获预分频值
  964. * @param timx TIM外设
  965. * @param channel_id 指定TIM通道
  966. * @arg TIM_CHANNEL_1
  967. * @arg TIM_CHANNEL_2
  968. * @retval uint32_t 输入捕获预分频值
  969. * @arg TIM_INPUT_CAPTURE_PSC_DIV1
  970. * @arg TIM_INPUT_CAPTURE_PSC_DIV2
  971. * @arg TIM_INPUT_CAPTURE_PSC_DIV4
  972. * @arg TIM_INPUT_CAPTURE_PSC_DIV8
  973. */
  974. __STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
  975. {
  976. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  977. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  978. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  979. /* 获取输入捕获预分频 */
  980. return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
  981. }
  982. /**
  983. * @brief 使能TIM通道输出比较的预装载功能
  984. * @param timx TIM外设
  985. * @param channel_id 指定TIM通道
  986. * @arg TIM_CHANNEL_1
  987. * @arg TIM_CHANNEL_2
  988. * @arg TIM_CHANNEL_3
  989. * @arg TIM_CHANNEL_4
  990. * @retval 无
  991. */
  992. __STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
  993. {
  994. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  995. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  996. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  997. /* 使能输出比较预装载功能 */
  998. *preg |= (TIM_CCM1_OC1PE << tmp_value);
  999. }
  1000. /**
  1001. * @brief 禁止TIM通道输出比较的预装载功能
  1002. * @param timx TIM外设
  1003. * @param channel_id 指定TIM通道
  1004. * @arg TIM_CHANNEL_1
  1005. * @arg TIM_CHANNEL_2
  1006. * @arg TIM_CHANNEL_3
  1007. * @arg TIM_CHANNEL_4
  1008. * @retval 无
  1009. */
  1010. __STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
  1011. {
  1012. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1013. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1014. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1015. /* 使能输出比较预装载功能 */
  1016. *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
  1017. }
  1018. /**
  1019. * @brief 使能TIM通道快速模式
  1020. * @param timx TIM外设
  1021. * @param channel_id 指定TIM通道
  1022. * @arg TIM_CHANNEL_1
  1023. * @arg TIM_CHANNEL_2
  1024. * @arg TIM_CHANNEL_3
  1025. * @arg TIM_CHANNEL_4
  1026. * @retval 无
  1027. */
  1028. __STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
  1029. {
  1030. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1031. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1032. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1033. /* 使能输出比较预装载功能 */
  1034. *preg |= (TIM_CCM1_OC1FE << tmp_value);
  1035. }
  1036. /**
  1037. * @brief 禁止TIM通道快速模式
  1038. * @param timx TIM外设
  1039. * @param channel_id 指定TIM通道
  1040. * @arg TIM_CHANNEL_1
  1041. * @arg TIM_CHANNEL_2
  1042. * @arg TIM_CHANNEL_3
  1043. * @arg TIM_CHANNEL_4
  1044. * @retval 无
  1045. */
  1046. __STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
  1047. {
  1048. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1049. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1050. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1051. /* 禁止输出快速模式 */
  1052. *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
  1053. }
  1054. /**
  1055. * @brief 配置通道输出模式
  1056. * @param timx TIM外设
  1057. * @param channel_id 指定TIM通道
  1058. * @arg TIM_CHANNEL_1
  1059. * @arg TIM_CHANNEL_2
  1060. * @arg TIM_CHANNEL_3
  1061. * @arg TIM_CHANNEL_4
  1062. * @param ocmode 输出模式选择
  1063. * @arg TIM_OUTPUT_MODE_FROZEN
  1064. * @arg TIM_OUTPUT_MODE_ACTIVE
  1065. * @arg TIM_OUTPUT_MODE_INACTIVE
  1066. * @arg TIM_OUTPUT_MODE_TOGGLE
  1067. * @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
  1068. * @arg TIM_OUTPUT_MODE_FORCED_ACTIVE
  1069. * @arg TIM_OUTPUT_MODE_PWM1
  1070. * @arg TIM_OUTPUT_MODE_PWM2
  1071. * @retval 无
  1072. */
  1073. __STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
  1074. {
  1075. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1076. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1077. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1078. MODIFY_REG(*preg, ((TIM_CCM1_OC1M | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
  1079. }
  1080. /**
  1081. * @brief 获取通道输出模式
  1082. * @param timx TIM外设
  1083. * @param channel_id 指定TIM通道
  1084. * @arg TIM_CHANNEL_1
  1085. * @arg TIM_CHANNEL_2
  1086. * @arg TIM_CHANNEL_3
  1087. * @arg TIM_CHANNEL_4
  1088. * @note 该函数执行后,会将通道设置为输出模式
  1089. * @retval uint32_t 输出模式选择
  1090. * @arg TIM_OUTPUT_MODE_FROZEN
  1091. * @arg TIM_OUTPUT_MODE_ACTIVE
  1092. * @arg TIM_OUTPUT_MODE_INACTIVE
  1093. * @arg TIM_OUTPUT_MODE_TOGGLE
  1094. * @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
  1095. * @arg TIM_OUTPUT_MODE_FORCED_ACTIVE
  1096. * @arg TIM_OUTPUT_MODE_PWM1
  1097. * @arg TIM_OUTPUT_MODE_PWM2
  1098. */
  1099. __STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
  1100. {
  1101. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1102. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1103. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1104. return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
  1105. }
  1106. /**
  1107. * @brief 设置捕获/比较寄存器的值
  1108. * @param timx TIM外设
  1109. * @param ccx_value 捕获比较寄存器的值
  1110. * @param channel_id TIM 通道配置
  1111. * @arg TIM_CHANNEL_1
  1112. * @arg TIM_CHANNEL_2
  1113. * @arg TIM_CHANNEL_3
  1114. * @arg TIM_CHANNEL_4
  1115. * @retval std_status_t 返回API执行结果
  1116. */
  1117. __STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
  1118. {
  1119. if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
  1120. {
  1121. __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
  1122. MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);
  1123. }
  1124. else
  1125. {
  1126. uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;
  1127. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;
  1128. __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
  1129. MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
  1130. }
  1131. }
  1132. /**
  1133. * @brief 获取捕获/比较寄存器的值
  1134. * @param timx TIM外设
  1135. * @param channel_id TIM 通道配置
  1136. * @arg TIM_CHANNEL_1
  1137. * @arg TIM_CHANNEL_2
  1138. * @arg TIM_CHANNEL_3
  1139. * @arg TIM_CHANNEL_4
  1140. * @retval uint32_t 捕获比较寄存器的值
  1141. */
  1142. __STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
  1143. {
  1144. if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
  1145. {
  1146. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
  1147. return (*preg & TIM_CC1_CC1);
  1148. }
  1149. else
  1150. {
  1151. uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;
  1152. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;
  1153. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
  1154. return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
  1155. }
  1156. }
  1157. /**
  1158. * @brief 设置通道为输入模式
  1159. * @param timx TIM外设
  1160. * @param channel_id TIM 通道配置
  1161. * @arg TIM_CHANNEL_1
  1162. * @arg TIM_CHANNEL_2
  1163. * @param icmode 输入模式选择
  1164. * @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
  1165. * @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
  1166. * @arg TIM_INPUT_CAPTURE_SEL_TRC
  1167. * @retval 无
  1168. */
  1169. __STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
  1170. {
  1171. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1172. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1173. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1174. MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
  1175. }
  1176. /**
  1177. * @brief 获取通道的输入状态
  1178. * @param timx TIM外设
  1179. * @param channel_id TIM 通道配置
  1180. * @arg TIM_CHANNEL_1
  1181. * @arg TIM_CHANNEL_2
  1182. * @retval uint32_t 输入模式选择
  1183. * @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
  1184. * @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
  1185. * @arg TIM_INPUT_CAPTURE_SEL_TRC
  1186. */
  1187. __STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
  1188. {
  1189. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1190. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1191. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1192. return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
  1193. }
  1194. /**
  1195. * @brief 设置输入通道的滤波参数
  1196. * @param timx TIM外设
  1197. * @param channel_id TIM 通道配置
  1198. * @arg TIM_CHANNEL_1
  1199. * @arg TIM_CHANNEL_2
  1200. * @param icfilter 输入滤波参数,其值的范围为:0x00~0x0F
  1201. * @retval 无
  1202. */
  1203. __STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
  1204. {
  1205. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1206. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1207. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1208. MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
  1209. }
  1210. /**
  1211. * @brief 获取输入通道的滤波参数
  1212. * @param timx TIM外设
  1213. * @param channel_id TIM 通道配置
  1214. * @arg TIM_CHANNEL_1
  1215. * @arg TIM_CHANNEL_2
  1216. * @retval uint32_t 输入滤波参数,其值的范围为:0x00~0x0F
  1217. */
  1218. __STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
  1219. {
  1220. uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
  1221. uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;
  1222. __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
  1223. return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
  1224. }
  1225. /**
  1226. * @brief 设置主模式(TRIG_OUT)输出参数
  1227. * @param timx TIM外设
  1228. * @param trigout_mode 主模式输出参数定义
  1229. * @arg TIM_TRIG_OUT_RESET
  1230. * @arg TIM_TRIG_OUT_ENABLE
  1231. * @arg TIM_TRIG_OUT_UPDATE
  1232. * @arg TIM_TRIG_OUT_CC1
  1233. * @arg TIM_TRIG_OUT_OC1REF
  1234. * @arg TIM_TRIG_OUT_OC2REF
  1235. * @arg TIM_TRIG_OUT_OC3REF
  1236. * @arg TIM_TRIG_OUT_OC4REF
  1237. * @retval 无
  1238. */
  1239. __STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
  1240. {
  1241. MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
  1242. }
  1243. /**
  1244. * @brief 设置从模式参数
  1245. * @param timx TIM外设
  1246. * @param slave_mode 从模式参数定义
  1247. * @arg TIM_SLAVE_MODE_DISABLE
  1248. * @arg TIM_SLAVE_MODE_RESET
  1249. * @arg TIM_SLAVE_MODE_GATED
  1250. * @arg TIM_SLAVE_MODE_TRIG
  1251. * @retval 无
  1252. */
  1253. __STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
  1254. {
  1255. MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
  1256. }
  1257. /**
  1258. * @brief 设置触发输入源
  1259. * @param timx TIM外设
  1260. * @param trig_source 触发输入源定义
  1261. * @arg TIM_TRIG_SOURCE_ITR0
  1262. * @arg TIM_TRIG_SOURCE_TI1F_ED
  1263. * @arg TIM_TRIG_SOURCE_TI1FP1
  1264. * @arg TIM_TRIG_SOURCE_TI2FP2
  1265. * @retval 无
  1266. */
  1267. __STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
  1268. {
  1269. MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
  1270. }
  1271. /**
  1272. * @brief 使能主/从模式
  1273. * @param timx TIM外设
  1274. * @retval 无
  1275. */
  1276. __STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
  1277. {
  1278. timx->SMC |= TIM_SMC_MS_MOD;
  1279. }
  1280. /**
  1281. * @brief 禁止主/从模式
  1282. * @param timx TIM外设
  1283. * @retval 无
  1284. */
  1285. __STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
  1286. {
  1287. timx->SMC &= (~TIM_SMC_MS_MOD);
  1288. }
  1289. /**
  1290. * @brief 配置TIM OCREF CLEAR输入源
  1291. * @param timx TIM外设
  1292. * @param ocrefclr_source OCREF CLR源选择
  1293. * @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
  1294. * @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
  1295. * @retval 无
  1296. */
  1297. __STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
  1298. {
  1299. MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
  1300. }
  1301. /**
  1302. * @brief 使能输入捕获/输出比较换相预装载
  1303. * @param timx TIM外设
  1304. * @note 该函数仅对互补通道有效
  1305. * @retval 无
  1306. */
  1307. __STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
  1308. {
  1309. timx->CR2 |= TIM_CR2_CC_PRECR;
  1310. }
  1311. /**
  1312. * @brief 禁止输入捕获/输出比较换相预装载
  1313. * @param timx TIM外设
  1314. * @note 该函数仅对互补通道有效
  1315. * @retval 无
  1316. */
  1317. __STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
  1318. {
  1319. timx->CR2 &= (~TIM_CR2_CC_PRECR);
  1320. }
  1321. /**
  1322. * @brief 配置换相控制更新源选择
  1323. * @param timx TIM外设
  1324. * @param ccupdate_source 换相更新源
  1325. * @arg TIM_COM_SOFTWARE
  1326. * @arg TIM_COM_TRGI
  1327. * @note 该函数仅对互补通道有效
  1328. * @retval 无
  1329. */
  1330. __STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
  1331. {
  1332. MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
  1333. }
  1334. /**
  1335. * @brief 使能TI1的XOR功能
  1336. * @param timx TIM外设
  1337. * @retval 无
  1338. */
  1339. __STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
  1340. {
  1341. timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
  1342. }
  1343. /**
  1344. * @brief 禁止TI1的XOR功能
  1345. * @param timx TIM外设
  1346. * @retval 无
  1347. */
  1348. __STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
  1349. {
  1350. timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
  1351. }
  1352. /**
  1353. * @brief 配置TIM输入通道重映射功能
  1354. * @param timx TIM外设
  1355. * @param ti_sel 通道输入源选择参数
  1356. * @arg TIM_TIM3_TI1_GPIO: TIM3 TI1连接到GPIO
  1357. * @arg TIM_TIM3_TI1_COMP1: TIM3 TI1连接到COMP1输出
  1358. * @arg TIM_TIM3_TI2_GPIO: TIM3 TI2连接到GPIO
  1359. * @arg TIM_TIM3_TI2_COMP2: TIM3 TI2连接到COMP2输出
  1360. * @param channel_id TIM通道
  1361. * @arg TIM_CHANNEL_1
  1362. * @arg TIM_CHANNEL_2
  1363. * @retval 无
  1364. */
  1365. __STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
  1366. {
  1367. MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
  1368. }
  1369. /**
  1370. * @brief TIM输出使能
  1371. * @param timx TIM外设
  1372. * @retval 无
  1373. */
  1374. __STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)
  1375. {
  1376. timx->BDT |= (TIM_BDT_MOEN);
  1377. }
  1378. /**
  1379. * @brief TIM输出禁止
  1380. * @param timx TIM外设
  1381. * @retval 无
  1382. */
  1383. __STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)
  1384. {
  1385. timx->BDT &= (~TIM_BDT_MOEN);
  1386. }
  1387. /**
  1388. * @brief TIM自动输出使能
  1389. * @param timx TIM外设
  1390. * @retval 无
  1391. */
  1392. __STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)
  1393. {
  1394. timx->BDT |= (TIM_BDT_AOEN);
  1395. }
  1396. /**
  1397. * @brief TIM自动输出禁止
  1398. * @param timx TIM外设
  1399. * @retval 无
  1400. */
  1401. __STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)
  1402. {
  1403. timx->BDT &= (~TIM_BDT_AOEN);
  1404. }
  1405. /**
  1406. * @brief 使能OSSR功能
  1407. * @param timx TIM外设
  1408. * @retval 无
  1409. */
  1410. __STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)
  1411. {
  1412. timx->BDT |= TIM_BDT_OSSR;
  1413. }
  1414. /**
  1415. * @brief 禁止OSSR功能
  1416. * @param timx TIM外设
  1417. * @retval 无
  1418. */
  1419. __STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)
  1420. {
  1421. timx->BDT &= (~TIM_BDT_OSSR);
  1422. }
  1423. /**
  1424. * @brief 使能OSSI功能
  1425. * @param timx TIM外设
  1426. * @retval 无
  1427. */
  1428. __STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)
  1429. {
  1430. timx->BDT |= TIM_BDT_OSSI;
  1431. }
  1432. /**
  1433. * @brief 禁止OSSI功能
  1434. * @param timx TIM外设
  1435. * @retval 无
  1436. */
  1437. __STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)
  1438. {
  1439. timx->BDT &= (~TIM_BDT_OSSI);
  1440. }
  1441. /**
  1442. * @brief 使能TIM断路
  1443. * @param timx TIM外设
  1444. * @retval 无
  1445. */
  1446. __STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)
  1447. {
  1448. timx->BDT |= TIM_BDT_BKEN;
  1449. }
  1450. /**
  1451. * @brief 禁止TIM断路
  1452. * @param timx TIM外设
  1453. * @retval 无
  1454. */
  1455. __STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)
  1456. {
  1457. timx->BDT &= (~TIM_BDT_BKEN);
  1458. }
  1459. /**
  1460. * @brief 使能断路源
  1461. * @param timx TIM外设
  1462. * @param brk_source 断路输入源定义
  1463. * @arg TIM_BREAK_INPUT_SRC_GPIO
  1464. * @arg TIM_BREAK_INPUT_SRC_COMP1
  1465. * @arg TIM_BREAK_INPUT_SRC_COMP2
  1466. * @retval 无
  1467. */
  1468. __STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
  1469. {
  1470. timx->AF1 |= brk_source;
  1471. }
  1472. /**
  1473. * @brief 配置断路的极性
  1474. * @param timx TIM外设
  1475. * @param brk_source 断路输入源定义
  1476. * @arg TIM_BREAK_INPUT_SRC_GPIO
  1477. * @arg TIM_BREAK_INPUT_SRC_COMP1
  1478. * @arg TIM_BREAK_INPUT_SRC_COMP2
  1479. * @param brk_pol 断路输入极性定义
  1480. * @arg TIM_BREAK_INPUT_POL_HIGH
  1481. * @arg TIM_BREAK_INPUT_POL_LOW
  1482. * @retval 无
  1483. */
  1484. __STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
  1485. {
  1486. MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
  1487. }
  1488. /**
  1489. * @brief 配置TIM死区时间
  1490. * @param timx TIM外设
  1491. * @param deadtime 死区时间,该值的范围:0x00~0xFF
  1492. * @retval 无
  1493. */
  1494. __STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
  1495. {
  1496. MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
  1497. }
  1498. /**
  1499. * @brief 获取TIM死区时间
  1500. * @param timx TIM外设
  1501. * @retval uint32_t 死区时间,其值范围为:0x00~0xFF
  1502. */
  1503. __STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
  1504. {
  1505. return (timx->BDT & TIM_BDT_DTG);
  1506. }
  1507. /**
  1508. * @brief 配置TIM的锁定级别
  1509. * @param timx TIM外设
  1510. * @param locklevel LOCK锁定级别
  1511. * @arg TIM_LOCK_LEVEL_OFF
  1512. * @arg TIM_LOCK_LEVEL1
  1513. * @arg TIM_LOCK_LEVEL2
  1514. * @arg TIM_LOCK_LEVEL3
  1515. * @retval 无
  1516. */
  1517. __STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
  1518. {
  1519. MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
  1520. }
  1521. /**
  1522. * @brief 获取TIM锁定级别
  1523. * @param timx TIM外设
  1524. * @retval uint32_t LOCK锁定级别
  1525. * @arg TIM_LOCK_LEVEL_OFF
  1526. * @arg TIM_LOCK_LEVEL1
  1527. * @arg TIM_LOCK_LEVEL2
  1528. * @arg TIM_LOCK_LEVEL3
  1529. */
  1530. __STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
  1531. {
  1532. return (timx->BDT & TIM_BDT_LOCK);
  1533. }
  1534. /**
  1535. * @brief 使能LOCKUP锁定功能
  1536. * @param timx TIM外设
  1537. * @retval 无
  1538. */
  1539. __STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
  1540. {
  1541. timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
  1542. }
  1543. /* 基础计数功能初始化/去初始化 */
  1544. void std_tim_deinit(TIM_t *timx);
  1545. void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
  1546. void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);
  1547. /* 输入捕获初始化 */
  1548. void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
  1549. void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);
  1550. /* 输出模式初始化及参数配置函数 */
  1551. void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
  1552. void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);
  1553. /* 断路功能初始化 */
  1554. void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
  1555. void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);
  1556. /**
  1557. * @}
  1558. */
  1559. #ifdef __cplusplus
  1560. }
  1561. #endif
  1562. /**
  1563. * @}
  1564. */
  1565. /**
  1566. * @}
  1567. */
  1568. #endif /* CIU32F003_STD_TIM_H */