gd32f4xx_usart.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /*!
  2. \file gd32f4xx_usart.c
  3. \brief USART driver
  4. */
  5. /*
  6. Copyright (C) 2016 GigaDevice
  7. 2016-08-15, V1.0.0, firmware for GD32F4xx
  8. */
  9. #include "gd32f4xx_usart.h"
  10. /*!
  11. \brief reset USART/UART
  12. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  13. \param[out] none
  14. \retval none
  15. */
  16. void usart_deinit(uint32_t usart_periph)
  17. {
  18. switch(usart_periph){
  19. case USART0:
  20. rcu_periph_reset_enable(RCU_USART0RST);
  21. rcu_periph_reset_disable(RCU_USART0RST);
  22. break;
  23. case USART1:
  24. rcu_periph_reset_enable(RCU_USART1RST);
  25. rcu_periph_reset_disable(RCU_USART1RST);
  26. break;
  27. case USART2:
  28. rcu_periph_reset_enable(RCU_USART2RST);
  29. rcu_periph_reset_disable(RCU_USART2RST);
  30. break;
  31. case USART5:
  32. rcu_periph_reset_enable(RCU_USART5RST);
  33. rcu_periph_reset_disable(RCU_USART5RST);
  34. break;
  35. case UART3:
  36. rcu_periph_reset_enable(RCU_UART3RST);
  37. rcu_periph_reset_disable(RCU_UART3RST);
  38. break;
  39. case UART4:
  40. rcu_periph_reset_enable(RCU_UART4RST);
  41. rcu_periph_reset_disable(RCU_UART4RST);
  42. break;
  43. case UART6:
  44. rcu_periph_reset_enable(RCU_UART6RST);
  45. rcu_periph_reset_disable(RCU_UART6RST);
  46. break;
  47. case UART7:
  48. rcu_periph_reset_enable(RCU_UART7RST);
  49. rcu_periph_reset_disable(RCU_UART7RST);
  50. break;
  51. default:
  52. break;
  53. }
  54. }
  55. /*!
  56. \brief configure USART baud rate value
  57. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  58. \param[in] baudval: baud rate value
  59. \param[out] none
  60. \retval none
  61. */
  62. void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval)
  63. {
  64. uint32_t uclk=0U, intdiv=0U, fradiv=0U, udiv=0U;
  65. switch(usart_periph){
  66. /* get clock frequency */
  67. case USART0:
  68. uclk=rcu_clock_freq_get(CK_APB2);
  69. break;
  70. case USART5:
  71. uclk=rcu_clock_freq_get(CK_APB2);
  72. break;
  73. case USART1:
  74. uclk=rcu_clock_freq_get(CK_APB1);
  75. break;
  76. case USART2:
  77. uclk=rcu_clock_freq_get(CK_APB1);
  78. break;
  79. case UART3:
  80. uclk=rcu_clock_freq_get(CK_APB1);
  81. break;
  82. case UART4:
  83. uclk=rcu_clock_freq_get(CK_APB1);
  84. break;
  85. case UART6:
  86. uclk=rcu_clock_freq_get(CK_APB1);
  87. break;
  88. case UART7:
  89. uclk=rcu_clock_freq_get(CK_APB1);
  90. break;
  91. default:
  92. break;
  93. }
  94. if(USART_CTL0(usart_periph) & USART_CTL0_OVSMOD){
  95. /* when oversampling by 8, configure the value of USART_BAUD */
  96. udiv = ((2U*uclk) + baudval/2U)/baudval;
  97. intdiv = udiv & 0xfff0U;
  98. fradiv = udiv & 0x7U;
  99. USART_BAUD(usart_periph) |= ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv));
  100. }else{
  101. /* when oversampling by 16, configure the value of USART_BAUD */
  102. udiv = (uclk+baudval/2U)/baudval;
  103. intdiv = udiv & 0xfff0U;
  104. fradiv = udiv & 0xfU;
  105. USART_BAUD(usart_periph) |= ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv));
  106. }
  107. }
  108. /*!
  109. \brief configure USART parity function
  110. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  111. \param[in] paritycfg: configure USART parity
  112. \arg USART_PM_NONE: no parity
  113. \arg USART_PM_ODD: odd parity
  114. \arg USART_PM_EVEN: even parity
  115. \param[out] none
  116. \retval none
  117. */
  118. void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg)
  119. {
  120. /* clear USART_CTL0 PM,PCEN Bits */
  121. USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN);
  122. /* configure USART parity mode */
  123. USART_CTL0(usart_periph) |= paritycfg ;
  124. }
  125. /*!
  126. \brief configure USART word length
  127. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  128. \param[in] wlen: USART word length configure
  129. \arg USART_WL_8BIT: 8 bits
  130. \arg USART_WL_9BIT: 9 bits
  131. \param[out] none
  132. \retval none
  133. */
  134. void usart_word_length_set(uint32_t usart_periph, uint32_t wlen)
  135. {
  136. /* clear USART_CTL0 WL bit */
  137. USART_CTL0(usart_periph) &= ~USART_CTL0_WL;
  138. /* configure USART word length */
  139. USART_CTL0(usart_periph) |= wlen;
  140. }
  141. /*!
  142. \brief configure USART stop bit length
  143. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  144. \param[in] stblen: USART stop bit configure
  145. \arg USART_STB_1BIT: 1 bit
  146. \arg USART_STB_0_5BIT: 0.5 bit
  147. \arg USART_STB_2BIT: 2 bits
  148. \arg USART_STB_1_5BIT: 1.5 bits
  149. \param[out] none
  150. \retval none
  151. */
  152. void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen)
  153. {
  154. /* clear USART_CTL1 STB bits */
  155. USART_CTL1(usart_periph) &= ~USART_CTL1_STB;
  156. /* configure USART stop bits */
  157. USART_CTL1(usart_periph) |= stblen;
  158. }
  159. /*!
  160. \brief enable USART
  161. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  162. \param[out] none
  163. \retval none
  164. */
  165. void usart_enable(uint32_t usart_periph)
  166. {
  167. USART_CTL0(usart_periph) |= USART_CTL0_UEN;
  168. }
  169. /*!
  170. \brief disable USART
  171. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  172. \param[out] none
  173. \retval none
  174. */
  175. void usart_disable(uint32_t usart_periph)
  176. {
  177. USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN);
  178. }
  179. /*!
  180. \brief configure USART transmitter
  181. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  182. \param[in] rtconfig: enable or disable USART transmitter
  183. \arg USART_TRANSMIT_ENABLE: enable USART transmission
  184. \arg USART_TRANSMIT_DISABLE: enable USART transmission
  185. \param[out] none
  186. \retval none
  187. */
  188. void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig)
  189. {
  190. uint32_t ctl = 0U;
  191. ctl = USART_CTL0(usart_periph);
  192. ctl &= ~USART_CTL0_TEN;
  193. ctl |= txconfig;
  194. /* configure transfer mode */
  195. USART_CTL0(usart_periph) = ctl;
  196. }
  197. /*!
  198. \brief configure USART receiver
  199. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  200. \param[in] rtconfig: enable or disable USART receiver
  201. \arg USART_RECEIVE_ENABLE: enable USART reception
  202. \arg USART_RECEIVE_DISABLE: disable USART reception
  203. \param[out] none
  204. \retval none
  205. */
  206. void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig)
  207. {
  208. uint32_t ctl = 0U;
  209. ctl = USART_CTL0(usart_periph);
  210. ctl &= ~USART_CTL0_REN;
  211. ctl |= rxconfig;
  212. /* configure transfer mode */
  213. USART_CTL0(usart_periph) = ctl;
  214. }
  215. /*!
  216. \brief data is transmitted/received with the LSB/MSB first
  217. \param[in] usart_periph: USARTx(x=0,1,2,5)
  218. \param[in] msbf: LSB/MSB
  219. \arg USART_MSBF_LSB: LSB first
  220. \arg USART_MSBF_MSB: MSB first
  221. \param[out] none
  222. \retval none
  223. */
  224. void usart_data_first_config(uint32_t usart_periph, uint32_t msbf)
  225. {
  226. USART_CTL3(usart_periph) &= ~(USART_CTL3_MSBF);
  227. USART_CTL3(usart_periph) |= msbf;
  228. }
  229. /*!
  230. \brief configure USART inversion
  231. \param[in] usart_periph: USARTx(x=0,1,2,5)
  232. \param[in] invertpara: refer to enum USART_INVERT_CONFIG
  233. \arg USART_DINV_ENABLE: data bit level inversion
  234. \arg USART_DINV_DISABLE: data bit level not inversion
  235. \arg USART_TXPIN_ENABLE: TX pin level inversion
  236. \arg USART_TXPIN_DISABLE: TX pin level not inversion
  237. \arg USART_RXPIN_ENABLE: RX pin level inversion
  238. \arg USART_RXPIN_DISABLE: RX pin level not inversion
  239. \param[out] none
  240. \retval none
  241. */
  242. void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara)
  243. {
  244. /* inverted or not the specified siginal */
  245. switch(invertpara){
  246. case USART_DINV_ENABLE:
  247. USART_CTL3(usart_periph) |= USART_CTL3_DINV;
  248. break;
  249. case USART_TXPIN_ENABLE:
  250. USART_CTL3(usart_periph) |= USART_CTL3_TINV;
  251. break;
  252. case USART_RXPIN_ENABLE:
  253. USART_CTL3(usart_periph) |= USART_CTL3_RINV;
  254. break;
  255. case USART_DINV_DISABLE:
  256. USART_CTL3(usart_periph) &= ~(USART_CTL3_DINV);
  257. break;
  258. case USART_TXPIN_DISABLE:
  259. USART_CTL3(usart_periph) &= ~(USART_CTL3_TINV);
  260. break;
  261. case USART_RXPIN_DISABLE:
  262. USART_CTL3(usart_periph) &= ~(USART_CTL3_RINV);
  263. break;
  264. default:
  265. break;
  266. }
  267. }
  268. /*!
  269. \brief configure the USART oversample mode
  270. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  271. \param[in] oversamp: oversample value
  272. \arg USART_OVSMOD_8: 8 bits
  273. \arg USART_OVSMOD_16: 16 bits
  274. \param[out] none
  275. \retval none
  276. */
  277. void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp)
  278. {
  279. /* clear OVSMOD bit */
  280. USART_CTL0(usart_periph) &= ~(USART_CTL0_OVSMOD);
  281. USART_CTL0(usart_periph) |= oversamp;
  282. }
  283. /*!
  284. \brief configure sample bit method
  285. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  286. \param[in] obsm: sample bit
  287. \arg USART_OSB_1bit: 1 bit
  288. \arg USART_OSB_3bit: 3 bits
  289. \param[out] none
  290. \retval none
  291. */
  292. void usart_sample_bit_config(uint32_t usart_periph, uint32_t obsm)
  293. {
  294. USART_CTL2(usart_periph) &= ~(USART_CTL2_OSB);
  295. USART_CTL2(usart_periph) |= obsm;
  296. }
  297. /*!
  298. \brief enable receiver timeout of USART
  299. \param[in] usart_periph: USARTx(x=0,1,2,5)
  300. \param[out] none
  301. \retval none
  302. */
  303. void usart_receiver_timeout_enable(uint32_t usart_periph)
  304. {
  305. USART_CTL3(usart_periph) |= USART_CTL3_RTEN;
  306. }
  307. /*!
  308. \brief disable receiver timeout of USART
  309. \param[in] usart_periph: USARTx(x=0,1,2,5)
  310. \param[out] none
  311. \retval none
  312. */
  313. void usart_receiver_timeout_disable(uint32_t usart_periph)
  314. {
  315. USART_CTL3(usart_periph) &= ~(USART_CTL3_RTEN);
  316. }
  317. /*!
  318. \brief set the receiver timeout threshold of USART
  319. \param[in] usart_periph: USARTx(x=0,1,2,5)
  320. \param[in] rtimeout: 0-0x00FFFFFF
  321. \param[out] none
  322. \retval none
  323. */
  324. void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout)
  325. {
  326. USART_RT(usart_periph) &= ~(USART_RT_RT);
  327. USART_RT(usart_periph) |= rtimeout;
  328. }
  329. /*!
  330. \brief USART transmit data function
  331. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  332. \param[in] data: data of transmission
  333. \param[out] none
  334. \retval none
  335. */
  336. void usart_data_transmit(uint32_t usart_periph, uint32_t data)
  337. {
  338. USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data);
  339. }
  340. /*!
  341. \brief USART receive data function
  342. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  343. \param[out] none
  344. \retval data of received
  345. */
  346. uint16_t usart_data_receive(uint32_t usart_periph)
  347. {
  348. return (uint16_t)(USART_DATA(usart_periph) & (uint16_t)USART_DATA_DATA);
  349. }
  350. /*!
  351. \brief configure the address of the USART in wake up by address match mode
  352. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  353. \param[in] addr: address of USART/UART
  354. \param[out] none
  355. \retval none
  356. */
  357. void usart_address_config(uint32_t usart_periph, uint8_t addr)
  358. {
  359. USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR);
  360. USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr);
  361. }
  362. /*!
  363. \brief receiver in mute mode
  364. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  365. \param[out] none
  366. \retval none
  367. */
  368. void usart_mute_mode_enable(uint32_t usart_periph)
  369. {
  370. USART_CTL0(usart_periph) |= USART_CTL0_RWU;
  371. }
  372. /*!
  373. \brief receiver in active mode
  374. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  375. \param[out] none
  376. \retval none
  377. */
  378. void usart_mute_mode_disable(uint32_t usart_periph)
  379. {
  380. USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU);
  381. }
  382. /*!
  383. \brief configure wakeup method in mute mode
  384. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  385. \param[in] wmehtod: two method be used to enter or exit the mute mode
  386. \arg USART_WM_IDLE: idle line
  387. \arg USART_WM_ADDR: address mask
  388. \param[out] none
  389. \retval none
  390. */
  391. void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmehtod)
  392. {
  393. USART_CTL0(usart_periph) &= ~(USART_CTL0_WM);
  394. USART_CTL0(usart_periph) |= wmehtod;
  395. }
  396. /*!
  397. \brief enable LIN mode
  398. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  399. \param[out] none
  400. \retval none
  401. */
  402. void usart_lin_mode_enable(uint32_t usart_periph)
  403. {
  404. USART_CTL1(usart_periph) |= USART_CTL1_LMEN;
  405. }
  406. /*!
  407. \brief disable LIN mode
  408. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  409. \param[out] none
  410. \retval none
  411. */
  412. void usart_lin_mode_disable(uint32_t usart_periph)
  413. {
  414. USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN);
  415. }
  416. /*!
  417. \brief configure lin break frame length
  418. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  419. \param[in] lblen: lin break frame length
  420. \arg USART_LBLEN_10B: 10 bits
  421. \arg USART_LBLEN_11B: 11 bits
  422. \param[out] none
  423. \retval none
  424. */
  425. void usart_lin_break_dection_length_config(uint32_t usart_periph, uint32_t lblen)
  426. {
  427. USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN);
  428. USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen);
  429. }
  430. /*!
  431. \brief send break frame
  432. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  433. \param[out] none
  434. \retval none
  435. */
  436. void usart_send_break(uint32_t usart_periph)
  437. {
  438. USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD;
  439. }
  440. /*!
  441. \brief enable half duplex mode
  442. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  443. \param[out] none
  444. \retval none
  445. */
  446. void usart_halfduplex_enable(uint32_t usart_periph)
  447. {
  448. USART_CTL2(usart_periph) |= USART_CTL2_HDEN;
  449. }
  450. /*!
  451. \brief disable half duplex mode
  452. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  453. \param[out] none
  454. \retval none
  455. */
  456. void usart_halfduplex_disable(uint32_t usart_periph)
  457. {
  458. USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN);
  459. }
  460. /*!
  461. \brief enable CK pin in synchronous mode
  462. \param[in] usart_periph: USARTx(x=0,1,2,5)
  463. \param[out] none
  464. \retval none
  465. */
  466. void usart_synchronous_clock_enable(uint32_t usart_periph)
  467. {
  468. USART_CTL1(usart_periph) |= USART_CTL1_CKEN;
  469. }
  470. /*!
  471. \brief disable CK pin in synchronous mode
  472. \param[in] usart_periph: USARTx(x=0,1,2,5)
  473. \param[out] none
  474. \retval none
  475. */
  476. void usart_synchronous_clock_disable(uint32_t usart_periph)
  477. {
  478. USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN);
  479. }
  480. /*!
  481. \brief configure USART synchronous mode parameters
  482. \param[in] usart_periph: USARTx(x=0,1,2,5)
  483. \param[in] clen: CK length
  484. \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame
  485. \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame
  486. \param[in] cph: clock phase
  487. \arg USART_CPH_1CK: first clock transition is the first data capture edge
  488. \arg USART_CPH_2CK: second clock transition is the first data capture edge
  489. \param[in] cpl: clock polarity
  490. \arg USART_CPL_LOW: steady low value on CK pin
  491. \arg USART_CPL_HIGH: steady high value on CK pin
  492. \param[out] none
  493. \retval none
  494. */
  495. void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl)
  496. {
  497. uint32_t ctl = 0U;
  498. /* read USART_CTL1 register */
  499. ctl = USART_CTL1(usart_periph);
  500. /* set CK length, CK phase, CK polarity */
  501. ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl);
  502. USART_CTL1(usart_periph) |= ctl;
  503. }
  504. /*!
  505. \brief configure guard time value in smartcard mode
  506. \param[in] usart_periph: USARTx(x=0,1,2,5)
  507. \param[in] gaut: guard time value
  508. \param[out] none
  509. \retval none
  510. */
  511. void usart_guard_time_config(uint32_t usart_periph,uint32_t gaut)
  512. {
  513. USART_GP(usart_periph) &= ~(USART_GP_GUAT);
  514. USART_GP(usart_periph) |= (USART_GP_GUAT & ((gaut)<<8));
  515. }
  516. /*!
  517. \brief enable smartcard mode
  518. \param[in] usart_periph: USARTx(x=0,1,2,5)
  519. \param[out] none
  520. \retval none
  521. */
  522. void usart_smartcard_mode_enable(uint32_t usart_periph)
  523. {
  524. USART_CTL2(usart_periph) |= USART_CTL2_SCEN;
  525. }
  526. /*!
  527. \brief disable smartcard mode
  528. \param[in] usart_periph: USARTx(x=0,1,2,5)
  529. \param[out] none
  530. \retval none
  531. */
  532. void usart_smartcard_mode_disable(uint32_t usart_periph)
  533. {
  534. USART_CTL2(usart_periph) &= ~(USART_CTL2_SCEN);
  535. }
  536. /*!
  537. \brief enable NACK in smartcard mode
  538. \param[in] usart_periph: USARTx(x=0,1,2,5)
  539. \param[out] none
  540. \retval none
  541. */
  542. void usart_smartcard_mode_nack_enable(uint32_t usart_periph)
  543. {
  544. USART_CTL2(usart_periph) |= USART_CTL2_NKEN;
  545. }
  546. /*!
  547. \brief disable NACK in smartcard mode
  548. \param[in] usart_periph: USARTx(x=0,1,2,5)
  549. \param[out] none
  550. \retval none
  551. */
  552. void usart_smartcard_mode_nack_disable(uint32_t usart_periph)
  553. {
  554. USART_CTL2(usart_periph) &= ~(USART_CTL2_NKEN);
  555. }
  556. /*!
  557. \brief configure smartcard auto-retry number
  558. \param[in] usart_periph: USARTx(x=0,1,2,5)
  559. \param[in] scrtnum: smartcard auto-retry number
  560. \param[out] none
  561. \retval none
  562. */
  563. void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum)
  564. {
  565. USART_CTL3(usart_periph) &= ~(USART_CTL3_SCRTNUM);
  566. USART_CTL3(usart_periph) |= (USART_CTL3_SCRTNUM & ((scrtnum)<<1));
  567. }
  568. /*!
  569. \brief configure block length in Smartcard T=1 reception
  570. \param[in] usart_periph: USARTx(x=0,1,2,5)
  571. \param[in] bl: block length
  572. \param[out] none
  573. \retval none
  574. */
  575. void usart_block_length_config(uint32_t usart_periph, uint32_t bl)
  576. {
  577. USART_RT(usart_periph) &= ~(USART_RT_BL);
  578. USART_RT(usart_periph) |= (USART_RT_BL & ((bl)<<24));
  579. }
  580. /*!
  581. \brief enable IrDA mode
  582. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  583. \param[out] none
  584. \retval none
  585. */
  586. void usart_irda_mode_enable(uint32_t usart_periph)
  587. {
  588. USART_CTL2(usart_periph) |= USART_CTL2_IREN;
  589. }
  590. /*!
  591. \brief disable IrDA mode
  592. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  593. \param[out] none
  594. \retval none
  595. */
  596. void usart_irda_mode_disable(uint32_t usart_periph)
  597. {
  598. USART_CTL2(usart_periph) &= ~(USART_CTL2_IREN);
  599. }
  600. /*!
  601. \brief configure the peripheral clock prescaler in USART IrDA low-power mode
  602. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  603. \param[in] psc: 0-0x00FFFFFF
  604. \param[out] none
  605. \retval none
  606. */
  607. void usart_prescaler_config(uint32_t usart_periph, uint32_t psc)
  608. {
  609. USART_GP(usart_periph) &= ~(USART_GP_PSC);
  610. USART_GP(usart_periph) |= psc;
  611. }
  612. /*!
  613. \brief configure IrDA low-power
  614. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  615. \param[in] irlp: IrDA low-power or normal
  616. \arg USART_IRLP_LOW: low-power
  617. \arg USART_IRLP_NORMAL: normal
  618. \param[out] none
  619. \retval none
  620. */
  621. void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp)
  622. {
  623. USART_CTL2(usart_periph) &= ~(USART_CTL2_IRLP);
  624. USART_CTL2(usart_periph) |= (USART_CTL2_IRLP & irlp);
  625. }
  626. /*!
  627. \brief configure hardware flow control RTS
  628. \param[in] usart_periph: USARTx(x=0,1,2,5)
  629. \param[in] hardwareflow: enable or disable RTS
  630. \arg USART_RTS_ENABLE: enable RTS
  631. \arg USART_RTS_DISABLE: disable RTS
  632. \param[out] none
  633. \retval none
  634. */
  635. void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig)
  636. {
  637. uint32_t ctl = 0U;
  638. ctl = USART_CTL2(usart_periph);
  639. ctl &= ~USART_CTL2_RTSEN;
  640. ctl |= rtsconfig;
  641. /* configure RTS */
  642. USART_CTL2(usart_periph) = ctl;
  643. }
  644. /*!
  645. \brief configure hardware flow control CTS
  646. \param[in] usart_periph: USARTx(x=0,1,2,5)
  647. \param[in] hardwareflow: enable or disable CTS
  648. \arg USART_CTS_ENABLE: enable CTS
  649. \arg USART_CTS_DISABLE: disable CTS
  650. \param[out] none
  651. \retval none
  652. */
  653. void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig)
  654. {
  655. uint32_t ctl = 0U;
  656. ctl = USART_CTL2(usart_periph);
  657. ctl &= ~USART_CTL2_CTSEN;
  658. ctl |= ctsconfig;
  659. /* configure CTS */
  660. USART_CTL2(usart_periph) = ctl;
  661. }
  662. /*!
  663. \brief configure break frame coherence mode
  664. \param[in] usart_periph: USARTx(x=0,1,2,5)
  665. \param[in] bcm:
  666. \arg USART_BCM_NONE: no parity error is detected
  667. \arg USART_BCM_EN: parity error is detected
  668. \param[out] none
  669. \retval none
  670. */
  671. void usart_break_frame_coherence_config(uint32_t usart_periph, uint32_t bcm)
  672. {
  673. USART_CHC(usart_periph) &= ~(USART_CHC_BCM);
  674. USART_CHC(usart_periph) |= (USART_CHC_BCM & bcm);
  675. }
  676. /*!
  677. \brief configure parity check coherence mode
  678. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  679. \param[in] pcm:
  680. \arg USART_PCM_NONE: not check parity
  681. \arg USART_PCM_EN: check the parity
  682. \param[out] none
  683. \retval none
  684. */
  685. void usart_parity_check_coherence_config(uint32_t usart_periph, uint32_t pcm)
  686. {
  687. USART_CHC(usart_periph) &= ~(USART_CHC_PCM);
  688. USART_CHC(usart_periph) |= (USART_CHC_PCM & pcm);
  689. }
  690. /*!
  691. \brief configure hardware flow control coherence mode
  692. \param[in] usart_periph: USARTx(x=0,1,2,5)
  693. \param[in] hcm:
  694. \arg USART_HCM_NONE: nRTS signal equals to the rxne status register
  695. \arg USART_HCM_EN: nRTS signal is set when the last data bit has been sampled
  696. \param[out] none
  697. \retval none
  698. */
  699. void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm)
  700. {
  701. USART_CHC(usart_periph) &= ~(USART_CHC_HCM);
  702. USART_CHC(usart_periph) |= (USART_CHC_HCM & hcm);
  703. }
  704. /*!
  705. \brief configure USART DMA reception
  706. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  707. \param[in] dmacmd: enable or disable DMA for reception
  708. \arg USART_DENR_ENABLE: DMA enable for reception
  709. \arg USART_DENR_DISABLE: DMA disable for reception
  710. \param[out] none
  711. \retval none
  712. */
  713. void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd)
  714. {
  715. uint32_t ctl = 0U;
  716. ctl = USART_CTL2(usart_periph);
  717. ctl &= ~USART_CTL2_DENR;
  718. ctl |= dmacmd;
  719. /* configure DMA reception */
  720. USART_CTL2(usart_periph) = ctl;
  721. }
  722. /*!
  723. \brief configure USART DMA transmission
  724. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  725. \param[in] dmacmd: enable or disable DMA for transmission
  726. \arg USART_DENT_ENABLE: DMA enable for transmission
  727. \arg USART_DENT_DISABLE: DMA disable for transmission
  728. \param[out] none
  729. \retval none
  730. */
  731. void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd)
  732. {
  733. uint32_t ctl = 0U;
  734. ctl = USART_CTL2(usart_periph);
  735. ctl &= ~USART_CTL2_DENT;
  736. ctl |= dmacmd;
  737. /* configure DMA transmission */
  738. USART_CTL2(usart_periph) = ctl;
  739. }
  740. /*!
  741. \brief get flag in STAT0/STAT1/CHC register
  742. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  743. \param[in] flag: USART flags, refer to usart_flag_enum
  744. \arg USART_FLAG_CTSF: CTS change flag
  745. \arg USART_FLAG_LBDF: LIN break detected flag
  746. \arg USART_FLAG_TBE: transmit data buffer empty
  747. \arg USART_FLAG_TC: transmission complete
  748. \arg USART_FLAG_RBNE: read data buffer not empty
  749. \arg USART_FLAG_IDLEF: IDLE frame detected flag
  750. \arg USART_FLAG_ORERR: overrun error
  751. \arg USART_FLAG_NERR: noise error flag
  752. \arg USART_FLAG_FERR: frame error flag
  753. \arg USART_FLAG_PERR: parity error flag
  754. \arg USART_FLAG_BSY: busy flag
  755. \arg USART_FLAG_EBF: end of block flag
  756. \arg USART_FLAG_RTF: receiver timeout flag
  757. \arg USART_FLAG_EPERR: early parity error flag
  758. \param[out] none
  759. \retval FlagStatus: SET or RESET
  760. */
  761. FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag)
  762. {
  763. if(RESET != (USART_REG_VAL(usart_periph, flag) & BIT(USART_BIT_POS(flag)))){
  764. return SET;
  765. }else{
  766. return RESET;
  767. }
  768. }
  769. /*!
  770. \brief clear flag in STAT0/STAT1/CHC register
  771. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  772. \param[in] flag: USART flags, refer to usart_flag_enum
  773. \arg USART_FLAG_CTSF: CTS change flag
  774. \arg USART_FLAG_LBDF: LIN break detected flag
  775. \arg USART_FLAG_TC: transmission complete
  776. \arg USART_FLAG_RBNE: read data buffer not empty
  777. \arg USART_FLAG_EBF: end of block flag
  778. \arg USART_FLAG_RTF: receiver timeout flag
  779. \arg USART_FLAG_EPERR: early parity error flag
  780. \param[out] none
  781. \retval none
  782. */
  783. void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag)
  784. {
  785. USART_REG_VAL(usart_periph, flag) &= ~BIT(USART_BIT_POS(flag));
  786. }
  787. /*!
  788. \brief enable USART interrupt
  789. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  790. \param[in] int_flag
  791. \arg USART_INTEN_PERRIE: parity error interrupt
  792. \arg USART_INTEN_TBEIE: transmitter buffer empty interrupt
  793. \arg USART_INTEN_TCIE: transmission complete interrupt
  794. \arg USART_INTEN_RBNEIE: read data buffer not empty interrupt and overrun error interrupt
  795. \arg USART_INTEN_IDLEIE: IDLE line detected interrupt
  796. \arg USART_INTEN_LBDIE: LIN break detected interrupt
  797. \arg USART_INTEN_ERRIE: error interrupt
  798. \arg USART_INTEN_CTSIE: CTS interrupt
  799. \arg USART_INTEN_RTIE: interrupt enable bit of receive timeout event
  800. \arg USART_INTEN_EBIE: interrupt enable bit of end of block event
  801. \param[out] none
  802. */
  803. void usart_interrupt_enable(uint32_t usart_periph, uint32_t int_flag)
  804. {
  805. uint32_t usart_reg = 0U;
  806. usart_reg = int_flag & (~(uint32_t)USART_INTEN_MASK);
  807. int_flag &= USART_INTEN_MASK;
  808. /* flags in USART_CTL0 */
  809. if(USART_INTS_CTL0 == usart_reg){
  810. USART_CTL0(usart_periph) |= int_flag;
  811. /* flags in USART_CTL1 */
  812. }else if(USART_INTS_CTL1 == usart_reg){
  813. USART_CTL1(usart_periph) |= int_flag;
  814. /* flags in USART_CTL2 */
  815. }else if(USART_INTS_CTL2 == usart_reg){
  816. USART_CTL2(usart_periph) |= int_flag;
  817. /* flags in USART_CTL3 */
  818. }else if(USART_INTS_CTL3 == usart_reg){
  819. USART_CTL3(usart_periph) |= int_flag;
  820. }else{
  821. /* illegal parameters */
  822. }
  823. }
  824. /*!
  825. \brief disable USART interrupt
  826. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  827. \param[in] int_flag
  828. \arg USART_INTEN_PERRIE: parity error interrupt
  829. \arg USART_INTEN_TBEIE: transmitter buffer empty interrupt
  830. \arg USART_INTEN_TCIE: transmission complete interrupt
  831. \arg USART_INTEN_RBNEIE: read data buffer not empty interrupt and overrun error interrupt
  832. \arg USART_INTEN_IDLEIE: IDLE line detected interrupt
  833. \arg USART_INTEN_LBDIE: LIN break detected interrupt
  834. \arg USART_INTEN_ERRIE: error interrupt
  835. \arg USART_INTEN_CTSIE: CTS interrupt
  836. \arg USART_INTEN_RTIE: interrupt enable bit of receive timeout event
  837. \arg USART_INTEN_EBIE: interrupt enable bit of end of block event
  838. \param[out] none
  839. */
  840. void usart_interrupt_disable(uint32_t usart_periph, uint32_t int_flag)
  841. {
  842. uint32_t usart_reg = 0U;
  843. usart_reg = int_flag & (~(uint32_t)USART_INTEN_MASK);
  844. int_flag &= USART_INTEN_MASK;
  845. /* flags in USART_CTL0 */
  846. if(USART_INTS_CTL0 == usart_reg){
  847. USART_CTL0(usart_periph) &= ~(int_flag);
  848. /* flags in USART_CTL1 */
  849. }else if(USART_INTS_CTL1 == usart_reg){
  850. USART_CTL1(usart_periph) &= ~(int_flag);
  851. /* flags in USART_CTL2 */
  852. }else if(USART_INTS_CTL2 == usart_reg){
  853. USART_CTL2(usart_periph) &= ~(int_flag);
  854. /* flags in USART_CTL3 */
  855. }else if(USART_INTS_CTL3 == usart_reg){
  856. USART_CTL3(usart_periph) &= ~(int_flag);
  857. }else{
  858. /* illegal parameters */
  859. }
  860. }
  861. /*!
  862. \brief get USART interrupt enable flag
  863. \param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
  864. \param[in] int_flag
  865. \arg USART_INT_PERRIE: parity error interrupt
  866. \arg USART_INT_TBEIE: transmitter buffer empty interrupt
  867. \arg USART_INT_TCIE: transmission complete interrupt
  868. \arg USART_INT_RBNEIE: read data buffer not empty interrupt and overrun error interrupt
  869. \arg USART_INT_IDLEIE: IDLE line detected interrupt
  870. \arg USART_INT_LBDIE: LIN break detected interrupt
  871. \arg USART_INT_CTSIE: CTS interrupt
  872. \arg USART_INT_ERRIE: error interrupt
  873. \arg USART_INT_EBIE: interrupt enable bit of end of block event
  874. \arg USART_INT_RTIE: interrupt enable bit of receive timeout event
  875. \param[out] none
  876. \retval FlagStatus
  877. */
  878. FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag)
  879. {
  880. if(RESET != (USART_REG_VAL(usart_periph, int_flag) & BIT(USART_BIT_POS(int_flag)))){
  881. return SET;
  882. }else{
  883. return RESET;
  884. }
  885. }