uart.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:15k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : uart.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 06/08/2003
  5. * Description        : This file provides all the UART software functions
  6. ********************************************************************************
  7. * History:
  8. *  01/01/2004 : V1.2
  9. *  14/07/2004 : V1.3
  10. *******************************************************************************/
  11. #include "uart.h"
  12. /*******************************************************************************
  13. * Function Name  : UART_Init
  14. * Description    : This function initializes the selected UART.
  15. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  16. * Output         : None
  17. * Return         : None
  18. *******************************************************************************/
  19. void UART_Init(UART_TypeDef *UARTx)
  20. {
  21.   UARTx->IER = 0x00;
  22.   UARTx->CR = 0x00;
  23.   (void)UARTx->RxBUFR;
  24.   UARTx->RxRSTR = 0xFFFF;
  25.   UARTx->TxRSTR = 0xFFFF;
  26. }
  27. /*******************************************************************************
  28. * Function Name  : UART_BaudRateConfig
  29. * Description    : This function configures the baud rate of the selected UART.
  30. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  31. * Input 2        : The baudrate value
  32. * Output         : None
  33. * Return         : None
  34. *******************************************************************************/
  35. void UART_BaudRateConfig(UART_TypeDef *UARTx, u32 BaudRate)
  36. {
  37.   UARTx->BR = (u16)(RCCU_FrequencyValue(RCCU_FCLK)/(16*BaudRate));
  38. }
  39. /*******************************************************************************
  40. * Function Name  : UART_Config
  41. * Description    : This function configures the baudrate, the mode, the data
  42. *                  parity and the number of stop bits of the selected UART.
  43. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  44. * Input 2        : The baudrate value
  45. * Input 3        : The parity type
  46. * Input 4        : The number of stop bits
  47. * Input 5        : The UART mode
  48. * Output         : None
  49. * Return         : None
  50. *******************************************************************************/
  51. void UART_Config(UART_TypeDef *UARTx, u32 BaudRate, UARTParity_TypeDef Parity,
  52.                  UARTStopBits_TypeDef StopBits, UARTMode_TypeDef Mode)
  53. {
  54.   UART_ModeConfig(UARTx, Mode);
  55.   UART_BaudRateConfig(UARTx, BaudRate);
  56.   UART_ParityConfig(UARTx, Parity);
  57.   UART_StopBitsConfig(UARTx, StopBits);
  58. }
  59. /*******************************************************************************
  60. * Function Name  : UART_ItConfig
  61. * Description    : This function enables or disables the interrupts of the
  62. *                  selected UART.
  63. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  64. * Input 2        : The new interrupt flag
  65. * Input 3        : ENABLE or DISABLE
  66. * Output         : None
  67. * Return         : None
  68. *******************************************************************************/
  69. void UART_ItConfig(UART_TypeDef *UARTx, u16 UART_Flag, FunctionalState NewState)
  70. {
  71.   if (NewState==ENABLE) UARTx->IER|=UART_Flag; else UARTx->IER&=~UART_Flag;
  72. }
  73. /*******************************************************************************
  74. * Function Name  : UART_FifoConfig
  75. * Description    : This function enables or disables the Rx and Tx FIFOs of
  76. *                  the selected UART.
  77. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  78. * Input 2        : ENABLE or DISABLE
  79. * Output         : None
  80. * Return         : None
  81. *******************************************************************************/
  82. void UART_FifoConfig(UART_TypeDef *UARTx, FunctionalState NewState)
  83. {
  84.   if (NewState==ENABLE) UARTx->CR|=0x0400; else UARTx->CR&=~0x0400;
  85. }
  86. /*******************************************************************************
  87. * Function Name  : UART_FifoReset
  88. * Description    : This function resets the Rx and the Tx FIFOs of the
  89. *                  selected UART.
  90. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  91. * Input 2        : UART_RxFIFO or UART_TxFIFO
  92. * Output         : None
  93. * Return         : None
  94. *******************************************************************************/
  95. void UART_FifoReset(UART_TypeDef *UARTx, UARTFIFO_TypeDef FIFO)
  96. {
  97.   if (FIFO==UART_RxFIFO) UARTx->RxRSTR=0xFFFF; else UARTx->TxRSTR=0xFFFF;
  98. }
  99. /*******************************************************************************
  100. * Function Name  : UART_LoopBackConfig
  101. * Description    : This function enables or disables the loop back mode of
  102. *                  the selected UART.
  103. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  104. * Input 2        : ENABLE or DISABLE
  105. * Output         : None
  106. * Return         : None
  107. *******************************************************************************/
  108. void UART_LoopBackConfig(UART_TypeDef *UARTx, FunctionalState NewState)
  109. {
  110.   if (NewState==ENABLE) UARTx->CR|=0x0040; else UARTx->CR&=~0x0040;
  111. }
  112. /*******************************************************************************
  113. * Function Name  : UART_RxConfig
  114. * Description    : This function enables or disables the UART data reception.
  115. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  116. * Input 2        : ENABLE or DISABLE
  117. * Output         : None
  118. * Return         : None
  119. *******************************************************************************/
  120. void UART_RxConfig(UART_TypeDef *UARTx, FunctionalState NewState)
  121. {
  122.   if (NewState==ENABLE) UARTx->CR|=0x0100; else UARTx->CR&=~0x0100;
  123. }
  124. /*******************************************************************************
  125. * Function Name  : UART_OnOffConfig
  126. * Description    : This function sets On/Off the selected UART.
  127. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  128. * Input 2        : ENABLE or DISABLE
  129. * Output         : None
  130. * Return         : None
  131. *******************************************************************************/
  132. void UART_OnOffConfig(UART_TypeDef *UARTx, FunctionalState NewState)
  133. {
  134.   if (NewState==ENABLE) UARTx->CR|=0x0080; else UARTx->CR&=~0x0080;
  135. }
  136. /*******************************************************************************
  137. * Function Name  : UART_ByteSend
  138. * Description    : This function sends a data byte to the selected UART.
  139. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  140. * Input 2        : A pointer to the data byte to send
  141. * Output         : None
  142. * Return         : None
  143. *******************************************************************************/
  144. void UART_ByteSend(UART_TypeDef *UARTx, u8 *Data)
  145. {
  146.   if (UARTx->CR & (0x0001<<UART_FIFOEnableBit))// if FIFO ENABLED
  147.     while((UARTx->SR & UART_TxFull)); // while the UART_TxFIFO contain 16 characters.
  148.   else                  // if FIFO DISABLED
  149.     while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty
  150.   UARTx->TxBUFR = *Data;
  151. }
  152. /*******************************************************************************
  153. * Function Name  : UART_9BitByteSend
  154. * Description    : This function sends a 9 bits data byte to the selected UART.
  155. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  156. * Input 2        : A pointer to the data to send
  157. * Output         : None
  158. * Return         : None
  159. *******************************************************************************/
  160. void UART_9BitByteSend(UART_TypeDef *UARTx, u16 *Data)
  161. {
  162.   if(UARTx->CR & (0x0001<<UART_FIFOEnableBit))// if FIFO ENABLED
  163.     while((UARTx->SR & UART_TxFull)); // while the UART_TxFIFO contain 16 characters.
  164.   else                  // if FIFO DISABLED
  165.     while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty
  166.   UARTx->TxBUFR = *Data;
  167. }
  168. /*******************************************************************************
  169. * Function Name  : UART_DataSend
  170. * Description    : This function sends several data bytes to the selected UART.
  171. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  172. * Input 2        : A pointer to the data to send
  173. * Input 3        : The data length in bytes
  174. * Output         : None
  175. * Return         : None
  176. *******************************************************************************/
  177. void UART_DataSend(UART_TypeDef *UARTx, u8 *Data, u8 DataLength)
  178. {
  179.   while(DataLength--)
  180.   {
  181.     UART_ByteSend(UARTx,Data);
  182.     Data++;
  183.   }
  184. }
  185. /*******************************************************************************
  186. * Function Name  : UART_9BitDataSend
  187. * Description    : This function sends several 9 bits data bytes to the selected UART.
  188. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  189. * Input 2        : A pointer to the data to send
  190. * Input 3        : The data length
  191. * Output         : None
  192. * Return         : None
  193. *******************************************************************************/
  194. void UART_9BitDataSend(UART_TypeDef *UARTx, u16 *Data, u8 DataLength)
  195. {
  196.   while(DataLength--)
  197.   {
  198.     UART_9BitByteSend(UARTx,Data);
  199.     Data++;
  200.   }
  201. }
  202. /*******************************************************************************
  203. * Function Name  : UART_StringSend
  204. * Description    : This function sends a string to the selected UART.
  205. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  206. * Input 2        : A pointer to the string to send
  207. * Output         : None
  208. * Return         : None
  209. *******************************************************************************/
  210. void UART_StringSend(UART_TypeDef *UARTx, u8 *String)
  211. {
  212.   u8 *Data=String;
  213.   while(*Data != '')
  214.     UART_ByteSend(UARTx, Data++);
  215.   *Data='';
  216.   UART_ByteSend(UARTx, Data);
  217. }
  218. /*******************************************************************************
  219. * Function Name  : UART_ByteReceive
  220. * Description    : This function gets a data byte from the selected UART.
  221. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  222. * Input 2        : A pointer to the buffer where the data will be stored
  223. * Input 3        : The time-out period
  224. * Output         : The received data
  225. * Return         : The UARTx.SR register contents
  226. *******************************************************************************/
  227. u16 UART_ByteReceive(UART_TypeDef *UARTx, u8 *Data, u8 TimeOut)
  228. {
  229.    u16 wStatus;
  230.    UARTx->TOR=TimeOut;// reload the Timeout counter
  231.    while (!((wStatus=UARTx->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
  232.    *Data = (u8)UARTx->RxBUFR; // then read the Receive Buffer Register
  233.    return wStatus;
  234. }
  235. /*******************************************************************************
  236. * Function Name  : UART_9BitByteReceive
  237. * Description    : This function gets a 9 bits data byte from the selected UART.
  238. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  239. * Input 2        : A pointer to the buffer where the data will be stored
  240. * Input 3        : The time-out period value
  241. * Output         : The received data
  242. * Return         : The UARTx.SR register contents
  243. *******************************************************************************/
  244. u16 UART_9BitByteReceive(UART_TypeDef *UARTx, u16 *Data, u8 TimeOut)
  245. {
  246.   u16 wStatus;
  247.   UARTx->TOR=TimeOut;// reload the Timeout counter
  248.   while (!((wStatus=UARTx->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
  249.   *Data = (u16)UARTx->RxBUFR; // then read the RxBUFR
  250.   return wStatus;
  251. }
  252. /*******************************************************************************
  253. * Function Name  : UART_DataReceive
  254. * Description    : This function gets 8 bits data bytes from the selected UART.
  255. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  256. * Input 2        : A pointer to the buffer where the data will be stored
  257. * Input 3        : The data length
  258. * Input 4        : The time-out period value
  259. * Output         : The received data
  260. * Return         : The UARTx.SR register contents
  261. *******************************************************************************/
  262. u16 UART_DataReceive(UART_TypeDef *UARTx, u8 *Data, u8 DataLength, u8 TimeOut)
  263. {
  264.   u16 wStatus;
  265.   while(DataLength--)
  266.     wStatus=UART_ByteReceive(UARTx,Data++,TimeOut);
  267.   return wStatus;
  268. }
  269. /*******************************************************************************
  270. * Function Name  : UART_9BitDataReceive
  271. * Description    : This function gets 9 bits data bytes from the selected UART.
  272. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  273. * Input 2        : A pointer to the buffer where the data will be stored
  274. * Input 3        : The data length
  275. * Input 4        : The time-out value
  276. * Output         : The received data
  277. * Return         : The UARTx.SR register contents
  278. *******************************************************************************/
  279. u16 UART_9BitDataReceive(UART_TypeDef *UARTx, u16 *Data, u8 DataLength, u8 TimeOut)
  280. {
  281.   u16 wStatus;
  282.   while(DataLength--)
  283.     wStatus=UART_9BitByteReceive(UARTx,Data++,TimeOut);
  284.   return wStatus;
  285. }
  286. /*******************************************************************************
  287. * Function Name  : UART_StringReceive
  288. * Description    : This function gets 8 bits data bytes from the selected UART.
  289. * Input 1        : UARTx (x can be 0,1, 2 or 3) the desired UART
  290. * Input 2        : A pointer to the buffer where the string will be stored
  291. * Output         : The received string
  292. * Return         : The UARTx.SR register contents
  293. *******************************************************************************/
  294. u16 UART_StringReceive(UART_TypeDef *UARTx, u8 *Data)
  295. {
  296.   u8 *pSTRING=Data;
  297.   u16 wStatus;
  298.   do
  299.   {
  300.     while (!((wStatus=UARTx->SR) & (UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
  301.     *(pSTRING++) = (u8)UARTx->RxBUFR; // then read the RxBUFR
  302.   } while((*(pSTRING - 1)!=0x0D)&(*(pSTRING - 1)!=''));
  303.   *(pSTRING - 1)='';
  304.   return wStatus;
  305. }
  306. #ifdef USE_SERIAL_PORT
  307. /*******************************************************************************
  308. * Function Name  : sendchar
  309. * Description    : This function sends a character to the selected UART.
  310. * Input 1        : A pointer to the character to send.
  311. * Output         : None
  312. * Return         : None
  313. *******************************************************************************/
  314. void sendchar( char *ch )
  315. {
  316.    #ifdef USE_UART0
  317.      #define  UARTx  UART0
  318.    #endif /* Use_UART0 */
  319.    #ifdef USE_UART1
  320.      #define  UARTx  UART1
  321.    #endif /* Use_UART1 */
  322.    #ifdef USE_UART2
  323.      #define  UARTx  UART2
  324.    #endif /* Use_UART2 */
  325.    #ifdef USE_UART3
  326.      #define  UARTx  UART3
  327.    #endif /* Use_UART3 */
  328.    UART_ByteSend(UARTx,(u8 *)ch);
  329. }
  330. #endif /* USE_SERIAL_PORT */
  331. /******************* (C) COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/