[应用相关] STM32F4XX高效驱动篇1-UART

[复制链接]
737|13
 楼主| condition 发表于 2019-6-18 10:03 | 显示全部楼层 |阅读模式
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。
串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。
从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。

 楼主| condition 发表于 2019-6-18 10:03 | 显示全部楼层
关于串口的使用方式,个人总结出以下三种:

1)         中断接收,状态查询发送:这种方式在单片机时代用的比较多,那时候大部分芯片的处理速度不够快,工业控制接口中大部分使用的是9600波特率,程序简单也就对串口发送数据所用时间要求不高。

2)         中断接收,中断发送:这种方式一般会在对高效性要求较高,或软件实时性高的产品中使用。这种方式的好外在于完全释放了CPU在发送开始到结束这一时间CPU控制权。

3)         中断接口,DMA发送:这种方式的使用场合和模式2相同,效率也相差不多。但这种方式确实比模式2CPU的占用时间会更少。
 楼主| condition 发表于 2019-6-18 10:04 | 显示全部楼层
本帖最后由 condition 于 2019-6-18 10:05 编辑

举个例子来说明以上三种模式。假如要把一堆物品从A点运到B点通过传送带,在这个传送过程中传送带上一次只能运一个物品,模式一:把物品放到传送带A点上,然后等待物品由A点被传到B点,这时再放一个物品到传送带上,以此往复所有物品传送过去。模式二:把物品放到A点的传送带上然后就去忙别的事情,看到物品快被传到B点,马上回来再放一个物品到传送带上。很明显这种方式比模式一多了很多空余时间。模式三:这种模式就牛了,在把物品放到A点之前,直接去找了一个“闲杂人等”过来,把物品交给他由他去发,我们需要再发送时,先问下她是否以发完,如果发完了就把新的物品交给他,如果没发完就等一小回再来找他。哈哈,这样咱们就有更多的时间去忙更多的事情了,也不用一回跑来一回跑去。把跑路的时间给节约出来了。
以上三种模式,很明显得出那种模式发送数据效率最高。我们下面说提供的程序就是使用模式三。
 楼主| condition 发表于 2019-6-18 10:04 | 显示全部楼层

说完发送,再说说接收方式。大家一定发现数据接收都是采用中断方式,是的 本人使用过DMA方式进行过多次测试,在使用方面确实没有中断接收灵活。主要有以下两种情况,1,DMA接收数据的主要判断依据1是接收器满中断,这种情况在实际中很少用,除非您的数据是定长。这种方式同时还会存在一些安全隐患,假如噪声原因多接收到一个字节,那之后数据时序就会错位。2,DMA总线空闲中断,这种方式除非是半双工情况下使用。在全双工时被受到发送完成总线空闲的干扰。所以在数据接收方式上主要使用中断。
 楼主| condition 发表于 2019-6-18 10:05 | 显示全部楼层
在数据接收中断方面还分二种方式,

方式1:顺序接收,在接收到第一个数据时就触发超时定时器,每接收到一个字节时就清一次定时器,都到一组数据接收完毕,定时器会因为触发超时中断。在超时中断中来判断一组数据被接收。这种方式一般会用到实时性的一些协议中,比如MODBUS。

方式2:队列接收,申请一个缓冲区收尾相接,接收到数据时载入队列之中,用户只要定时的去队列中读数据,来使用这些数据。这种方式是window,linux的驱动主要接收方式。他的优点就在于在使用数据时无需关闭中断。也就不用怛心在处理上一组数据时了来新的数据会破坏上组数据内容。在方式1中需要考虑在处理数据时暂时性的关下中断。
 楼主| condition 发表于 2019-6-18 10:05 | 显示全部楼层
以下程序则主要是使用到接收使用方式2,发送数据使用模式3的DMA发送,本驱动程序为可裁切,覆盖串口1-8,通过宏裁切。下面提供了一些接口,这里对接口做一个大概的说明。

打开串口

void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);

关闭串口

void BSP_UartClose(uint8_t COM);

向串口中写数据

uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);

从串口中读数据

uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);



查询串口发送忙碌状态

uint32_t BSP_UartTxIdleState(uint8_t COM);

这个接口主要用在,向串口写数据后,在进行下一次写数据之前需要进行查询。
 楼主| condition 发表于 2019-6-18 10:06 | 显示全部楼层
