fm33lc0xx_fl_lptim32.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /**
  2. ****************************************************************************************************
  3. * @file fm33lc0xx_fl_lptim32.c
  4. * @author FMSH Application Team
  5. * @brief Src file of LPTIM32 FL Module
  6. ****************************************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) [2019] [Fudan Microelectronics]
  10. * THIS SOFTWARE is licensed under the Mulan PSL v1.
  11. * can use this software according to the terms and conditions of the Mulan PSL v1.
  12. * You may obtain a copy of Mulan PSL v1 at:
  13. * http://license.coscl.org.cn/MulanPSL
  14. * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
  16. * PURPOSE.
  17. * See the Mulan PSL v1 for more details.
  18. *
  19. ****************************************************************************************************
  20. */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "fm33lc0xx_fl_rcc.h"
  23. #include "fm33lc0xx_fl_lptim32.h"
  24. #include "fm33_assert.h"
  25. /** @addtogroup FM33LC0XX_FL_Driver
  26. * @{
  27. */
  28. /** @addtogroup LPTIM32
  29. * @{
  30. */
  31. /* Private macros ------------------------------------------------------------*/
  32. /** @addtogroup LPTIM32_FL_Private_Macros
  33. * @{
  34. */
  35. #define IS_LPTIM32_INSTANCE(INSTANCE) (((INSTANCE) == LPTIM32))
  36. #define IS_FL_LPTIM32_OPCLK_SOURCE(__VALUE__) (((__VALUE__) == FL_RCC_LPTIM32_CLK_SOURCE_APB1CLK)||\
  37. ((__VALUE__) == FL_RCC_LPTIM32_CLK_SOURCE_LSCLK)||\
  38. ((__VALUE__) == FL_RCC_LPTIM32_CLK_SOURCE_RCLP)||\
  39. ((__VALUE__) == FL_RCC_LPTIM32_CLK_SOURCE_RCMF_PSC))
  40. #define IS_FL_LPTIM32_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM32_CLK_SOURCE_INTERNAL)||\
  41. ((__VALUE__) == FL_LPTIM32_CLK_SOURCE_EXTERNAL))
  42. #define IS_FL_LPTIM32_PRESCALER(__VALUE__) (((__VALUE__) == FL_LPTIM32_PSC_DIV1)||\
  43. ((__VALUE__) == FL_LPTIM32_PSC_DIV2)||\
  44. ((__VALUE__) == FL_LPTIM32_PSC_DIV4)||\
  45. ((__VALUE__) == FL_LPTIM32_PSC_DIV8)||\
  46. ((__VALUE__) == FL_LPTIM32_PSC_DIV16)||\
  47. ((__VALUE__) == FL_LPTIM32_PSC_DIV32)||\
  48. ((__VALUE__) == FL_LPTIM32_PSC_DIV64)||\
  49. ((__VALUE__) == FL_LPTIM32_PSC_DIV128))
  50. #define IS_FL_LPTIM32_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM32_OPERATION_MODE_NORMAL)||\
  51. ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT)||\
  52. ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT)||\
  53. ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_TIMEOUT))
  54. #define IS_FL_LPTIM32_ETR_TRIGEER_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_RISING)||\
  55. ((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_FALLING)||\
  56. ((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH))
  57. #define IS_FL_LPTIM32_ONE_PULSE_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS)||\
  58. ((__VALUE__) == FL_LPTIM32_ONE_PULSE_MODE_SINGLE))
  59. #define IS_FL_LPTIM32_ETR_COUNT_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ETR_COUNT_EDGE_RISING)||\
  60. ((__VALUE__) == FL_LPTIM32_ETR_COUNT_EDGE_FALLING))
  61. #define IS_FL_LPTIM32_IC_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_IC_EDGE_RISING)||\
  62. ((__VALUE__) == FL_LPTIM32_IC_EDGE_FALLING)||\
  63. ((__VALUE__) == FL_LPTIM32_IC_EDGE_BOTH))
  64. #define IS_FL_LPTIM32_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_LPTIM32_OC_POLARITY_NORMAL)||\
  65. ((__VALUE__) == FL_LPTIM32_OC_POLARITY_INVERT))
  66. #define IS_FL_LPTIM32_CHANNEL(__VALUE__) (((__VALUE__) == FL_LPTIM32_CHANNEL_1)||\
  67. ((__VALUE__) == FL_LPTIM32_CHANNEL_2))
  68. #define IS_FL_LPTIM32_CAPTURE_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM32_IC_CAPTURE_SOURCE_GROUP0)||\
  69. ((__VALUE__) == FL_LPTIM32_IC_CAPTURE_SOURCE_GROUP1)||\
  70. ((__VALUE__) == FL_LPTIM32_IC_CAPTURE_SOURCE_GROUP2)||\
  71. ((__VALUE__) == FL_LPTIM32_IC_CAPTURE_SOURCE_GROUP3))
  72. /**
  73. * @}
  74. */
  75. /** @addtogroup LPTIM32_FL_EF_Init
  76. * @{
  77. */
  78. /**
  79. * @brief 复位LPTIM32外设
  80. * @param LPTIM32x 外设入口地址
  81. * @retval 错误状态,可能值:
  82. * -FL_PASS 外设寄存器值恢复复位值
  83. * -FL_FAIL 未成功执行
  84. */
  85. FL_ErrorStatus FL_LPTIM32_DeInit(LPTIM32_Type *LPTIM32x)
  86. {
  87. FL_ErrorStatus status = FL_FAIL;
  88. assert_param(IS_LPTIM32_INSTANCE(LPTIM32x));
  89. /* 使能外设复位 */
  90. FL_RCC_EnablePeripheralReset();
  91. /*复位LPTIM*/
  92. FL_RCC_EnableResetAPB1Peripheral(FL_RCC_RSTAPB_LPTIM32);
  93. FL_RCC_DisableResetAPB1Peripheral(FL_RCC_RSTAPB_LPTIM32);
  94. /* 关闭外设总线时钟和工作时钟 */
  95. FL_RCC_DisableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_LPTIM32);
  96. FL_RCC_DisableGroup2OperationClock(FL_RCC_GROUP2_OPCLK_LPTIM32);
  97. /* 锁定外设复位功能 */
  98. FL_RCC_DisablePeripheralReset();
  99. status = FL_PASS;
  100. return status;
  101. }
  102. /**
  103. * @brief 配置LPTIM32工作在定时器模式
  104. *
  105. * @note 其中 @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT 模式需要外部脉冲提供给LPTIM32模块作为工作时钟,此时
  106. * LPTIM32完全工作在异步模式下。
  107. * @param LPTIM32x 外设入口地址
  108. * @param initStruct 指向 @ref FL_LPTIM32_InitTypeDef 结构体的指针
  109. *
  110. * @retval 错误状态,可能值:
  111. * -FL_PASS 配置成功
  112. * -FL_FAIL 配置过程发生错误
  113. */
  114. FL_ErrorStatus FL_LPTIM32_Init(LPTIM32_Type *LPTIM32x, FL_LPTIM32_InitTypeDef *initStruct)
  115. {
  116. FL_ErrorStatus status = FL_PASS;
  117. /* 检查入口参数 */
  118. assert_param(IS_LPTIM32_INSTANCE(LPTIM32x));
  119. assert_param(IS_FL_LPTIM32_OPCLK_SOURCE(initStruct->clockSource));
  120. assert_param(IS_FL_LPTIM32_CLK_SOURCE(initStruct->prescalerClockSource));
  121. assert_param(IS_FL_LPTIM32_PRESCALER(initStruct->prescaler));
  122. assert_param(IS_FL_LPTIM32_MODE(initStruct->mode));
  123. assert_param(IS_FL_LPTIM32_ETR_TRIGEER_EDGE(initStruct->triggerEdge));
  124. assert_param(IS_FL_LPTIM32_ONE_PULSE_MODE(initStruct->onePulseMode));
  125. assert_param(IS_FL_LPTIM32_ETR_COUNT_EDGE(initStruct->countEdge));
  126. /* 时钟配置 */
  127. if(LPTIM32x == LPTIM32)
  128. {
  129. /* 使能总线时钟 */
  130. FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_LPTIM32);
  131. /* 除了异步计数模式,其他模式都需要使能工作时钟 */
  132. if(initStruct->mode != FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT)
  133. {
  134. /* 使能工作时钟 */
  135. FL_RCC_EnableGroup2OperationClock(FL_RCC_GROUP2_OPCLK_LPTIM32);
  136. /* 设置工作时钟时钟源 */
  137. FL_RCC_SetLPTIM32ClockSource(initStruct->clockSource);
  138. }
  139. }
  140. /* 配置分频器的时钟源 */
  141. FL_LPTIM32_SetClockSource(LPTIM32x, initStruct->prescalerClockSource);
  142. /* 配置时钟分频 */
  143. FL_LPTIM32_SetPrescaler(LPTIM32x, initStruct->prescaler);
  144. /* 配置定时器工作模式 */
  145. FL_LPTIM32_SetOperationMode(LPTIM32x, initStruct->mode);
  146. /* 配置定时器不同模式下的特殊寄存器 */
  147. switch(initStruct->mode)
  148. {
  149. case FL_LPTIM32_OPERATION_MODE_NORMAL:
  150. {
  151. }
  152. break;
  153. case FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT:
  154. {
  155. /* 配置外部输入有效边沿 */
  156. FL_LPTIM32_SetETRTriggerEdge(LPTIM32x, initStruct->triggerEdge);
  157. }
  158. break;
  159. case FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT:
  160. {
  161. /* 配置外部计数边沿 */
  162. FL_LPTIM32_SetETRCountEdge(LPTIM32x, initStruct->countEdge);
  163. /* 开启外部输入滤波 */
  164. FL_LPTIM32_EnableETRFilter(LPTIM32x);
  165. }
  166. break;
  167. case FL_LPTIM32_OPERATION_MODE_TIMEOUT:
  168. {
  169. /* 配置外部输入有效边沿 */
  170. FL_LPTIM32_SetETRTriggerEdge(LPTIM32x, initStruct->triggerEdge);
  171. }
  172. break;
  173. }
  174. /* 单次计数模式 */
  175. FL_LPTIM32_SetOnePulseMode(LPTIM32x, initStruct->onePulseMode);
  176. /* 设置重装载值 */
  177. FL_LPTIM32_WriteAutoReload(LPTIM32x, initStruct->autoReload);
  178. return status;
  179. }
  180. /**
  181. * @brief 将 @ref FL_LPTIM32_InitTypeDef 结构体初始化为默认配置
  182. * @param initStruct 指向 @ref FL_LPTIM32_InitTypeDef 结构体的指针
  183. *
  184. * @retval None
  185. */
  186. void FL_LPTIM32_StructInit(FL_LPTIM32_InitTypeDef *initStruct)
  187. {
  188. initStruct->clockSource = FL_RCC_LPTIM32_CLK_SOURCE_APB1CLK;
  189. initStruct->prescalerClockSource = FL_LPTIM32_CLK_SOURCE_INTERNAL;
  190. initStruct->prescaler = FL_LPTIM32_PSC_DIV1;
  191. initStruct->autoReload = 0;
  192. initStruct->mode = FL_LPTIM32_OPERATION_MODE_NORMAL;
  193. initStruct->countEdge = FL_LPTIM32_ETR_COUNT_EDGE_RISING;
  194. initStruct->triggerEdge = FL_LPTIM32_ETR_TRIGGER_EDGE_RISING;
  195. initStruct->onePulseMode = FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS;
  196. }
  197. /**
  198. * @brief 配置LPTIM32工作在输入捕获模式
  199. *
  200. * @param LPTIM32x 外设入口地址
  201. * @param initStruct_IC 指向 @ref FL_LPTIM32_IC_InitTypeDef 结构体的指针
  202. * @param channel LPTIM32通道
  203. * 此参数可取以下值:
  204. * @arg @ref FL_LPTIM32_CHANNEL_1
  205. * @arg @ref FL_LPTIM32_CHANNEL_2
  206. *
  207. * @retval 错误状态,可能值:
  208. * -FL_PASS 配置成功
  209. * -FL_FAIL 配置过程发生错误
  210. */
  211. FL_ErrorStatus FL_LPTIM32_IC_Init(LPTIM32_Type *LPTIM32x, uint32_t channel, FL_LPTIM32_IC_InitTypeDef *initStruct_IC)
  212. {
  213. FL_ErrorStatus status = FL_PASS;
  214. /* 参数检查 */
  215. assert_param(IS_LPTIM32_INSTANCE(LPTIM32x));
  216. assert_param(IS_FL_LPTIM32_CHANNEL(channel));
  217. assert_param(IS_FL_LPTIM32_IC_EDGE(initStruct_IC->ICEdge));
  218. assert_param(IS_FL_LPTIM32_CAPTURE_SOURCE(initStruct_IC->ICSource));
  219. /* 通道捕获源 */
  220. FL_LPTIM32_IC_SetCaptureSource(LPTIM32, initStruct_IC->ICSource, channel);
  221. /* 捕获通道边沿 */
  222. FL_LPTIM32_IC_SetCaptureEdge(LPTIM32, initStruct_IC->ICEdge, channel);
  223. /* 通道输入捕获使能 */
  224. FL_LPTIM32_SetChannelMode(LPTIM32, FL_LPTIM32_CHANNEL_MODE_INPUT, channel);
  225. return status;
  226. }
  227. /**
  228. * @brief 将 @ref FL_LPTIM32_IC_InitTypeDef 结构体初始化为默认配置
  229. * @param initStruct_IC 指向 @ref FL_LPTIM32_IC_InitTypeDef 结构体的指针
  230. *
  231. * @retval None
  232. */
  233. void FL_LPTIM32_IC_StructInit(FL_LPTIM32_IC_InitTypeDef *initStruct_IC)
  234. {
  235. initStruct_IC->ICEdge = FL_LPTIM32_IC_EDGE_RISING;
  236. initStruct_IC->ICSource = FL_LPTIM32_IC_CAPTURE_SOURCE_GROUP0;
  237. }
  238. /**
  239. * @brief 配置LPTIM32寄存器工作在输出比较模式
  240. *
  241. * @param LPTIM32x 外设入口地址
  242. * @param initStruct_OC 指向 @ref FL_LPTIM32_OC_InitTypeDef 结构体的指针
  243. * @param channel LPTIM32通道
  244. * 此参数可取以下值:
  245. * @arg @ref FL_LPTIM32_CHANNEL_1
  246. * @arg @ref FL_LPTIM32_CHANNEL_2
  247. *
  248. * @retval ErrorStatus枚举值
  249. * -FL_PASS 配置成功
  250. * -FL_FAIL 配置过程发生错误
  251. */
  252. FL_ErrorStatus FL_LPTIM32_OC_Init(LPTIM32_Type *LPTIM32x, uint32_t channel, FL_LPTIM32_OC_InitTypeDef *initStruct_OC)
  253. {
  254. FL_ErrorStatus result = FL_PASS;
  255. /* 参数检查 */
  256. assert_param(IS_LPTIM32_INSTANCE(LPTIM32x));
  257. assert_param(IS_FL_LPTIM32_CHANNEL(channel));
  258. assert_param(IS_FL_LPTIM32_OC_POLARITY(initStruct_OC->OCPolarity));
  259. /* 比较通道极性 */
  260. FL_LPTIM32_OC_SetPolarity(LPTIM32x, initStruct_OC->OCPolarity, channel);
  261. /* 设置比较值 */
  262. switch(channel)
  263. {
  264. case FL_LPTIM32_CHANNEL_1:
  265. FL_LPTIM32_WriteCompareCH1(LPTIM32x, initStruct_OC->compareValue);
  266. break;
  267. case FL_LPTIM32_CHANNEL_2:
  268. FL_LPTIM32_WriteCompareCH2(LPTIM32x, initStruct_OC->compareValue);
  269. break;
  270. default :
  271. result = FL_FAIL;
  272. break;
  273. }
  274. /* 通道输出比较使能 */
  275. FL_LPTIM32_SetChannelMode(LPTIM32x, FL_LPTIM32_CHANNEL_MODE_OUTPUT, channel);
  276. return result;
  277. }
  278. /**
  279. * @brief 将 @ref FL_LPTIM32_OC_InitTypeDef 结构体初始化为默认配置
  280. * @param initStruct_OC 指向 @ref FL_LPTIM32_OC_InitTypeDef 结构体的指针
  281. *
  282. * @retval None
  283. */
  284. void FL_LPTIM32_OC_StructInit(FL_LPTIM32_OC_InitTypeDef *initStruct_OC)
  285. {
  286. initStruct_OC->compareValue = 0;
  287. initStruct_OC->OCPolarity = FL_LPTIM32_OC_POLARITY_NORMAL;
  288. }
  289. /**
  290. * @}
  291. */
  292. /**
  293. * @}
  294. */
  295. /**
  296. * @}
  297. */
  298. /******************************************* END OF FILE *******************************************/