基于HAL库的STM32F1开发实践教程-课件 05.DMA_第1页
基于HAL库的STM32F1开发实践教程-课件 05.DMA_第2页
基于HAL库的STM32F1开发实践教程-课件 05.DMA_第3页
基于HAL库的STM32F1开发实践教程-课件 05.DMA_第4页
基于HAL库的STM32F1开发实践教程-课件 05.DMA_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

山东师范大学信息科学与工程学院张宝译DMADMA概念DMA(DirectMemoryAccess,直接存储器访问)这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作(前提是未设置停止CPU访问)。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。

山东师范大学信息科学与工程学院应用场景DMA方式主要适用于一些高速的I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。山东师范大学信息科学与工程学院DMA传输类型山东师范大学信息科学与工程学院1、两个设备之间;2、设备和内存之间;(多数情况下,DMAC进行的是外设接口和内存之间的传输。)3、内存和内存之间。DMA技术缺点山东师范大学信息科学与工程学院DMA技术的弊端DMA传送的优点是以增加系统硬件的复杂性和成本为代价的,因为DMA是用硬件控制代替软件控制的。另外,DMA传送期间CPU被挂起,部分或完全失去对系统总线的控制,这可能会影响CPU对中断请求的及时响应与处理。

因此,在一些小系统或速度要求不高、数据传输量不大的系统中,一般并不用DMA方式。因为DMA允许外设直接访问内存,从而形成对总线的独占。这在实时性强的硬实时系统嵌入式开发中将会造成中断延时过长。DMA参数山东师范大学信息科学与工程学院传输模式:数据传输的方向有三个(存储器到外设、外设到存储器、

存储器到存储器)通道选择:数据传输走哪条路仲裁器:多个DMA进行传输时,优先级高的先传输数据长度:每次传输的数据长度(1个字节、2个字节、4个字节)指针递增:使能此模式侯,则下次传输的地址将是前一次传输的地址

递增1【注意这个1的含义的理解】CubeMX配置DMA(USART1举例)山东师范大学信息科学与工程学院1.添加串口及中断CubeMX配置DMA山东师范大学信息科学与工程学院CubeMX配置DMA山东师范大学信息科学与工程学院CubeMX配置DMA山东师范大学信息科学与工程学院CubeMX配置DMA山东师范大学信息科学与工程学院编写代码山东师范大学信息科学与工程学院//usart.c和usart.h中#defineUSART1_DMA_TX_SIZE200uint8_tUSART1_DMA_TX_BUFFER[USART1_DMA_TX_SIZE];#defineUSART1_DMA_RX_SIZE200uint8_tUSART1_DMA_RX_BUFFER[USART1_DMA_RX_SIZE];volatileuint8_tDMA_usart1_Rx_Size;volatileuint8_tDMA_usart1_Rx_Flag=0;volatileuint8_tDMA_usart1_Tx_Flag=1;编写代码山东师范大学信息科学与工程学院//main.c中voidInitXXX(void){//使能IDLE中断

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//使能IDLE中断

//打开DMA接收,数据存入USART1_DMA_RX_BUFFER数组中

HAL_UART_Receive_DMA(&huart1,USART1_DMA_RX_BUFFER,USART1_DMA_RX_SIZE);}【在main函数的主循环之前,调用此函数,使能串口空闲中断,打开DMA接收】编写代码山东师范大学信息科学与工程学院//stm32f1xx_it.c中voidUSART1_IRQHandler(void){if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET){__HAL_UART_CLEAR_IDLEFLAG(&huart1);DMA_usart1_Rx_Size=USART1_DMA_RX_SIZE-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);HAL_UART_DMAStop(&huart1);for(uint8_tk=0;k<DMA_usart1_Rx_Size;k++){USART_RX_BUF[k]=USART1_DMA_RX_BUFFER[k];}DMA_usart1_Rx_Flag=1;HAL_UART_Receive_DMA(&huart1,USART1_DMA_RX_BUFFER,USART1_DMA_RX_SIZE);}HAL_UART_IRQHandler(&huart1);}编写代码山东师范大学信息科学与工程学院//usart.c中voidUSER_DMA_send(uint8_t*buf,uint8_tlen){ if(1==DMA_usart1_Tx_Flag) { HAL_UART_Transmit_DMA(&huart1,buf,len); DMA_usart1_Tx_Flag=0; }}编写代码山东师范大学信息科学与工程学院//stm32f1xx_it.c中voidDMA1_Channel4_IRQHandler(void){if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TC4)!=RESET){__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TC4);

DMA_usart1_Tx_Flag=1;

}if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_HT4)!=RESET){__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_HT4);}if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TE4)!=RESET){__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TE4);}

HAL_DMA_IRQHandler(&hdma_usart1_tx);}编写代码山东师范大学信息科学与工程学院//main.c中,main函数的while(1)循环中if(DMA_usart1_Rx_Flag==1){DMA_usart1_Rx_Flag=0; len=DMA

温馨提示

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

评论

0/150

提交评论