lib_uart.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
  3. *文件名: lib_uart.c
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: UART模块库函数
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #include "lib_uart.h"
  12. /***************************************************************
  13. 函数名:UART_Init
  14. 描 述:UART初始化
  15. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_InitStruct:初始化配置结构体地址
  16. 输出值:无
  17. 返回值:无
  18. ***************************************************************/
  19. void UART_Init(UART_TypeDef* UARTx,UART_InitStruType* UART_InitStruct)
  20. {
  21. uint32_t BaudClockTemp = 0, BaudTemp = 0;
  22. if(UART_InitStruct->UART_ClockSet == UART_Clock_1)
  23. {
  24. BaudClockTemp = (SystemCoreClock/16)%UART_InitStruct->UART_BaudRate;
  25. if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
  26. {
  27. BaudTemp = (SystemCoreClock/16/UART_InitStruct->UART_BaudRate)-1;
  28. }
  29. else
  30. {
  31. BaudTemp = SystemCoreClock/16/UART_InitStruct->UART_BaudRate;
  32. }
  33. }
  34. else if(UART_InitStruct->UART_ClockSet == UART_Clock_2)
  35. {
  36. BaudClockTemp = (SystemCoreClock/32)%UART_InitStruct->UART_BaudRate;
  37. if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
  38. {
  39. BaudTemp = (SystemCoreClock/32/UART_InitStruct->UART_BaudRate)-1;
  40. }
  41. else
  42. {
  43. BaudTemp = SystemCoreClock/32/UART_InitStruct->UART_BaudRate;
  44. }
  45. }
  46. else if(UART_InitStruct->UART_ClockSet == UART_Clock_4)
  47. {
  48. BaudClockTemp = (SystemCoreClock/64)%UART_InitStruct->UART_BaudRate;
  49. if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
  50. {
  51. BaudTemp = (SystemCoreClock/64/UART_InitStruct->UART_BaudRate)-1;
  52. }
  53. else
  54. {
  55. BaudTemp = SystemCoreClock/64/UART_InitStruct->UART_BaudRate;
  56. }
  57. }
  58. if(BaudTemp > 2046)
  59. {
  60. BaudTemp = 2047;
  61. }
  62. UARTx->CON.BCS = UART_InitStruct->UART_ClockSet;
  63. UARTx->BRR.BRR = BaudTemp ;
  64. UARTx->CON.TXFS = UART_InitStruct->UART_StopBits;
  65. UARTx->CON.TXMOD = UART_InitStruct->UART_TxMode;
  66. UARTx->CON.TXP = UART_InitStruct->UART_TxPolar;
  67. UARTx->CON.RXMOD = UART_InitStruct->UART_RxMode;
  68. UARTx->CON.RXP = UART_InitStruct->UART_RxPolar;
  69. }
  70. /***************************************************************
  71. 函数名:UART_ITConfig
  72. 描 述:UART中断配置
  73. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_IT:中断类型 、 NewState:使能/失能
  74. 输出值:无
  75. 返回值:无
  76. ***************************************************************/
  77. void UART_ITConfig(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT,TYPE_FUNCEN NewState)
  78. {
  79. if (NewState != DISABLE)
  80. UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) | (uint32_t) UART_IT;
  81. else
  82. UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) & (~((uint32_t) UART_IT));
  83. }
  84. /***************************************************************
  85. 函数名:UART_TBIMConfig
  86. 描 述:UART发送缓冲器空中断模式选择
  87. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 Type:空中断模式
  88. 输出值:无
  89. 返回值:无
  90. ***************************************************************/
  91. void UART_TBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
  92. {
  93. UARTx->IE.TBIM = Type;
  94. }
  95. /***************************************************************
  96. 函数名:UART_RBIMConfig
  97. 描 述:UART接收缓冲器满中断模式选择
  98. 输入值:UARTx:可以是UART0/1/2/3 、 Type:满中断模式
  99. 输出值:无
  100. 返回值:无
  101. ***************************************************************/
  102. void UART_RBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
  103. {
  104. UARTx->IE.RBIM = Type;
  105. }
  106. /***************************************************************
  107. 函数名:UART_Sendxxxx
  108. 描 述:UART发送字节、半字、字
  109. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 数据
  110. 输出值:无
  111. 返回值:无
  112. ***************************************************************/
  113. void UART_SendByte(UART_TypeDef* UARTx,uint8_t Temp08)
  114. {
  115. UARTx->TBW.Byte[0] = Temp08;
  116. }
  117. void UART_SendHalfWord(UART_TypeDef* UARTx,uint16_t Temp16)
  118. {
  119. UARTx->TBW.HalfWord[0] = Temp16;
  120. }
  121. void UART_SendWord(UART_TypeDef* UARTx,uint32_t Temp32)
  122. {
  123. UARTx->TBW.Word = Temp32;
  124. }
  125. /***************************************************************
  126. 函数名:UART_Recxxxx
  127. 描 述:UART接收字节、半字、字
  128. 输入值:UARTx:可以是UART0/1/2/3/4/5
  129. 输出值:无
  130. 返回值:数据
  131. ***************************************************************/
  132. uint8_t UART_RecByte(UART_TypeDef* UARTx)
  133. {
  134. return UARTx->RBR.Byte[0];
  135. }
  136. uint16_t UART_RecHalfWord(UART_TypeDef* UARTx)
  137. {
  138. return UARTx->RBR.HalfWord[0];
  139. }
  140. uint32_t UART_RecWord(UART_TypeDef* UARTx)
  141. {
  142. return UARTx->RBR.Word;
  143. }
  144. /***************************************************************
  145. 函数名:UART_GetFlagStatus
  146. 描 述:UART获取标志位状态
  147. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_Flag:标志位
  148. 输出值:无
  149. 返回值:SET/RESET
  150. ***************************************************************/
  151. FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx,UART_TYPE_FLAG UART_Flag)
  152. {
  153. FlagStatus bitstatus = RESET;
  154. if ((UARTx->IF.Word & ((uint32_t)UART_Flag)) != RESET)
  155. bitstatus = SET;
  156. else
  157. bitstatus = RESET;
  158. return bitstatus;
  159. }
  160. /***************************************************************
  161. 函数名:UART_GetITStatus
  162. 描 述:UART获取中断状态
  163. 输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_Flag:标志位
  164. 输出值:无
  165. 返回值:SET/RESET
  166. ***************************************************************/
  167. ITStatus UART_GetITStatus(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT)
  168. {
  169. FlagStatus bitstatus = RESET;
  170. if((UARTx->IE.Word & ((uint32_t)UART_IT)) == 0)
  171. bitstatus = RESET;
  172. else
  173. bitstatus = SET;
  174. return bitstatus;
  175. }
  176. /***************************************************************
  177. 函数名:UART_ClearIFPendingBit
  178. 描 述:UART标志位清除
  179. 输入值:UARTx:可以是UART0/1/2/3/4/5、 UART_Flag:标志位
  180. 输出值:无
  181. 返回值:无
  182. ***************************************************************/
  183. void UART_ClearIFPendingBit(UART_TypeDef* UARTx,UART_CLR_IF UART_Flag)
  184. {
  185. UARTx->IF.Word = (uint32_t)UART_Flag;
  186. }
  187. /*************************END OF FILE**********************/