Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

637 řádky
18 KiB

  1. #include "../inc/system.h"
  2. #include "./USART.h"
  3. //////////////////////////////////////////////////////////////////
  4. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
  5. #if 1
  6. #pragma import(__use_no_semihosting)
  7. //标准库需要的支持函数
  8. struct __FILE
  9. {
  10. int handle;
  11. };
  12. FILE __stdout;
  13. //定义_sys_exit()以避免使用半主机模式
  14. void _sys_exit(int x)
  15. {
  16. x = x;
  17. }
  18. //重定义fputc函数
  19. int fputc(int ch, FILE *f)
  20. {
  21. while((USART1->SR&0X80)==0);//循环发送,直到发送完毕
  22. USART1->DR = (u8) ch;
  23. return ch;
  24. }
  25. #endif
  26. #ifndef USE_STM32F103_Cxxx
  27. define USE_STM32F103_Cxxx 1 //默认使用STM32F103Cxxxx三个串口
  28. #endif
  29. #define Send_Buffer 1024 //设置发送缓冲区最大长度
  30. #define Receive_Queue_Max_Length 1030 //设置接收队列缓冲区最大长度
  31. #define Receive_Queue_ItemSize 1 //设置接收队列缓冲区单个数据大小
  32. static uint8_t Receive_Queue_Buffer[Receive_Queue_Max_Length]; //设置接收队列缓冲区
  33. static uint16_t Receive_Queue_Buffer_Count = 0;
  34. static void *Receive_Queue[Receive_Queue_Max_Length];
  35. /* 串口私有数据结构体类型 */
  36. typedef struct USART_PRIV_DATA {
  37. USART_TypeDef *USARTx; //串口号
  38. OS_EVENT *xSemphr_Send; //发送完成信号量句柄
  39. OS_EVENT *xSemphr_Receive; //接收数据帧信号量句柄
  40. OS_EVENT *xQueue_Receive; //接收队列句柄
  41. char SendBuffer[Send_Buffer]; //发送缓冲区
  42. char *pSendBuffer; //指向发送缓冲区指针
  43. } usart_priv_obj_t;
  44. /* 串口相关操作函数声明 */
  45. static int usart_init(usart_obj_t *pDev, uint32_t BaudRate, uint16_t DataBit, float StopBit, uint16_t Parity);
  46. static void usart_deinit(usart_obj_t *pDev);
  47. static void usart_send(usart_obj_t *pDev, uint8_t *data, uint16_t dataLenght);
  48. static int usart_print(usart_obj_t *pDev, INT32U timeout_ms, char *format, ...);
  49. static int usart_receive(usart_obj_t *pDev, uint8_t *data, uint16_t data_len, uint16_t *rec_br, INT32U timeout_ms);
  50. static uint32_t usart_wait_message_count(usart_obj_t *pDev);
  51. static void usart_irq_handle(usart_obj_t *pDev);
  52. /* 串口1私有数据 */
  53. static usart_priv_obj_t g_usart1_priv_data = {
  54. USART1,
  55. };
  56. /* 串口1结构体对象 */
  57. static usart_obj_t g_usart1 = {
  58. "usart1",
  59. usart_init,
  60. usart_deinit,
  61. usart_send,
  62. usart_print,
  63. usart_receive,
  64. usart_wait_message_count,
  65. &g_usart1_priv_data
  66. };
  67. /* 串口2私有数据 */
  68. static usart_priv_obj_t g_usart2_priv_data = {
  69. USART2,
  70. };
  71. /* 串口2结构体对象 */
  72. static usart_obj_t g_usart2 = {
  73. "usart2",
  74. usart_init,
  75. usart_deinit,
  76. usart_send,
  77. usart_print,
  78. usart_receive,
  79. usart_wait_message_count,
  80. &g_usart2_priv_data
  81. };
  82. /* 串口3私有数据 */
  83. static usart_priv_obj_t g_usart3_priv_data = {
  84. USART3,
  85. };
  86. /* 串口3结构体对象 */
  87. static usart_obj_t g_usart3 = {
  88. "usart3",
  89. usart_init,
  90. usart_deinit,
  91. usart_send,
  92. usart_print,
  93. usart_receive,
  94. usart_wait_message_count,
  95. &g_usart3_priv_data
  96. };
  97. #if (USE_STM32F103_Cxxx != 1)
  98. /* 串口4私有数据 */
  99. static usart_priv_obj_t g_usart4_priv_data = {
  100. UART4,
  101. };
  102. /* 串口4结构体对象 */
  103. static usart_obj_t g_uart4 = {
  104. "usart4",
  105. usart_init,
  106. usart_deinit,
  107. usart_send,
  108. usart_print,
  109. usart_receive,
  110. usart_wait_message_count,
  111. &g_usart4_priv_data
  112. };
  113. /* 串口5私有数据 */
  114. static usart_priv_obj_t g_usart5_priv_data = {
  115. UART5,
  116. };
  117. /* 串口5结构体对象 */
  118. static usart_obj_t g_uart5 = {
  119. "uart5",
  120. usart_init,
  121. usart_deinit,
  122. usart_send,
  123. usart_print,
  124. usart_receive,
  125. usart_wait_message_count,
  126. &g_usart5_priv_data
  127. };
  128. #endif
  129. /* 串口设备列表 */
  130. static usart_obj_t *g_usart_devs[] = {
  131. &g_usart1,
  132. &g_usart2,
  133. &g_usart3,
  134. #if(USE_STM32F103_Cxxx != 1)
  135. &g_uart4,
  136. &g_uart5,
  137. #endif
  138. };
  139. static void USART_DMA_Config(void);
  140. /*
  141. *@函数名:usart_init
  142. *@函数功能:初始化指定串口
  143. *@参数:
  144. * @pDev:指定串口句柄
  145. * @BautRate:串口波特率
  146. * value:9600、 14400、 19200、 38400、 115200、 256000、 921600
  147. * @DataBit:串口数据位
  148. * value:8、 9
  149. * @StopBit:串口停止位
  150. * value:0.5、 1、 1.5、 2
  151. * @Parity:串口校验位
  152. * value:0:无校验、 1:奇校验、 2:偶校验
  153. *@返回值
  154. * 0:串口初始化成功
  155. * -1:串口初始化失败
  156. */
  157. static int usart_init(usart_obj_t *pDev, uint32_t BaudRate, uint16_t DataBit, float StopBit, uint16_t Parity)
  158. {
  159. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  160. /* 创建串口发送信号量和接收队列 */
  161. usart_priv_obj->xQueue_Receive = OSQCreate(Receive_Queue,
  162. Receive_Queue_Max_Length);
  163. if (usart_priv_obj->xQueue_Receive == NULL)
  164. {
  165. printf("usart init fail %s %d\r\n", __FILE__, __LINE__);
  166. }
  167. usart_priv_obj->xSemphr_Send = OSSemCreate(0);
  168. if (usart_priv_obj->xSemphr_Send == NULL)
  169. {
  170. printf("usart init fail %s %d\r\n", __FILE__, __LINE__);
  171. }
  172. usart_priv_obj->xSemphr_Receive = OSSemCreate(0);
  173. if (usart_priv_obj->xSemphr_Receive == NULL)
  174. {
  175. printf("usart init fail %s %d\r\n", __FILE__, __LINE__);
  176. }
  177. /* 初始化不同串口不同的参数部分 */
  178. uint32_t RCC_APBxPeriph_UARTx = NULL;
  179. uint32_t RCC_AHB1Periph_GPIOx = NULL;
  180. GPIO_TypeDef *GPIOx = NULL;
  181. uint16_t GPIO_PinSource_Tx;
  182. uint16_t GPIO_PinSource_Rx;
  183. uint8_t AF_Type;
  184. GPIO_InitTypeDef GPIO_InitStructure_Tx;
  185. GPIO_InitTypeDef GPIO_InitStructure_Rx;
  186. USART_InitTypeDef USART_InitStructure;
  187. NVIC_InitTypeDef NVIC_InitStructure;
  188. if(USART1 == usart_priv_obj->USARTx)
  189. {
  190. RCC_APBxPeriph_UARTx = RCC_APB2Periph_USART1;
  191. RCC_AHB1Periph_GPIOx = RCC_AHB1Periph_GPIOA;
  192. GPIOx = GPIOA;
  193. GPIO_PinSource_Tx = GPIO_PinSource9;
  194. GPIO_PinSource_Rx = GPIO_PinSource10;
  195. AF_Type = GPIO_AF_USART1;
  196. GPIO_InitStructure_Tx.GPIO_Pin = GPIO_Pin_9;
  197. GPIO_InitStructure_Rx.GPIO_Pin = GPIO_Pin_10;
  198. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  199. }
  200. else if(USART2 == usart_priv_obj->USARTx)
  201. {
  202. RCC_APBxPeriph_UARTx = RCC_APB1Periph_USART2;
  203. RCC_AHB1Periph_GPIOx = RCC_AHB1Periph_GPIOA;
  204. GPIOx = GPIOA;
  205. GPIO_PinSource_Tx = GPIO_PinSource2;
  206. GPIO_PinSource_Rx = GPIO_PinSource3;
  207. AF_Type = GPIO_AF_USART2;
  208. GPIO_InitStructure_Tx.GPIO_Pin = GPIO_Pin_2;
  209. GPIO_InitStructure_Rx.GPIO_Pin = GPIO_Pin_3;
  210. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  211. }
  212. else if(USART3 == usart_priv_obj->USARTx)
  213. {
  214. RCC_APBxPeriph_UARTx = RCC_APB1Periph_USART3;
  215. RCC_AHB1Periph_GPIOx = RCC_AHB1Periph_GPIOB;
  216. GPIOx = GPIOB;
  217. GPIO_PinSource_Tx = GPIO_PinSource10;
  218. GPIO_PinSource_Rx = GPIO_PinSource11;
  219. AF_Type = GPIO_AF_USART3;
  220. GPIO_InitStructure_Tx.GPIO_Pin = GPIO_Pin_10;
  221. GPIO_InitStructure_Rx.GPIO_Pin = GPIO_Pin_11;
  222. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  223. }
  224. /* else if (UART4 == usart_priv_obj->USARTx)
  225. {
  226. }*/
  227. // else{}
  228. /* 初始化串口数据位、停止位、校验位 */
  229. switch(DataBit)
  230. {
  231. case 8:USART_InitStructure.USART_WordLength = USART_WordLength_8b; break;
  232. case 9:USART_InitStructure.USART_WordLength = USART_WordLength_9b; break;
  233. default:return -1;
  234. }
  235. if(0.5f == StopBit)
  236. USART_InitStructure.USART_StopBits = USART_StopBits_0_5;
  237. else if(1.0f == StopBit)
  238. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  239. else if(1.5f == StopBit)
  240. USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
  241. else if(2.0f == StopBit)
  242. USART_InitStructure.USART_StopBits = USART_StopBits_2;
  243. else
  244. return -1;
  245. switch(Parity)
  246. {
  247. case 0:USART_InitStructure.USART_Parity = USART_Parity_No; break;
  248. case 1:USART_InitStructure.USART_Parity = USART_Parity_Odd; break;
  249. case 2:USART_InitStructure.USART_Parity = USART_Parity_Even; break;
  250. default:return -1;
  251. }
  252. /* 初始化串口时钟、GPIO、NVIC */
  253. if(USART1 == usart_priv_obj->USARTx)
  254. RCC_APB2PeriphClockCmd(RCC_APBxPeriph_UARTx, ENABLE);
  255. else
  256. RCC_APB1PeriphClockCmd(RCC_APBxPeriph_UARTx, ENABLE);
  257. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
  258. GPIO_PinAFConfig(GPIOx, GPIO_PinSource_Tx, AF_Type);
  259. GPIO_PinAFConfig(GPIOx, GPIO_PinSource_Rx, AF_Type);
  260. GPIO_InitStructure_Tx.GPIO_Mode = GPIO_Mode_AF;
  261. GPIO_InitStructure_Tx.GPIO_OType = GPIO_OType_PP;
  262. GPIO_InitStructure_Rx.GPIO_PuPd = GPIO_PuPd_UP;
  263. GPIO_InitStructure_Tx.GPIO_Speed = GPIO_Speed_100MHz;
  264. GPIO_Init(GPIOx, &GPIO_InitStructure_Tx);
  265. GPIO_InitStructure_Rx.GPIO_Mode = GPIO_Mode_AF;
  266. GPIO_InitStructure_Rx.GPIO_OType = GPIO_OType_PP;
  267. GPIO_InitStructure_Rx.GPIO_PuPd = GPIO_PuPd_UP;
  268. GPIO_InitStructure_Rx.GPIO_Speed = GPIO_Speed_100MHz;
  269. GPIO_Init(GPIOx, &GPIO_InitStructure_Rx);
  270. USART_InitStructure.USART_BaudRate = BaudRate;
  271. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  272. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  273. USART_Init(usart_priv_obj->USARTx, &USART_InitStructure);
  274. USART_DMA_Config();
  275. USART_ClearITPendingBit(usart_priv_obj->USARTx, USART_IT_TC);//清除传输完成
  276. USART_ITConfig(usart_priv_obj->USARTx, USART_IT_TC, ENABLE);
  277. USART_ITConfig(usart_priv_obj->USARTx, USART_IT_IDLE, ENABLE);
  278. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  279. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
  280. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  281. NVIC_Init(&NVIC_InitStructure);
  282. USART_Cmd(usart_priv_obj->USARTx, ENABLE);
  283. return 0;
  284. }
  285. /*
  286. *@函数名:usart_deinit
  287. *@函数功能:重置指定串口
  288. *@参数:
  289. * @pDev:指定串口句柄
  290. *@返回值:无
  291. */
  292. static void usart_deinit(usart_obj_t *pDev)
  293. {
  294. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  295. USART_DeInit(usart_priv_obj->USARTx);
  296. }
  297. /*
  298. *@函数名:usart_print
  299. *@函数功能:串口格式化发送数据
  300. *@参数:
  301. * @pDev:指定串口句柄
  302. * @timeout_ms:等待超时时间
  303. * 参数值:0~portMAX_DELAY;
  304. * @format:待发送字符串
  305. * @...:可变参数
  306. *@返回值
  307. * 0:串口发送成功
  308. * -1:串口发送失败
  309. */
  310. static int usart_print(usart_obj_t *pDev, INT32U timeout_ms, char *format, ...)
  311. {
  312. OS_ERR err;
  313. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  314. /* 格式化字符串复制到缓冲区 */
  315. va_list arg;
  316. va_start(arg, format);
  317. vsprintf(usart_priv_obj->SendBuffer, format, arg);
  318. va_end(arg);
  319. usart_priv_obj->pSendBuffer = usart_priv_obj->SendBuffer;
  320. /* 开启发送中断,在中断中发送数据 */
  321. USART_ITConfig(usart_priv_obj->USARTx, USART_IT_TXE, ENABLE);
  322. /* 等待中断发送完成释放信号量 */
  323. OSSemPend(usart_priv_obj->xSemphr_Send, timeout_ms, &err);
  324. if (err != OS_ERR_NONE)
  325. {
  326. return 0;
  327. }
  328. else
  329. {
  330. return -1;
  331. }
  332. }
  333. /*
  334. *@函数名:usart_send
  335. *@函数功能:串口发送数据
  336. *@参数:
  337. * @pDev:指定串口句柄
  338. * @data:待发送数据
  339. *@返回值
  340. * 0:串口发送成功
  341. * -1:串口发送失败
  342. */
  343. static void usart_send(usart_obj_t *pDev, uint8_t *data, uint16_t dataLenght)
  344. {
  345. OS_ERR err;
  346. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  347. OSSemPend(usart_priv_obj->xSemphr_Send, 0, &err);
  348. DMA_Cmd(USART_TX_DMA_STREAM, DISABLE);
  349. USART_TX_DMA_STREAM->M0AR = (uint32_t)data;
  350. DMA_SetCurrDataCounter(USART_TX_DMA_STREAM, dataLenght);//设置需要发送的量
  351. DMA_Cmd(USART_TX_DMA_STREAM, ENABLE);
  352. }
  353. /*
  354. *@函数名:usart_receive
  355. *@函数功能:从串口接收队列中读取一个数据
  356. *@参数:
  357. * @pDev:指定串口句柄
  358. * @data:保存接收到的数据
  359. * @timeout_ms:等待超时时间
  360. * 参数值:0~portMAX_DELAY;
  361. *@返回值
  362. * 0:读取串口队列成功
  363. * -1:读取串口超时
  364. */
  365. static int usart_receive(struct USART *pDev, uint8_t *data, uint16_t data_len, uint16_t *rec_br, INT32U timeout_ms)
  366. {
  367. OS_ERR err;
  368. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  369. /* 读取串口接收队列 */
  370. OSSemPend(usart_priv_obj->xSemphr_Receive, timeout_ms, &err);
  371. if (err == OS_ERR_NONE)
  372. {
  373. *rec_br = Receive_Queue_Buffer_Count;
  374. Receive_Queue_Buffer_Count = 0;
  375. if(data_len > *rec_br)
  376. {
  377. data_len = (*rec_br);
  378. }
  379. memcpy(data, Receive_Queue_Buffer, data_len);
  380. return 0;
  381. }
  382. else
  383. {
  384. return -1;
  385. }
  386. }
  387. /*
  388. *@函数名:usart_wait_message_count
  389. *@函数功能:获取串口接收队列剩余数据量
  390. *@参数:
  391. * @pDev:指定串口句柄
  392. *@返回值:串口接收队列剩余数据量
  393. */
  394. static uint32_t usart_wait_message_count(usart_obj_t *pDev)
  395. {
  396. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  397. return ((OS_Q *)(usart_priv_obj->xQueue_Receive->OSEventPtr))->OSQEntries;
  398. }
  399. /*
  400. *@函数名:usart_irq_handle
  401. *@函数功能:处理串口发送和接收中断
  402. *@参数:
  403. * @pDev:待处理中断的串口句柄
  404. *@返回值:无
  405. */
  406. //UBaseType_t semaphore;
  407. static void usart_irq_handle(usart_obj_t *pDev)
  408. {
  409. OS_CPU_SR cpu_sr;
  410. OS_ENTER_CRITICAL();
  411. OSIntEnter(); /* Tell uC/OS-III that we are starting an ISR */
  412. OS_EXIT_CRITICAL();
  413. usart_priv_obj_t *usart_priv_obj = pDev->usart_priv_data;
  414. /* 发送寄存器为空,填入数据到发送寄存器开始发送 */
  415. if(SET == USART_GetITStatus(usart_priv_obj->USARTx, USART_IT_TC))
  416. {
  417. OSSemPost(usart_priv_obj->xSemphr_Send);
  418. DMA_ClearFlag(USART_TX_DMA_STREAM, DMA_FLAG_TCIF7); //清除DMA传输完成标志
  419. DMA_ClearFlag(USART_TX_DMA_STREAM, DMA_FLAG_HTIF7); //清除DMA传输完成标志
  420. USART_ClearITPendingBit(usart_priv_obj->USARTx, USART_IT_TC); //清除传输完成
  421. }
  422. /* 空闲中断接收到完整的数据帧 */
  423. if(SET == USART_GetITStatus(usart_priv_obj->USARTx, USART_IT_IDLE))
  424. {
  425. OSSemPost(usart_priv_obj->xSemphr_Receive);
  426. /* 清除计数器和空闲中断标志位 */
  427. USART_GetITStatus(usart_priv_obj->USARTx, USART_IT_IDLE);
  428. USART_ReceiveData(usart_priv_obj->USARTx);
  429. Receive_Queue_Buffer_Count = Receive_Queue_Max_Length
  430. - DMA_GetCurrDataCounter(USART_RX_DMA_STREAM);
  431. DMA_ClearFlag(USART_RX_DMA_STREAM, DMA_FLAG_TCIF5); //清除DMA传输完成标志
  432. DMA_ClearFlag(USART_RX_DMA_STREAM, DMA_FLAG_HTIF5); //清除DMA传输完成标志
  433. DMA_Cmd(USART_RX_DMA_STREAM, DISABLE);
  434. DMA_SetCurrDataCounter(USART_RX_DMA_STREAM, Receive_Queue_Max_Length);//设置需要接收的量
  435. DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);
  436. }
  437. OSIntExit();
  438. }
  439. /*
  440. *@函数名:USART1_IRQHandler
  441. *@函数功能:处理串口1发送和接收中断
  442. *@参数:无
  443. *@返回值:无
  444. */
  445. void USART1_IRQHandler(void)
  446. {
  447. usart_irq_handle(&g_usart1);
  448. }
  449. /*
  450. *@函数名:USART2_IRQHandler
  451. *@函数功能:处理串口2发送和接收中断
  452. *@参数:无
  453. *@返回值:无
  454. */
  455. void USART2_IRQHandler(void)
  456. {
  457. usart_irq_handle(&g_usart2);
  458. }
  459. /*
  460. *@函数名:USART3_IRQHandler
  461. *@函数功能:处理串口3发送和接收中断
  462. *@参数:无
  463. *@返回值:无
  464. */
  465. void USART3_IRQHandler(void)
  466. {
  467. usart_irq_handle(&g_usart3);
  468. }
  469. #if (USE_STM32F103_Cxxx != 1)
  470. /*
  471. *@函数名:UART4_IRQHandler
  472. *@函数功能:处理串口4发送和接收中断
  473. *@参数:无
  474. *@返回值:无
  475. */
  476. void UART4_IRQHandler(void)
  477. {
  478. usart_irq_handle(&g_uart4);
  479. }
  480. /*
  481. *@函数名:UART5_IRQHandler
  482. *@函数功能:处理串口5发送和接收中断
  483. *@参数:无
  484. *@返回值:无
  485. */
  486. void UART5_IRQHandler(void)
  487. {
  488. usart_irq_handle(&g_uart5);
  489. }
  490. #endif
  491. /*
  492. *@函数名:Get_USART_Handle
  493. *@函数功能:获取指定串口句柄
  494. *@参数:
  495. * @name:串口名称
  496. *@返回值:串口句柄
  497. */
  498. usart_obj_t *get_usart_obj(char *name) {
  499. uint8_t usart_dev_num = sizeof(g_usart_devs) / sizeof(g_usart_devs[0]);
  500. for(uint8_t i = 0; i < usart_dev_num; i++)
  501. {
  502. if(0 == strcmp(name, g_usart_devs[i]->name))
  503. {
  504. return g_usart_devs[i];
  505. }
  506. }
  507. return NULL;
  508. }
  509. static void USART_DMA_Config(void)
  510. {
  511. DMA_InitTypeDef DMA_InitStructure;
  512. RCC_AHB1PeriphClockCmd(USART_TX_DMA_CLK | USART_RX_DMA_CLK, ENABLE);//使能DMA2时钟
  513. /* 配置发送 */
  514. DMA_InitStructure.DMA_BufferSize = 0;//随便配置,因为在接收到数据后我们会重新给这值赋值
  515. DMA_InitStructure.DMA_Channel = USART_TX_DMA_CHANNEL;//串口发送通道
  516. DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//DMA搬运方向:存储器到外设
  517. DMA_InitStructure.DMA_Memory0BaseAddr = 0;//存储器地址
  518. DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发模式选择:单次模式
  519. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据宽度:字节
  520. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//使能存储器地址自动递增功能
  521. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA 传输模式选择:一次传输
  522. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//外设地址
  523. DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发模式选择:单次模式
  524. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据宽度:字节
  525. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//禁止外设地址自动递增功能
  526. DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//软件设置数据流的优先级:中等
  527. /* FIFO不用随便配置 */
  528. DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  529. DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  530. DMA_Init(USART_TX_DMA_STREAM, &DMA_InitStructure);
  531. DMA_Cmd(USART_TX_DMA_STREAM, DISABLE);//发送先失能
  532. /* 配置接收 */
  533. DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Receive_Queue_Buffer;//存储器地址
  534. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//外设地址
  535. DMA_InitStructure.DMA_BufferSize = Receive_Queue_Max_Length;//接收数据的长度
  536. DMA_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL;//串口接收通道
  537. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//DMA搬运方向:外设到存储器
  538. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA 传输模式选择:循环接收
  539. /* 其余配置与上面一样 */
  540. DMA_Init(USART_RX_DMA_STREAM, &DMA_InitStructure);
  541. DMA_ClearFlag(USART_RX_DMA_STREAM, DMA_FLAG_TCIF5); //清除DMA传输完成标志
  542. DMA_ClearFlag(USART_RX_DMA_STREAM, DMA_FLAG_HTIF5); //清除DMA传输完成标志
  543. DMA_Cmd(USART_RX_DMA_STREAM, DISABLE);//发送先失能
  544. DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);//接收使能
  545. USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
  546. USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  547. }