SWM320_uart.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  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):
  62. NVIC_DisableIRQ(UART0_IRQn);
  63. break;
  64. case ((uint32_t)UART1):
  65. NVIC_DisableIRQ(UART1_IRQn);
  66. break;
  67. case ((uint32_t)UART2):
  68. NVIC_DisableIRQ(UART2_IRQn);
  69. break;
  70. case ((uint32_t)UART3):
  71. NVIC_DisableIRQ(UART3_IRQn);
  72. break;
  73. }
  74. UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
  75. UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
  76. (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
  77. UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
  78. UARTx->CTRL |= (initStruct->TimeoutTime << UART_CTRL_TOTIME_Pos);
  79. UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
  80. UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
  81. (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
  82. (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
  83. switch ((uint32_t)UARTx)
  84. {
  85. case ((uint32_t)UART0):
  86. if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  87. {
  88. NVIC_EnableIRQ(UART0_IRQn);
  89. }
  90. else
  91. {
  92. NVIC_DisableIRQ(UART0_IRQn);
  93. }
  94. break;
  95. case ((uint32_t)UART1):
  96. if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  97. {
  98. NVIC_EnableIRQ(UART1_IRQn);
  99. }
  100. else
  101. {
  102. NVIC_DisableIRQ(UART1_IRQn);
  103. }
  104. break;
  105. case ((uint32_t)UART2):
  106. if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  107. {
  108. NVIC_EnableIRQ(UART2_IRQn);
  109. }
  110. else
  111. {
  112. NVIC_DisableIRQ(UART2_IRQn);
  113. }
  114. break;
  115. case ((uint32_t)UART3):
  116. if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
  117. {
  118. NVIC_EnableIRQ(UART3_IRQn);
  119. }
  120. else
  121. {
  122. NVIC_DisableIRQ(UART3_IRQn);
  123. }
  124. break;
  125. }
  126. }
  127. /******************************************************************************************************************************************
  128. * 函数名称: UART_Open()
  129. * 功能说明: UART串口打开
  130. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  131. * 输 出: 无
  132. * 注意事项: 无
  133. ******************************************************************************************************************************************/
  134. void UART_Open(UART_TypeDef *UARTx)
  135. {
  136. UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
  137. }
  138. /******************************************************************************************************************************************
  139. * 函数名称: UART_Close()
  140. * 功能说明: UART串口关闭
  141. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  142. * 输 出: 无
  143. * 注意事项: 无
  144. ******************************************************************************************************************************************/
  145. void UART_Close(UART_TypeDef *UARTx)
  146. {
  147. UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
  148. }
  149. /******************************************************************************************************************************************
  150. * 函数名称: UART_WriteByte()
  151. * 功能说明: 发送一个字节数据
  152. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
  153. * uint32_t data 要发送的字节
  154. * 输 出: 无
  155. * 注意事项: 无
  156. ******************************************************************************************************************************************/
  157. void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data)
  158. {
  159. UARTx->DATA = data;
  160. }
  161. /******************************************************************************************************************************************
  162. * 函数名称: UART_ReadByte()
  163. * 功能说明: 读取一个字节数据,并指出数据是否Valid
  164. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
  165. * uint32_t * data 接收到的数据
  166. * 输 出: uint32_t 0 无错误 UART_ERR_PARITY 奇偶校验错误
  167. * 注意事项: 无
  168. ******************************************************************************************************************************************/
  169. uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
  170. {
  171. uint32_t reg = UARTx->DATA;
  172. *data = (reg & UART_DATA_DATA_Msk);
  173. if (reg & UART_DATA_PAERR_Msk)
  174. return UART_ERR_PARITY;
  175. return 0;
  176. }
  177. /******************************************************************************************************************************************
  178. * 函数名称: UART_IsTXBusy()
  179. * 功能说明: UART是否正在发送数据
  180. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  181. * 输 出: uint32_t 1 UART正在发送数据 0 数据已发完
  182. * 注意事项: 无
  183. ******************************************************************************************************************************************/
  184. uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
  185. {
  186. return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
  187. }
  188. /******************************************************************************************************************************************
  189. * 函数名称: UART_IsRXFIFOEmpty()
  190. * 功能说明: 接收FIFO是否为空,如果不空则说明其中有数据可以读取
  191. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  192. * 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
  193. * 注意事项: 无
  194. ******************************************************************************************************************************************/
  195. uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
  196. {
  197. return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
  198. }
  199. /******************************************************************************************************************************************
  200. * 函数名称: UART_IsTXFIFOFull()
  201. * 功能说明: 发送FIFO是否为满,如果不满则可以继续向其中写入数据
  202. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  203. * 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
  204. * 注意事项: 无
  205. ******************************************************************************************************************************************/
  206. uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
  207. {
  208. return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
  209. }
  210. /******************************************************************************************************************************************
  211. * 函数名称: UART_SetBaudrate()
  212. * 功能说明: 设置波特率
  213. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  214. * uint32_t baudrate 要设置的波特率
  215. * 输 出: 无
  216. * 注意事项: 不要在串口工作时更改波特率,使用此函数前请先调用UART_Close()关闭串口
  217. ******************************************************************************************************************************************/
  218. void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
  219. {
  220. UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
  221. UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate - 1) << UART_BAUD_BAUD_Pos);
  222. }
  223. /******************************************************************************************************************************************
  224. * 函数名称: UART_GetBaudrate()
  225. * 功能说明: 查询波特率
  226. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  227. * 输 出: uint32_t 当前波特率
  228. * 注意事项: 无
  229. ******************************************************************************************************************************************/
  230. uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
  231. {
  232. return SystemCoreClock / 16 / (((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
  233. }
  234. /******************************************************************************************************************************************
  235. * 函数名称: UART_CTSConfig()
  236. * 功能说明: UART CTS流控配置
  237. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  238. * uint32_t enable 1 使能CTS流控 0 禁止CTS流控
  239. * uint32_t polarity 0 CTS输入为低表示可以发送数据 1 CTS输入为高表示可以发送数据
  240. * 输 出: 无
  241. * 注意事项: 无
  242. ******************************************************************************************************************************************/
  243. void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
  244. {
  245. UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
  246. UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
  247. (polarity << UART_CTSCR_POL_Pos);
  248. }
  249. /******************************************************************************************************************************************
  250. * 函数名称: UART_CTSLineState()
  251. * 功能说明: UART CTS线当前状态
  252. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  253. * 输 出: uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平
  254. * 注意事项: 无
  255. ******************************************************************************************************************************************/
  256. uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
  257. {
  258. return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
  259. }
  260. /******************************************************************************************************************************************
  261. * 函数名称: UART_RTSConfig()
  262. * 功能说明: UART RTS流控配置
  263. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  264. * uint32_t enable 1 使能RTS流控 0 禁止RTS流控
  265. * uint32_t polarity 0 RTS输出低表示可以接收数据 1 RTS输出高表示可以接收数据
  266. * uint32_t threshold RTS流控的触发阈值,可取值UART_RTS_1BYTE、UART_RTS_2BYTE、UART_RTS_4BYTE、UART_RTS_6BYTE
  267. * 输 出: 无
  268. * 注意事项: 无
  269. ******************************************************************************************************************************************/
  270. void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
  271. {
  272. UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
  273. UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
  274. (polarity << UART_RTSCR_POL_Pos) |
  275. (threshold << UART_RTSCR_THR_Pos);
  276. }
  277. /******************************************************************************************************************************************
  278. * 函数名称: UART_RTSLineState()
  279. * 功能说明: UART RTS线当前状态
  280. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  281. * 输 出: uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平
  282. * 注意事项: 无
  283. ******************************************************************************************************************************************/
  284. uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
  285. {
  286. return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
  287. }
  288. /******************************************************************************************************************************************
  289. * 函数名称: UART_LINConfig()
  290. * 功能说明: UART LIN功能配置
  291. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  292. * uint32_t detectedIEn 检测到Break中断使能
  293. * uint32_t generatedIEn Break发送完成中断使能
  294. * 输 出: 无
  295. * 注意事项: 无
  296. ******************************************************************************************************************************************/
  297. void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
  298. {
  299. UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
  300. UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
  301. (generatedIEn << UART_LINCR_GENBRKIE_Pos);
  302. }
  303. /******************************************************************************************************************************************
  304. * 函数名称: UART_LINGenerate()
  305. * 功能说明: UART LIN产生/发送Break
  306. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  307. * 输 出: 无
  308. * 注意事项: 无
  309. ******************************************************************************************************************************************/
  310. void UART_LINGenerate(UART_TypeDef *UARTx)
  311. {
  312. UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
  313. }
  314. /******************************************************************************************************************************************
  315. * 函数名称: UART_LINIsDetected()
  316. * 功能说明: UART LIN是否检测到Break
  317. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  318. * 输 出: uint32_t 1 检测到LIN Break 0 未检测到LIN Break
  319. * 注意事项: 无
  320. ******************************************************************************************************************************************/
  321. uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
  322. {
  323. return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
  324. }
  325. /******************************************************************************************************************************************
  326. * 函数名称: UART_LINIsGenerated()
  327. * 功能说明: UART LIN Break是否发送完成
  328. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  329. * 输 出: uint32_t 1 LIN Break 发送完成 0 LIN Break发送未完成
  330. * 注意事项: 无
  331. ******************************************************************************************************************************************/
  332. uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
  333. {
  334. return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
  335. }
  336. /******************************************************************************************************************************************
  337. * 函数名称: UART_ABRStart()
  338. * 功能说明: UART 自动波特率检测开始
  339. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  340. * uint32_t detectChar 用于自动检测、计算波特率的检测字符
  341. * 8位数据时可取值:0xFF、0xFE、0xF8、0x80,分别表示发送方必须发送0xFF、0xFE、0xF8、0x80
  342. * 9位数据时可取值:0x1FF、0x1FE、0x1F8、0x180,分别表示发送方必须发送0x1FF、0x1FE、0x1F8、0x180
  343. * 输 出: 无
  344. * 注意事项: 自动波特率检测时不能开启奇偶校验
  345. ******************************************************************************************************************************************/
  346. void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
  347. {
  348. uint32_t bits;
  349. if ((detectChar == 0xFF) || (detectChar == 0x1FF))
  350. bits = 0;
  351. else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
  352. bits = 1;
  353. else if ((detectChar == 0xF8) || (detectChar == 0x1F8))
  354. bits = 2;
  355. else if ((detectChar == 0x80) || (detectChar == 0x180))
  356. bits = 3;
  357. else
  358. while (1)
  359. ;
  360. UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
  361. UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
  362. (bits << UART_BAUD_ABRBIT_Pos);
  363. }
  364. /******************************************************************************************************************************************
  365. * 函数名称: UART_ABRIsDone()
  366. * 功能说明: UART 自动波特率是否完成
  367. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  368. * 输 出: uint32_t 0 未完成 UART_ABR_RES_OK 已完成,且成功 UART_ABR_RES_ERR 已完成,但失败、出错
  369. * 注意事项: 无
  370. ******************************************************************************************************************************************/
  371. uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
  372. {
  373. if (UARTx->BAUD & UART_BAUD_ABREN_Msk)
  374. {
  375. return 0;
  376. }
  377. else if (UARTx->BAUD & UART_BAUD_ABRERR_Msk)
  378. {
  379. return UART_ABR_RES_ERR;
  380. }
  381. else
  382. {
  383. return UART_ABR_RES_OK;
  384. }
  385. }
  386. /******************************************************************************************************************************************
  387. * 函数名称: UART_INTRXThresholdEn()
  388. * 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 触发中断
  389. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  390. * 输 出: 无
  391. * 注意事项: 无
  392. ******************************************************************************************************************************************/
  393. void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
  394. {
  395. UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
  396. }
  397. /******************************************************************************************************************************************
  398. * 函数名称: UART_INTRXThresholdDis()
  399. * 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 不触发中断
  400. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  401. * 输 出: 无
  402. * 注意事项: 无
  403. ******************************************************************************************************************************************/
  404. void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
  405. {
  406. UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
  407. }
  408. /******************************************************************************************************************************************
  409. * 函数名称: UART_INTRXThresholdStat()
  410. * 功能说明: 是否RX FIFO中数据个数 >= RXThreshold
  411. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  412. * 输 出: uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
  413. * 注意事项: RXIF = RXTHRF & RXIE
  414. ******************************************************************************************************************************************/
  415. uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
  416. {
  417. return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
  418. }
  419. /******************************************************************************************************************************************
  420. * 函数名称: UART_INTTXThresholdEn()
  421. * 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 触发中断
  422. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  423. * 输 出: 无
  424. * 注意事项: 无
  425. ******************************************************************************************************************************************/
  426. void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
  427. {
  428. UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
  429. }
  430. /******************************************************************************************************************************************
  431. * 函数名称: UART_INTTXThresholdDis()
  432. * 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 不触发中断
  433. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  434. * 输 出: 无
  435. * 注意事项: 无
  436. ******************************************************************************************************************************************/
  437. void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
  438. {
  439. UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
  440. }
  441. /******************************************************************************************************************************************
  442. * 函数名称: UART_INTTXThresholdStat()
  443. * 功能说明: 是否TX FIFO中数据个数 <= TXThreshold
  444. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  445. * 输 出: uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
  446. * 注意事项: TXIF = TXTHRF & TXIE
  447. ******************************************************************************************************************************************/
  448. uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
  449. {
  450. return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
  451. }
  452. /******************************************************************************************************************************************
  453. * 函数名称: UART_INTTimeoutEn()
  454. * 功能说明: 接收发生超时时 触发中断
  455. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  456. * 输 出: 无
  457. * 注意事项: 无
  458. ******************************************************************************************************************************************/
  459. void UART_INTTimeoutEn(UART_TypeDef *UARTx)
  460. {
  461. UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
  462. }
  463. /******************************************************************************************************************************************
  464. * 函数名称: UART_INTTimeoutDis()
  465. * 功能说明: 接收发生超时时 不触发中断
  466. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  467. * 输 出: 无
  468. * 注意事项: 无
  469. ******************************************************************************************************************************************/
  470. void UART_INTTimeoutDis(UART_TypeDef *UARTx)
  471. {
  472. UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
  473. }
  474. /******************************************************************************************************************************************
  475. * 函数名称: UART_INTTimeoutStat()
  476. * 功能说明: 是否发生了接收超时,即超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
  477. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  478. * 输 出: uint32_t 1 发生了接收超时 0 未发生接收超时
  479. * 注意事项: 无
  480. ******************************************************************************************************************************************/
  481. uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
  482. {
  483. return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
  484. }
  485. /******************************************************************************************************************************************
  486. * 函数名称: UART_INTTXDoneEn()
  487. * 功能说明: 发送FIFO空且发送移位寄存器空中断使能
  488. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  489. * 输 出: 无
  490. * 注意事项: 无
  491. ******************************************************************************************************************************************/
  492. void UART_INTTXDoneEn(UART_TypeDef *UARTx)
  493. {
  494. UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
  495. }
  496. /******************************************************************************************************************************************
  497. * 函数名称: UART_INTTXDoneDis()
  498. * 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
  499. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  500. * 输 出: 无
  501. * 注意事项: 无
  502. ******************************************************************************************************************************************/
  503. void UART_INTTXDoneDis(UART_TypeDef *UARTx)
  504. {
  505. UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
  506. }
  507. /******************************************************************************************************************************************
  508. * 函数名称: UART_INTTXDoneStat()
  509. * 功能说明: 发送FIFO空且发送移位寄存器空中断状态
  510. * 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
  511. * 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器未空
  512. * 注意事项: 无
  513. ******************************************************************************************************************************************/
  514. uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
  515. {
  516. return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
  517. }