lib_uart.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. /**
  2. ******************************************************************************
  3. * @file lib_uart.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  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 (0x3CUL)
  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_TypeDef *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 UART initialization.
  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. WordLen:
  55. UART_WORDLEN_8B
  56. UART_WORDLEN_9B
  57. FirstBit:
  58. UART_FIRSTBIT_LSB
  59. UART_FIRSTBIT_MSB
  60. Baudrate: Baudrate value
  61. * @retval None
  62. */
  63. void UART_Init(UART_TypeDef *UARTx, UART_InitType *InitStruct)
  64. {
  65. uint32_t pclk;
  66. uint32_t div;
  67. uint32_t tmp_reg1, tmp_reg2;
  68. /* Check parameters */
  69. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  70. assert_parameters(IS_UART_MODE(InitStruct->Mode));
  71. assert_parameters(IS_UART_PARITY(InitStruct->Parity));
  72. assert_parameters(IS_UART_WORDLEN(InitStruct->WordLen));
  73. assert_parameters(IS_UART_FIRSTBIT(InitStruct->FirstBit));
  74. assert_parameters(IS_UART_BAUDRATE(InitStruct->Baudrate));
  75. tmp_reg1 = UARTx->CTRL;
  76. tmp_reg1 &= ~(UART_CTRL_RXEN\
  77. |UART_CTRL_TXEN);
  78. tmp_reg1 |= (InitStruct->Mode);
  79. tmp_reg2 = UARTx->CTRL2;
  80. tmp_reg2 &= ~(UART_CTRL2_MSB \
  81. |UART_CTRL2_MODE \
  82. |UART_CTRL2_PMODE);
  83. tmp_reg2 |= (InitStruct->Parity\
  84. |InitStruct->WordLen\
  85. |InitStruct->FirstBit);
  86. UARTx->CTRL2 = tmp_reg2;
  87. pclk = CLK_GetPCLKFreq();
  88. div = pclk/InitStruct->Baudrate;
  89. if ((pclk%InitStruct->Baudrate) > (InitStruct->Baudrate/2))
  90. {
  91. div++;
  92. }
  93. UARTx->BAUDDIV = div;
  94. UARTx->CTRL = tmp_reg1;
  95. }
  96. /**
  97. * @brief Fills each UART_InitType member with its default value.
  98. * @param InitStruct: pointer to an UART_InitType structure which will be initialized.
  99. * @retval None
  100. */
  101. void UART_StructInit(UART_InitType *InitStruct)
  102. {
  103. /*-------------- Reset UART init structure parameters values ---------------*/
  104. /* Initialize the Baudrate member */
  105. InitStruct->Baudrate = 9600;
  106. /* Initialize the FirstBit member */
  107. InitStruct->FirstBit = UART_FIRSTBIT_LSB;
  108. /* Initialize the Mode member */
  109. InitStruct->Mode = UART_MODE_OFF;
  110. /* Initialize the Parity member */
  111. InitStruct->Parity = UART_PARITY_NONE;
  112. /* Initialize the WordLen member */
  113. InitStruct->WordLen = UART_WORDLEN_8B;
  114. }
  115. /**
  116. * @brief Get peripheral flag.
  117. * @param UARTx: UART0~UART5
  118. FlagMask: flag to get.
  119. --UART_FLAG_RXPARITY
  120. --UART_FLAG_TXDONE
  121. --UART_FLAG_RXPE
  122. --UART_FLAG_RXOV
  123. --UART_FLAG_TXOV
  124. --UART_FLAG_RXFULL
  125. * @retval 1:flag set
  126. 0:flag reset
  127. */
  128. uint8_t UART_GetFlag(UART_TypeDef *UARTx, uint32_t FlagMask)
  129. {
  130. /* Check parameters */
  131. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  132. assert_parameters(IS_UART_FLAGR(FlagMask));
  133. if (UARTx->STATE&FlagMask)
  134. {
  135. return 1;
  136. }
  137. else
  138. {
  139. return 0;
  140. }
  141. }
  142. /**
  143. * @brief Clear peripheral flag.
  144. * @param UARTx: UART0~UART5
  145. FlagMask: status to clear, can use the ¡®|¡¯ operator.
  146. --UART_FLAG_TXDONE
  147. --UART_FLAG_RXPE
  148. --UART_FLAG_RXOV
  149. --UART_FLAG_TXOV
  150. * @retval None
  151. */
  152. void UART_ClearFlag(UART_TypeDef *UARTx, uint32_t FlagMask)
  153. {
  154. /* Check parameters */
  155. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  156. assert_parameters(IS_UART_FLAGC(FlagMask));
  157. UARTx->STATE = FlagMask;
  158. }
  159. /**
  160. * @brief Enable or disable the specified UART interrupts.
  161. * @param UARTx: UART0~UART5
  162. INTMask: can use the ¡®|¡¯ operator.
  163. --UART_INT_TXDONE
  164. --UART_INT_RXPE
  165. --UART_INT_RXOV
  166. --UART_INT_TXOV
  167. --UART_INT_RX
  168. NewState:New status of interrupt mask.
  169. * @retval None
  170. */
  171. void UART_INTConfig(UART_TypeDef *UARTx, uint32_t INTMask, uint8_t NewState)
  172. {
  173. /* Check parameters */
  174. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  175. assert_parameters(IS_UART_INT(INTMask));
  176. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  177. if (NewState == ENABLE)
  178. {
  179. UARTx->CTRL |= INTMask;
  180. }
  181. else
  182. {
  183. UARTx->CTRL &= ~INTMask;
  184. }
  185. }
  186. /**
  187. * @brief Get interrupt status.
  188. * @param UARTx: UART0~UART5
  189. INTMask: status to get.
  190. --UART_INTSTS_TXDONE
  191. --UART_INTSTS_RXPE
  192. --UART_INTSTS_RXOV
  193. --UART_INTSTS_TXOV
  194. --UART_INTSTS_RX
  195. * @retval 1:status set
  196. 0:status reset
  197. */
  198. uint8_t UART_GetINTStatus(UART_TypeDef *UARTx, uint32_t INTMask)
  199. {
  200. /* Check parameters */
  201. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  202. assert_parameters(IS_UART_INTFLAGR(INTMask));
  203. if (UARTx->INTSTS&INTMask)
  204. {
  205. return 1;
  206. }
  207. else
  208. {
  209. return 0;
  210. }
  211. }
  212. /**
  213. * @brief Clear interrupt status.
  214. * @param UARTx: UART0~UART5
  215. INTMask: status to clear, can use the ¡®|¡¯ operator.
  216. --UART_INTSTS_TXDONE
  217. --UART_INTSTS_RXPE
  218. --UART_INTSTS_RXOV
  219. --UART_INTSTS_TXOV
  220. --UART_INTSTS_RX
  221. * @retval None
  222. */
  223. void UART_ClearINTStatus(UART_TypeDef *UARTx, uint32_t INTMask)
  224. {
  225. /* Check parameters */
  226. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  227. assert_parameters(IS_UART_INTFLAGC(INTMask));
  228. UARTx->INTSTS = INTMask;
  229. }
  230. /**
  231. * @brief Load send data register.
  232. * @param UARTx: UART0~USART5
  233. DAT: data to send.
  234. * @retval None
  235. */
  236. void UART_SendData(UART_TypeDef *UARTx, uint8_t ch)
  237. {
  238. /* Check parameters */
  239. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  240. UARTx->DATA = ch;
  241. }
  242. /**
  243. * @brief Read receive data register.
  244. * @param UARTx: UART0~UART5
  245. * @retval The received data.
  246. */
  247. uint8_t UART_ReceiveData(UART_TypeDef *UARTx)
  248. {
  249. /* Check parameters */
  250. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  251. return UARTx->DATA;
  252. }
  253. /**
  254. * @brief UART Baudrate control.
  255. * @param UARTx: UART0~UART5
  256. BaudRate: Baudrate value
  257. * @retval None
  258. */
  259. void UART_BaudrateConfig(UART_TypeDef *UARTx, uint32_t BaudRate)
  260. {
  261. uint32_t pclk;
  262. uint32_t div;
  263. /* Check parameters */
  264. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  265. assert_parameters(IS_UART_BAUDRATE(BaudRate));
  266. pclk = CLK_GetPCLKFreq();
  267. div = pclk/BaudRate;
  268. if ((pclk%BaudRate) > (BaudRate/2))
  269. {
  270. div++;
  271. }
  272. UARTx->BAUDDIV = div;
  273. }
  274. /**
  275. * @brief UART Transmit/Receive enable control.
  276. * @param UARTx: UART0~UART5
  277. Mode:
  278. UART_MODE_RX
  279. UART_MODE_TX
  280. NewState:
  281. ENABLE
  282. DISABLE
  283. * @retval None
  284. */
  285. void UART_Cmd(UART_TypeDef *UARTx, uint32_t Mode, uint32_t NewState)
  286. {
  287. /* Check parameters */
  288. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  289. assert_parameters(IS_UART_MODE(Mode));
  290. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  291. if (NewState == ENABLE)
  292. {
  293. UARTx->CTRL |= Mode;
  294. }
  295. else
  296. {
  297. UARTx->CTRL &= ~Mode;
  298. }
  299. }
  300. /**
  301. * @brief Get UART configure information.
  302. * @param UARTx: UART0~UART5
  303. * ConfigInfo: The pointer of UART configuration.
  304. * @retval None
  305. */
  306. void UART_GetConfigINFO(UART_TypeDef *UARTx, UART_ConfigINFOType *ConfigInfo)
  307. {
  308. uint32_t tmp1, tmp2, tmp3;
  309. uint32_t pclk;
  310. /* Check parameters */
  311. assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
  312. tmp1 = UARTx->CTRL;
  313. tmp2 = UARTx->BAUDDIV;
  314. pclk = CLK_GetPCLKFreq();
  315. tmp3 = UARTx->CTRL2;
  316. /* Mode_Transmit */
  317. if (tmp1 & UART_CTRL_TXEN)
  318. ConfigInfo->Mode_Transmit = 1;
  319. else
  320. ConfigInfo->Mode_Transmit = 0;
  321. /* Mode_Receive */
  322. if (tmp1 & UART_CTRL_RXEN)
  323. ConfigInfo->Mode_Receive = 1;
  324. else
  325. ConfigInfo->Mode_Receive = 0;
  326. /* Baudrate */
  327. ConfigInfo->Baudrate = pclk / tmp2;
  328. /* LSB/MSB */
  329. if (tmp3 & UART_CTRL2_MSB)
  330. ConfigInfo->FirstBit = 1;
  331. else
  332. ConfigInfo->FirstBit = 0;
  333. /* WordLen */
  334. if (tmp3 & UART_CTRL2_MODE)
  335. ConfigInfo->WordLen = 9;
  336. else
  337. ConfigInfo->WordLen = 8;
  338. /* Parity */
  339. if ((tmp3 & UART_CTRL2_PMODE) == UART_CTRL2_PMODE_0)
  340. ConfigInfo->Parity = 0;
  341. else if ((tmp3 & UART_CTRL2_PMODE) == UART_CTRL2_PMODE_1)
  342. ConfigInfo->Parity = 1;
  343. else if ((tmp3 & UART_CTRL2_PMODE) == UART_CTRL2_PMODE_EVEN)
  344. ConfigInfo->Parity = 2;
  345. else
  346. ConfigInfo->Parity = 3;
  347. }
  348. /*********************************** END OF FILE ******************************/