




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章DMASTM32本章知識與能力要求理解和掌握DMA的基本概念、適用場合;理解STM32的DMA結(jié)構(gòu)及工作原理;熟悉STM32標(biāo)準(zhǔn)外設(shè)庫和HAL庫中有關(guān)DMA的庫函數(shù);掌握基于STM32標(biāo)準(zhǔn)外設(shè)庫開發(fā)DMA應(yīng)用程序的方法;掌握基于STM32CubeMX進(jìn)行DMA開發(fā)的方法。第8章DMADMA基礎(chǔ)理論知識8.1STM32的DMA模塊8.2DMA模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用8.3DMA模塊的HAL庫接口函數(shù)及應(yīng)用8.48.1DMA基礎(chǔ)理論知識外設(shè)CPU存儲器一般的數(shù)據(jù)處理流程在外設(shè)與存儲器傳輸數(shù)據(jù)過程中,CPU全程參與導(dǎo)致CPU大量的時間和資源被浪費(fèi),造成CPU效率低下。由于外設(shè)和存儲器速度較低不需要處理數(shù)據(jù)時總線總線總線總線8.1DMA基礎(chǔ)理論知識DMA傳輸方式是利用DMA控制器直接控制總線,在外設(shè)與存儲器之間建立一條直接通道,不需要CPU的中轉(zhuǎn)。涉及到總線控制權(quán)轉(zhuǎn)移問題,即DMA傳輸前,CPU需要把總線控制權(quán)交給DMA控制器,DMA傳輸結(jié)束后,DMA控制器再把總線控制權(quán)交還給CPU。8.1DMA基礎(chǔ)理論知識DMA請求對DMA進(jìn)行初始化,I/O設(shè)備準(zhǔn)備好后,向DMA控制器發(fā)出DMA請求。DMA響應(yīng)DMA控制器對DMA請求進(jìn)行優(yōu)先級判別,向CPU發(fā)出總線請求信號。CPU響應(yīng)總線請求,當(dāng)CPU執(zhí)行完當(dāng)前總線周期就將總線控制權(quán)交給DMA控制器,完成DMA響應(yīng)。DMA傳輸DMA控制器獲得總線控制權(quán)后,外設(shè)經(jīng)硬件信號請求DMA傳輸或通過軟件啟動DMA請求,按配置好的相關(guān)參數(shù),DMA控制器發(fā)出讀寫命令,開始進(jìn)行數(shù)據(jù)傳送。DMA結(jié)束DMA控制器對傳輸?shù)臄?shù)據(jù)進(jìn)行計(jì)數(shù),判斷數(shù)據(jù)是否傳輸完成,當(dāng)傳輸完成,DMA控制器將總線控制權(quán)交還給CPU,并向I/O設(shè)備發(fā)出結(jié)束信號。DMA傳輸過程8.2.1DMA內(nèi)部結(jié)構(gòu)8.2.2DMA優(yōu)先權(quán)8.2.3DMA中斷請求8.2STM32的DMA模塊8.2.1DMA內(nèi)部結(jié)構(gòu)STM32最多有2個DMA控制器:DMA1有7個通道DMA2有5個通道每一個通道專門用來管理一個或多個外設(shè)對存儲器訪問的請求。中小容量的STM32F103系列只有DMA1,STM32F103ZET6屬于大容量芯片,有DMA1和DMA2兩個DMA控制器。DMA的內(nèi)部結(jié)構(gòu)框圖8.2.1
DMA內(nèi)部結(jié)構(gòu)外設(shè)(TIMx(x=1,2,3,4)、ADC1、SPI1、IICx(x=1,2)、USARTx(x=1,2,3))產(chǎn)生的DMA1請求,傳送到DMA1控制器,同一時刻只能有一個請求有效。外設(shè)通道1通道2通道3通道4通道5通道6通道7ADC1ADC1
SPI/I2S
SPI1_RXSPI1_TXSPI/I2S_RXSPI/I2S_TX
USART
USART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXIIC
IIC2_TXIIC2_RXIIC1_TXIIC1_RXTIM1
TIM1_CH1TIM1_CH2TIM1_TX4TIM1_TRIGTIM1_COMTIM1_UP
TIM1_CH3
TIM2TIM2_CH3TIM2_UP
TIM2_CH1
TIM2_CH2TIM2_CH4TIM3
TIM3_CH3TIM3_CH4TIM3_UP
TIM3_CH1TIM3_TRIG
TIM4TIM4_CH1
TIM4_CH2TIM4_CH3
TIM4_UPDMA1各個通道的DMA請求8.2.1
DMA內(nèi)部結(jié)構(gòu)外設(shè)(TIMx(x=5,6,7,8)、ADC3、SPI/I2S3、USART4、DAC通道1、2和SDIO)產(chǎn)生5個通道的DMA2請求傳送到DMA2控制器,同一時刻只能有一個請求有效DMA2各個通道的DMA請求外設(shè)通道1通道2通道3通道4通道5ADC3
ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TX
USART4
USART4_RX
USART4_TXSDIO
SDIO
TIM5TIM5_CH4TIM5_TRIGTIM5_CH3TIM5_UP
TIM5_CH2TIM5_CH1TIM6/DAC通道1
TIM6_UP/DMA通道1
TIM7/DAC通道2
TIM7_UP/DMA通道2
TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1
TIM8_CH28.2.2DMA優(yōu)先權(quán)如果2個請求有相同的軟件優(yōu)先級,則較低編號的通道比較高編號的通道有較高的優(yōu)先權(quán)。例如,通道2優(yōu)先于通道4。最高優(yōu)先級(VeryHigh)高優(yōu)先級(High)中等優(yōu)先級(Medium)低優(yōu)先級(Low)通道的優(yōu)先權(quán)分為4個等級,高優(yōu)先級的通道優(yōu)先獲得總線響應(yīng)。當(dāng)有多個DMA請求時,DMA控制器通過內(nèi)部的仲裁器進(jìn)行優(yōu)先權(quán)管理。在大容量產(chǎn)品和互聯(lián)型產(chǎn)品中,DMA1控制器擁有高于DMA2控制器的優(yōu)先級。8.2.2DMA優(yōu)先權(quán)DMA2各通道的DMA映射及優(yōu)先權(quán)DMA1各通道的DMA映射及優(yōu)先權(quán)8.2.3DMA中斷請求中斷事件標(biāo)志位中斷使能控制位中斷事件HTIFHTIE傳輸過半TCIFTCIE傳輸完成TEIFTEIE傳輸錯誤DMA的每個通道都可以在DMA傳輸過程中觸發(fā)中斷,可通過設(shè)置相應(yīng)寄存器的不同位來打開這些中斷。
DMA中斷事件主要有:HT(HalfTransfer,傳輸一半)TC(TransferComplete,傳輸完成)TE(TransferError,傳輸錯誤)
分別對應(yīng)三個中斷標(biāo)志:HTIF、TCIF、TEIF,每個中斷標(biāo)志都有允許控制位。8.3DMA模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用18.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)28.3.2
DMA標(biāo)準(zhǔn)外設(shè)庫的配置過程38.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)函數(shù)名稱功能描述DMA_DeInit將DMA的通道x寄存器重設(shè)為缺省值DMA_Init根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道x寄存器DMA_StrucInit把DMA_InitStruct中的每個參數(shù)按缺省值填入DMA_Cmd使能或者失能指定的通道xDMA_ITConfig使能或者失能指定的通道x中斷DMA_GetCurrDataCounter返回當(dāng)前DMA通道x剩余的待傳輸數(shù)據(jù)個數(shù)DMA_SetCurrDataCounter設(shè)置DMA通道x進(jìn)行DMA傳輸?shù)漠?dāng)前數(shù)據(jù)個數(shù)DMA_GetFlagStatus檢查指定的DMA通道x標(biāo)志位設(shè)置與否DMA_ClearFlag清除DMA通道x待處理標(biāo)志位DMA_GetITStatus檢查指定的DMA通道x中斷發(fā)生與否DMA_ClearITPendingBit清除DMA通道x中斷待處理標(biāo)志位DMA標(biāo)準(zhǔn)外設(shè)庫支持11種庫函數(shù)8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)在stm32f10x_adc.h頭文件中聲明了ADC所有的庫函數(shù)8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)如果想要查看具體的函數(shù)定義,可在keil工程中將光標(biāo)放在想要查看的函數(shù)上,然后單擊右鍵選擇“GoToDefinitionof…”,即可跳轉(zhuǎn)到相應(yīng)函數(shù)的函數(shù)體8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)
voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,
DMA_InitTypeDef*DMA_InitStruct)
DMA的初始化函數(shù)為:參數(shù)1:用于指定DMA的具體通道x參數(shù)2:根據(jù)DMA_InitStruct結(jié)構(gòu)體變量中指定的參數(shù)初始化DMA的通道x,DMA_InitStruct是指向DMA_InitTypeDef結(jié)構(gòu)體的指針,包含DMA通道的配置參數(shù)8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)typedefstruct{uint32_tDMA_PeripheralBaseAddr;//外設(shè)基地址
uint32_tDMA_MemoryBaseAddr;//存儲器基地址
uint32_tDMA_DIR;//傳輸方向:外設(shè)是源還是目的
uint32_tDMA_BufferSize;//緩沖區(qū)大小uint32_tDMA_PeripheralInc;//外設(shè)地址是否遞增
uint32_tDMA_MemoryInc;//存儲器地址是否遞增
uint32_tDMA_PeripheralDataSize;//外設(shè)數(shù)據(jù)寬度
uint32_tDMA_MemoryDataSize;//存儲器數(shù)據(jù)寬度
uint32_tDMA_Mode;//DMA工作模式
uint32_tDMA_Priority;//DMA優(yōu)先權(quán)
uint32_tDMA_M2M;//是否存儲器到存儲器傳輸}DMA_InitTypeDef;DMA初始化結(jié)構(gòu)體成員就是配置DMA的相關(guān)參數(shù),DMA_InitTypeDef定義在stm32f10x_dma.h文件中8.3.1DMA標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)DMA_InitTypeDef結(jié)構(gòu)體成員取值范圍DMA_PeripheralBaseAddr(外設(shè)基地址)直接給出外設(shè)的地址DMA_MemoryBaseAddr(存儲器基地址)通常為用戶程序定義的主存緩沖區(qū)首地址DMA_DIR(傳輸方向)DMA_DIR_PeripheralSRC,外設(shè)作為數(shù)據(jù)傳輸?shù)膩碓碊MA_DIR_PeripheralDST,外設(shè)作為數(shù)據(jù)傳輸?shù)哪康牡谼MA_BufferSize(緩沖區(qū)大?。┰O(shè)置一次傳輸數(shù)據(jù)量的大小,可設(shè)為0~65536DMA_PeripheralInc(外設(shè)地址增量)DMA_PeripheralInc_Enable,外設(shè)地址遞增允許DMA_PeripheralInc_Disable,外設(shè)地址不變DMA_MemoryInc(存儲器地址增量)DMA_MemoryInc_Enable,內(nèi)存地址遞增DMA_MemoryInc_Disable,內(nèi)存地址不變DMA_PeripheralDataSize(外設(shè)數(shù)據(jù)寬度)DMA_PeripheralDataSize_Byte,外設(shè)數(shù)據(jù)寬度為8位DMA_PeripheralDataSize_HalfWord,外設(shè)數(shù)據(jù)寬度為16位DMA_PeripheralDataSize_Word,外設(shè)數(shù)據(jù)寬度為32位DMA_MemoryDataSize(存儲器數(shù)據(jù)寬度)DMA_MemoryDataSize_Byte,存儲器數(shù)據(jù)寬度為8位DMA_MemoryDataSize_HalfWord,存儲器數(shù)據(jù)寬度為16位DMA_MemoryDataSize_Word,存儲器數(shù)據(jù)寬度為32位DMA_Mode(DMA工作模式)DMA_Mode_Circular,工作在循環(huán)緩沖模式DMA_Mode_Normal,工作在正常緩沖模式DMA_Priority(DMA優(yōu)先權(quán))DMA_Priority_VeryHigh,最高優(yōu)先級;DMA_Priority_High,高優(yōu)先級;DMA_Priority_Medium,中等優(yōu)先級;DMA_Priority_Low,低優(yōu)先級DMA_M2M(存儲器到存儲器傳輸)DMA_M2M_Enable,允許內(nèi)存到內(nèi)存的傳輸;DMA_M2M_Disable,禁止內(nèi)存到內(nèi)存的傳輸DMA_InitTypeDef結(jié)構(gòu)體成員及其取值8.3.2DMA標(biāo)準(zhǔn)外設(shè)庫的配置過程StepFour使能DMA時鐘DMA掛接在AHB,所以使用RCC_AHBPeriphClockCmd()函數(shù)使能DMA時鐘:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);使能DMA1通道4,啟動傳輸DMA_Cmd(DMA1_Channel4,ENABLE);初始化DMA通道4參數(shù)允許DMA中斷,如果使用中斷,則要進(jìn)行DMA中斷配置DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);StepThreeStepTwoStepOne庫函數(shù)的配置過程(以DMA1通道4為例)8.3.2DMA標(biāo)準(zhǔn)外設(shè)庫的配置過程DMA_InitTypeDefDMA_InitStructure;/*設(shè)置DMA源:串口數(shù)據(jù)寄存器地址*/DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)(&(USART1->DR)); /*內(nèi)存地址,要傳輸?shù)淖兞康闹羔?/DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuff;/*方向:從內(nèi)存到外設(shè)*/DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST; /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/DMA_InitStructure.DMA_BufferSize=SENDBUFF_SIZE;/*外設(shè)地址設(shè)置為不增*/DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;/*內(nèi)存地址設(shè)置為自增*/DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; 初始化DMA通道4參數(shù)/*設(shè)置外設(shè)數(shù)據(jù)單位*/ DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;/*設(shè)置內(nèi)存數(shù)據(jù)單位8bit*/DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; /*設(shè)置DMA模式為不斷循環(huán)模式*/DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;/*設(shè)置DMA的優(yōu)先級:中*/DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;/*禁止內(nèi)存到內(nèi)存的傳輸*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA1_Channel4,&DMA_InitStructure);8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例通過DMA方式將數(shù)據(jù)發(fā)送到USART1接口,并通過PC端串口調(diào)試助手顯示傳輸結(jié)果。為證明DMA方式不需要CPU直接控制,在主程序中通過循環(huán)點(diǎn)亮LED燈進(jìn)行顯示。功能硬件設(shè)計(jì)本實(shí)例DMA不需要硬件,主程序所用到的LED燈的硬件設(shè)計(jì)如圖。8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例軟件設(shè)計(jì)main.c文件USARTx.c文件USARTx.h頭文件編譯無錯誤后下載到開發(fā)板,通過串口調(diào)試助手可以觀察到實(shí)驗(yàn)現(xiàn)象:主程序LED燈一直循環(huán)閃爍,數(shù)據(jù)通過DMA方式不停地發(fā)送A到串口。8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例#include"stm32f10x.h"#include"led.h"#include"USARTx.h"externuint8_tSendBuff[SENDBUFF_SIZE];//SENDBUFF_SIZE變量定義在USARTx.h頭文件中//不精確延時staticvoidDelay(uint32_ttime){uint32_ti,j;for(i=0;i<time;++i){for(j=0;j<10000;++j){//空循環(huán)體,什么都不做
}}}intmain(void){uint16_ti;
LED_Init();//LED燈初始化
USARTx_Init_Config();//USART1初始化
USARTx_DMA_Config();//DMA初始化
printf("使用DMA方式傳輸串口數(shù)據(jù)\n");
/*輸入要發(fā)送的數(shù)據(jù),作為DMA傳輸?shù)臄?shù)據(jù)源*/
for(i=0;i<SENDBUFF_SIZE;i++){SendBuff[i]='A';}
/*USART1向DMA發(fā)出傳輸請求*/
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);while(1){GPIO_SetBits(GPIOB,GPIO_Pin_5);//熄滅LED燈
Delay(1000);GPIO_ResetBits(GPIOB,GPIO_Pin_5);//點(diǎn)亮LED燈
Delay(1000); }}main.c文件8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例#include"USARTx.h"uint8_tSendBuff[SENDBUFF_SIZE];voidUSARTx_Init_Config(void){GPIO_InitTypeDefGPIO_InitStructure; USART_InitTypeDefUSART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE); USART_DeInit(USART1);
//USART1_TXPA.9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART1_RXPA.10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART1參數(shù)配置USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);
/*清除發(fā)送完成標(biāo)志*/USART_ClearFlag(USART1,USART_FLAG_TC|USART_FLAG_TXE|USART_FLAG_RXNE);}USARTx.c文件8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例voidUSARTx_DMA_Config(void){DMA_InitTypeDefDMA_InitStructure;/*開啟DMA時鐘*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*設(shè)置DMA源:串口數(shù)據(jù)寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)(&(USART1->DR)); /*內(nèi)存地址,要傳輸?shù)淖兞康闹羔?/
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuff;/*方向:從內(nèi)存到外設(shè)*/
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST; /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStructure.DMA_BufferSize=SENDBUFF_SIZE;/*外設(shè)地址設(shè)置為不增*/
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;/*內(nèi)存地址設(shè)置為自增*/
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; /*設(shè)置外設(shè)數(shù)據(jù)單位*/
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;/*設(shè)置內(nèi)存數(shù)據(jù)單位8bit*/DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; /*設(shè)置DMA模式為不斷循環(huán)模式*/
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; /*設(shè)置DMA的優(yōu)先級:中*/
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;/*禁止內(nèi)存到內(nèi)存的傳輸*/
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;/*配置DMA1的通道4*/
DMA_Init(DMA1_Channel4,&DMA_InitStructure);/*使能DMA*/DMA_Cmd(DMA1_Channel4,ENABLE); /*設(shè)置DMA發(fā)送完成后產(chǎn)生中斷*/
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);}USARTx.c文件8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例//重定向C庫函數(shù)printf到USART1intfputc(intch,FILE*f){
/*發(fā)送一個字節(jié)數(shù)據(jù)到串口USART1*/USART_SendData(USART1,(uint8_t)ch);
/*等待串口數(shù)據(jù)發(fā)送完畢*/
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return(ch);}//重定向c庫函數(shù)scanf到USART1intfgetc(FILE*f){
/*等待串口輸入數(shù)據(jù)*/
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);return(int)USART_ReceiveData(USART1);}USARTx.c文件8.3.3DMA標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例#ifndef__USARTx_H#define__USARTx_H#include"stm32f10x.h"#include<stdio.h>#defineSENDBUFF_SIZE100voidUSARTx_Init_Config(void);voidUSARTx_DMA_Config(void);intfputc(intch,FILE*f);intfgetc(FILE*f);#endifUSARTx.h文件軟件設(shè)計(jì)main.c文件USARTx.c文件USARTx.h頭文件8.4DMA模塊的HAL庫接口函數(shù)及應(yīng)用8.4.1DMA的HAL庫接口函數(shù)8.4.2HAL庫DMA應(yīng)用實(shí)例8.4.1DMA的HAL庫接口函數(shù)DMA模塊的HAL庫相關(guān)的接口函數(shù)定義在stm32f1xx_hal_dma.c源文件中,在stm32f1xx_hal_dma.h頭文件中可以查看相關(guān)函數(shù)的聲明以及結(jié)構(gòu)體定義。類型函數(shù)及功能描述初始化及復(fù)位函數(shù)HAL_DMA_Init(DMA_HandleTypeDef*hdma);功能描述:DMA初始化函數(shù)HAL_DMA_DeInit(DMA_HandleTypeDef*hdma);功能描述:DMA復(fù)位函數(shù)引腳功能操作函數(shù)HAL_DMA_Start(DMA_HandleTypeDef*hdma,uint32_tSrcAddress,uint32_tDstAddress,uint32_tDataLength);功能描述:啟動DMA傳輸HAL_DMA_Start_IT(DMA_HandleTypeDef*hdma,uint32_tSrcAddress,uint32_tDstAddress,uint32_tDataLength);功能描述:DMA中斷開始voidHAL_DMA_IRQHandler(DMA_HandleTypeDef*hdma);功能描述:DMA中斷處理函數(shù)外設(shè)狀態(tài)函數(shù)HAL_DMA_GetState(DMA_HandleTypeDef*hdma);功能描述:獲取DMA狀態(tài)函數(shù)HAL_DMA_GetError(DMA_HandleTypeDef*hdma);功能描述:獲取DMA錯誤函數(shù)STM32的HAL庫常用DMA接口函數(shù)8.4.1DMA的HAL庫接口函數(shù)HAL_DMA_Start(DMA_HandleTypeDef*hdma,uint32_tSrcAddress,uint32_tDstAddress,uint32_tDataLength);DMA啟動傳輸函數(shù)HAL_DMA_Start()HAL_DMA_Start(huart->hdmatx,(u32)pData,(uint32_t)&huart->Instance->DR,100);//開啟DMA的串口傳輸四個參數(shù)hdma具體使用的DMA對象SrcAddressDMA傳輸?shù)脑磾?shù)據(jù)地址DstAddressDMA傳輸?shù)哪康牡刂稤ataLengthDMA傳輸數(shù)據(jù)的長度使用范例:8.4.1DMA的HAL庫接口函數(shù)DMA串口發(fā)送數(shù)據(jù)傳輸函數(shù)AL_UART_Transmit_DMA()HAL_StatusTypeDefHAL_UART_Transmit_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize){uint32_t*tmp;if(huart->gState==HAL_UART_STATE_READY){if((pData==NULL)||(Size==0U)){returnHAL_ERROR;}/*huart配置,上鎖*/__HAL_LOCK(huart);huart->pTxBuffPtr=pData;huart->TxXferSize=Size;huart->TxXferCount=Size;huart->ErrorCode=HAL_UART_ERROR_NONE;huart->gState=HAL_UART_STATE_BUSY_TX;/*設(shè)置UART的DMA傳輸完成時調(diào)用的回調(diào)函數(shù)*/
huart->hdmatx->XferCpltCallback=UART_DMATransmitCplt;
/*設(shè)置UART的DMA傳輸完成一半時的回調(diào)函數(shù)*/
huart->hdmatx->XferHalfCpltCallback=UART_DMATxHalfCplt;/*設(shè)置DMA傳輸錯誤的回調(diào)函數(shù)*/
huart->hdmatx->XferErrorCallback=UART_DMAError;/*置DMA傳輸中止的回調(diào)函數(shù)*/
huart->hdmatx->XferAbortCallback=NULL;/*設(shè)置存儲器到外設(shè)的地址,開啟中斷,并使能UART的DMA傳輸?shù)腄MA通道*/
tmp=(uint32_t*)&pData;HAL_DMA_Start_IT(huart->hdmatx,*(uint32_t*)tmp,(uint32_t)&huart->Instance->DR,Size);/*清除串口TC中斷標(biāo)志位*/__HAL_UART_CLEAR_FLAG(huart,UART_FLAG_TC);/*huart解鎖*/__HAL_UNLOCK(huart);/*通過配置UART的CR3寄存器,使能DMA發(fā)送*/
SET_BIT(huart->Instance->CR3,USART_CR3_DMAT);returnHAL_OK;}else
{returnHAL_BUSY;}}8.4.2HAL庫DMA應(yīng)用實(shí)例基于HAL庫采用DMA方式實(shí)現(xiàn)USART串口收發(fā)數(shù)據(jù),用于需要大批量數(shù)據(jù)的通信與信息交換的場合。功能硬件設(shè)計(jì)通過STM32F103目標(biāo)板上的串口1(USART1)采用DMA方式實(shí)現(xiàn)與上位機(jī)PC的數(shù)據(jù)傳輸,可在PC機(jī)的串口助手查看測試結(jié)果。新建STM32CubeMX工程,選擇MCUSTM32CubeMX功能參數(shù)配置生成工程代碼編寫應(yīng)用程序下載調(diào)試驗(yàn)證軟件設(shè)計(jì)流程RCC和時鐘配置USART1配置DMA配置開啟串口的中斷8.4.2HAL庫DMA應(yīng)用實(shí)例軟件設(shè)計(jì)——新建STM32CubeMX工程,選擇MCU新建一個STM32CubeMx工程,選擇選擇MCU,這里選擇STM32F103ZETx芯片,讀者可根據(jù)自己的目標(biāo)板選擇相應(yīng)的芯片軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置HSE選擇“Crystal/CeramicResonator”(晶振/陶瓷諧振器RCC配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置通過圖形化方式直觀地對系統(tǒng)時鐘進(jìn)行配置,系統(tǒng)時鐘采用外部高速時鐘,配置STM32F103系列芯片最大時鐘為72MHz,配置APB2為72MHz,配置APB1為36MHz。時鐘配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“Connectivity”中選擇“USART1”;設(shè)置“MODE”為“Asynchronous”;設(shè)置USART1的相關(guān)參數(shù)配置為默認(rèn)的:115200、8、None和1串口USART1配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“SystemCore”中單擊“DMA”在右側(cè)的配置頁面“Configuration”中,單擊“Add”,添加“USART1_TX”;“Mode”選擇為“Circular”;“Channel”和“Direction”會自動選擇;“DataWidth”用默認(rèn)的“Byte”;按同樣的操作方式添加“USART1_RX”DMA配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“SystemCore”中點(diǎn)擊“NVIC”,在右側(cè)的配置頁面“Configura
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度社區(qū)后備干部考試復(fù)習(xí)題庫及答案
- 農(nóng)業(yè)信息化服務(wù)合同及內(nèi)容梳理指南書
- 2025年中藥現(xiàn)代化與國際市場協(xié)同創(chuàng)新研究報(bào)告
- 公司選人用人管理方案(3篇)
- 2025年船舶行業(yè)船舶駕駛培訓(xùn)考核試卷
- 婚內(nèi)財(cái)產(chǎn)保護(hù)協(xié)議書范本
- 2025年基本公共衛(wèi)生服務(wù)知識試題及答案
- 臍橙合作協(xié)議書范本
- 2025至2030中國電子認(rèn)證服務(wù)行業(yè)項(xiàng)目調(diào)研及市場前景預(yù)測評估報(bào)告
- 2025年藥店藥品價格調(diào)整整改措施范文
- 胸外科護(hù)士進(jìn)修總結(jié)
- 2025醫(yī)學(xué)檢驗(yàn)(士)考試真題及答案
- 橋梁建設(shè)中的人工智能應(yīng)用
- Q-JJJ 9002-2025 鐵路建設(shè)項(xiàng)目安全穿透式管理實(shí)施指南
- 血小板減少病人的護(hù)理
- 人工智能時代文藝評論的傳播路徑研究
- 2025年江蘇省蘇豪控股集團(tuán)有限公司人員招聘筆試備考試題及答案詳解1套
- 護(hù)士條例培訓(xùn)課件
- 2025年山東出版集團(tuán)有限公司 山東出版?zhèn)髅焦煞萦邢薰菊衅腹P試參考題庫含答案解析
- (廣東專屬)2024-2025學(xué)年人教版八年級數(shù)學(xué)第二學(xué)期期末模擬試卷(含答案)
- 智能停車場管理系統(tǒng)建設(shè)方案
評論
0/150
提交評論