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