• 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
    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
  • 相关阅读:
    java使用递归删除非空目录
    关于Java日期的两道例题
    equals和==的区别
    从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
    输出所有的水仙花数
    99乘法表
    switch
    next()、nextInt()
    流程控制
    Scanner从键盘输入
  • 原文地址:https://www.cnblogs.com/hiker-blogs/p/3694567.html
Copyright © 2020-2023  润新知