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