SWM341_uart.c 28 KB

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