嵌入式系统导论(第2版)-教学课件 嵌入式导论08_第1页
嵌入式系统导论(第2版)-教学课件 嵌入式导论08_第2页
嵌入式系统导论(第2版)-教学课件 嵌入式导论08_第3页
嵌入式系统导论(第2版)-教学课件 嵌入式导论08_第4页
嵌入式系统导论(第2版)-教学课件 嵌入式导论08_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统导论主讲教师:第8章STM32的DMA接口本章内容提要8.1DMA控制器8.2DMA应用示例:USART接口的DMA传输8.3DMA、USART和GPIO的综合应用数据传送方式程序查询传送中断传送DMA传送8.1DMA控制器DMA传送希望克服程序控制传送的不足:外设→CPU→存储器外设←CPU←存储器直接存储器存取DMA:外设→存储器外设←存储器CPU释放总线,由DMA控制器管理查询要等,中断太烦,来个直接的DMA传送过程1)DMA预处理2)DMA请求和应答3)DMA传送DMA读:存储器→外设DMA写:存储器←外设4)增减地址和计数,判断传送是否完成STM32的DMA控制器直接存储器存取DMA(DirectMemoryAccess)利用系统总线直接在外设与存储器之间进行 大量和高速数据传输的方法STM32设计有2个DMA控制器单元DMA1单元,支持7个DMA通道DMA2单元,支持5个DMA通道具有多达12个独立的可配置DMA通道支持存储器到存储器、外设到存储器、 存储器到外设和外设到外设的自动传输每个通道都支持软件触发DMA框图DMA1各通道的请求外设通道1通道2通道3通道4通道5通道6通道7ADC1ADC1SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TXUSARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXI2CI2C2_TXI2C2_RXI2C1_TXI2C1_RXTIM1TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3TIM2TIM2_CH3TIM2_UPTIM2_CH1TIM2_CH2TIM2_CH4TIM3TIM3_CH3TIM3_CH3TIM3_UPTIM3_CH1TIM3_TRIGTIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UPDMA1各条通道连接的外设参考手册STM32主要外设都支持DMADMA2各通道的请求外设通道1通道2通道3通道4通道5ADC3ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TXUART4UART4_RXUART4_TXSDIOSDIOTIM5TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM6/DAC_Channel1TIM6_UP/DAC_Channel1TIM7TIM7_UP/DAC_Channel2TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1TIM8_CH2DMA2各条通道连接的外设DMA通道的优先级和中断每个DMA通道可以由应用程序赋予4个优先级之一(很高、高级、中级和低级)在仲裁阶段,高优先级的通道优先获得总线响应相同优先级时,通道号小的通道优先获得总线响应每个DMA通道都可以在3个时刻产生中断请求DMA传输过半HTIFDMA传输完成TCIFDMA传输错误TEIF每个DMA通道都有自己的中断向量(除大容量产品中,DMA2通道4和DMA2通道5的中断被映射在同一个中断向量上)DMA通道的寄存器每个DMA通道由4个寄存器控制配置寄存器CCR定义DMA传输的特性传输数量寄存器CNDTR保存传输的数据个数外设地址寄存器CPAR保存外设的地址存储器地址寄存器CMAR保存存储器的地址中断操作由两个中断寄存器控制中断状态寄存器ISR中断标志清除寄存器IFCR参考手册DMA寄存器寄存器缩写寄存器中文名称DMA_CCR配置寄存器DMA_CNDTR传输数量寄存器DMA_CPAR外设地址寄存器DMA_CMAR存储器地址寄存器DMA_ISR中断状态寄存器DMA_IFCR中断标志清除寄存器8.2DMA应用示例:USART接口的DMA传输【例8-1】将主存一个数据块采用DMA方式传输到USART1发送接口(TX)DMA传输前,让所有LED灯灭DMA传输中,处理器继续执行程序让LED1灯亮DMA传输后,产生中断让LED2灯亮将USART1端口连接PC机串口,重定向在PC机远程终端程序中显示传输结果使用DMA方式进行USART1发送属于DMA1单元的通道4(USART1_TX)DMA传输的开发方法使用DMA传输之前,需要进行DMA初始化配置(1)开启DMA时钟:RCC_AHBPeriphClockCmd函数(2)如果使用中断,进行DMA的NVIC配置(3)DMA传输的参数配置:DMA_Init函数(4)允许DMA传输:DMA_Cmd函数(5)如果使用中断,设置DMA传输何时产生中断:

DMA_ITConfig函数当进行DMA传输时,需要进行DMA请求例如,USART使用USART_DMACmd函数开始DMA传输后,处理器可以继续执行程序启动DMA单元时钟使用STM32库函数

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx,ENABLE);DMAx是DMA1或DMA2直接寄存器编程通过允许RCC单元的AHB时钟寄存器实现

RCC->AHBENR|=0x000000001; //允许DMA时钟DMA初始化DMA初始化函数

voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)按照DMA_InitStruct结构变量初始化DMAy通道x(y=1、2,x=1~12)DMA_InitStruct是指向DMA_InitTypeDef结构体的指针,包含对DMA通道的配置信息帮助文档DMA初始化结构类型DMA_InitTypeDeftypedef

