之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖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 == 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
STM32F4XX高效驱动篇1-UART,码迷,mamicode.com