lib_u32k.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /**
  2. ******************************************************************************
  3. * @file lib_u32k.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief UART 32K library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_u32k.h"
  14. #define U32K_STS_Msk (0x7UL)
  15. #define U32K_CTRL0_RSTValue (0UL)
  16. #define U32K_CTRL1_RSTValue (0UL)
  17. #define U32K_PHASE_RSTValue (0x4B00UL)
  18. /**
  19. * @brief Initializes the U32Kx peripheral registers to their default reset values.
  20. * @param U32Kx: U32K0~U32K1
  21. * @retval None
  22. */
  23. void U32K_DeInit(U32K_Type *U32Kx)
  24. {
  25. /* Check parameters */
  26. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  27. /* Disable U32K */
  28. U32Kx->CTRL0 &= ~U32K_CTRL0_EN;
  29. /* clear interrupt status */
  30. U32Kx->STS = U32K_STS_Msk;
  31. /* write default reset values */
  32. U32Kx->CTRL0 = U32K_CTRL0_RSTValue;
  33. U32Kx->CTRL1 = U32K_CTRL1_RSTValue;
  34. U32Kx->BAUDDIV = U32K_PHASE_RSTValue;
  35. }
  36. /**
  37. * @brief Initializes U32K.
  38. * @param U32Kx:
  39. U32K0~U32K1
  40. InitStruct: U32K configuration
  41. Debsel:
  42. U32K_DEBSEL_0
  43. U32K_DEBSEL_1
  44. U32K_DEBSEL_2
  45. U32K_DEBSEL_3
  46. Parity:
  47. U32K_PARITY_EVEN
  48. U32K_PARITY_ODD
  49. U32K_PARITY_0
  50. U32K_PARITY_1
  51. U32K_PARITY_NONE
  52. FirstBit:
  53. U32K_FIRSTBIT_LSB
  54. U32K_FIRSTBIT_MSB
  55. AutoCal:
  56. U32K_AUTOCAL_ON
  57. U32K_AUTOCAL_OFF
  58. LineSel:
  59. U32K_LINE_RX0
  60. U32K_LINE_RX1
  61. U32K_LINE_RX2
  62. U32K_LINE_RX3
  63. Baudrate: Baudrate value, 300UL ~ 14400UL
  64. * @retval None
  65. */
  66. void U32K_Init(U32K_Type *U32Kx, U32K_InitType *InitStruct)
  67. {
  68. uint32_t tmp_reg1, tmp_reg2;
  69. /* Check parameters */
  70. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  71. assert_parameters(IS_U32K_DEBSEL(InitStruct->Debsel));
  72. assert_parameters(IS_U32K_PARITY(InitStruct->Parity));
  73. assert_parameters(IS_U32K_FIRSTBIT(InitStruct->FirstBit));
  74. assert_parameters(IS_U32K_AUTOCAL(InitStruct->AutoCal));
  75. assert_parameters(IS_U32K_LINE(InitStruct->LineSel));
  76. assert_parameters(IS_U32K_BAUDRATE(InitStruct->Baudrate));
  77. tmp_reg1 = U32Kx->CTRL0;
  78. tmp_reg1 &= ~(U32K_CTRL0_DEBSEL\
  79. |U32K_CTRL0_PMODE\
  80. |U32K_CTRL0_MSB\
  81. |U32K_CTRL0_ACOFF);
  82. tmp_reg1 |= (InitStruct->Debsel\
  83. |InitStruct->Parity\
  84. |InitStruct->FirstBit\
  85. |InitStruct->AutoCal);
  86. U32Kx->CTRL0 = tmp_reg1;
  87. if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_0) //RTCCLK 32768Hz
  88. U32Kx->BAUDDIV = 65536*InitStruct->Baudrate/32768;
  89. else if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_1) //RTCCLK 8192Hz
  90. U32Kx->BAUDDIV = 65536*InitStruct->Baudrate/8192;
  91. else
  92. assert_parameters(0);
  93. tmp_reg2 = U32Kx->CTRL1;
  94. tmp_reg2 &= ~(U32K_CTRL1_RXSEL);
  95. tmp_reg2 |= (InitStruct->LineSel);
  96. U32Kx->CTRL1 = tmp_reg2;
  97. }
  98. /**
  99. * @brief Fills each U32K_InitType member with its default value.
  100. * @param InitStruct: pointer to an U32K_InitType structure which will be initialized.
  101. * @retval None
  102. */
  103. void U32K_StructInit(U32K_InitType *InitStruct)
  104. {
  105. /*-------------- Reset U32K init structure parameters values ---------------*/
  106. /* Initialize the AutoCal member */
  107. InitStruct->AutoCal = U32K_AUTOCAL_ON;
  108. /* Initialize the Baudrate member */
  109. InitStruct->Baudrate = 9600;
  110. /* Initialize the Debsel member */
  111. InitStruct->Debsel = U32K_DEBSEL_0;
  112. /* Initialize the FirstBit member */
  113. InitStruct->FirstBit = U32K_FIRSTBIT_LSB;
  114. /* Initialize the LineSel member */
  115. InitStruct->LineSel = U32K_LINE_RX0;
  116. /* Initialize the Parity member */
  117. InitStruct->Parity = U32K_PARITY_NONE;
  118. }
  119. /**
  120. * @brief Enables or disables U32K interrupt.
  121. * @param U32Kx:
  122. U32K0~U32K1
  123. INTMask: can use the '|' operator
  124. U32K_INT_RXOV
  125. U32K_INT_RXPE
  126. U32K_INT_RX
  127. NewState:
  128. ENABLE
  129. DISABLE
  130. * @retval None
  131. */
  132. void U32K_INTConfig(U32K_Type *U32Kx, uint32_t INTMask, uint8_t NewState)
  133. {
  134. uint32_t tmp;
  135. /* Check parameters */
  136. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  137. assert_parameters(IS_U32K_INT(INTMask));
  138. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  139. tmp = U32Kx->CTRL1;
  140. tmp &= ~INTMask;
  141. if (NewState == ENABLE)
  142. {
  143. tmp |= INTMask;
  144. }
  145. U32Kx->CTRL1 = tmp;
  146. }
  147. /**
  148. * @brief Gets interrupt flag status.
  149. * @param U32Kx:
  150. U32K0~U32K1
  151. INTMask:
  152. U32K_INTSTS_RXOV
  153. U32K_INTSTS_RXPE
  154. U32K_INTSTS_RX
  155. * @retval Flag status
  156. */
  157. uint8_t U32K_GetINTStatus(U32K_Type *U32Kx, uint32_t INTMask)
  158. {
  159. /* Check parameters */
  160. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  161. assert_parameters(IS_U32K_INTFLAGR(INTMask));
  162. if (U32Kx->STS&INTMask)
  163. return 1;
  164. else
  165. return 0;
  166. }
  167. /**
  168. * @brief Clears flag status.
  169. * @param U32Kx:
  170. U32K0~U32K1
  171. INTMask: can use the '|' operator
  172. U32K_INTSTS_RXOV
  173. U32K_INTSTS_RXPE
  174. U32K_INTSTS_RX
  175. * @retval None
  176. */
  177. void U32K_ClearINTStatus(U32K_Type *U32Kx, uint32_t INTMask)
  178. {
  179. /* Check parameters */
  180. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  181. assert_parameters(IS_U32K_INTFLAGC(INTMask));
  182. U32Kx->STS = INTMask;
  183. }
  184. /**
  185. * @brief Reads receive data register.
  186. * @param U32Kx:
  187. U32K0~U32K1
  188. * @retval Receive data value
  189. */
  190. uint8_t U32K_ReceiveData(U32K_Type *U32Kx)
  191. {
  192. /* Check parameters */
  193. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  194. return (U32Kx->DATA);
  195. }
  196. /**
  197. * @brief Configures U32K baudrate.
  198. * @param U32Kx: U32K0~U32K1
  199. BaudRate: Baudrate value
  200. * @retval None
  201. */
  202. void U32K_BaudrateConfig(U32K_Type *U32Kx, uint32_t BaudRate)
  203. {
  204. /* Check parameters */
  205. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  206. assert_parameters(IS_U32K_BAUDRATE(BaudRate));
  207. if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_0) //RTCCLK 32768Hz
  208. U32Kx->BAUDDIV = 65536*BaudRate/32768;
  209. else if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_1) //RTCCLK 8192Hz
  210. U32Kx->BAUDDIV = 65536*BaudRate/8192;
  211. else
  212. assert_parameters(0);
  213. }
  214. /**
  215. * @brief Enables or disables U32K controlller.
  216. * @param U32Kx:
  217. U32K0~U32K1
  218. NewState:
  219. ENABLE
  220. DISABLE
  221. * @retval None
  222. */
  223. void U32K_Cmd(U32K_Type *U32Kx, uint32_t NewState)
  224. {
  225. uint32_t tmp;
  226. /* Check parameters */
  227. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  228. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  229. tmp = U32Kx->CTRL0;
  230. tmp &= ~(U32K_CTRL0_EN);
  231. if (NewState == ENABLE)
  232. {
  233. tmp |= U32K_CTRL0_EN;
  234. }
  235. U32Kx->CTRL0 = tmp;
  236. }
  237. /**
  238. * @brief Configures U32K receive line.
  239. * @param U32Kx:
  240. U32K0~U32K1
  241. Line:
  242. U32K_LINE_RX0
  243. U32K_LINE_RX1
  244. U32K_LINE_RX2
  245. U32K_LINE_RX3
  246. * @retval None
  247. */
  248. void U32K_LineConfig(U32K_Type *U32Kx, uint32_t Line)
  249. {
  250. uint32_t tmp;
  251. /* Check parameters */
  252. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  253. assert_parameters(IS_U32K_LINE(Line));
  254. tmp = U32Kx->CTRL1;
  255. tmp &= ~U32K_CTRL1_RXSEL_Msk;
  256. tmp |= Line;
  257. U32Kx->CTRL1 = tmp;
  258. }
  259. /**
  260. * @brief Configures Wake-up mode.
  261. * @param U32Kx:
  262. U32K0~U32K1
  263. WKUMode:
  264. U32K_WKUMOD_RX
  265. U32K_WKUMOD_PC
  266. * @retval None
  267. */
  268. void U32K_WKUModeConfig(U32K_Type *U32Kx, uint32_t WKUMode)
  269. {
  270. uint32_t tmp;
  271. /* Check parameters */
  272. assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
  273. assert_parameters(IS_U32K_WKUMODE(WKUMode));
  274. tmp = U32Kx->CTRL0;
  275. tmp &= ~U32K_CTRL0_WKUMODE_Msk;
  276. tmp |= WKUMode;
  277. U32Kx->CTRL0 = tmp;
  278. }
  279. /*********************************** END OF FILE ******************************/