struct{uint32_tDMA_PeripheralBaseAddr; /*外设基地址*/uint32_tDMA_MemoryBaseAddr;/*存储器基地址*/uint32_tDMA_DIR; /*传输方向:外设是源还是目的*/uint32_tDMA_BufferSize; /*缓冲区大小*/uint32_tDMA_PeripheralInc; /*外设地址是否增量*/uint32_tDMA_MemoryInc; /*存储器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外设数据宽度*/uint32_tDMA_MemoryDataSize; /*存储器数据宽度*/uint32_tDMA_Mode;

/*操作模式*/

uint32_tDMA_Priority; /*软件优先级*/uint32_tDMA_M2M; /*是否存储器到存储器传输*/}DMA_InitTypeDef;DMA_InitTypeDef成员-1成员1:DMA_PeripheralBaseAddr,外设基地址本例的外设是USART1数据寄存器(USART1_DR)需要用户定义给出这个地址(STM32库没有定义)成员2:DMA_MemoryBaseAddr,存储器基地址通常是用户程序定义的主存缓冲区首地址成员3:DMA_DIR,传输方向选择外设是源(DMA_DIR_PeripheralSRC)还是目的(DMA_DIR_PeripheralDST)成员4:DMA_BufferSize,缓冲区大小传输的数据量(直接给出数值)单位是成员7给出的DMA_PeripheralDataSizeDMA_InitTypeDef成员-2成员5:DMA_PeripheralInc,外设地址增量允许(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成员6:DMA_MemoryInc,存储器地址增量允许(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成员7:DMA_PeripheralDataSize,外设数据宽度字节(DMA_PeripheralDataSize_Byte)半字(DMA_PeripheralDataSize_HalfWord)字(DMA_PeripheralDataSize_Word)DMA_InitTypeDef成员-3成员8:DMA_MemoryDataSize,存储器数据宽度字节(DMA_MemoryDataSize_Byte)半字(DMA_MemoryDataSize_HalfWord)字(DMA_MemoryDataSize_Word)成员9:DMA_Mode,操作模式正常(DMA_Mode_Normal):一次性传输循环(DMA_Mode_Circular):自动重复传输DMA_InitTypeDef成员-4成员10:DMA_Priority,软件优先级选择通道的4个优先级之一很高(DMA_Priority_VeryHigh)高级(DMA_Priority_High)中级(DMA_Priority_Medium)低级(DMA_Priority_Low)成员11:DMA_M2M,存储器到存储器传输允许(DMA_M2M_Enable)禁止(DMA_M2M_Disable)DMA初始化配置头文件dma.h配置DMA传输的外设基地址(USART1数据寄存器DR)(DMA_InitStructure.DMA_PeripheralBaseAddr)STM32库的头文件没有定义USART1_DR地址查阅STM32参考手册USART1的起始地址(0x40013800)数据寄存器DR在USART的偏移量(0x04)相加得到USART1_DR地址(0x40013804)

#defineUSART1_DR_Base0x40013804#defineSENDBUF_SIZE0x4000 //缓冲区大小voidDMA1_Config(void);DMA配置源文件dma.c-1/*DMA的中断配置函数*/voidNVIC_Config(void){NVIC_InitTypeDef

NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}DMA配置源文件dma.c-2//USART1进行DMA传送的初始化配置(含中断配置)uint8_t

SendBuf[SENDBUF_SIZE];//发送缓冲区voidDMA1_Config(void){DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); NVIC_Config(); /*配置DMA中断

*/

//设置DMA源:串口数据寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuf;/*内存地址(要传输的变量的指针)*/

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/*方向:从内存到外设*/DMA配置源文件dma.c-3

DMA_InitStructure.DMA_BufferSize=SENDBUF_SIZE; /*传输大小*/

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外设地址不增*/

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

/*内存地址自增*/

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

/*外设数据单位,字节*/

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

/*内存数据单位,字节*/

DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; /*DMA模式:一次传输,不循环*/DMA配置源文件dma.c-4

DMA_InitStructure.DMA_Priority=MA_Priority_Medium; /*优先级:中*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*禁止内存到内存的传输 */

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*配置DMA1的4通道*/

DMA_Cmd(DMA1_Channel4,ENABLE); /*允许DMA1的4通道进行DMA传输

*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*设置DMA1的4通道DMA传输完成产生中断*/}帮助文档进行DMA传输的主程序main.c-1int

main(void){ inti; USART1_Config();

//

USART1配置:1152008-N-1

DMA1_Config();

LED_Config();

LED_Off_all(); //LED灯全灭

for(i=0;i<SENDBUFF_SIZE;i++) {SendBuf[i]='A'; //填充缓冲区

}进行DMA传输的主程序main.c-2

printf("\r\nDMA传输开始\r\n"); //USART1接口发出DMA请求

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); LED_On(1); //点亮LED1灯

while(1) {

温馨提示

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

评论

0/150

提交评论