具体接口的使用方法,函数都有详细的说明。
  1. /*
  2. ********************************************************************************
  3. *
  4. *                                 BSP_Uart.c
  5. *
  6. * File          : BSP_Uart.c
  7. * Version       : V1.0
  8. * Author        : whq
  9. * Mode          : Thumb2
  10. * Toolchain     :
  11. * Description   : 串口驱动程序
  12. *               
  13. * History       :
  14. * Date          : 2013.08.12
  15. *******************************************************************************/
  16. #include <string.h>

  17. #include "misc.h"
  18. #include "stm32f4xx_gpio.h"
  19. #include "stm32f4xx_rcc.h"
  20. #include "stm32f4xx_usart.h"
  21. #include "stm32f4xx_dma.h"


  22. #include "Queue.h"
  23. #include "BSP_Uart.h"


  24. #if COM1_EN
  25. static uint8_t COM1_TX_BUFF[BSP_COM1_Tx_BUFF_SIZE] = {0};
  26. static uint8_t COM1_RX_BUFF[BSP_COM1_Rx_BUFF_SIZE] = {0};
  27. static QUEUE8_TYPE COM1_RX_QUEUE = {0};
  28. #endif

  29. #if COM2_EN
  30. static uint8_t COM2_TX_BUFF[BSP_COM2_Tx_BUFF_SIZE] = {0};
  31. static uint8_t COM2_RX_BUFF[BSP_COM2_Rx_BUFF_SIZE] = {0};
  32. static QUEUE8_TYPE COM2_RX_QUEUE = {0};
  33. #endif

  34. #if COM3_EN
  35. static uint8_t COM3_TX_BUFF[BSP_COM3_Tx_BUFF_SIZE] = {0};
  36. static uint8_t COM3_RX_BUFF[BSP_COM3_Rx_BUFF_SIZE] = {0};
  37. static QUEUE8_TYPE COM3_RX_QUEUE = {0};
  38. #endif

  39. #if COM4_EN
  40. static uint8_t COM4_TX_BUFF[BSP_COM4_Tx_BUFF_SIZE] = {0};
  41. static uint8_t COM4_RX_BUFF[BSP_COM4_Rx_BUFF_SIZE] = {0};
  42. static QUEUE8_TYPE COM4_RX_QUEUE = {0};
  43. #endif

  44. #if COM5_EN
  45. static uint8_t COM5_TX_BUFF[BSP_COM5_Tx_BUFF_SIZE] = {0};
  46. static uint8_t COM5_RX_BUFF[BSP_COM5_Rx_BUFF_SIZE] = {0};
  47. static QUEUE8_TYPE COM5_RX_QUEUE = {0};
  48. #endif

  49. #if COM6_EN
  50. static uint8_t COM6_TX_BUFF[BSP_COM6_Tx_BUFF_SIZE] = {0};
  51. static uint8_t COM6_RX_BUFF[BSP_COM6_Rx_BUFF_SIZE] = {0};
  52. static QUEUE8_TYPE COM6_RX_QUEUE = {0};
  53. #endif

  54. #if COM7_EN
  55. static uint8_t COM7_TX_BUFF[BSP_COM7_Tx_BUFF_SIZE] = {0};
  56. static uint8_t COM7_RX_BUFF[BSP_COM7_Rx_BUFF_SIZE] = {0};
  57. static QUEUE8_TYPE COM7_RX_QUEUE = {0};
  58. #endif

  59. #if COM8_EN
  60. static uint8_t COM8_TX_BUFF[BSP_COM8_Tx_BUFF_SIZE] = {0};
  61. static uint8_t COM8_RX_BUFF[BSP_COM8_Rx_BUFF_SIZE] = {0};
  62. static QUEUE8_TYPE COM8_RX_QUEUE = {0};
  63. #endif



  64. static USART_TypeDef* const COM_USART[COMn] = {  
  65. #if     COM1_EN
  66.     BSP_COM1,
  67. #endif
  68. #if     COM2_EN
  69.     BSP_COM2,
  70. #endif
  71. #if     COM3_EN
  72.     BSP_COM3,
  73. #endif
  74. #if     COM4_EN
  75.     BSP_COM4,
  76. #endif
  77. #if     COM5_EN
  78.     BSP_COM5,
  79. #endif
  80. #if     COM6_EN
  81.     BSP_COM6,
  82. #endif
  83. #if     COM7_EN
  84.     BSP_COM7,
  85. #endif
  86. #if     COM8_EN
  87.     BSP_COM8,
  88. #endif
  89. };

  90. static const uint8_t COM_AF[COMn] = {
  91. #if     COM1_EN
  92.     BSP_COM1_AF,
  93. #endif
  94. #if     COM2_EN
  95.     BSP_COM2_AF,
  96. #endif
  97. #if     COM3_EN
  98.     BSP_COM3_AF,
  99. #endif
  100. #if     COM4_EN
  101.     BSP_COM4_AF,
  102. #endif
  103. #if     COM5_EN
  104.     BSP_COM5_AF,
  105. #endif
  106. #if     COM6_EN
  107.     BSP_COM6_AF,
  108. #endif
  109. #if     COM7_EN
  110.     BSP_COM7_AF,
  111. #endif
  112. #if     COM8_EN
  113.     BSP_COM8_AF,
  114. #endif
  115. };
  116.                                                 
  117. static const uint8_t COM_TX_AF_PIN[COMn] = {   
  118. #if     COM1_EN
  119.     BSP_COM1_TX_AF_PIN,
  120. #endif
  121. #if     COM2_EN
  122.     BSP_COM2_TX_AF_PIN,
  123. #endif
  124. #if     COM3_EN
  125.     BSP_COM3_TX_AF_PIN,
  126. #endif
  127. #if     COM4_EN
  128.     BSP_COM4_TX_AF_PIN,
  129. #endif
  130. #if     COM5_EN
  131.     BSP_COM5_TX_AF_PIN,
  132. #endif
  133. #if     COM6_EN
  134.     BSP_COM6_TX_AF_PIN,
  135. #endif
  136. #if     COM7_EN
  137.     BSP_COM7_TX_AF_PIN,
  138. #endif
  139. #if     COM8_EN
  140.     BSP_COM8_TX_AF_PIN,
  141. #endif
  142. };

  143. static const uint8_t COM_RX_AF_PIN[COMn] = {   
  144. #if     COM1_EN
  145.     BSP_COM1_RX_AF_PIN,
  146. #endif
  147. #if     COM2_EN
  148.     BSP_COM2_RX_AF_PIN,
  149. #endif
  150. #if     COM3_EN
  151.     BSP_COM3_RX_AF_PIN,
  152. #endif
  153. #if     COM4_EN
  154.     BSP_COM4_RX_AF_PIN,
  155. #endif
  156. #if     COM5_EN
  157.     BSP_COM5_RX_AF_PIN,
  158. #endif
  159. #if     COM6_EN
  160.     BSP_COM6_RX_AF_PIN,
  161. #endif
  162. #if     COM7_EN
  163.     BSP_COM7_RX_AF_PIN,
  164. #endif
  165. #if     COM8_EN
  166.     BSP_COM8_RX_AF_PIN,
  167. #endif
  168. };

  169. static GPIO_TypeDef* const COM_TX_PORT[COMn] = {  
  170. #if     COM1_EN
  171.     BSP_COM1_TX_GPIO_PORT,
  172. #endif
  173. #if     COM2_EN
  174.     BSP_COM2_TX_GPIO_PORT,
  175. #endif
  176. #if     COM3_EN
  177.     BSP_COM3_TX_GPIO_PORT,
  178. #endif
  179. #if     COM4_EN
  180.     BSP_COM4_TX_GPIO_PORT,
  181. #endif
  182. #if     COM5_EN
  183.     BSP_COM5_TX_GPIO_PORT,
  184. #endif
  185. #if     COM6_EN
  186.     BSP_COM6_TX_GPIO_PORT,
  187. #endif
  188. #if     COM7_EN
  189.     BSP_COM7_TX_GPIO_PORT,
  190. #endif
  191. #if     COM8_EN
  192.     BSP_COM8_TX_GPIO_PORT,
  193. #endif
  194. };

  195. static GPIO_TypeDef* const COM_RX_PORT[COMn] = {     
  196. #if     COM1_EN
  197.     BSP_COM1_RX_GPIO_PORT,
  198. #endif
  199. #if     COM2_EN
  200.     BSP_COM2_RX_GPIO_PORT,
  201. #endif
  202. #if     COM3_EN
  203.     BSP_COM3_RX_GPIO_PORT,
  204. #endif
  205. #if     COM4_EN
  206.     BSP_COM4_RX_GPIO_PORT,
  207. #endif
  208. #if     COM5_EN
  209.     BSP_COM5_RX_GPIO_PORT,
  210. #endif
  211. #if     COM6_EN
  212.     BSP_COM6_RX_GPIO_PORT,
  213. #endif
  214. #if     COM7_EN
  215.     BSP_COM7_RX_GPIO_PORT,
  216. #endif
  217. #if     COM8_EN
  218.     BSP_COM8_RX_GPIO_PORT,
  219. #endif
  220. };

  221. static const uint32_t COM_USART_CLK[COMn] = {   
  222. #if     COM1_EN
  223.     BSP_COM1_CLK,
  224. #endif
  225. #if     COM2_EN
  226.     BSP_COM2_CLK,
  227. #endif
  228. #if     COM3_EN
  229.     BSP_COM3_CLK,
  230. #endif
  231. #if     COM4_EN
  232.     BSP_COM4_CLK,
  233. #endif
  234. #if     COM5_EN
  235.     BSP_COM5_CLK,
  236. #endif
  237. #if     COM6_EN
  238.     BSP_COM6_CLK,
  239. #endif
  240. #if     COM7_EN
  241.     BSP_COM7_CLK,
  242. #endif
  243. #if     COM8_EN
  244.     BSP_COM8_CLK,
  245. #endif
  246. };
  247.                
  248. static const uint32_t COM_TX_PORT_CLK[COMn] = {
  249. #if     COM1_EN
  250.     BSP_COM1_TX_GPIO_CLK,
  251. #endif
  252. #if     COM2_EN
  253.     BSP_COM2_TX_GPIO_CLK,
  254. #endif
  255. #if     COM3_EN
  256.     BSP_COM3_TX_GPIO_CLK,
  257. #endif
  258. #if     COM4_EN
  259.     BSP_COM4_TX_GPIO_CLK,
  260. #endif
  261. #if     COM5_EN
  262.     BSP_COM5_TX_GPIO_CLK,
  263. #endif
  264. #if     COM6_EN
  265.     BSP_COM6_TX_GPIO_CLK,
  266. #endif
  267. #if     COM7_EN
  268.     BSP_COM7_TX_GPIO_CLK,
  269. #endif
  270. #if     COM8_EN
  271.     BSP_COM8_TX_GPIO_CLK,
  272. #endif
  273. };

  274. static const uint32_t COM_RX_PORT_CLK[COMn] = {
  275. #if     COM1_EN
  276.     BSP_COM1_RX_GPIO_CLK,
  277. #endif
  278. #if     COM2_EN
  279.     BSP_COM2_RX_GPIO_CLK,
  280. #endif
  281. #if     COM3_EN
  282.     BSP_COM3_RX_GPIO_CLK,
  283. #endif
  284. #if     COM4_EN
  285.     BSP_COM4_RX_GPIO_CLK,
  286. #endif
  287. #if     COM5_EN
  288.     BSP_COM5_RX_GPIO_CLK,
  289. #endif
  290. #if     COM6_EN
  291.     BSP_COM6_RX_GPIO_CLK,
  292. #endif
  293. #if     COM7_EN
  294.     BSP_COM7_RX_GPIO_CLK,
  295. #endif
  296. #if     COM8_EN
  297.     BSP_COM8_RX_GPIO_CLK,
  298. #endif
  299. };

  300. static const uint16_t COM_TX_PIN[COMn] = {      
  301. #if     COM1_EN
  302.     BSP_COM1_TX_PIN,
  303. #endif
  304. #if     COM2_EN
  305.     BSP_COM2_TX_PIN,
  306. #endif
  307. #if     COM3_EN
  308.     BSP_COM3_TX_PIN,
  309. #endif
  310. #if     COM4_EN
  311.     BSP_COM4_TX_PIN,
  312. #endif
  313. #if     COM5_EN
  314.     BSP_COM5_TX_PIN,
  315. #endif
  316. #if     COM6_EN
  317.     BSP_COM6_TX_PIN,
  318. #endif
  319. #if     COM7_EN
  320.     BSP_COM7_TX_PIN,
  321. #endif
  322. #if     COM8_EN
  323.     BSP_COM8_TX_PIN,
  324. #endif
  325. };

  326. static const uint16_t COM_RX_PIN[COMn] = {
  327. #if     COM1_EN
  328.     BSP_COM1_RX_PIN,
  329. #endif
  330. #if     COM2_EN
  331.     BSP_COM2_RX_PIN,
  332. #endif
  333. #if     COM3_EN
  334.     BSP_COM3_RX_PIN,
  335. #endif
  336. #if     COM4_EN
  337.     BSP_COM4_RX_PIN,
  338. #endif
  339. #if     COM5_EN
  340.     BSP_COM5_RX_PIN,
  341. #endif
  342. #if     COM6_EN
  343.     BSP_COM6_RX_PIN,
  344. #endif
  345. #if     COM7_EN
  346.     BSP_COM7_RX_PIN,
  347. #endif
  348. #if     COM8_EN
  349.     BSP_COM8_RX_PIN,
  350. #endif
  351. };

  352. static const uint32_t COM_DMA_DR_BASE[COMn] = {
  353. #if     COM1_EN
  354.     BSP_COM1_DMA_DR_BASE,
  355. #endif
  356. #if     COM2_EN
  357.     BSP_COM2_DMA_DR_BASE,
  358. #endif
  359. #if     COM3_EN
  360.     BSP_COM3_DMA_DR_BASE,
  361. #endif
  362. #if     COM4_EN
  363.     BSP_COM4_DMA_DR_BASE,
  364. #endif
  365. #if     COM5_EN
  366.     BSP_COM5_DMA_DR_BASE,
  367. #endif
  368. #if     COM6_EN
  369.     BSP_COM6_DMA_DR_BASE,
  370. #endif
  371. #if     COM7_EN
  372.     BSP_COM7_DMA_DR_BASE,
  373. #endif
  374. #if     COM8_EN
  375.     BSP_COM8_DMA_DR_BASE,
  376. #endif
  377. };

  378. static const uint32_t COM_DMA_CLK[COMn] = {     
  379. #if     COM1_EN
  380.     BSP_COM1_DMA_CLK,
  381. #endif
  382. #if     COM2_EN
  383.     BSP_COM2_DMA_CLK,
  384. #endif
  385. #if     COM3_EN
  386.     BSP_COM3_DMA_CLK,
  387. #endif
  388. #if     COM4_EN
  389.     BSP_COM4_DMA_CLK,
  390. #endif
  391. #if     COM5_EN
  392.     BSP_COM5_DMA_CLK,
  393. #endif
  394. #if     COM6_EN
  395.     BSP_COM6_DMA_CLK,
  396. #endif
  397. #if     COM7_EN
  398.     BSP_COM7_DMA_CLK,
  399. #endif
  400. #if     COM8_EN
  401.     BSP_COM8_DMA_CLK,
  402. #endif
  403. };

  404. static const uint32_t COM_DMA_TX_FLAG[COMn] = {
  405. #if     COM1_EN
  406.     BSP_COM1_Tx_DMA_FLAG,
  407. #endif
  408. #if     COM2_EN
  409.     BSP_COM2_Tx_DMA_FLAG,
  410. #endif
  411. #if     COM3_EN
  412.     BSP_COM3_Tx_DMA_FLAG,
  413. #endif
  414. #if     COM4_EN
  415.     BSP_COM4_Tx_DMA_FLAG,
  416. #endif
  417. #if     COM5_EN
  418.     BSP_COM5_Tx_DMA_FLAG,
  419. #endif
  420. #if     COM6_EN
  421.     BSP_COM6_Tx_DMA_FLAG,
  422. #endif
  423. #if     COM7_EN
  424.     BSP_COM7_Tx_DMA_FLAG,
  425. #endif
  426. #if     COM8_EN
  427.     BSP_COM8_Tx_DMA_FLAG,
  428. #endif
  429. };

  430. static const uint32_t COM_DMA_TX_CHANNEL[COMn] = {
  431. #if     COM1_EN
  432.     BSP_COM1_Tx_DMA_Channel,
  433. #endif
  434. #if     COM2_EN
  435.     BSP_COM2_Tx_DMA_Channel,
  436. #endif
  437. #if     COM3_EN
  438.     BSP_COM3_Tx_DMA_Channel,
  439. #endif
  440. #if     COM4_EN
  441.     BSP_COM4_Tx_DMA_Channel,
  442. #endif
  443. #if     COM5_EN
  444.     BSP_COM5_Tx_DMA_Channel,
  445. #endif
  446. #if     COM6_EN
  447.     BSP_COM6_Tx_DMA_Channel,
  448. #endif
  449. #if     COM7_EN
  450.     BSP_COM7_Tx_DMA_Channel,
  451. #endif
  452. #if     COM8_EN
  453.     BSP_COM8_Tx_DMA_Channel,
  454. #endif
  455. };

  456. static DMA_Stream_TypeDef * const COM_DMA_TX_STREAM[COMn] = {
  457. #if     COM1_EN
  458.     BSP_COM1_Tx_DMA_Stream,
  459. #endif
  460. #if     COM2_EN
  461.     BSP_COM2_Tx_DMA_Stream,
  462. #endif
  463. #if     COM3_EN
  464.     BSP_COM3_Tx_DMA_Stream,
  465. #endif
  466. #if     COM4_EN
  467.     BSP_COM4_Tx_DMA_Stream,
  468. #endif
  469. #if     COM5_EN
  470.     BSP_COM5_Tx_DMA_Stream,
  471. #endif
  472. #if     COM6_EN
  473.     BSP_COM6_Tx_DMA_Stream,
  474. #endif
  475. #if     COM7_EN
  476.     BSP_COM7_Tx_DMA_Stream,
  477. #endif
  478. #if     COM8_EN
  479.     BSP_COM8_Tx_DMA_Stream,
  480. #endif
  481. };


  482. static const uint32_t COM_RX_IRQn[COMn] = {     
  483. #if     COM1_EN
  484.     BSP_COM1_IRQn,
  485. #endif
  486. #if     COM2_EN
  487.     BSP_COM2_IRQn,
  488. #endif
  489. #if     COM3_EN
  490.     BSP_COM3_IRQn,
  491. #endif
  492. #if     COM4_EN
  493.     BSP_COM4_IRQn,
  494. #endif
  495. #if     COM5_EN
  496.     BSP_COM5_IRQn,
  497. #endif
  498. #if     COM6_EN
  499.     BSP_COM6_IRQn,
  500. #endif
  501. #if     COM7_EN
  502.     BSP_COM7_IRQn,
  503. #endif
  504. #if     COM8_EN
  505.     BSP_COM8_IRQn,
  506. #endif
  507. };

  508. static uint8_t * const COM_TX_BUFF[COMn] = {      
  509. #if     COM1_EN
  510.     COM1_TX_BUFF,
  511. #endif
  512. #if     COM2_EN
  513.     COM2_TX_BUFF,
  514. #endif
  515. #if     COM3_EN
  516.     COM3_TX_BUFF,
  517. #endif
  518. #if     COM4_EN
  519.     COM4_TX_BUFF,
  520. #endif
  521. #if     COM5_EN
  522.     COM5_TX_BUFF,
  523. #endif
  524. #if     COM6_EN
  525.     COM6_TX_BUFF,
  526. #endif
  527. #if     COM7_EN
  528.     COM7_TX_BUFF,
  529. #endif
  530. #if     COM8_EN
  531.     COM8_TX_BUFF,
  532. #endif
  533. };
  534.                                                 
  535. static const uint32_t COM_TX_BUFF_SIZE[COMn] = {  
  536. #if     COM1_EN
  537.     BSP_COM1_Tx_BUFF_SIZE,
  538. #endif
  539. #if     COM2_EN
  540.     BSP_COM2_Tx_BUFF_SIZE,
  541. #endif
  542. #if     COM3_EN
  543.     BSP_COM3_Tx_BUFF_SIZE,
  544. #endif
  545. #if     COM4_EN
  546.     BSP_COM4_Tx_BUFF_SIZE,
  547. #endif
  548. #if     COM5_EN
  549.     BSP_COM5_Tx_BUFF_SIZE,
  550. #endif
  551. #if     COM6_EN
  552.     BSP_COM6_Tx_BUFF_SIZE,
  553. #endif
  554. #if     COM7_EN
  555.     BSP_COM7_Tx_BUFF_SIZE,
  556. #endif
  557. #if     COM8_EN
  558.     BSP_COM8_Tx_BUFF_SIZE,
  559. #endif
  560. };     

  561. static uint8_t * const COM_RX_BUFF[COMn] = {      
  562. #if     COM1_EN
  563.     COM1_RX_BUFF,
  564. #endif
  565. #if     COM2_EN
  566.     COM2_RX_BUFF,
  567. #endif
  568. #if     COM3_EN
  569.     COM3_RX_BUFF,
  570. #endif
  571. #if     COM4_EN
  572.     COM4_RX_BUFF,
  573. #endif
  574. #if     COM5_EN
  575.     COM5_RX_BUFF,
  576. #endif
  577. #if     COM6_EN
  578.     COM6_RX_BUFF,
  579. #endif
  580. #if     COM7_EN
  581.     COM7_RX_BUFF,
  582. #endif
  583. #if     COM8_EN
  584.     COM8_RX_BUFF,
  585. #endif
  586. };
  587.                                                 
  588. static const uint32_t COM_RX_BUFF_SIZE[COMn] = {  
  589. #if     COM1_EN
  590.     BSP_COM1_Rx_BUFF_SIZE,
  591. #endif
  592. #if     COM2_EN
  593.     BSP_COM2_Rx_BUFF_SIZE,
  594. #endif
  595. #if     COM3_EN
  596.     BSP_COM3_Rx_BUFF_SIZE,
  597. #endif
  598. #if     COM4_EN
  599.     BSP_COM4_Rx_BUFF_SIZE,
  600. #endif
  601. #if     COM5_EN
  602.     BSP_COM5_Rx_BUFF_SIZE,
  603. #endif
  604. #if     COM6_EN
  605.     BSP_COM6_Rx_BUFF_SIZE,
  606. #endif
  607. #if     COM7_EN
  608.     BSP_COM7_Rx_BUFF_SIZE,
  609. #endif
  610. #if     COM8_EN
  611.     BSP_COM8_Rx_BUFF_SIZE,
  612. #endif
  613. };     

  614. static QUEUE8_TYPE * const COM_RX_QUEUE[COMn] = {   
  615. #if     COM1_EN
  616.     &COM1_RX_QUEUE,
  617. #endif
  618. #if     COM2_EN
  619.     &COM2_RX_QUEUE,
  620. #endif
  621. #if     COM3_EN
  622.     &COM3_RX_QUEUE,
  623. #endif
  624. #if     COM4_EN
  625.     &COM4_RX_QUEUE,
  626. #endif
  627. #if     COM5_EN
  628.     &COM5_RX_QUEUE,
  629. #endif
  630. #if     COM6_EN
  631.     &COM6_RX_QUEUE,
  632. #endif
  633. #if     COM7_EN
  634.     &COM7_RX_QUEUE,
  635. #endif
  636. #if     COM8_EN
  637.     &COM8_RX_QUEUE,
  638. #endif
  639. };

  640. static const uint16_t parityArr[3] = {USART_Parity_No, USART_Parity_Odd, USART_Parity_Even};

  641. /*******************************************************************************
  642. * Function Name :BSP_Uart1Open
  643. * Description   :串口及引脚初始化
  644. * Input         :   uartx: COM1,COM2,COM3....
  645.                     baud: 2400,4800,9600,19200,38400,57600,115200
  646.                     data: 数据位数  8,9,
  647.                     stop:停止位数  1,2
  648.                     parity:效验    0: 无效验,1:奇效验,2:偶效验
  649. * Output        :
  650. * Other         :
  651. * Date          :2013.08.12
  652. *******************************************************************************/
  653. void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity)
  654. {
  655.     USART_InitTypeDef USART_InitStructure;
  656.     GPIO_InitTypeDef GPIO_InitStructure;
  657.     NVIC_InitTypeDef NvicInitdef;
  658.     DMA_InitTypeDef DMA_InitStructure;
  659.    
  660.     /* DMA clock enable */
  661.     RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);

  662.     /* Enable GPIO clock */
  663.     RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE);

  664.     /* Enable UART clock */
  665.     if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
  666.     {
  667.         RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  668.     }
  669.     else
  670.     {
  671.         RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  672.     }
  673.     USART_DeInit(COM_USART[COM]);
  674.    
  675.     /* Connect PXx to USARTx_Tx*/
  676.     GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_AF_PIN[COM], COM_AF[COM]);
  677.     /* Connect PXx to USARTx_Rx*/
  678.     GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_AF_PIN[COM], COM_AF[COM]);

  679.     /* Configure USART Tx as alternate function push-pull */
  680.     GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
  681.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  682.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  683.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  684.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  685.     GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);

  686.     /* Configure USART Rx as input floating */
  687.     GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
  688.     GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);

  689.     /* USART configuration */
  690.     USART_StructInit(&USART_InitStructure);
  691.     USART_InitStructure.USART_BaudRate = baud;
  692.     USART_InitStructure.USART_StopBits = (stop == 2)? USART_StopBits_2 : USART_StopBits_1;
  693.     USART_InitStructure.USART_WordLength = (data == 9)? USART_WordLength_9b : USART_WordLength_8b;
  694.     USART_InitStructure.USART_Parity = (parity < 3)? parityArr[parity] : USART_Parity_No;
  695.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  696.     USART_Init(COM_USART[COM], &USART_InitStructure);
  697.    
  698.     /* Enable USART DMA_TX*/
  699.     USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, ENABLE);
  700.    
  701.     USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE);
  702.    
  703.      /* Enable USART */
  704.     USART_Cmd(COM_USART[COM], ENABLE);   

  705.     NvicInitdef.NVIC_IRQChannel = COM_RX_IRQn[COM];
  706.     NvicInitdef.NVIC_IRQChannelPreemptionPriority = 3;
  707.     NvicInitdef.NVIC_IRQChannelSubPriority = 0;
  708.     NvicInitdef.NVIC_IRQChannelCmd = ENABLE;
  709.     NVIC_Init( &NvicInitdef );

  710.     QUEUE_PacketCreate(COM_RX_QUEUE[COM], COM_RX_BUFF[COM], COM_RX_BUFF_SIZE[COM]);
  711.     /* -------------------------------DMA发送------------------------------  */
  712.     /* DMA StreamX Config */
  713.     DMA_DeInit(COM_DMA_TX_STREAM[COM]);   
  714.    
  715.     /* DMA StreamX disable */
  716.     DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);

  717.     DMA_StructInit(&DMA_InitStructure);
  718.     DMA_InitStructure.DMA_Channel = COM_DMA_TX_CHANNEL[COM];
  719.     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)COM_DMA_DR_BASE[COM];
  720.     DMA_InitStructure.DMA_Memory0BaseAddr = (u32)COM_TX_BUFF[COM];
  721.     DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  722.     DMA_InitStructure.DMA_BufferSize = 0;
  723.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  724.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  725.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  726.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  727.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  728.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  729.     DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  730.     DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  731.     DMA_Init(COM_DMA_TX_STREAM[COM], &DMA_InitStructure);

  732.     DMA_FlowControllerConfig(COM_DMA_TX_STREAM[COM], DMA_FlowCtrl_Memory);    //控制流 取决于缓存大小
  733. }


  734. /*******************************************************************************
  735. * Function Name : void BSP_UartClose(uint8_t COMx)
  736. * Description   : 串口关闭
  737. * Input         : COMx:通道x
  738. * Output        :
  739. * Other         :
  740. * Date          : 2013.08.12
  741. *******************************************************************************/
  742. void BSP_UartClose(uint8_t COM)
  743. {
  744.     if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
  745.     {
  746.         RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
  747.     }
  748.     else
  749.     {
  750.         RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
  751.     }
  752.    
  753.     RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);
  754.     DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
  755.     USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, DISABLE);
  756.     USART_ITConfig(COM_USART[COM], USART_IT_RXNE, DISABLE);
  757.     USART_Cmd(COM_USART[COM], DISABLE);
  758. }

  759. /*******************************************************************************
  760. * Function Name : uint32_t BSP_UartWrite(uint8_t COMx, uint8_t *buffter, uint32_t len)
  761. * Description   : 串口发送数据
  762. * Input         :   COMx:通道x
  763. * Output        :
  764. * Other         :
  765. * Date          : 2013.08.12
  766. *******************************************************************************/
  767. uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len)
  768. {
  769.     if (COM >= COMn)
  770.         return 0;
  771.         
  772.     if (0 == len)
  773.         return 0;
  774.         
  775.     if ((DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM]) == 0)
  776.         && (DMA_FIFOStatus_Empty == DMA_GetFIFOStatus(COM_DMA_TX_STREAM[COM])))
  777.     {
  778.         uint32_t resLen = 0;

  779.         USART_ClearFlag(COM_USART[COM], USART_FLAG_TC);
  780.         resLen = (COM_TX_BUFF_SIZE[COM] > len)? len : COM_TX_BUFF_SIZE[COM];
  781.         memcpy((void *)(COM_TX_BUFF[COM]), buffter, resLen);      
  782.         DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
  783.         DMA_ClearFlag(COM_DMA_TX_STREAM[COM], COM_DMA_TX_FLAG[COM]);
  784.         DMA_SetCurrDataCounter(COM_DMA_TX_STREAM[COM], resLen);               
  785.         DMA_Cmd(COM_DMA_TX_STREAM[COM], ENABLE);

  786.         return resLen;
  787.     }
  788.     return 0;
  789. }

  790. /*******************************************************************************
  791. * Function Name : uint32_t BSP_UartRead(uint8_t COMx, uint8_t *buffter, uint32_t len)
  792. * Description   : 串口读回数据
  793. * Input         : COMx:通道x
  794. * Output        :
  795. * Other         :
  796. * Date          : 2013.08.12
  797. *******************************************************************************/
  798. uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len)
  799. {
  800.     return QUEUE_PacketOut(COM_RX_QUEUE[COM], buffter, len);
  801. }

  802. /*******************************************************************************
  803. * Function Name : uint32_t BSP_UartTxIdleState(uint8_t COM)
  804. * Description   : 查询 发送是否 发送完成
  805. * Input         :
  806. * Output        :       1)忙碌      0)空闲
  807. * Other         :
  808. * Date          : 2013.08.12
  809. *******************************************************************************/
  810. uint32_t BSP_UartTxIdleState(uint8_t COM)
  811. {
  812.     return (DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM])
  813.             || (USART_GetFlagStatus(COM_USART[COM], USART_FLAG_TC) != SET));
  814. }


  815. /*******************************************************************************
  816. * Function Name : void _IRQHandler(uint8_t COM)
  817. * Description   : 中断函数
  818. * Input         :
  819. * Output        :
  820. * Other         :
  821. * Date          : 2013.08.12
  822. *******************************************************************************/
  823. void _IRQHandler(uint8_t COM)
  824. {
  825.     if (USART_GetITStatus(COM_USART[COM], USART_IT_RXNE) != RESET)
  826.     {
  827.         u8 ch = USART_ReceiveData(COM_USART[COM]);  //读数据后 会自动清空标志
  828.         QUEUE_PacketIn(COM_RX_QUEUE[COM], &ch, 1);
  829.     }
  830. }

  831. #if COM1_EN > 0
  832. /*******************************************************************************
  833. * Function Name  : USART1_IRQHandler
  834. * Description    : This function handles USART1 global interrupt request.
  835. * Input          : None
  836. * Output         : None
  837. * Return         : None
  838. *******************************************************************************/
  839. void USART1_IRQHandler(void)
  840. {
  841.     _IRQHandler(COM1);
  842. }
  843. #endif //COM1_EN > 0

  844. #if COM2_EN > 0
  845. /*******************************************************************************
  846. * Function Name  : USART2_IRQHandler
  847. * Description    : This function handles USART2 global interrupt request.
  848. * Input          : None
  849. * Output         : None
  850. * Return         : None
  851. *******************************************************************************/
  852. void USART2_IRQHandler(void)
  853. {
  854.     _IRQHandler(COM2);
  855. }
  856. #endif //COM2_EN > 0

  857. #if COM3_EN > 0
  858. /*******************************************************************************
  859. * Function Name  : USART3_IRQHandler
  860. * Description    : This function handles USART3 global interrupt request.
  861. * Input          : None
  862. * Output         : None
  863. * Return         : None
  864. *******************************************************************************/
  865. void USART3_IRQHandler(void)
  866. {
  867.     _IRQHandler(COM3);
  868. }
  869. #endif //COM3_EN > 0

  870. #if COM4_EN > 0
  871. /*******************************************************************************
  872. * Function Name  : USART4_IRQHandler
  873. * Description    : This function handles USART4 global interrupt request.
  874. * Input          : None
  875. * Output         : None
  876. * Return         : None
  877. *******************************************************************************/
  878. void UART4_IRQHandler(void)
  879. {
  880.     _IRQHandler(COM4);
  881. }
  882. #endif //COM4_EN > 0

  883. #if COM5_EN > 0
  884. /*******************************************************************************
  885. * Function Name  : USART5_IRQHandler
  886. * Description    : This function handles USART5 global interrupt request.
  887. * Input          : None
  888. * Output         : None
  889. * Return         : None
  890. *******************************************************************************/
  891. void UART5_IRQHandler(void)
  892. {
  893.     _IRQHandler(COM5);
  894. }
  895. #endif //COM5_EN > 0

  896. #if COM6_EN > 0
  897. /*******************************************************************************
  898. * Function Name  : USART6_IRQHandler
  899. * Description    : This function handles USART6 global interrupt request.
  900. * Input          : None
  901. * Output         : None
  902. * Return         : None
  903. *******************************************************************************/
  904. void USART6_IRQHandler(void)
  905. {
  906.     _IRQHandler(COM6);
  907. }
  908. #endif //COM6_EN > 0

  909. #if COM7_EN > 0
  910. /*******************************************************************************
  911. * Function Name  : USART7_IRQHandler
  912. * Description    : This function handles USART7 global interrupt request.
  913. * Input          : None
  914. * Output         : None
  915. * Return         : None
  916. *******************************************************************************/
  917. void UART7_IRQHandler(void)
  918. {
  919.     _IRQHandler(COM7);
  920. }
  921. #endif //COM7_EN > 0

  922. #if COM8_EN > 0
  923. /*******************************************************************************
  924. * Function Name  : USART8_IRQHandler
  925. * Description    : This function handles USART8 global interrupt request.
  926. * Input          : None
  927. * Output         : None
  928. * Return         : None
  929. *******************************************************************************/
  930. void UART8_IRQHandler(void)
  931. {
  932.     _IRQHandler(COM8);
  933. }
  934. #endif //COM8_EN > 0

  935. BSP_Uart.c
 楼主| condition 发表于 2019-6-18 10:06 | 显示全部楼层
  1. 1 /*
  2.   2 ********************************************************************************
  3.   3 *
  4.   4 *                                 BSP_Uart.h
  5.   5 *
  6.   6 * File          : BSP_Uart.h
  7.   7 * Version       : V1.0
  8.   8 * Author        : whq
  9.   9 * Mode          : Thumb2
  10. 10 * Toolchain     :
  11. 11 * Description   : 串口驱动头文件
  12. 12 *               
  13. 13 * History       :
  14. 14 * Date          : 2013.08.12
  15. 15 *******************************************************************************/
  16. 16
  17. 17 #ifndef _BSP_UART_H_
  18. 18 #define _BSP_UART_H_
  19. 19
  20. 20 #include <stdint.h>
  21. 21
  22. 22
  23. 23 #define COM1_EN         1
  24. 24 #define COM2_EN         1
  25. 25 #define COM3_EN         1
  26. 26 #define COM4_EN         1
  27. 27 #define COM5_EN         1
  28. 28 #define COM6_EN         1
  29. 29 #define COM7_EN         0
  30. 30 #define COM8_EN         0
  31. 31
  32. 32
  33. 33
  34. 34 #define COM_1_0                             //映射:COM_1_0,映射1:COM_1_1
  35. 35 #define COM_2_0                             //映射:COM_2_0,映射1:COM_2_1
  36. 36 #define COM_3_2                             //映射:COM_3_2,
  37. 37 #define COM_4_0
  38. 38 #define COM_5_0
  39. 39 #define COM_6_0
  40. 40 #define COM_7_0
  41. 41 #define COM_8_0
  42. 42
  43. 43
  44. 44
  45. 45 #if !(COM1_EN || COM2_EN || COM3_EN || COM4_EN || COM5_EN || COM6_EN || COM7_EN || COM8_EN)
  46. 46 #error  "请至少使能一路串口!"
  47. 47 #endif
  48. 48
  49. 49
  50. 50 typedef enum {
  51. 51 #if     COM1_EN
  52. 52         COM1,
  53. 53 #endif
  54. 54 #if     COM2_EN
  55. 55         COM2,
  56. 56 #endif
  57. 57 #if     COM3_EN
  58. 58         COM3,
  59. 59 #endif
  60. 60 #if     COM4_EN
  61. 61         COM4,
  62. 62 #endif
  63. 63 #if     COM5_EN
  64. 64         COM5,
  65. 65 #endif
  66. 66 #if     COM6_EN
  67. 67         COM6,
  68. 68 #endif
  69. 69 #if     COM7_EN
  70. 70         COM7,
  71. 71 #endif
  72. 72 #if     COM8_EN
  73. 73         COM8,
  74. 74 #endif
  75. 75     COM_MAX
  76. 76 }COM_PORT;
  77. 77
  78. 78 /** @addtogroup STM3210E_BSP_LOW_LEVEL_COM
  79. 79   * @{
  80. 80   */
  81. 81 #define COMn                                COM_MAX
  82. 82
  83. 83
  84. 84
  85. 85 /**
  86. 86  * [url=home.php?mod=space&uid=247401]@brief[/url] Definition for COM port1, connected to USART1
  87. 87  */
  88. 88 #define BSP_COM1                            USART1
  89. 89 #define BSP_COM1_CLK                        RCC_APB2Periph_USART1
  90. 90 #define BSP_COM1_AF                         GPIO_AF_USART1
  91. 91 #ifdef COM_1_3
  92. 92 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource6
  93. 93 #define BSP_COM1_TX_PIN                     GPIO_Pin_6
  94. 94 #define BSP_COM1_TX_GPIO_PORT               GPIOB
  95. 95 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  96. 96 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource10
  97. 97 #define BSP_COM1_RX_PIN                     GPIO_Pin_10
  98. 98 #define BSP_COM1_RX_GPIO_PORT               GPIOA
  99. 99 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  100. 100 #elif defined(COM_1_2)
  101. 101 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource9
  102. 102 #define BSP_COM1_TX_PIN                     GPIO_Pin_9
  103. 103 #define BSP_COM1_TX_GPIO_PORT               GPIOA
  104. 104 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  105. 105 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource7
  106. 106 #define BSP_COM1_RX_PIN                     GPIO_Pin_7
  107. 107 #define BSP_COM1_RX_GPIO_PORT               GPIOB
  108. 108 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  109. 109 #elif defined(COM_1_1)
  110. 110 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource6
  111. 111 #define BSP_COM1_TX_PIN                     GPIO_Pin_6
  112. 112 #define BSP_COM1_TX_GPIO_PORT               GPIOB
  113. 113 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  114. 114 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource7
  115. 115 #define BSP_COM1_RX_PIN                     GPIO_Pin_7
  116. 116 #define BSP_COM1_RX_GPIO_PORT               GPIOB
  117. 117 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  118. 118 #else
  119. 119 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource9
  120. 120 #define BSP_COM1_TX_PIN                     GPIO_Pin_9
  121. 121 #define BSP_COM1_TX_GPIO_PORT               GPIOA
  122. 122 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  123. 123 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource10
  124. 124 #define BSP_COM1_RX_PIN                     GPIO_Pin_10
  125. 125 #define BSP_COM1_RX_GPIO_PORT               GPIOA
  126. 126 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  127. 127 #endif
  128. 128
  129. 129 #define BSP_COM1_IRQn                       USART1_IRQn
  130. 130
  131. 131 #define BSP_COM1_DMA_DR_BASE                0x40011004
  132. 132 #define BSP_COM1_DMA_CLK                    RCC_AHB1Periph_DMA2
  133. 133 #define BSP_COM1_Tx_DMA_FLAG                DMA_FLAG_TCIF7
  134. 134 #define BSP_COM1_Tx_DMA_Stream              DMA2_Stream7
  135. 135 #define BSP_COM1_Tx_DMA_Channel             DMA_Channel_4
  136. 136
  137. 137 #define BSP_COM1_Tx_BUFF_SIZE               0x600       //发送缓冲区大小
  138. 138 #define BSP_COM1_Rx_BUFF_SIZE               0x600         //接收缓冲区大小
  139. 139
  140. 140
  141. 141 /**
  142. 142  * @brief Definition for COM port2, connected to USART2
  143. 143  */
  144. 144 #define BSP_COM2                            USART2
  145. 145 #define BSP_COM2_CLK                        RCC_APB1Periph_USART2
  146. 146 #define BSP_COM2_AF                         GPIO_AF_USART2
  147. 147
  148. 148 #ifdef COM_2_3
  149. 149 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource2
  150. 150 #define BSP_COM2_TX_PIN                     GPIO_Pin_2
  151. 151 #define BSP_COM2_TX_GPIO_PORT               GPIOA
  152. 152 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  153. 153 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource6
  154. 154 #define BSP_COM2_RX_PIN                     GPIO_Pin_6
  155. 155 #define BSP_COM2_RX_GPIO_PORT               GPIOD
  156. 156 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  157. 157 #elif defined(COM_2_2)
  158. 158 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource5
  159. 159 #define BSP_COM2_TX_PIN                     GPIO_Pin_5
  160. 160 #define BSP_COM2_TX_GPIO_PORT               GPIOD
  161. 161 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  162. 162 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource3
  163. 163 #define BSP_COM2_RX_PIN                     GPIO_Pin_3
  164. 164 #define BSP_COM2_RX_GPIO_PORT               GPIOA
  165. 165 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  166. 166 #elif defined(COM_2_1)
  167. 167 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource5
  168. 168 #define BSP_COM2_TX_PIN                     GPIO_Pin_5
  169. 169 #define BSP_COM2_TX_GPIO_PORT               GPIOD
  170. 170 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  171. 171 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource6
  172. 172 #define BSP_COM2_RX_PIN                     GPIO_Pin_6
  173. 173 #define BSP_COM2_RX_GPIO_PORT               GPIOD
  174. 174 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  175. 175 #else
  176. 176 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource2
  177. 177 #define BSP_COM2_TX_PIN                     GPIO_Pin_2
  178. 178 #define BSP_COM2_TX_GPIO_PORT               GPIOA
  179. 179 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  180. 180 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource3
  181. 181 #define BSP_COM2_RX_PIN                     GPIO_Pin_3
  182. 182 #define BSP_COM2_RX_GPIO_PORT               GPIOA
  183. 183 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  184. 184 #endif
  185. 185     
  186. 186 #define BSP_COM2_IRQn                       USART2_IRQn
  187. 187     
  188. 188 #define BSP_COM2_DMA_DR_BASE                0x40004404
  189. 189 #define BSP_COM2_DMA_CLK                    RCC_AHB1Periph_DMA1
  190. 190 #define BSP_COM2_Tx_DMA_FLAG                DMA_FLAG_TCIF6
  191. 191 #define BSP_COM2_Tx_DMA_Stream              DMA1_Stream6
  192. 192 #define BSP_COM2_Tx_DMA_Channel             DMA_Channel_4
  193. 193
  194. 194 #define BSP_COM2_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  195. 195 #define BSP_COM2_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  196. 196
  197. 197
  198. 198
  199. 199 /**
  200. 200  * @brief Definition for COM port3, connected to USART3
  201. 201  */
  202. 202 #define BSP_COM3                            USART3
  203. 203 #define BSP_COM3_CLK                        RCC_APB1Periph_USART3
  204. 204 #define BSP_COM3_AF                         GPIO_AF_USART3
  205. 205 #ifdef COM_3_3                              //自由组合部分
  206. 206 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource8
  207. 207 #define BSP_COM3_TX_PIN                     GPIO_Pin_8
  208. 208 #define BSP_COM3_TX_GPIO_PORT               GPIOD
  209. 209 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  210. 210 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
  211. 211 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
  212. 212 #define BSP_COM3_RX_GPIO_PORT               GPIOC
  213. 213 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  214. 214 #elif defined(COM_3_2)
  215. 215 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource8
  216. 216 #define BSP_COM3_TX_PIN                     GPIO_Pin_8
  217. 217 #define BSP_COM3_TX_GPIO_PORT               GPIOD
  218. 218 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  219. 219 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource9
  220. 220 #define BSP_COM3_RX_PIN                     GPIO_Pin_9
  221. 221 #define BSP_COM3_RX_GPIO_PORT               GPIOD
  222. 222 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  223. 223 #elif defined(COM_3_1)
  224. 224 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource10
  225. 225 #define BSP_COM3_TX_PIN                     GPIO_Pin_10
  226. 226 #define BSP_COM3_TX_GPIO_PORT               GPIOC
  227. 227 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  228. 228 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
  229. 229 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
  230. 230 #define BSP_COM3_RX_GPIO_PORT               GPIOC
  231. 231 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  232. 232 #else
  233. 233 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource10
  234. 234 #define BSP_COM3_TX_PIN                     GPIO_Pin_10
  235. 235 #define BSP_COM3_TX_GPIO_PORT               GPIOB
  236. 236 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  237. 237 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
  238. 238 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
  239. 239 #define BSP_COM3_RX_GPIO_PORT               GPIOB
  240. 240 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
  241. 241 #endif
  242. 242     
  243. 243 #define BSP_COM3_IRQn                       USART3_IRQn
  244. 244     
  245. 245 #define BSP_COM3_DMA_DR_BASE                0x40004804
  246. 246 #define BSP_COM3_DMA_CLK                    RCC_AHB1Periph_DMA1
  247. 247 #define BSP_COM3_Tx_DMA_FLAG                DMA_FLAG_TCIF3
  248. 248 #define BSP_COM3_Tx_DMA_Stream              DMA1_Stream3
  249. 249 #define BSP_COM3_Tx_DMA_Channel             DMA_Channel_4
  250. 250
  251. 251 #define BSP_COM3_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  252. 252 #define BSP_COM3_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  253. 253
  254. 254
  255. 255 /**
  256. 256  * @brief Definition for COM port4, connected to USART4
  257. 257  */
  258. 258 #define BSP_COM4                            UART4
  259. 259 #define BSP_COM4_CLK                        RCC_APB1Periph_UART4
  260. 260 #define BSP_COM4_AF                         GPIO_AF_UART4
  261. 261 #ifdef COM_4_3
  262. 262 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource10
  263. 263 #define BSP_COM4_TX_PIN                     GPIO_Pin_10
  264. 264 #define BSP_COM4_TX_GPIO_PORT               GPIOC
  265. 265 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  266. 266 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource1
  267. 267 #define BSP_COM4_RX_PIN                     GPIO_Pin_1
  268. 268 #define BSP_COM4_RX_GPIO_PORT               GPIOA
  269. 269 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  270. 270 #elif defined(COM_4_2)
  271. 271 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource0
  272. 272 #define BSP_COM4_TX_PIN                     GPIO_Pin_0
  273. 273 #define BSP_COM4_TX_GPIO_PORT               GPIOA
  274. 274 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  275. 275 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource11
  276. 276 #define BSP_COM4_RX_PIN                     GPIO_Pin_11
  277. 277 #define BSP_COM4_RX_GPIO_PORT               GPIOC
  278. 278 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  279. 279 #elif defined(COM_4_1)
  280. 280 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource10
  281. 281 #define BSP_COM4_TX_PIN                     GPIO_Pin_10
  282. 282 #define BSP_COM4_TX_GPIO_PORT               GPIOC
  283. 283 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  284. 284 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource11
  285. 285 #define BSP_COM4_RX_PIN                     GPIO_Pin_11
  286. 286 #define BSP_COM4_RX_GPIO_PORT               GPIOC
  287. 287 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  288. 288 #else
  289. 289 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource0
  290. 290 #define BSP_COM4_TX_PIN                     GPIO_Pin_0
  291. 291 #define BSP_COM4_TX_GPIO_PORT               GPIOA
  292. 292 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  293. 293 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource1
  294. 294 #define BSP_COM4_RX_PIN                     GPIO_Pin_1
  295. 295 #define BSP_COM4_RX_GPIO_PORT               GPIOA
  296. 296 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
  297. 297 #endif
  298. 298         
  299. 299 #define BSP_COM4_IRQn                       UART4_IRQn
  300. 300         
  301. 301 #define BSP_COM4_DMA_DR_BASE                0x40004C04
  302. 302 #define BSP_COM4_DMA_CLK                    RCC_AHB1Periph_DMA1
  303. 303 #define BSP_COM4_Tx_DMA_FLAG                DMA_FLAG_TCIF4
  304. 304 #define BSP_COM4_Tx_DMA_Stream              DMA1_Stream4
  305. 305 #define BSP_COM4_Tx_DMA_Channel             DMA_Channel_4
  306. 306
  307. 307 #define BSP_COM4_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  308. 308 #define BSP_COM4_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  309. 309
  310. 310
  311. 311 /**
  312. 312  * @brief Definition for COM port5, connected to USART5
  313. 313  */
  314. 314 #define BSP_COM5                            UART5
  315. 315 #define BSP_COM5_CLK                        RCC_APB1Periph_UART5
  316. 316 #define BSP_COM5_AF                         GPIO_AF_UART5
  317. 317
  318. 318 #define BSP_COM5_TX_AF_PIN                  GPIO_PinSource12
  319. 319 #define BSP_COM5_TX_PIN                     GPIO_Pin_12
  320. 320 #define BSP_COM5_TX_GPIO_PORT               GPIOC
  321. 321 #define BSP_COM5_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  322. 322 #define BSP_COM5_RX_AF_PIN                  GPIO_PinSource2
  323. 323 #define BSP_COM5_RX_PIN                     GPIO_Pin_2
  324. 324 #define BSP_COM5_RX_GPIO_PORT               GPIOD
  325. 325 #define BSP_COM5_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
  326. 326         
  327. 327 #define BSP_COM5_IRQn                       UART5_IRQn
  328. 328         
  329. 329 #define BSP_COM5_DMA_DR_BASE                0x40005004
  330. 330 #define BSP_COM5_DMA_CLK                    RCC_AHB1Periph_DMA1
  331. 331 #define BSP_COM5_Tx_DMA_FLAG                DMA_FLAG_TCIF7
  332. 332 #define BSP_COM5_Tx_DMA_Stream              DMA1_Stream7
  333. 333 #define BSP_COM5_Tx_DMA_Channel             DMA_Channel_4
  334. 334
  335. 335 #define BSP_COM5_Tx_BUFF_SIZE               125     //发送缓冲区大小
  336. 336 #define BSP_COM5_Rx_BUFF_SIZE               125     //接收缓冲区大小
  337. 337
  338. 338
  339. 339 /**
  340. 340  * @brief Definition for COM port6, connected to USART6
  341. 341  */
  342. 342 #define BSP_COM6                            USART6
  343. 343 #define BSP_COM6_CLK                        RCC_APB2Periph_USART6
  344. 344 #define BSP_COM6_AF                         GPIO_AF_USART6
  345. 345 #ifdef COM_6_3
  346. 346 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource6
  347. 347 #define BSP_COM6_TX_PIN                     GPIO_Pin_6
  348. 348 #define BSP_COM6_TX_GPIO_PORT               GPIOC
  349. 349 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  350. 350 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource9
  351. 351 #define BSP_COM6_RX_PIN                     GPIO_Pin_9
  352. 352 #define BSP_COM6_RX_GPIO_PORT               GPIOG
  353. 353 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOG
  354. 354 #elif defined(COM_6_2)
  355. 355 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource14
  356. 356 #define BSP_COM6_TX_PIN                     GPIO_Pin_14
  357. 357 #define BSP_COM6_TX_GPIO_PORT               GPIOG
  358. 358 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOG
  359. 359 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource7
  360. 360 #define BSP_COM6_RX_PIN                     GPIO_Pin_7
  361. 361 #define BSP_COM6_RX_GPIO_PORT               GPIOC
  362. 362 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  363. 363 #elif defined(COM_6_1)
  364. 364 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource14
  365. 365 #define BSP_COM6_TX_PIN                     GPIO_Pin_14
  366. 366 #define BSP_COM6_TX_GPIO_PORT               GPIOG
  367. 367 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOG
  368. 368 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource9
  369. 369 #define BSP_COM6_RX_PIN                     GPIO_Pin_9
  370. 370 #define BSP_COM6_RX_GPIO_PORT               GPIOG
  371. 371 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOG
  372. 372 #else
  373. 373 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource6
  374. 374 #define BSP_COM6_TX_PIN                     GPIO_Pin_6
  375. 375 #define BSP_COM6_TX_GPIO_PORT               GPIOC
  376. 376 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  377. 377 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource7
  378. 378 #define BSP_COM6_RX_PIN                     GPIO_Pin_7
  379. 379 #define BSP_COM6_RX_GPIO_PORT               GPIOC
  380. 380 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
  381. 381 #endif
  382. 382         
  383. 383 #define BSP_COM6_IRQn                       USART6_IRQn
  384. 384         
  385. 385 #define BSP_COM6_DMA_DR_BASE                0x40011404
  386. 386 #define BSP_COM6_DMA_CLK                    RCC_AHB1Periph_DMA2
  387. 387 #define BSP_COM6_Tx_DMA_FLAG                DMA_FLAG_TCIF6
  388. 388 #define BSP_COM6_Tx_DMA_Stream              DMA2_Stream6
  389. 389 #define BSP_COM6_Tx_DMA_Channel             DMA_Channel_5
  390. 390
  391. 391         
  392. 392 #define BSP_COM6_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  393. 393 #define BSP_COM6_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  394. 394
  395. 395 /**
  396. 396  * @brief Definition for COM port7, connected to USART7
  397. 397  */
  398. 398 #define BSP_COM7                            UART7
  399. 399 #define BSP_COM7_CLK                        RCC_APB1Periph_UART7
  400. 400 #define BSP_COM7_AF                         GPIO_AF_UART7
  401. 401 #ifdef COM_7_3
  402. 402 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource8
  403. 403 #define BSP_COM7_TX_PIN                     GPIO_Pin_8
  404. 404 #define BSP_COM7_TX_GPIO_PORT               GPIOE
  405. 405 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  406. 406 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource6
  407. 407 #define BSP_COM7_RX_PIN                     GPIO_Pin_6
  408. 408 #define BSP_COM7_RX_GPIO_PORT               GPIOF
  409. 409 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOF
  410. 410 #elif defined(COM_7_2)
  411. 411 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource7
  412. 412 #define BSP_COM7_TX_PIN                     GPIO_Pin_7
  413. 413 #define BSP_COM7_TX_GPIO_PORT               GPIOF
  414. 414 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOF
  415. 415 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource7
  416. 416 #define BSP_COM7_RX_PIN                     GPIO_Pin_7
  417. 417 #define BSP_COM7_RX_GPIO_PORT               GPIOE
  418. 418 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  419. 419 #elif defined(COM_7_1)
  420. 420 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource7
  421. 421 #define BSP_COM7_TX_PIN                     GPIO_Pin_7
  422. 422 #define BSP_COM7_TX_GPIO_PORT               GPIOF
  423. 423 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOF
  424. 424 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource6
  425. 425 #define BSP_COM7_RX_PIN                     GPIO_Pin_6
  426. 426 #define BSP_COM7_RX_GPIO_PORT               GPIOF
  427. 427 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOF
  428. 428 #else
  429. 429 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource8
  430. 430 #define BSP_COM7_TX_PIN                     GPIO_Pin_8
  431. 431 #define BSP_COM7_TX_GPIO_PORT               GPIOE
  432. 432 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  433. 433 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource7
  434. 434 #define BSP_COM7_RX_PIN                     GPIO_Pin_7
  435. 435 #define BSP_COM7_RX_GPIO_PORT               GPIOE
  436. 436 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  437. 437 #endif
  438. 438         
  439. 439 #define BSP_COM7_IRQn                       UART7_IRQn
  440. 440         
  441. 441 #define BSP_COM7_DMA_DR_BASE                0x40007804
  442. 442 #define BSP_COM7_DMA_CLK                    RCC_AHB1Periph_DMA1
  443. 443 #define BSP_COM7_Tx_DMA_FLAG                DMA_FLAG_TCIF1
  444. 444 #define BSP_COM7_Tx_DMA_Stream              DMA1_Stream1
  445. 445 #define BSP_COM7_Tx_DMA_Channel             DMA_Channel_5
  446. 446
  447. 447 #define BSP_COM7_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  448. 448 #define BSP_COM7_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  449. 449
  450. 450 /**
  451. 451  * @brief Definition for COM port8, connected to USART8
  452. 452  */
  453. 453 #define BSP_COM8                            UART8
  454. 454 #define BSP_COM8_CLK                        RCC_APB1Periph_UART8
  455. 455 #define BSP_COM8_AF                         GPIO_AF_UART8
  456. 456
  457. 457 #define BSP_COM8_TX_AF_PIN                  GPIO_PinSource1
  458. 458 #define BSP_COM8_TX_PIN                     GPIO_Pin_1
  459. 459 #define BSP_COM8_TX_GPIO_PORT               GPIOE
  460. 460 #define BSP_COM8_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  461. 461 #define BSP_COM8_RX_AF_PIN                  GPIO_PinSource0
  462. 462 #define BSP_COM8_RX_PIN                     GPIO_Pin_0
  463. 463 #define BSP_COM8_RX_GPIO_PORT               GPIOE
  464. 464 #define BSP_COM8_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
  465. 465         
  466. 466 #define BSP_COM8_IRQn                       UART8_IRQn
  467. 467         
  468. 468 #define BSP_COM8_DMA_DR_BASE                0x40007C04
  469. 469 #define BSP_COM8_DMA_CLK                    RCC_AHB1Periph_DMA1
  470. 470 #define BSP_COM8_Tx_DMA_FLAG                DMA_FLAG_TCIF0
  471. 471 #define BSP_COM8_Tx_DMA_Stream              DMA1_Stream0
  472. 472 #define BSP_COM8_Tx_DMA_Channel             DMA_Channel_5
  473. 473
  474. 474 #define BSP_COM8_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
  475. 475 #define BSP_COM8_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
  476. 476
  477. 477
  478. 478
  479. 479 /******************************函数声明****************************************/
  480. 480 void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);
  481. 481 void BSP_UartClose(uint8_t COM);
  482. 482 uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);
  483. 483 uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);
  484. 484 uint32_t BSP_UartTxIdleState(uint8_t COM);
  485. 485
  486. 486
  487. 487
  488. 488 #endif

  489. BSP_Uart.h
 楼主| condition 发表于 2019-6-18 10:06 | 显示全部楼层
  1. 1 /*
  2.   2 ********************************************************************************
  3.   3 *
  4.   4 *                                 Queue.c
  5.   5 *
  6.   6 * File          : Queue.c
  7.   7 * Version       : V1.0
  8.   8 * Author        : whq
  9.   9 * Mode          : Thumb2
  10. 10 * Toolchain     :
  11. 11 * Description   : 队列操作
  12. 12 *               
  13. 13 * History       :
  14. 14 * Date          : 2013.07.22
  15. 15 *******************************************************************************/
  16. 16
  17. 17 #include <string.h>
  18. 18
  19. 19 #include "Queue.h"
  20. 20 /*******************************************************************************
  21. 21 * Function Name : uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t lenSize)
  22. 22 * Description   : 队列建立
  23. 23 * Input         :   pQ8:    队列
  24. 24                     pBuf:   队列缓冲区地址
  25. 25                     bufSize:队列缓冲区大小
  26. 26 * Output        :
  27. 27 * Other         :
  28. 28 * Date          : 2013.08.29
  29. 29 *******************************************************************************/
  30. 30 uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize)
  31. 31 {
  32. 32     ASSERT_PARAM(pQ8);
  33. 33     ASSERT_PARAM(pBuf);
  34. 34     ASSERT_PARAM(bufSize);
  35. 35
  36. 36     pQ8->bufSize    = bufSize;
  37. 37     pQ8->pBuf       = pBuf;
  38. 38     pQ8->pStart     = pBuf;
  39. 39     pQ8->pEnd       = pBuf;
  40. 40
  41. 41     return 0;
  42. 42 }
  43. 43
  44. 44 /*******************************************************************************
  45. 45 * Function Name : uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
  46. 46 * Description   : 数据载入队列
  47. 47 * Input         :   pQ8:    队列
  48. 48                     pData:  要进队列的数据
  49. 49                     len:    数据长度
  50. 50 * Output        :
  51. 51 * Other         :
  52. 52 * Date          : 2013.08.29
  53. 53 *******************************************************************************/
  54. 54 uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
  55. 55 {
  56. 56     uint32_t dataLen = len;
  57. 57     
  58. 58     ASSERT_PARAM(pData);
  59. 59     ASSERT_PARAM(pQ8);
  60. 60     ASSERT_PARAM(pQ8->pStart);
  61. 61     ASSERT_PARAM(pQ8->pEnd);
  62. 62
  63. 63     while (dataLen--)
  64. 64     {
  65. 65         *pQ8->pEnd++ = *pData++;
  66. 66         
  67. 67         if (pQ8->pEnd >= pQ8->pBuf + pQ8->bufSize)      //指针指向栈尾
  68. 68         {
  69. 69             pQ8->pEnd = pQ8->pBuf;
  70. 70         }
  71. 71         
  72. 72         if (pQ8->pEnd == pQ8->pStart)                   //缓冲区填满 覆盖最早的数据
  73. 73         {
  74. 74             pQ8->pStart++;
  75. 75             if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
  76. 76             {
  77. 77                 pQ8->pStart = pQ8->pBuf;
  78. 78             }
  79. 79         }
  80. 80     }
  81. 81     
  82. 82     return len;
  83. 83 }
  84. 84
  85. 85 /*******************************************************************************
  86. 86 * Function Name : uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
  87. 87 * Description   : 队列中取数据
  88. 88 * Input         :   pQ8:    队列
  89. 89                     pData:  缓冲区
  90. 90                     dataLen:缓冲区大小
  91. 91 * Output        :
  92. 92 * Other         :
  93. 93 * Date          : 2013.08.29
  94. 94 *******************************************************************************/
  95. 95 uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
  96. 96 {
  97. 97     uint32_t index = 0;
  98. 98     
  99. 99     ASSERT_PARAM(pData);
  100. 100     ASSERT_PARAM(pQ8);
  101. 101     ASSERT_PARAM(pQ8->pStart);
  102. 102     ASSERT_PARAM(pQ8->pEnd);
  103. 103
  104. 104     while ((pQ8->pStart != pQ8->pEnd) && (index < dataLen) && (index < pQ8->bufSize))
  105. 105     {
  106. 106         pData[index++] = *pQ8->pStart++;
  107. 107         if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
  108. 108         {
  109. 109             pQ8->pStart = pQ8->pBuf;
  110. 110         }
  111. 111     }
  112. 112
  113. 113     return index;
  114. 114 }
  115. 115
  116. 116 /*******************************************************************************
  117. 117 * Function Name : uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
  118. 118 * Description   : 以起始符和结束符取队列中的数据 (取出的数据 包括起始符 和分隔符)
  119. 119 * Input         :   pQ8:        队列
  120. 120                     startChar:  起始符
  121. 121                     endChar:    结束符
  122. 122                     pData:      缓冲区
  123. 123                     dataLen:    缓冲区大小
  124. 124 * Output        :
  125. 125 * Other         :
  126. 126 * Date          : 2013.08.29
  127. 127 *******************************************************************************/
  128. 128 uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
  129. 129 {
  130. 130     int32_t count;
  131. 131     int32_t index;
  132. 132     volatile uint8_t *pStart;
  133. 133     volatile uint8_t *pEnd;
  134. 134     
  135. 135     ASSERT_PARAM(pData);
  136. 136     ASSERT_PARAM(pQ8);
  137. 137     ASSERT_PARAM(pQ8->pStart);
  138. 138     ASSERT_PARAM(pQ8->pEnd);
  139. 139
  140. 140     pStart      = pQ8->pStart;
  141. 141     count       = pQ8->bufSize;
  142. 142     
  143. 143     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
  144. 144     {
  145. 145         if (startChar == *pStart) break;
  146. 146         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  147. 147     }
  148. 148
  149. 149     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
  150. 150     if (count == -1) return 0;
  151. 151     pEnd = pStart;
  152. 152     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  153. 153
  154. 154     while ((pEnd != pQ8->pEnd) && count--)          //查找结束字符
  155. 155     {
  156. 156         if (endChar == *pEnd) break;
  157. 157         if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  158. 158     }
  159. 159     
  160. 160     if (pEnd == pQ8->pEnd) return 0;                //未找结束符
  161. 161     if (count == -1) return 0;
  162. 162     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  163. 163     
  164. 164     count   = pQ8->bufSize - count;   
  165. 165     index   = 0;
  166. 166      //获取从起始字符到结束字符的数据
  167. 167     while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
  168. 168     {
  169. 169         pData[index++] = *pStart++;
  170. 170         if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  171. 171     }
  172. 172
  173. 173     pQ8->pStart = pEnd;
  174. 174     return index;
  175. 175 }
  176. 176
  177. 177 /*******************************************************************************
  178. 178 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
  179. 179 * Description   : 提取首尾双分隔符内的数据(包括分隔符)
  180. 180 * Input         :   pQ8:        队列
  181. 181                     startChar:  起始符
  182. 182                     endChar:    结束符
  183. 183                     pData:      缓冲区
  184. 184                     dataLen:    缓冲区大小
  185. 185 * Output        :
  186. 186 * Other         :
  187. 187 * Date          : 2013.08.30
  188. 188 *******************************************************************************/
  189. 189 uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
  190. 190 {
  191. 191     int32_t count;
  192. 192     int32_t index;
  193. 193     volatile uint8_t *pStart;
  194. 194     volatile uint8_t *pEnd;
  195. 195     
  196. 196     ASSERT_PARAM(pData);
  197. 197     ASSERT_PARAM(pQ8);
  198. 198     ASSERT_PARAM(pQ8->pStart);
  199. 199     ASSERT_PARAM(pQ8->pEnd);
  200. 200
  201. 201     pStart      = pQ8->pStart;
  202. 202     count       = pQ8->bufSize;
  203. 203     
  204. 204     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
  205. 205     {
  206. 206         if (splitChar == *pStart) break;
  207. 207         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  208. 208     }
  209. 209
  210. 210     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
  211. 211     if (count == -1) return 0;
  212. 212     pEnd = pStart;
  213. 213     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  214. 214
  215. 215     while ((pEnd != pQ8->pEnd) && count--)          //查找结束字符
  216. 216     {
  217. 217         if (splitChar == *pEnd) break;
  218. 218         if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  219. 219     }
  220. 220     
  221. 221     if (pEnd == pQ8->pEnd) return 0;                //未找结束符
  222. 222     if (count == -1) return 0;
  223. 223     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  224. 224     
  225. 225     count   = pQ8->bufSize - count;   
  226. 226     index   = 0;
  227. 227      //获取从起始字符到结束字符的数据
  228. 228     while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
  229. 229     {
  230. 230         pData[index++] = *pStart++;
  231. 231         if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  232. 232     }
  233. 233
  234. 234     //如果取出的数据只包括分隔符,有可能是上次结束符和下次起始符,因此放弃上次结束符。
  235. 235     if (index <= 2)                                 
  236. 236     {
  237. 237         index = 0;
  238. 238         if (--pStart < pQ8->pBuf) pStart = pQ8->pBuf + pQ8->bufSize - 1;
  239. 239     }
  240. 240
  241. 241     pQ8->pStart = pStart;
  242. 242     return index;
  243. 243 }
  244. 244
  245. 245 /*******************************************************************************
  246. 246 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
  247. 247 * Description   : 提取单结束分隔符的数据 (包括分隔符)
  248. 248 * Input         :
  249. 249 * Output        :
  250. 250 * Other         :
  251. 251 * Date          : 2013.10.20
  252. 252 *******************************************************************************/
  253. 253 uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
  254. 254 {
  255. 255     int32_t count;
  256. 256     int32_t index;
  257. 257     volatile uint8_t *pStart;
  258. 258     volatile uint8_t *pEnd;
  259. 259     
  260. 260     ASSERT_PARAM(pData);
  261. 261     ASSERT_PARAM(pQ8);
  262. 262     ASSERT_PARAM(pQ8->pStart);
  263. 263     ASSERT_PARAM(pQ8->pEnd);
  264. 264
  265. 265     pStart      = pQ8->pStart;
  266. 266     count       = pQ8->bufSize;
  267. 267
  268. 268     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
  269. 269     {
  270. 270         if (splitChar == *pStart) break;
  271. 271         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  272. 272     }
  273. 273
  274. 274     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
  275. 275     if (count == -1) return 0;
  276. 276     pEnd = pStart;
  277. 277     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  278. 278     
  279. 279     pStart      = pQ8->pStart;
  280. 280     count       = pQ8->bufSize;
  281. 281     index       = 0;
  282. 282     while ((pStart != pEnd) && (index < dataLen) && count--)        //查找起始字符
  283. 283     {
  284. 284         pData[index++] = *pStart;
  285. 285         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  286. 286     }
  287. 287     
  288. 288     pQ8->pStart = pStart;
  289. 289     return index;
  290. 290 }
  291. 291
  292. 292 /*******************************************************************************
  293. 293 * Function Name :QUEUE_PacketDoubleCharSplit
  294. 294 * Description   :提取双结束分隔符的数据 (包括分隔符)
  295. 295 * Input         :QUEUE8_TYPE * pQ8
  296. 296 * Input         :uint8_t splitChar1
  297. 297 * Input         :uint8_t splitChar2
  298. 298 * Input         :uint8_t * pData
  299. 299 * Input         :uint32_t dataLen
  300. 300 * Output        :uint32_t
  301. 301 * Other         :
  302. 302 * Date          :2014/03/27
  303. 303 *******************************************************************************/
  304. 304 uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen)
  305. 305 {
  306. 306     int32_t count;
  307. 307     int32_t index;
  308. 308     volatile uint8_t *pStart;
  309. 309     volatile uint8_t *pEnd;
  310. 310     uint8_t lastChar = 0;
  311. 311
  312. 312     ASSERT_PARAM(pData);
  313. 313     ASSERT_PARAM(pQ8);
  314. 314     ASSERT_PARAM(pQ8->pStart);
  315. 315     ASSERT_PARAM(pQ8->pEnd);
  316. 316
  317. 317     pStart      = pQ8->pStart;
  318. 318     count       = pQ8->bufSize;
  319. 319
  320. 320     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
  321. 321     {
  322. 322         if ((splitChar1 == lastChar) && (splitChar2 == *pStart)) break;
  323. 323
  324. 324         lastChar = *pStart;
  325. 325
  326. 326         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  327. 327     }
  328. 328
  329. 329     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
  330. 330     if (count == -1) return 0;
  331. 331     pEnd = pStart;
  332. 332     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
  333. 333
  334. 334     pStart      = pQ8->pStart;
  335. 335     count       = pQ8->bufSize;
  336. 336     index       = 0;
  337. 337     while ((pStart != pEnd) && (index < dataLen) && count--)        //查找起始字符
  338. 338     {
  339. 339         pData[index++] = *pStart;
  340. 340         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
  341. 341     }
  342. 342
  343. 343     pQ8->pStart = pStart;
  344. 344     return index;
  345. 345 }
  346. 346
  347. 347
  348. 348 /*******************************************************************************
  349. 349 * Function Name : void ASSERT_FAILED(uint8_t* file, uint32_t line)
  350. 350 * Description   : 异常
  351. 351 * Input         :
  352. 352 * Output        :
  353. 353 * Other         :
  354. 354 * Date          : 2013.08.29
  355. 355 *******************************************************************************/
  356. 356 void ASSERT_FAILED(uint8_t* file, uint32_t line)
  357. 357 {
  358. 358     uint8_t ** = 1;
  359. 359
  360. 360     while (**);
  361. 361 }

  362. Queue.c
 楼主| condition 发表于 2019-6-18 10:07 | 显示全部楼层
  1. 1 /*
  2. 2 ********************************************************************************
  3. 3 *
  4. 4 *                                 Queue.h
  5. 5 *
  6. 6 * File          : Queue.h
  7. 7 * Version       : V1.0
  8. 8 * Author        : whq
  9. 9 * Mode          : Thumb2
  10. 10 * Toolchain     :
  11. 11 * Description   : 队列操作头文件
  12. 12 *               
  13. 13 * History       :
  14. 14 * Date          : 2013.07.22
  15. 15 *******************************************************************************/
  16. 16
  17. 17
  18. 18 #ifndef _QUEUE_H_
  19. 19 #define _QUEUE_H_
  20. 20
  21. 21 #ifdef  __cplusplus
  22. 22 extern "C"
  23. 23 {
  24. 24 #endif
  25. 25
  26. 26
  27. 27
  28. 28 #include "stdint.h"
  29. 29
  30. 30 #define DEBUG_FULL_ASSERT       0
  31. 31
  32. 32 #ifdef DEBUG_FULL_ASSERT
  33. 33 #define ASSERT_PARAM(a)          ((a) ? (void)0 : ASSERT_FAILED((uint8_t *)__FILE__, __LINE__))
  34. 34 void ASSERT_FAILED(uint8_t* file, uint32_t line);
  35. 35 #else
  36. 36 #define ASSERT_PARAM(a)           if (a == NULL) return 0;
  37. 37 #endif
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43 typedef struct {
  44. 44     volatile uint32_t     bufSize;
  45. 45     volatile uint8_t      *pStart;
  46. 46     volatile uint8_t      *pEnd;
  47. 47     volatile uint8_t      *pBuf;
  48. 48 }QUEUE8_TYPE;
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53 uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize);
  54. 54 uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len);
  55. 55 uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen);
  56. 56 uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen);
  57. 57 uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
  58. 58 uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
  59. 59 uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen);
  60. 60
  61. 61
  62. 62 #ifdef  __cplusplus
  63. 63 }
  64. 64 #endif
  65. 65
  66. 66 #endif

  67. Queue.h
guanjiaer 发表于 2019-7-8 10:54 | 显示全部楼层
非常感谢楼主分享
heimaojingzhang 发表于 2019-7-8 11:14 | 显示全部楼层
非常感谢楼主分享
keaibukelian 发表于 2019-7-8 11:25 | 显示全部楼层
感谢楼主分享啊
labasi 发表于 2019-7-8 11:29 | 显示全部楼层

非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

256

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部