STM32串口DMA方式发送数据.doc_第1页
STM32串口DMA方式发送数据.doc_第2页
STM32串口DMA方式发送数据.doc_第3页
STM32串口DMA方式发送数据.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32 串口DMA方式接收 2011-04-02 18:13 4458人阅读 评论(5) 收藏 举报 STM32 是一款基于ARM Cortex-M3内核的32位MCU,主频最高可达72M。最近因为要在车机上集成TPMS功能, 便开始着手STM32的开发工作,STM32F10x系列共有5个串口(USART1USART5),支持DMA方式通信,DMA方式由于不需要CPU的参与,而是直接由DMA控制器完成串口数据的读写,因而可以很大程度的提高CPU的利用率。在使用STM32串口之前需要做一系列的初始化工作:1.RCC(复位和时钟控制寄存器)初始化,启用GPIO、DMA、USART时钟。2.NVIC(嵌套向量中断控制寄存器)初始化,完成各个硬件中断的配置。3.USART初始话,配置串口,设置DMA通道等。4.DMA初始化,完成DMA的配置。最后是使能USART和DMA。下面是通过DMA的方式从串口USART1接收数据,STM32工作后串口数据由DMA控制器接收存到指定buffer,读取数据直接从DMA buffer中读取即可。发送数据采用非DMA方式,首先将待发送的数据存入到发送队列,然后在任务循环中将队列中的数据发送给USART1。实例代码如下:cpp view plaincopyprint?1. /* 2. /STM32F10xUSARTTest 3. /compiler:KeilUV3 4. /2011-03-28,Byfriehood 5. /* 6. staticint8urDMABuffer64;/DMAbuffer 7. staticint16urDMARear=sizeof(rDMABuffer);8. 9. staticint8uUSART_RevBuf64;/串口接收buffer 10. staticint8uUSART_SndBuf64;/串口发送buffer 11. staticint8uHead=0,Tail=0;/发送buffer的头尾 12. 13. 14. /串口任务 15. voidTask_USART(void)16. 17. int16uend;18. if(USART1-SR&(USART_FLAG_ORE|USART_FLAG_NE|USART_FLAG_FE)19. 20. USART_ReceiveData(USART1);21. 22. 23. /DMA接收 24. end=DMA_GetCurrDataCounter(DMA1_Channel5);25. /*if(sizeof(rDMABuffer)-end)0)26. dbgprt(DMAavailabledatalen=%d/n,sizeof(rDMABuffer)-end);*/27. while(rDMARear!=end)28. 29. USART_receive(rDMABuffersizeof(rDMABuffer)-rDMARear);30. if(!(-rDMARear)31. 32. rDMARear=sizeof(rDMABuffer);33. 34. 35. 36. /发送 37. if(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=SET)38. 39. int8uchr;40. /从发送队列取出一个字符 41. if(PopFront(&chr)42. 43. USART_SendData(USART1,chr);44. dbgprt(USART_SendData:0x%02x/n,chr);45. while(USART_GetFlagStatus(USART1,USART_FLAG_TC)=RESET)46. 47. 48. 49. 50. 51. 52. 53. /USART串口初始化 54. voiddev_USART_init(void)55. 56. USART_InitTypeDefUSART_InitStructure;57. GPIO_InitTypeDefGPIO_InitStructure;58. DMA_InitTypeDefDMA_InitStructure;59. 60. /*DMA1Channel5(triggeredbyUSART1Rxevent)Config*/参见STM32datasheet 61. DMA_DeInit(DMA1_Channel5);62. DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1-DR;63. DMA_InitStructure.DMA_MemoryBaseAddr=(u32)rDMABuffer;64. DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;65. DMA_InitStructure.DMA_BufferSize=sizeof(rDMABuffer);66. DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;67. DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;68. DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;69. DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;70. DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;71. DMA_InitStructure.DMA_Priority=DMA_Priority_Low;72. DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;73. DMA_Init(DMA1_Channel5,&DMA_InitStructure);74. 75. USART_InitStructure.USART_BaudRate=9600;76. USART_InitStructure.USART_WordLength=USART_WordLength_8b;77. USART_InitStructure.USART_StopBits=USART_StopBits_1;78. USART_InitStructure.USART_Parity=USART_Parity_No;79. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;80. USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;81. 82. /配置IO:GPIOA9和GPIOA10分别作为串口TX、RX端。见STM32datasheet 83. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;84. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;85. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;86. GPIO_Init(GPIOA,&GPIO_InitStructure);87. 88. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;89. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;90. GPIO_Init(GPIOA,&GPIO_InitStructure);91. 92. /*ConfigureUSART1*/93. USART_Init(USART1,&USART_InitStructure);94. /*EnableUSART1DMARxrequest*/95. USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);96. /*EnableDMA1Channel5*/97. DMA_Cmd(DMA1_Channel5,ENABLE);98. /*EnabletheUSART1*/99. USART_Cmd(USART1,ENABLE);100. 101. 102. /向串口发送数据 103. voidUSART_send(constint8u*pBuf,int8ulen)104. 105. inti;106. if(pBuf=NULL)107. 108. return;109. 110. /将数据压入到发送队列 111. dbgprt(USART_PushBack:);112. for(i=0;i=ARRAYSIZE(USART_SndBuf)126. Tail=0;127. if(Tail=Head)128. Head=Tail+1;129. 130. 131. /从发送队列头部取出一个字节 132. boolPopFront(int8u*byte)133. 134. if(Head=ARRAYSIZE(USART_SndBuf)135. Head=0;136. if(Head=Tail)137. returnFALSE;138. *byte=USART_SndBufHead+;139. returnTRUE;140. 141. 142. /处理接收到的串口数据 143. voidUSART_receive(int8ubyte)144. 145. /Treatereceiveddata 146. /PlaceCodehere 147. /. 148. 149. 150. /CRC校验 151. boolCheckCRC(constint8u*str,int8ulen,constint8u*crcstr)152. 153. int8ucheckSum;154. if(str=NULL|crcstr=NULL)155. returnFALSE;156. GetCRC(str,len,&checkSum);157. if(checkSum!=*crcstr)158. returnFALSE;159. else160. returnTRUE;161. 162. 163. /获取CRC 164. boolGetCRC(con

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论