lib_uart.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /**
  2. ******************************************************************************
  3. * @file lib_uart.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief UART library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_uart.h"
  14. #include "lib_clk.h"
  15. #define UART_STATE_RCMsk (0xBCUL)
  16. #define UART_INTSTS_RCMsk (0x3FUL)
  17. #define UART_BAUDDIV_RSTValue (0UL)
  18. #define UART_CTRL_RSTValue (0UL)
  19. #define UART_CTRL2_RSTValue (0UL)
  20. /**
  21. * @brief Iinitializes the UARTx peripheral registers to their default reset
  22. values.
  23. * @param UARTx: UART0~UART5
  24. * @retval None
  25. */
  26. void UART_DeInit(UART_Type *UARTx)
  27. {
  28. __IO uint32_t dummy_data = 0UL;
  29. /* Check parameters */
  30. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  31. /* read data, clear RXFULL flag */
  32. dummy_data = UARTx->DATA;
  33. dummy_data += 1;
  34. UARTx->INTSTS = UART_INTSTS_RCMsk;
  35. UARTx->STATE = UART_STATE_RCMsk;
  36. UARTx->BAUDDIV = UART_BAUDDIV_RSTValue;
  37. UARTx->CTRL2 = UART_CTRL2_RSTValue;
  38. UARTx->CTRL = UART_CTRL_RSTValue;
  39. }
  40. /**
  41. * @brief Iinitializes UART.
  42. * @param UARTx: UART0~UART5
  43. InitStruct:UART configuration.
  44. Mode: (between UART_MODE_RX and UART_MODE_TX, can use the '|' operator)
  45. UART_MODE_RX
  46. UART_MODE_TX
  47. UART_MODE_OFF
  48. Parity:
  49. UART_PARITY_EVEN
  50. UART_PARITY_ODD
  51. UART_PARITY_0
  52. UART_PARITY_1
  53. UART_PARITY_NONE
  54. FirstBit:
  55. UART_FIRSTBIT_LSB
  56. UART_FIRSTBIT_MSB
  57. Baudrate: Baudrate value, 300UL ~ 819200UL
  58. * @retval None
  59. */
  60. void UART_Init(UART_Type *UARTx, UART_InitType *InitStruct)
  61. {
  62. uint32_t pclk;
  63. uint32_t div;
  64. uint32_t tmp_reg1, tmp_reg2;
  65. /* Check parameters */
  66. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  67. assert_parameters(IS_UART_MODE(InitStruct->Mode));
  68. assert_parameters(IS_UART_PARITY(InitStruct->Parity));
  69. assert_parameters(IS_UART_FIRSTBIT(InitStruct->FirstBit));
  70. assert_parameters(IS_UART_BAUDRATE(InitStruct->Baudrate));
  71. tmp_reg1 = UARTx->CTRL;
  72. tmp_reg1 &= ~(UART_CTRL_RXEN_Msk\
  73. |UART_CTRL_TXEN_Msk);
  74. tmp_reg1 |= (InitStruct->Mode);
  75. tmp_reg2 = UARTx->CTRL2;
  76. tmp_reg2 &= ~(UART_CTRL2_MSB_Msk \
  77. |UART_CTRL2_PMODE_Msk);
  78. tmp_reg2 |= (InitStruct->Parity\
  79. |InitStruct->FirstBit);
  80. UARTx->CTRL2 = tmp_reg2;
  81. pclk = CLK_GetPCLKFreq();
  82. div = pclk/InitStruct->Baudrate;
  83. if ((pclk%InitStruct->Baudrate) > (InitStruct->Baudrate/2))
  84. {
  85. div++;
  86. }
  87. UARTx->BAUDDIV = div;
  88. UARTx->CTRL = tmp_reg1;
  89. }
  90. /**
  91. * @brief Fills each UART_InitType member with its default value.
  92. * @param InitStruct: pointer to an UART_InitType structure which will be initialized.
  93. * @retval None
  94. */
  95. void UART_StructInit(UART_InitType *InitStruct)
  96. {
  97. /*-------------- Reset UART init structure parameters values ---------------*/
  98. /* Initialize the Baudrate member */
  99. InitStruct->Baudrate = 9600;
  100. /* Initialize the FirstBit member */
  101. InitStruct->FirstBit = UART_FIRSTBIT_LSB;
  102. /* Initialize the Mode member */
  103. InitStruct->Mode = UART_MODE_OFF;
  104. /* Initialize the Parity member */
  105. InitStruct->Parity = UART_PARITY_NONE;
  106. }
  107. /**
  108. * @brief Gets peripheral flag.
  109. * @param UARTx: UART0~UART5
  110. FlagMask: flag to get.
  111. --UART_FLAG_DMATXDONE
  112. --UART_FLAG_RXPARITY
  113. --UART_FLAG_TXDONE
  114. --UART_FLAG_RXPE
  115. --UART_FLAG_RXOV
  116. --UART_FLAG_TXOV
  117. --UART_FLAG_RXFULL
  118. * @retval 1:flag set
  119. 0:flag reset
  120. */
  121. uint8_t UART_GetFlag(UART_Type *UARTx, uint32_t FlagMask)
  122. {
  123. /* Check parameters */
  124. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  125. assert_parameters(IS_UART_FLAGR(FlagMask));
  126. if (UARTx->STATE&FlagMask)
  127. {
  128. return 1;
  129. }
  130. else
  131. {
  132. return 0;
  133. }
  134. }
  135. /**
  136. * @brief Clears peripheral flag.
  137. * @param UARTx: UART0~UART5
  138. FlagMask: status to clear, can use the '|' operator.
  139. --UART_FLAG_DMATXDONE
  140. --UART_FLAG_TXDONE
  141. --UART_FLAG_RXPE
  142. --UART_FLAG_RXOV
  143. --UART_FLAG_TXOV
  144. * @retval None
  145. */
  146. void UART_ClearFlag(UART_Type *UARTx, uint32_t FlagMask)
  147. {
  148. /* Check parameters */
  149. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  150. assert_parameters(IS_UART_FLAGC(FlagMask));
  151. UARTx->STATE = FlagMask;
  152. }
  153. /**
  154. * @brief Enables or disables the specified UART interrupts.
  155. * @param UARTx: UART0~UART5
  156. INTMask: can use the '|' operator.
  157. --UART_INT_TXDONE
  158. --UART_INT_RXPE
  159. --UART_INT_RXOV
  160. --UART_INT_TXOV
  161. --UART_INT_RX
  162. NewState:New status of interrupt mask.
  163. * @retval None
  164. */
  165. void UART_INTConfig(UART_Type *UARTx, uint32_t INTMask, uint8_t NewState)
  166. {
  167. /* Check parameters */
  168. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  169. assert_parameters(IS_UART_INT(INTMask));
  170. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  171. if (NewState == ENABLE)
  172. {
  173. UARTx->CTRL |= INTMask;
  174. }
  175. else
  176. {
  177. UARTx->CTRL &= ~INTMask;
  178. }
  179. }
  180. /**
  181. * @brief Gets interrupt status.
  182. * @param UARTx: UART0~UART5
  183. INTMask: status to get.
  184. --UART_INTSTS_TXDONE
  185. --UART_INTSTS_RXPE
  186. --UART_INTSTS_RXOV
  187. --UART_INTSTS_TXOV
  188. --UART_INTSTS_RX
  189. * @retval 1:status set
  190. 0:status reset
  191. */
  192. uint8_t UART_GetINTStatus(UART_Type *UARTx, uint32_t INTMask)
  193. {
  194. /* Check parameters */
  195. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  196. assert_parameters(IS_UART_INTFLAGR(INTMask));
  197. if (UARTx->INTSTS&INTMask)
  198. {
  199. return 1;
  200. }
  201. else
  202. {
  203. return 0;
  204. }
  205. }
  206. /**
  207. * @brief Clears interrupt status.
  208. * @param UARTx: UART0~UART5
  209. INTMask: status to clear, can use the '|' operator.
  210. --UART_INTSTS_TXDONE
  211. --UART_INTSTS_RXPE
  212. --UART_INTSTS_RXOV
  213. --UART_INTSTS_TXOV
  214. --UART_INTSTS_RX
  215. * @retval None
  216. */
  217. void UART_ClearINTStatus(UART_Type *UARTx, uint32_t INTMask)
  218. {
  219. /* Check parameters */
  220. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  221. assert_parameters(IS_UART_INTFLAGC(INTMask));
  222. UARTx->INTSTS = INTMask;
  223. }
  224. /**
  225. * @brief Loads send data register.
  226. * @param UARTx: UART0~USART5
  227. ch: data to send.
  228. * @retval None
  229. */
  230. void UART_SendData(UART_Type *UARTx, uint8_t ch)
  231. {
  232. /* Check parameters */
  233. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  234. UARTx->DATA = ch;
  235. }
  236. /**
  237. * @brief Reads receive data register.
  238. * @param UARTx: UART0~UART5
  239. * @retval The received data.
  240. */
  241. uint8_t UART_ReceiveData(UART_Type *UARTx)
  242. {
  243. /* Check parameters */
  244. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  245. return UARTx->DATA;
  246. }
  247. /**
  248. * @brief Configures UART baudrate.
  249. * @param UARTx: UART0~UART5
  250. BaudRate: Baudrate value
  251. * @retval None
  252. */
  253. void UART_BaudrateConfig(UART_Type *UARTx, uint32_t BaudRate)
  254. {
  255. uint32_t pclk;
  256. uint32_t div;
  257. /* Check parameters */
  258. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  259. assert_parameters(IS_UART_BAUDRATE(BaudRate));
  260. pclk = CLK_GetPCLKFreq();
  261. div = pclk/BaudRate;
  262. if ((pclk%BaudRate) > (BaudRate/2))
  263. {
  264. div++;
  265. }
  266. UARTx->BAUDDIV = div;
  267. }
  268. /**
  269. * @brief Enables or disables UART Transmitter/Receiver.
  270. * @param UARTx: UART0~UART5
  271. Mode:
  272. UART_MODE_RX
  273. UART_MODE_TX
  274. NewState:
  275. ENABLE
  276. DISABLE
  277. * @retval None
  278. */
  279. void UART_Cmd(UART_Type *UARTx, uint32_t Mode, uint32_t NewState)
  280. {
  281. /* Check parameters */
  282. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  283. assert_parameters(IS_UART_MODE(Mode));
  284. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  285. if (NewState == ENABLE)
  286. {
  287. UARTx->CTRL |= Mode;
  288. }
  289. else
  290. {
  291. UARTx->CTRL &= ~Mode;
  292. }
  293. }
  294. /**
  295. * @brief Gets UART configure information.
  296. * @param[in] UARTx: UART0~UART5
  297. * @param[out] ConfigInfo: The pointer of UART configuration.
  298. * @retval None
  299. */
  300. void UART_GetConfigINFO(UART_Type *UARTx, UART_ConfigINFOType *ConfigInfo)
  301. {
  302. uint32_t tmp1, tmp2, tmp3;
  303. uint32_t pclk;
  304. /* Check parameters */
  305. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  306. tmp1 = UARTx->CTRL;
  307. tmp2 = UARTx->BAUDDIV;
  308. pclk = CLK_GetPCLKFreq();
  309. tmp3 = UARTx->CTRL2;
  310. /* Mode_Transmit */
  311. if (tmp1 & UART_CTRL_TXEN_Msk)
  312. ConfigInfo->Mode_Transmit = 1;
  313. else
  314. ConfigInfo->Mode_Transmit = 0;
  315. /* Mode_Receive */
  316. if (tmp1 & UART_CTRL_RXEN_Msk)
  317. ConfigInfo->Mode_Receive = 1;
  318. else
  319. ConfigInfo->Mode_Receive = 0;
  320. /* Baudrate */
  321. ConfigInfo->Baudrate = pclk / tmp2;
  322. /* LSB/MSB */
  323. if (tmp3 & UART_CTRL2_MSB_Msk)
  324. ConfigInfo->FirstBit = 1;
  325. else
  326. ConfigInfo->FirstBit = 0;
  327. /* Parity */
  328. ConfigInfo->Parity = (tmp3 & UART_CTRL2_PMODE) >> UART_CTRL2_PMODE_Pos;
  329. }
  330. /*********************************** END OF FILE ******************************/