STM32使用DMA加串口空闲中断接收数据资料_第1页
STM32使用DMA加串口空闲中断接收数据资料_第2页
STM32使用DMA加串口空闲中断接收数据资料_第3页
STM32使用DMA加串口空闲中断接收数据资料_第4页
STM32使用DMA加串口空闲中断接收数据资料_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、STM32使用DMA加串口空闲中断接收数据STM32中,需要用串口接收数据,是使用串口中断来接收数据。但是用这种方法的话, 就要频繁进入串口中断, 然后处理,效率就比较低。于是就想到用 DMA来接收串口数据,这 个STM32也是支持的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度 固定,那就好办,直接设置 DMA勺接收数据个数就行了。 但是如果长度不固定了,那应该怎就是又开有了这 串口总线么办了?这个时候,就要用到STM32在串口中提供的另一个好用的东西了, 串口空闲中断。在STM32的串口控制器中,设置了有串口空闲中断,即如果串口空闲, 启了串口空闲中断的话, 就触发串口空闲

2、中断, 然后程序就会跳到串口中断去执行。 个,是不是可以判断什么时候串口数据接收完毕了呢?因为串口数据接收完毕后, 肯定是会空闲的嘛,那这个中断肯定是会触发的了。擢收$时常搖牧2:扭制OlEIFRECT&LBt)TXCtc hx/JHEflIplI A1/rUSAAT中新控制USAHT 0RRCH1TXf IE还有一个问题,这串口空闲中断是只要串口空闲就会产生吗?其实不是 的,串口空闲中断要触发的话,是要 RXNE位被置位后,串口总线空闲才会触发的。所以我 们不用担心,串口数据发送完毕后,会不会触发串口空闲中断了。下面用代码来说明。1、配置串口。包括设置串口的引脚配置,串口的配置,串口中断的配

3、置,串口的接收DMA的配置void USART_i nit(void)GPIO_I ni tTypeDef GPIO_I nitStructure;USART_I nitTypeDef USART_I ni tStructure;NVIC_I ni tTypeDef NVIC_I nitStructure;/ 开启时钟RCC_APB2PeriphClockCmd(USART_RCC,ENABLE);/ 配置TX端口GPIO_I ni tStructure.GPIO_Pin = GPIO_USART_TX;GPIO_I ni tStructure.GPIO_Mode = GPIO_Mode_AF

4、_PP;GPIO_I nitStructure.GPIO_Speed = GPIO_Speed_5OMH z;GPIO_I nit(GPIO_USART_TYPE,&GPIO_I ni tStructure);II 配置RX端口GPIO_I ni tStructure.GPIO_Pin = GPIO_USART_RX;GPIO_I ni tStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_I nit(GPIO_USART_TYPE,&GPIO_I ni tStructure);/ 配置串口模式USART_I ni tStructure.USART

5、_BaudRate = 115200;USART_I ni tStructure.USART_WordLe ngth = USART_WordLe ngth_8b;USART_I nitStructure.USART_StopBits = USART_StopBits_1;USART_I ni tStructure.USART_Parity = USART_Parity_No;USART_I ni tStructure.USART_HardwareFlowCo ntrol = USART_HardwareFlowC on trol_No ne;USART_I ni tStructure.USA

6、RT_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_I nit(USART1,&USART_I nitStructure);/ 中断配置NVIC_I ni tStructure.NVIC_IRQCha nnel = USART1_IRQ n;NVIC_I ni tStructure.NVIC_IRQCha nn elPreemptio nPriority = 1;NVIC_I ni tStructure.NVIC_IRQCha nn elSubPriority=0;NVIC_I ni tStructure.NVIC_IRQCha nn elCmd = E

