首页 > 代码库 > STM32F4XX高效驱动篇1-UART

STM32F4XX高效驱动篇1-UART

之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。

串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。

从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。

关于串口的使用方式,个人总结出以下三种:

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

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

3)         中断接口,DMA发送:这种方式的使用场合和模式2相同,效率也相差不多。但这种方式确实比模式2CPU的占用时间会更少。

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

以上三种模式,很明显得出那种模式发送数据效率最高。我们下面说提供的程序就是使用模式三。

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

在数据接收中断方面还分二种方式,

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

方式2:队列接收,申请一个缓冲区收尾相接,接收到数据时载入队列之中,用户只要定时的去队列中读数据,来使用这些数据。这种方式是window,linux的驱动主要接收方式。他的优点就在于在使用数据时无需关闭中断。也就不用怛心在处理上一组数据时了来新的数据会破坏上组数据内容。在方式1中需要考虑在处理数据时暂时性的关下中断。

以下程序则主要是使用到接收使用方式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);

这个接口主要用在,向串口写数据后,在进行下一次写数据之前需要进行查询。

 

具体接口的使用方法,函数都有详细的说明。

  1   1 /*
  2   2 ********************************************************************************
  3   3 *
  4   4 *                                 BSP_Uart.c
  5   5 *
  6   6 * File          : BSP_Uart.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.08.12
 15  15 *******************************************************************************/
 16  16 #include <string.h>
 17  17 
 18  18 #include "misc.h"
 19  19 #include "stm32f4xx_gpio.h"
 20  20 #include "stm32f4xx_rcc.h"
 21  21 #include "stm32f4xx_usart.h"
 22  22 #include "stm32f4xx_dma.h"
 23  23 
 24  24 
 25  25 #include "Queue.h"
 26  26 #include "BSP_Uart.h"
 27  27 
 28  28 
 29  29 #if COM1_EN
 30  30 static uint8_t COM1_TX_BUFF[BSP_COM1_Tx_BUFF_SIZE] = {0};
 31  31 static uint8_t COM1_RX_BUFF[BSP_COM1_Rx_BUFF_SIZE] = {0};
 32  32 static QUEUE8_TYPE COM1_RX_QUEUE = {0};
 33  33 #endif
 34  34 
 35  35 #if COM2_EN
 36  36 static uint8_t COM2_TX_BUFF[BSP_COM2_Tx_BUFF_SIZE] = {0};
 37  37 static uint8_t COM2_RX_BUFF[BSP_COM2_Rx_BUFF_SIZE] = {0};
 38  38 static QUEUE8_TYPE COM2_RX_QUEUE = {0};
 39  39 #endif
 40  40 
 41  41 #if COM3_EN
 42  42 static uint8_t COM3_TX_BUFF[BSP_COM3_Tx_BUFF_SIZE] = {0};
 43  43 static uint8_t COM3_RX_BUFF[BSP_COM3_Rx_BUFF_SIZE] = {0};
 44  44 static QUEUE8_TYPE COM3_RX_QUEUE = {0};
 45  45 #endif
 46  46 
 47  47 #if COM4_EN
 48  48 static uint8_t COM4_TX_BUFF[BSP_COM4_Tx_BUFF_SIZE] = {0};
 49  49 static uint8_t COM4_RX_BUFF[BSP_COM4_Rx_BUFF_SIZE] = {0};
 50  50 static QUEUE8_TYPE COM4_RX_QUEUE = {0};
 51  51 #endif
 52  52 
 53  53 #if COM5_EN
 54  54 static uint8_t COM5_TX_BUFF[BSP_COM5_Tx_BUFF_SIZE] = {0};
 55  55 static uint8_t COM5_RX_BUFF[BSP_COM5_Rx_BUFF_SIZE] = {0};
 56  56 static QUEUE8_TYPE COM5_RX_QUEUE = {0};
 57  57 #endif
 58  58 
 59  59 #if COM6_EN
 60  60 static uint8_t COM6_TX_BUFF[BSP_COM6_Tx_BUFF_SIZE] = {0};
 61  61 static uint8_t COM6_RX_BUFF[BSP_COM6_Rx_BUFF_SIZE] = {0};
 62  62 static QUEUE8_TYPE COM6_RX_QUEUE = {0};
 63  63 #endif
 64  64 
 65  65 #if COM7_EN
 66  66 static uint8_t COM7_TX_BUFF[BSP_COM7_Tx_BUFF_SIZE] = {0};
 67  67 static uint8_t COM7_RX_BUFF[BSP_COM7_Rx_BUFF_SIZE] = {0};
 68  68 static QUEUE8_TYPE COM7_RX_QUEUE = {0};
 69  69 #endif
 70  70 
 71  71 #if COM8_EN
 72  72 static uint8_t COM8_TX_BUFF[BSP_COM8_Tx_BUFF_SIZE] = {0};
 73  73 static uint8_t COM8_RX_BUFF[BSP_COM8_Rx_BUFF_SIZE] = {0};
 74  74 static QUEUE8_TYPE COM8_RX_QUEUE = {0};
 75  75 #endif
 76  76 
 77  77 
 78  78 
 79  79 static USART_TypeDef* const COM_USART[COMn] = {  
 80  80 #if     COM1_EN
 81  81     BSP_COM1,
 82  82 #endif
 83  83 #if     COM2_EN
 84  84     BSP_COM2,
 85  85 #endif
 86  86 #if     COM3_EN
 87  87     BSP_COM3,
 88  88 #endif
 89  89 #if     COM4_EN
 90  90     BSP_COM4,
 91  91 #endif
 92  92 #if     COM5_EN
 93  93     BSP_COM5,
 94  94 #endif
 95  95 #if     COM6_EN
 96  96     BSP_COM6,
 97  97 #endif
 98  98 #if     COM7_EN
 99  99     BSP_COM7,
100 100 #endif
101 101 #if     COM8_EN
102 102     BSP_COM8,
103 103 #endif
104 104 }; 
105 105 
106 106 static const uint8_t COM_AF[COMn] = {
107 107 #if     COM1_EN
108 108     BSP_COM1_AF,
109 109 #endif
110 110 #if     COM2_EN
111 111     BSP_COM2_AF,
112 112 #endif
113 113 #if     COM3_EN
114 114     BSP_COM3_AF,
115 115 #endif
116 116 #if     COM4_EN
117 117     BSP_COM4_AF,
118 118 #endif
119 119 #if     COM5_EN
120 120     BSP_COM5_AF,
121 121 #endif
122 122 #if     COM6_EN
123 123     BSP_COM6_AF,
124 124 #endif
125 125 #if     COM7_EN
126 126     BSP_COM7_AF,
127 127 #endif
128 128 #if     COM8_EN
129 129     BSP_COM8_AF,
130 130 #endif
131 131 };
132 132                                                 
133 133 static const uint8_t COM_TX_AF_PIN[COMn] = {   
134 134 #if     COM1_EN
135 135     BSP_COM1_TX_AF_PIN,
136 136 #endif
137 137 #if     COM2_EN
138 138     BSP_COM2_TX_AF_PIN,
139 139 #endif
140 140 #if     COM3_EN
141 141     BSP_COM3_TX_AF_PIN,
142 142 #endif
143 143 #if     COM4_EN
144 144     BSP_COM4_TX_AF_PIN,
145 145 #endif
146 146 #if     COM5_EN
147 147     BSP_COM5_TX_AF_PIN,
148 148 #endif
149 149 #if     COM6_EN
150 150     BSP_COM6_TX_AF_PIN,
151 151 #endif
152 152 #if     COM7_EN
153 153     BSP_COM7_TX_AF_PIN,
154 154 #endif
155 155 #if     COM8_EN
156 156     BSP_COM8_TX_AF_PIN,
157 157 #endif
158 158 };
159 159 
160 160 static const uint8_t COM_RX_AF_PIN[COMn] = {   
161 161 #if     COM1_EN
162 162     BSP_COM1_RX_AF_PIN,
163 163 #endif
164 164 #if     COM2_EN
165 165     BSP_COM2_RX_AF_PIN,
166 166 #endif
167 167 #if     COM3_EN
168 168     BSP_COM3_RX_AF_PIN,
169 169 #endif
170 170 #if     COM4_EN
171 171     BSP_COM4_RX_AF_PIN,
172 172 #endif
173 173 #if     COM5_EN
174 174     BSP_COM5_RX_AF_PIN,
175 175 #endif
176 176 #if     COM6_EN
177 177     BSP_COM6_RX_AF_PIN,
178 178 #endif
179 179 #if     COM7_EN
180 180     BSP_COM7_RX_AF_PIN,
181 181 #endif
182 182 #if     COM8_EN
183 183     BSP_COM8_RX_AF_PIN,
184 184 #endif
185 185 };
186 186 
187 187 static GPIO_TypeDef* const COM_TX_PORT[COMn] = {  
188 188 #if     COM1_EN
189 189     BSP_COM1_TX_GPIO_PORT,
190 190 #endif
191 191 #if     COM2_EN
192 192     BSP_COM2_TX_GPIO_PORT,
193 193 #endif
194 194 #if     COM3_EN
195 195     BSP_COM3_TX_GPIO_PORT,
196 196 #endif
197 197 #if     COM4_EN
198 198     BSP_COM4_TX_GPIO_PORT,
199 199 #endif
200 200 #if     COM5_EN
201 201     BSP_COM5_TX_GPIO_PORT,
202 202 #endif
203 203 #if     COM6_EN
204 204     BSP_COM6_TX_GPIO_PORT,
205 205 #endif
206 206 #if     COM7_EN
207 207     BSP_COM7_TX_GPIO_PORT,
208 208 #endif
209 209 #if     COM8_EN
210 210     BSP_COM8_TX_GPIO_PORT,
211 211 #endif
212 212 };
213 213  
214 214 static GPIO_TypeDef* const COM_RX_PORT[COMn] = {     
215 215 #if     COM1_EN
216 216     BSP_COM1_RX_GPIO_PORT,
217 217 #endif
218 218 #if     COM2_EN
219 219     BSP_COM2_RX_GPIO_PORT,
220 220 #endif
221 221 #if     COM3_EN
222 222     BSP_COM3_RX_GPIO_PORT,
223 223 #endif
224 224 #if     COM4_EN
225 225     BSP_COM4_RX_GPIO_PORT,
226 226 #endif
227 227 #if     COM5_EN
228 228     BSP_COM5_RX_GPIO_PORT,
229 229 #endif
230 230 #if     COM6_EN
231 231     BSP_COM6_RX_GPIO_PORT,
232 232 #endif
233 233 #if     COM7_EN
234 234     BSP_COM7_RX_GPIO_PORT,
235 235 #endif
236 236 #if     COM8_EN
237 237     BSP_COM8_RX_GPIO_PORT,
238 238 #endif
239 239 };
240 240  
241 241 static const uint32_t COM_USART_CLK[COMn] = {   
242 242 #if     COM1_EN
243 243     BSP_COM1_CLK,
244 244 #endif
245 245 #if     COM2_EN
246 246     BSP_COM2_CLK,
247 247 #endif
248 248 #if     COM3_EN
249 249     BSP_COM3_CLK,
250 250 #endif
251 251 #if     COM4_EN
252 252     BSP_COM4_CLK,
253 253 #endif
254 254 #if     COM5_EN
255 255     BSP_COM5_CLK,
256 256 #endif
257 257 #if     COM6_EN
258 258     BSP_COM6_CLK,
259 259 #endif
260 260 #if     COM7_EN
261 261     BSP_COM7_CLK,
262 262 #endif
263 263 #if     COM8_EN
264 264     BSP_COM8_CLK,
265 265 #endif
266 266 };
267 267                 
268 268 static const uint32_t COM_TX_PORT_CLK[COMn] = { 
269 269 #if     COM1_EN
270 270     BSP_COM1_TX_GPIO_CLK,
271 271 #endif
272 272 #if     COM2_EN
273 273     BSP_COM2_TX_GPIO_CLK,
274 274 #endif
275 275 #if     COM3_EN
276 276     BSP_COM3_TX_GPIO_CLK,
277 277 #endif
278 278 #if     COM4_EN
279 279     BSP_COM4_TX_GPIO_CLK,
280 280 #endif
281 281 #if     COM5_EN
282 282     BSP_COM5_TX_GPIO_CLK,
283 283 #endif
284 284 #if     COM6_EN
285 285     BSP_COM6_TX_GPIO_CLK,
286 286 #endif
287 287 #if     COM7_EN
288 288     BSP_COM7_TX_GPIO_CLK,
289 289 #endif
290 290 #if     COM8_EN
291 291     BSP_COM8_TX_GPIO_CLK,
292 292 #endif
293 293 };
294 294  
295 295 static const uint32_t COM_RX_PORT_CLK[COMn] = {
296 296 #if     COM1_EN
297 297     BSP_COM1_RX_GPIO_CLK,
298 298 #endif
299 299 #if     COM2_EN
300 300     BSP_COM2_RX_GPIO_CLK,
301 301 #endif
302 302 #if     COM3_EN
303 303     BSP_COM3_RX_GPIO_CLK,
304 304 #endif
305 305 #if     COM4_EN
306 306     BSP_COM4_RX_GPIO_CLK,
307 307 #endif
308 308 #if     COM5_EN
309 309     BSP_COM5_RX_GPIO_CLK,
310 310 #endif
311 311 #if     COM6_EN
312 312     BSP_COM6_RX_GPIO_CLK,
313 313 #endif
314 314 #if     COM7_EN
315 315     BSP_COM7_RX_GPIO_CLK,
316 316 #endif
317 317 #if     COM8_EN
318 318     BSP_COM8_RX_GPIO_CLK,
319 319 #endif
320 320 };
321 321 
322 322 static const uint16_t COM_TX_PIN[COMn] = {      
323 323 #if     COM1_EN
324 324     BSP_COM1_TX_PIN,
325 325 #endif
326 326 #if     COM2_EN
327 327     BSP_COM2_TX_PIN,
328 328 #endif
329 329 #if     COM3_EN
330 330     BSP_COM3_TX_PIN,
331 331 #endif
332 332 #if     COM4_EN
333 333     BSP_COM4_TX_PIN,
334 334 #endif
335 335 #if     COM5_EN
336 336     BSP_COM5_TX_PIN,
337 337 #endif
338 338 #if     COM6_EN
339 339     BSP_COM6_TX_PIN,
340 340 #endif
341 341 #if     COM7_EN
342 342     BSP_COM7_TX_PIN,
343 343 #endif
344 344 #if     COM8_EN
345 345     BSP_COM8_TX_PIN,
346 346 #endif
347 347 };
348 348 
349 349 static const uint16_t COM_RX_PIN[COMn] = { 
350 350 #if     COM1_EN
351 351     BSP_COM1_RX_PIN,
352 352 #endif
353 353 #if     COM2_EN
354 354     BSP_COM2_RX_PIN,
355 355 #endif
356 356 #if     COM3_EN
357 357     BSP_COM3_RX_PIN,
358 358 #endif
359 359 #if     COM4_EN
360 360     BSP_COM4_RX_PIN,
361 361 #endif
362 362 #if     COM5_EN
363 363     BSP_COM5_RX_PIN,
364 364 #endif
365 365 #if     COM6_EN
366 366     BSP_COM6_RX_PIN,
367 367 #endif
368 368 #if     COM7_EN
369 369     BSP_COM7_RX_PIN,
370 370 #endif
371 371 #if     COM8_EN
372 372     BSP_COM8_RX_PIN,
373 373 #endif
374 374 };
375 375 
376 376 static const uint32_t COM_DMA_DR_BASE[COMn] = { 
377 377 #if     COM1_EN
378 378     BSP_COM1_DMA_DR_BASE,
379 379 #endif
380 380 #if     COM2_EN
381 381     BSP_COM2_DMA_DR_BASE,
382 382 #endif
383 383 #if     COM3_EN
384 384     BSP_COM3_DMA_DR_BASE,
385 385 #endif
386 386 #if     COM4_EN
387 387     BSP_COM4_DMA_DR_BASE,
388 388 #endif
389 389 #if     COM5_EN
390 390     BSP_COM5_DMA_DR_BASE,
391 391 #endif
392 392 #if     COM6_EN
393 393     BSP_COM6_DMA_DR_BASE,
394 394 #endif
395 395 #if     COM7_EN
396 396     BSP_COM7_DMA_DR_BASE,
397 397 #endif
398 398 #if     COM8_EN
399 399     BSP_COM8_DMA_DR_BASE,
400 400 #endif
401 401 };
402 402 
403 403 static const uint32_t COM_DMA_CLK[COMn] = {     
404 404 #if     COM1_EN
405 405     BSP_COM1_DMA_CLK,
406 406 #endif
407 407 #if     COM2_EN
408 408     BSP_COM2_DMA_CLK,
409 409 #endif
410 410 #if     COM3_EN
411 411     BSP_COM3_DMA_CLK,
412 412 #endif
413 413 #if     COM4_EN
414 414     BSP_COM4_DMA_CLK,
415 415 #endif
416 416 #if     COM5_EN
417 417     BSP_COM5_DMA_CLK,
418 418 #endif
419 419 #if     COM6_EN
420 420     BSP_COM6_DMA_CLK,
421 421 #endif
422 422 #if     COM7_EN
423 423     BSP_COM7_DMA_CLK,
424 424 #endif
425 425 #if     COM8_EN
426 426     BSP_COM8_DMA_CLK,
427 427 #endif
428 428 };
429 429 
430 430 static const uint32_t COM_DMA_TX_FLAG[COMn] = { 
431 431 #if     COM1_EN
432 432     BSP_COM1_Tx_DMA_FLAG,
433 433 #endif
434 434 #if     COM2_EN
435 435     BSP_COM2_Tx_DMA_FLAG,
436 436 #endif
437 437 #if     COM3_EN
438 438     BSP_COM3_Tx_DMA_FLAG,
439 439 #endif
440 440 #if     COM4_EN
441 441     BSP_COM4_Tx_DMA_FLAG,
442 442 #endif
443 443 #if     COM5_EN
444 444     BSP_COM5_Tx_DMA_FLAG,
445 445 #endif
446 446 #if     COM6_EN
447 447     BSP_COM6_Tx_DMA_FLAG,
448 448 #endif
449 449 #if     COM7_EN
450 450     BSP_COM7_Tx_DMA_FLAG,
451 451 #endif
452 452 #if     COM8_EN
453 453     BSP_COM8_Tx_DMA_FLAG,
454 454 #endif
455 455 };
456 456 
457 457 static const uint32_t COM_DMA_TX_CHANNEL[COMn] = { 
458 458 #if     COM1_EN
459 459     BSP_COM1_Tx_DMA_Channel,
460 460 #endif
461 461 #if     COM2_EN
462 462     BSP_COM2_Tx_DMA_Channel,
463 463 #endif
464 464 #if     COM3_EN
465 465     BSP_COM3_Tx_DMA_Channel,
466 466 #endif
467 467 #if     COM4_EN
468 468     BSP_COM4_Tx_DMA_Channel,
469 469 #endif
470 470 #if     COM5_EN
471 471     BSP_COM5_Tx_DMA_Channel,
472 472 #endif
473 473 #if     COM6_EN
474 474     BSP_COM6_Tx_DMA_Channel,
475 475 #endif
476 476 #if     COM7_EN
477 477     BSP_COM7_Tx_DMA_Channel,
478 478 #endif
479 479 #if     COM8_EN
480 480     BSP_COM8_Tx_DMA_Channel,
481 481 #endif
482 482 };
483 483 
484 484 static DMA_Stream_TypeDef * const COM_DMA_TX_STREAM[COMn] = { 
485 485 #if     COM1_EN
486 486     BSP_COM1_Tx_DMA_Stream,
487 487 #endif
488 488 #if     COM2_EN
489 489     BSP_COM2_Tx_DMA_Stream,
490 490 #endif
491 491 #if     COM3_EN
492 492     BSP_COM3_Tx_DMA_Stream,
493 493 #endif
494 494 #if     COM4_EN
495 495     BSP_COM4_Tx_DMA_Stream,
496 496 #endif
497 497 #if     COM5_EN
498 498     BSP_COM5_Tx_DMA_Stream,
499 499 #endif
500 500 #if     COM6_EN
501 501     BSP_COM6_Tx_DMA_Stream,
502 502 #endif
503 503 #if     COM7_EN
504 504     BSP_COM7_Tx_DMA_Stream,
505 505 #endif
506 506 #if     COM8_EN
507 507     BSP_COM8_Tx_DMA_Stream,
508 508 #endif
509 509 };
510 510 
511 511 
512 512 static const uint32_t COM_RX_IRQn[COMn] = {     
513 513 #if     COM1_EN
514 514     BSP_COM1_IRQn,
515 515 #endif
516 516 #if     COM2_EN
517 517     BSP_COM2_IRQn,
518 518 #endif
519 519 #if     COM3_EN
520 520     BSP_COM3_IRQn,
521 521 #endif
522 522 #if     COM4_EN
523 523     BSP_COM4_IRQn,
524 524 #endif
525 525 #if     COM5_EN
526 526     BSP_COM5_IRQn,
527 527 #endif
528 528 #if     COM6_EN
529 529     BSP_COM6_IRQn,
530 530 #endif
531 531 #if     COM7_EN
532 532     BSP_COM7_IRQn,
533 533 #endif
534 534 #if     COM8_EN
535 535     BSP_COM8_IRQn,
536 536 #endif
537 537 };
538 538 
539 539 static uint8_t * const COM_TX_BUFF[COMn] = {      
540 540 #if     COM1_EN
541 541     COM1_TX_BUFF,
542 542 #endif
543 543 #if     COM2_EN
544 544     COM2_TX_BUFF,
545 545 #endif
546 546 #if     COM3_EN
547 547     COM3_TX_BUFF,
548 548 #endif
549 549 #if     COM4_EN
550 550     COM4_TX_BUFF,
551 551 #endif
552 552 #if     COM5_EN
553 553     COM5_TX_BUFF,
554 554 #endif
555 555 #if     COM6_EN
556 556     COM6_TX_BUFF,
557 557 #endif
558 558 #if     COM7_EN
559 559     COM7_TX_BUFF,
560 560 #endif
561 561 #if     COM8_EN
562 562     COM8_TX_BUFF,
563 563 #endif
564 564 };
565 565                                                 
566 566 static const uint32_t COM_TX_BUFF_SIZE[COMn] = {  
567 567 #if     COM1_EN
568 568     BSP_COM1_Tx_BUFF_SIZE,
569 569 #endif
570 570 #if     COM2_EN
571 571     BSP_COM2_Tx_BUFF_SIZE,
572 572 #endif
573 573 #if     COM3_EN
574 574     BSP_COM3_Tx_BUFF_SIZE,
575 575 #endif
576 576 #if     COM4_EN
577 577     BSP_COM4_Tx_BUFF_SIZE,
578 578 #endif
579 579 #if     COM5_EN
580 580     BSP_COM5_Tx_BUFF_SIZE,
581 581 #endif
582 582 #if     COM6_EN
583 583     BSP_COM6_Tx_BUFF_SIZE,
584 584 #endif
585 585 #if     COM7_EN
586 586     BSP_COM7_Tx_BUFF_SIZE,
587 587 #endif
588 588 #if     COM8_EN
589 589     BSP_COM8_Tx_BUFF_SIZE,
590 590 #endif
591 591 };     
592 592 
593 593 static uint8_t * const COM_RX_BUFF[COMn] = {      
594 594 #if     COM1_EN
595 595     COM1_RX_BUFF,
596 596 #endif
597 597 #if     COM2_EN
598 598     COM2_RX_BUFF,
599 599 #endif
600 600 #if     COM3_EN
601 601     COM3_RX_BUFF,
602 602 #endif
603 603 #if     COM4_EN
604 604     COM4_RX_BUFF,
605 605 #endif
606 606 #if     COM5_EN
607 607     COM5_RX_BUFF,
608 608 #endif
609 609 #if     COM6_EN
610 610     COM6_RX_BUFF,
611 611 #endif
612 612 #if     COM7_EN
613 613     COM7_RX_BUFF,
614 614 #endif
615 615 #if     COM8_EN
616 616     COM8_RX_BUFF,
617 617 #endif
618 618 };
619 619                                                 
620 620 static const uint32_t COM_RX_BUFF_SIZE[COMn] = {  
621 621 #if     COM1_EN
622 622     BSP_COM1_Rx_BUFF_SIZE,
623 623 #endif
624 624 #if     COM2_EN
625 625     BSP_COM2_Rx_BUFF_SIZE,
626 626 #endif
627 627 #if     COM3_EN
628 628     BSP_COM3_Rx_BUFF_SIZE,
629 629 #endif
630 630 #if     COM4_EN
631 631     BSP_COM4_Rx_BUFF_SIZE,
632 632 #endif
633 633 #if     COM5_EN
634 634     BSP_COM5_Rx_BUFF_SIZE,
635 635 #endif
636 636 #if     COM6_EN
637 637     BSP_COM6_Rx_BUFF_SIZE,
638 638 #endif
639 639 #if     COM7_EN
640 640     BSP_COM7_Rx_BUFF_SIZE,
641 641 #endif
642 642 #if     COM8_EN
643 643     BSP_COM8_Rx_BUFF_SIZE,
644 644 #endif
645 645 };     
646 646 
647 647 static QUEUE8_TYPE * const COM_RX_QUEUE[COMn] = {    
648 648 #if     COM1_EN
649 649     &COM1_RX_QUEUE,
650 650 #endif
651 651 #if     COM2_EN
652 652     &COM2_RX_QUEUE,
653 653 #endif
654 654 #if     COM3_EN
655 655     &COM3_RX_QUEUE,
656 656 #endif
657 657 #if     COM4_EN
658 658     &COM4_RX_QUEUE,
659 659 #endif
660 660 #if     COM5_EN
661 661     &COM5_RX_QUEUE,
662 662 #endif
663 663 #if     COM6_EN
664 664     &COM6_RX_QUEUE,
665 665 #endif
666 666 #if     COM7_EN
667 667     &COM7_RX_QUEUE,
668 668 #endif
669 669 #if     COM8_EN
670 670     &COM8_RX_QUEUE,
671 671 #endif
672 672 };
673 673 
674 674 static const uint16_t parityArr[3] = {USART_Parity_No, USART_Parity_Odd, USART_Parity_Even};
675 675 
676 676 /*******************************************************************************
677 677 * Function Name :BSP_Uart1Open
678 678 * Description   :串口及引脚初始化
679 679 * Input         :   uartx: COM1,COM2,COM3....
680 680                     baud: 2400,4800,9600,19200,38400,57600,115200
681 681                     data: 数据位数  8,9,
682 682                     stop:停止位数  1,2
683 683                     parity:效验    0: 无效验,1:奇效验,2:偶效验
684 684 * Output        :
685 685 * Other         :
686 686 * Date          :2013.08.12
687 687 *******************************************************************************/
688 688 void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity)
689 689 {
690 690     USART_InitTypeDef USART_InitStructure;
691 691     GPIO_InitTypeDef GPIO_InitStructure;
692 692     NVIC_InitTypeDef NvicInitdef;
693 693     DMA_InitTypeDef DMA_InitStructure;
694 694     
695 695     /* DMA clock enable */
696 696     RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);
697 697 
698 698     /* Enable GPIO clock */
699 699     RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE);
700 700 
701 701     /* Enable UART clock */
702 702     if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
703 703     {
704 704         RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE); 
705 705     }
706 706     else
707 707     {
708 708         RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
709 709     }
710 710     USART_DeInit(COM_USART[COM]);
711 711     
712 712     /* Connect PXx to USARTx_Tx*/
713 713     GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_AF_PIN[COM], COM_AF[COM]);
714 714     /* Connect PXx to USARTx_Rx*/
715 715     GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_AF_PIN[COM], COM_AF[COM]);
716 716 
717 717     /* Configure USART Tx as alternate function push-pull */
718 718     GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
719 719     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
720 720     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
721 721     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
722 722     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
723 723     GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
724 724 
725 725     /* Configure USART Rx as input floating */
726 726     GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
727 727     GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
728 728 
729 729     /* USART configuration */
730 730     USART_StructInit(&USART_InitStructure);
731 731     USART_InitStructure.USART_BaudRate = baud;
732 732     USART_InitStructure.USART_StopBits = (stop == 2)? USART_StopBits_2 : USART_StopBits_1;
733 733     USART_InitStructure.USART_WordLength = (data =http://www.mamicode.com/= 9)? USART_WordLength_9b : USART_WordLength_8b;
734 734     USART_InitStructure.USART_Parity = (parity < 3)? parityArr[parity] : USART_Parity_No;
735 735     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
736 736     USART_Init(COM_USART[COM], &USART_InitStructure);
737 737     
738 738     /* Enable USART DMA_TX*/
739 739     USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, ENABLE);
740 740     
741 741     USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE);
742 742     
743 743      /* Enable USART */
744 744     USART_Cmd(COM_USART[COM], ENABLE);   
745 745 
746 746     NvicInitdef.NVIC_IRQChannel = COM_RX_IRQn[COM];
747 747     NvicInitdef.NVIC_IRQChannelPreemptionPriority = 3;
748 748     NvicInitdef.NVIC_IRQChannelSubPriority = 0;
749 749     NvicInitdef.NVIC_IRQChannelCmd = ENABLE;
750 750     NVIC_Init( &NvicInitdef );
751 751 
752 752     QUEUE_PacketCreate(COM_RX_QUEUE[COM], COM_RX_BUFF[COM], COM_RX_BUFF_SIZE[COM]);
753 753     /* -------------------------------DMA发送------------------------------  */
754 754     /* DMA StreamX Config */
755 755     DMA_DeInit(COM_DMA_TX_STREAM[COM]);    
756 756     
757 757     /* DMA StreamX disable */
758 758     DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
759 759 
760 760     DMA_StructInit(&DMA_InitStructure);
761 761     DMA_InitStructure.DMA_Channel = COM_DMA_TX_CHANNEL[COM];
762 762     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)COM_DMA_DR_BASE[COM];
763 763     DMA_InitStructure.DMA_Memory0BaseAddr = (u32)COM_TX_BUFF[COM];
764 764     DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
765 765     DMA_InitStructure.DMA_BufferSize = 0;
766 766     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
767 767     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
768 768     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
769 769     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
770 770     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
771 771     DMA_InitStructure.DMA_Priority = DMA_Priority_High;
772 772     DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
773 773     DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
774 774     DMA_Init(COM_DMA_TX_STREAM[COM], &DMA_InitStructure);
775 775 
776 776     DMA_FlowControllerConfig(COM_DMA_TX_STREAM[COM], DMA_FlowCtrl_Memory);    //控制流 取决于缓存大小
777 777 }
778 778 
779 779 
780 780 /*******************************************************************************
781 781 * Function Name : void BSP_UartClose(uint8_t COMx)
782 782 * Description   : 串口关闭
783 783 * Input         : COMx:通道x
784 784 * Output        : 
785 785 * Other         : 
786 786 * Date          : 2013.08.12
787 787 *******************************************************************************/
788 788 void BSP_UartClose(uint8_t COM)
789 789 {
790 790     if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
791 791     {
792 792         RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], DISABLE); 
793 793     }
794 794     else
795 795     {
796 796         RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
797 797     }
798 798     
799 799     RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);
800 800     DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
801 801     USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, DISABLE);
802 802     USART_ITConfig(COM_USART[COM], USART_IT_RXNE, DISABLE);
803 803     USART_Cmd(COM_USART[COM], DISABLE);
804 804 }
805 805 
806 806 /*******************************************************************************
807 807 * Function Name : uint32_t BSP_UartWrite(uint8_t COMx, uint8_t *buffter, uint32_t len)
808 808 * Description   : 串口发送数据
809 809 * Input         :   COMx:通道x
810 810 * Output        : 
811 811 * Other         : 
812 812 * Date          : 2013.08.12
813 813 *******************************************************************************/
814 814 uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len)
815 815 {
816 816     if (COM >= COMn)
817 817         return 0;
818 818         
819 819     if (0 == len)
820 820         return 0;
821 821         
822 822     if ((DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM]) == 0)
823 823         && (DMA_FIFOStatus_Empty == DMA_GetFIFOStatus(COM_DMA_TX_STREAM[COM])))
824 824     {
825 825         uint32_t resLen = 0;
826 826         
827 827         resLen = (COM_TX_BUFF_SIZE[COM] > len)? len : COM_TX_BUFF_SIZE[COM];
828 828         memcpy((void *)(COM_TX_BUFF[COM]), buffter, resLen);       
829 829         DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
830 830         DMA_ClearFlag(COM_DMA_TX_STREAM[COM], COM_DMA_TX_FLAG[COM]);
831 831         DMA_SetCurrDataCounter(COM_DMA_TX_STREAM[COM], resLen);                
832 832         DMA_Cmd(COM_DMA_TX_STREAM[COM], ENABLE);
833 833 
834 834         return resLen;
835 835     }
836 836     return 0;
837 837 }
838 838 
839 839 /*******************************************************************************
840 840 * Function Name : uint32_t BSP_UartRead(uint8_t COMx, uint8_t *buffter, uint32_t len)
841 841 * Description   : 串口读回数据
842 842 * Input         : COMx:通道x
843 843 * Output        : 
844 844 * Other         : 
845 845 * Date          : 2013.08.12
846 846 *******************************************************************************/
847 847 uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len)
848 848 {
849 849     return QUEUE_PacketOut(COM_RX_QUEUE[COM], buffter, len);
850 850 }
851 851 
852 852 /*******************************************************************************
853 853 * Function Name : uint32_t BSP_UartTxIdleState(uint8_t COM)
854 854 * Description   : 查询 发送是否 发送完成
855 855 * Input         : 
856 856 * Output        :       1)忙碌      0)空闲
857 857 * Other         : 
858 858 * Date          : 2013.08.12
859 859 *******************************************************************************/
860 860 uint32_t BSP_UartTxIdleState(uint8_t COM)
861 861 {
862 862     return (DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM])
863 863             || (USART_GetFlagStatus(COM_USART[COM], USART_FLAG_TC) != SET));
864 864 }
865 865 
866 866 
867 867 /*******************************************************************************
868 868 * Function Name : void _IRQHandler(uint8_t COM)
869 869 * Description   : 中断函数
870 870 * Input         : 
871 871 * Output        : 
872 872 * Other         : 
873 873 * Date          : 2013.08.12
874 874 *******************************************************************************/
875 875 void _IRQHandler(uint8_t COM)
876 876 {
877 877     if (USART_GetITStatus(COM_USART[COM], USART_IT_RXNE) != RESET)
878 878     {
879 879         u8 ch = USART_ReceiveData(COM_USART[COM]);  //读数据后 会自动清空标志
880 880         QUEUE_PacketIn(COM_RX_QUEUE[COM], &ch, 1);
881 881     }
882 882 }
883 883 
884 884 #if COM1_EN > 0
885 885 /*******************************************************************************
886 886 * Function Name  : USART1_IRQHandler
887 887 * Description    : This function handles USART1 global interrupt request.
888 888 * Input          : None
889 889 * Output         : None
890 890 * Return         : None
891 891 *******************************************************************************/
892 892 void USART1_IRQHandler(void)
893 893 {
894 894     _IRQHandler(COM1);
895 895 }
896 896 #endif //COM1_EN > 0
897 897 
898 898 #if COM2_EN > 0
899 899 /*******************************************************************************
900 900 * Function Name  : USART2_IRQHandler
901 901 * Description    : This function handles USART2 global interrupt request.
902 902 * Input          : None
903 903 * Output         : None
904 904 * Return         : None
905 905 *******************************************************************************/
906 906 void USART2_IRQHandler(void)
907 907 {
908 908     _IRQHandler(COM2);
909 909 }
910 910 #endif //COM2_EN > 0
911 911 
912 912 #if COM3_EN > 0
913 913 /*******************************************************************************
914 914 * Function Name  : USART3_IRQHandler
915 915 * Description    : This function handles USART3 global interrupt request.
916 916 * Input          : None
917 917 * Output         : None
918 918 * Return         : None
919 919 *******************************************************************************/
920 920 void USART3_IRQHandler(void)
921 921 {
922 922     _IRQHandler(COM3);
923 923 }
924 924 #endif //COM3_EN > 0
925 925 
926 926 #if COM4_EN > 0
927 927 /*******************************************************************************
928 928 * Function Name  : USART4_IRQHandler
929 929 * Description    : This function handles USART4 global interrupt request.
930 930 * Input          : None
931 931 * Output         : None
932 932 * Return         : None
933 933 *******************************************************************************/
934 934 void UART4_IRQHandler(void)
935 935 {
936 936     _IRQHandler(COM4);
937 937 }
938 938 #endif //COM4_EN > 0
939 939 
940 940 #if COM5_EN > 0
941 941 /*******************************************************************************
942 942 * Function Name  : USART5_IRQHandler
943 943 * Description    : This function handles USART5 global interrupt request.
944 944 * Input          : None
945 945 * Output         : None
946 946 * Return         : None
947 947 *******************************************************************************/
948 948 void UART5_IRQHandler(void)
949 949 {
950 950     _IRQHandler(COM5);
951 951 }
952 952 #endif //COM5_EN > 0
953 953 
954 954 #if COM6_EN > 0
955 955 /*******************************************************************************
956 956 * Function Name  : USART6_IRQHandler
957 957 * Description    : This function handles USART6 global interrupt request.
958 958 * Input          : None
959 959 * Output         : None
960 960 * Return         : None
961 961 *******************************************************************************/
962 962 void USART6_IRQHandler(void)
963 963 {
964 964     _IRQHandler(COM6);
965 965 }
966 966 #endif //COM6_EN > 0
967 967 
968 968 #if COM7_EN > 0
969 969 /*******************************************************************************
970 970 * Function Name  : USART7_IRQHandler
971 971 * Description    : This function handles USART7 global interrupt request.
972 972 * Input          : None
973 973 * Output         : None
974 974 * Return         : None
975 975 *******************************************************************************/
976 976 void UART7_IRQHandler(void)
977 977 {
978 978     _IRQHandler(COM7);
979 979 }
980 980 #endif //COM7_EN > 0
981 981 
982 982 #if COM8_EN > 0
983 983 /*******************************************************************************
984 984 * Function Name  : USART8_IRQHandler
985 985 * Description    : This function handles USART8 global interrupt request.
986 986 * Input          : None
987 987 * Output         : None
988 988 * Return         : None
989 989 *******************************************************************************/
990 990 void UART8_IRQHandler(void)
991 991 {
992 992     _IRQHandler(COM8);
993 993 }
994 994 #endif //COM8_EN > 0
BSP_Uart.c
  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  * @brief 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
BSP_Uart.h
  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 flg = 1;
359 359 
360 360     while (flg);
361 361 }
Queue.c
 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
Queue.h