SWM320_uart.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_uart.c
  3. * 功能说明: SWM320单片机的UART串口功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项: 没有编写LIN功能相关的函数
  6. * 版本日期: V1.1.0 2017年10月25日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM320.h"
  22. #include "SWM320_uart.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: UART_Init()
  25. * 功能说明: UART串口初始化
  26. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  27. * UART_InitStructure * initStruct 包含UART串口相关设定值的结构体
  28. * 输 出: 无
  29. * 注意事项: 无
  30. ******************************************************************************************************************************************/
  31. void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
  32. {
  33. switch((uint32_t)UARTx)
  34. {
  35. case ((uint32_t)UART0):
  36. SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos);
  37. break;
  38. case ((uint32_t)UART1):
  39. SYS->CLKEN |= (0x01 << SYS_CLKEN_UART1_Pos);
  40. break;
  41. case ((uint32_t)UART2):
  42. SYS->CLKEN |= (0x01 << SYS_CLKEN_UART2_Pos);
  43. break;
  44. case ((uint32_t)UART3):
  45. SYS->CLKEN |= (0x01 << SYS_CLKEN_UART3_Pos);
  46. break;
  47. }
  48. UART_Close(UARTx); //一些关键寄存器只能在串口关闭时设置
  49. UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
  50. UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
  51. UARTx->BAUD |= ((SystemCoreClock/16/initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
  52. UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
  53. UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
  54. (initStruct->Parity << UART_CTRL_PARITY_Pos) |
  55. (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
  56. /* 在SWM320中,当 RXLVL >= RXTHR 时触发中断,如果RXTHR设置为0的话,在未接收到数据时就会一直触发中断;
  57. 其他芯片中,当 RXLVL > RXTHR 时触发中断,为解决SWM320中RXTHR不能为0的问题,并统一库函数API,这里将RXTHR设置值加一
  58. */
  59. switch((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
  60. {
  61. case ((uint32_t)UART0): NVIC_DisableIRQ(UART0_IRQn); break;
  62. case ((uint32_t)UART1): NVIC_DisableIRQ(UART1_IRQn); break;
  63. case ((uint32_t)UART2): NVIC_DisableIRQ(UART2_IRQn); break;
  64. case ((uint32_t)UART3): NVIC_DisableIRQ(UART3_IRQn); break;
  65. }
  66. UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
  67. UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
  68. (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
  69. UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
  70. UARTx->CTRL |= (initStruct->TimeoutTime << UART_CTRL_TOTIME_Pos);
  71. UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
  72. UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
  73. (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
  74. (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
  75. switch((uint32_t)UARTx)
  76. {
  77. case ((uint32_t)UART0):
  78. if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  79. {
  80. NVIC_EnableIRQ(UART0_IRQn);
  81. }
  82. else
  83. {
  84. NVIC_DisableIRQ(UART0_IRQn);
  85. }
  86. break;
  87. case ((uint32_t)UART1):
  88. if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  89. {
  90. NVIC_EnableIRQ(UART1_IRQn);
  91. }
  92. else
  93. {
  94. NVIC_DisableIRQ(UART1_IRQn);
  95. }
  96. break;
  97. case ((uint32_t)UART2):
  98. if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  99. {
  100. NVIC_EnableIRQ(UART2_IRQn);
  101. }
  102. else
  103. {
  104. NVIC_DisableIRQ(UART2_IRQn);
  105. }
  106. break;
  107. case ((uint32_t)UART3):
  108. if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  109. {
  110. NVIC_EnableIRQ(UART3_IRQn);
  111. }
  112. else
  113. {
  114. NVIC_DisableIRQ(UART3_IRQn);
  115. }
  116. break;
  117. }
  118. }
  119. /******************************************************************************************************************************************
  120. * 函数名称: UART_Open()
  121. * 功能说明: UART串口打开
  122. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  123. * 输 出: 无
  124. * 注意事项: 无
  125. ******************************************************************************************************************************************/
  126. void UART_Open(UART_TypeDef * UARTx)
  127. {
  128. UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
  129. }
  130. /******************************************************************************************************************************************
  131. * 函数名称: UART_Close()
  132. * 功能说明: UART串口关闭
  133. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  134. * 输 出: 无
  135. * 注意事项: 无
  136. ******************************************************************************************************************************************/
  137. void UART_Close(UART_TypeDef * UARTx)
  138. {
  139. UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
  140. }
  141. /******************************************************************************************************************************************
  142. * 函数名称: UART_WriteByte()
  143. * 功能说明: 发送一个字节数据
  144. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
  145. * uint32_t data 要发送的字节
  146. * 输 出: 无
  147. * 注意事项: 无
  148. ******************************************************************************************************************************************/
  149. void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data)
  150. {
  151. UARTx->DATA = data;
  152. }
  153. /******************************************************************************************************************************************
  154. * 函数名称: UART_ReadByte()
  155. * 功能说明: 读取一个字节数据,并指出数据是否Valid
  156. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
  157. * uint32_t * data 接收到的数据
  158. * 输 出: uint32_t 0 无错误 UART_ERR_PARITY 奇偶校验错误
  159. * 注意事项: 无
  160. ******************************************************************************************************************************************/
  161. uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
  162. {
  163. uint32_t reg = UARTx->DATA;
  164. *data = (reg & UART_DATA_DATA_Msk);
  165. if(reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
  166. return 0;
  167. }
  168. /******************************************************************************************************************************************
  169. * 函数名称: UART_IsTXBusy()
  170. * 功能说明: UART是否正在发送数据
  171. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  172. * 输 出: uint32_t 1 UART正在发送数据 0 数据已发完
  173. * 注意事项: 无
  174. ******************************************************************************************************************************************/
  175. uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
  176. {
  177. return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
  178. }
  179. /******************************************************************************************************************************************
  180. * 函数名称: UART_IsRXFIFOEmpty()
  181. * 功能说明: 接收FIFO是否为空,如果不空则说明其中有数据可以读取
  182. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  183. * 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
  184. * 注意事项: 无
  185. ******************************************************************************************************************************************/
  186. uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
  187. {
  188. return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
  189. }
  190. /******************************************************************************************************************************************
  191. * 函数名称: UART_IsTXFIFOFull()
  192. * 功能说明: 发送FIFO是否为满,如果不满则可以继续向其中写入数据
  193. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  194. * 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
  195. * 注意事项: 无
  196. ******************************************************************************************************************************************/
  197. uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
  198. {
  199. return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
  200. }
  201. /******************************************************************************************************************************************
  202. * 函数名称: UART_SetBaudrate()
  203. * 功能说明: 设置波特率
  204. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  205. * uint32_t baudrate 要设置的波特率
  206. * 输 出: 无
  207. * 注意事项: 不要在串口工作时更改波特率,使用此函数前请先调用UART_Close()关闭串口
  208. ******************************************************************************************************************************************/
  209. void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
  210. {
  211. UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
  212. UARTx->BAUD |= ((SystemCoreClock/16/baudrate - 1) << UART_BAUD_BAUD_Pos);
  213. }
  214. /******************************************************************************************************************************************
  215. * 函数名称: UART_GetBaudrate()
  216. * 功能说明: 查询波特率
  217. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  218. * 输 出: uint32_t 当前波特率
  219. * 注意事项: 无
  220. ******************************************************************************************************************************************/
  221. uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
  222. {
  223. return SystemCoreClock/16/(((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
  224. }
  225. /******************************************************************************************************************************************
  226. * 函数名称: UART_CTSConfig()
  227. * 功能说明: UART CTS流控配置
  228. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  229. * uint32_t enable 1 使能CTS流控 0 禁止CTS流控
  230. * uint32_t polarity 0 CTS输入为低表示可以发送数据 1 CTS输入为高表示可以发送数据
  231. * 输 出: 无
  232. * 注意事项: 无
  233. ******************************************************************************************************************************************/
  234. void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
  235. {
  236. UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
  237. UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
  238. (polarity << UART_CTSCR_POL_Pos);
  239. }
  240. /******************************************************************************************************************************************
  241. * 函数名称: UART_CTSLineState()
  242. * 功能说明: UART CTS线当前状态
  243. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  244. * 输 出: uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平
  245. * 注意事项: 无
  246. ******************************************************************************************************************************************/
  247. uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
  248. {
  249. return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
  250. }
  251. /******************************************************************************************************************************************
  252. * 函数名称: UART_RTSConfig()
  253. * 功能说明: UART RTS流控配置
  254. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  255. * uint32_t enable 1 使能RTS流控 0 禁止RTS流控
  256. * uint32_t polarity 0 RTS输出低表示可以接收数据 1 RTS输出高表示可以接收数据
  257. * uint32_t threshold RTS流控的触发阈值,可取值UART_RTS_1BYTE、UART_RTS_2BYTE、UART_RTS_4BYTE、UART_RTS_6BYTE
  258. * 输 出: 无
  259. * 注意事项: 无
  260. ******************************************************************************************************************************************/
  261. void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
  262. {
  263. UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
  264. UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
  265. (polarity << UART_RTSCR_POL_Pos) |
  266. (threshold << UART_RTSCR_THR_Pos);
  267. }
  268. /******************************************************************************************************************************************
  269. * 函数名称: UART_RTSLineState()
  270. * 功能说明: UART RTS线当前状态
  271. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  272. * 输 出: uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平
  273. * 注意事项: 无
  274. ******************************************************************************************************************************************/
  275. uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
  276. {
  277. return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
  278. }
  279. /******************************************************************************************************************************************
  280. * 函数名称: UART_LINConfig()
  281. * 功能说明: UART LIN功能配置
  282. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  283. * uint32_t detectedIEn 检测到Break中断使能
  284. * uint32_t generatedIEn Break发送完成中断使能
  285. * 输 出: 无
  286. * 注意事项: 无
  287. ******************************************************************************************************************************************/
  288. void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
  289. {
  290. UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
  291. UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
  292. (generatedIEn << UART_LINCR_GENBRKIE_Pos);
  293. }
  294. /******************************************************************************************************************************************
  295. * 函数名称: UART_LINGenerate()
  296. * 功能说明: UART LIN产生/发送Break
  297. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  298. * 输 出: 无
  299. * 注意事项: 无
  300. ******************************************************************************************************************************************/
  301. void UART_LINGenerate(UART_TypeDef * UARTx)
  302. {
  303. UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
  304. }
  305. /******************************************************************************************************************************************
  306. * 函数名称: UART_LINIsDetected()
  307. * 功能说明: UART LIN是否检测到Break
  308. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  309. * 输 出: uint32_t 1 检测到LIN Break 0 未检测到LIN Break
  310. * 注意事项: 无
  311. ******************************************************************************************************************************************/
  312. uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
  313. {
  314. return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
  315. }
  316. /******************************************************************************************************************************************
  317. * 函数名称: UART_LINIsGenerated()
  318. * 功能说明: UART LIN Break是否发送完成
  319. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  320. * 输 出: uint32_t 1 LIN Break 发送完成 0 LIN Break发送未完成
  321. * 注意事项: 无
  322. ******************************************************************************************************************************************/
  323. uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
  324. {
  325. return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
  326. }
  327. /******************************************************************************************************************************************
  328. * 函数名称: UART_ABRStart()
  329. * 功能说明: UART 自动波特率检测开始
  330. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  331. * uint32_t detectChar 用于自动检测、计算波特率的检测字符
  332. * 8位数据时可取值:0xFF、0xFE、0xF8、0x80,分别表示发送方必须发送0xFF、0xFE、0xF8、0x80
  333. * 9位数据时可取值:0x1FF、0x1FE、0x1F8、0x180,分别表示发送方必须发送0x1FF、0x1FE、0x1F8、0x180
  334. * 输 出: 无
  335. * 注意事项: 自动波特率检测时不能开启奇偶校验
  336. ******************************************************************************************************************************************/
  337. void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
  338. {
  339. uint32_t bits = 0;
  340. if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
  341. else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
  342. else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
  343. else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
  344. else while(1);
  345. UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
  346. UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
  347. (bits << UART_BAUD_ABRBIT_Pos);
  348. }
  349. /******************************************************************************************************************************************
  350. * 函数名称: UART_ABRIsDone()
  351. * 功能说明: UART 自动波特率是否完成
  352. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  353. * 输 出: uint32_t 0 未完成 UART_ABR_RES_OK 已完成,且成功 UART_ABR_RES_ERR 已完成,但失败、出错
  354. * 注意事项: 无
  355. ******************************************************************************************************************************************/
  356. uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
  357. {
  358. if(UARTx->BAUD & UART_BAUD_ABREN_Msk)
  359. {
  360. return 0;
  361. }
  362. else if(UARTx->BAUD & UART_BAUD_ABRERR_Msk)
  363. {
  364. return UART_ABR_RES_ERR;
  365. }
  366. else
  367. {
  368. return UART_ABR_RES_OK;
  369. }
  370. }
  371. /******************************************************************************************************************************************
  372. * 函数名称: UART_INTEn()
  373. * 功能说明: 中断使能
  374. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  375. * uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
  376. * 输 出: 无
  377. * 注意事项: 无
  378. ******************************************************************************************************************************************/
  379. void UART_INTEn(UART_TypeDef * UARTx, uint32_t it)
  380. {
  381. UARTx->CTRL |= it;
  382. }
  383. /******************************************************************************************************************************************
  384. * 函数名称: UART_INTDis()
  385. * 功能说明: 中断禁止
  386. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  387. * uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
  388. * 输 出: 无
  389. * 注意事项: 无
  390. ******************************************************************************************************************************************/
  391. void UART_INTDis(UART_TypeDef * UARTx, uint32_t it)
  392. {
  393. UARTx->CTRL &= ~it;
  394. }
  395. /******************************************************************************************************************************************
  396. * 函数名称: UART_INTStat()
  397. * 功能说明: 中断状态查询
  398. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  399. * uint32_t it interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
  400. * 输 出: uint32_t 1 中断已发生 0 中断未发生
  401. * 注意事项: 无
  402. ******************************************************************************************************************************************/
  403. uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it)
  404. {
  405. return (((it & UART_IT_RX_THR) && (UARTx->BAUD & UART_BAUD_RXIF_Msk)) ||
  406. ((it & UART_IT_RX_TOUT) && (UARTx->BAUD & UART_BAUD_TOIF_Msk)) ||
  407. ((it & UART_IT_TX_THR) && (UARTx->BAUD & UART_BAUD_TXIF_Msk)) ||
  408. ((it & UART_IT_TX_DONE) && (UARTx->BAUD & UART_BAUD_TXDOIF_Msk)));
  409. }