7、NABLE;NVIC_I nit(&NVIC_I nitStructure);/*若总线空闲,产生中断 */USART_ITCo nfig(USART1, USART_IT_IDLE, ENABLE);/*开启串口 DMA接收*/USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);USART_Cmd(USART1,ENABLE);代码比较简单,一看就明白了,这就是使用库函数开发的好处,代码易懂。这里,关键的是要开启总线空闲中断,并且开启串口DMA接收。注意,不要开启串口接收中断,不然接收数据就会一直产生中断了。2、DMA配置DMA配置,要先查看串口接收是使用

8、的哪个DMA勺哪个通道,对于 USART1_R粳用的是DMA的5通道。iA K 3itf由At4j44 S5連述S旣E?;r*fl 谓 H 8l -it f;腔坦此 WJfi V f.)*tST4s J rIJEART TV.TiMt CHiT1M2. W1T,MJi CK3SPil RKuhrti n( nui ctuHW! TRKTHji comTHM-CH2Srt.!?Sz RXXw tJCUAR1J Fu TiWl.CHi U.- LUITIULT*TKUSARTi Al _t7muF SPVQS1_TXFTDR);DMAni tstructure.DMA_MemoryBaseAddr

9、 = (u32)receive_data;DMA_I ni tstructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_I ni tstructure.DMA_BufferSize = 128;DMA_I ni tstructure.DMA_Peripherall nc = DMA_PeripheralI nc_Disable;DMA_I ni tstructure.DMA_MemoryI nc =DMA_MemoryI nc_En able;DMA_I ni tstructure.DMA_PeripheralDataSize = DMA_Peripheral

10、DataSize_Byte;DMA_I ni tstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_I ni tstructure.DMA_Mode = DMA_Mode_Normal;DMA_I ni tstructure.DMA_Priority = DMA_Priority_High;DMA_I ni tstructure.DMA_M2M = DMA_M2M_Disable;DMA_I nit(DMA1_Cha nn el5,&DMA_I nitstructure);/ 启动DMADMA_Cmd(DMA1_Cha nn e

11、l5,ENABLE);/ 开启DMA发送发成中断/DMA_ITCo nfig(DMA1_Cha nn el4,DMA_IT_TC,ENABLE);因为这里,不需要用到DMA中断,所以DMA中断就不要使能了。因此DMA中断配置也就不需要了。这里,关键的是要设置DMA_DIR 为DMA_DIR_PeripheralSRC,表示数据是从外设到内存。这里设定的DMA_Mode 是普通模式,即数据传输就只能一次。3、串口中断程序编写这个就是关键的地方了。在这里,需要做什么了。需要对DMA设置下。当进入这个中断的时候,串口接收的数据,已经在内存的数组中了。通过读取DMA勺计数值,就可以知道接收到了多少个数

12、据。然后再把DMA合diable掉,重新设置接收数据长度,在开启 DMA接收下一次串口数据。为什么要这么做了,因为在STM32手册中有如下说明:另外还有一点,串口空闲中断触发后,硬件会自动将串口空闲中断标志位给置1我们是需要将给标志位给置 0的,不然又要进中断了,这个在手册中也有说明。IDL曰甜雋何息如它的(IDLEne detected邯檢测到总it空珥时,逹逼戡班打龍位一 51111USART CFtnr的IDLEIE力仁T 1小* 1 ? !讥-T /-(. ,USAHT_SR+ 擁駅 i 4 USART_DR)建仃怜精到豎倒总itti检测別空闸总扯”IDLESR;num = USART1-DR; /清 USART_IT_IDLE标志DMA_Cmd(DMA1_Channel5,DISABLE); / 关闭 DMAnum = 128 - DMA_GetCurrDataCou nter(DMA1_Cha nn el5);/得到真正接收数据个数receive_data num = 0:DMA1_Cha nn el5-CNDTR=128;/重新设置接收数据个数DMA_Cmd(DMA1_Channel5,ENABLE); /开启 DMAreceive_flag = 1; II接收数据标志位置 1DMA设置要注意下。在主函数中,使用下面代码测试:int mai n()periph

温馨提示

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

评论

0/150

提交评论