DMA使用
直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
1.初始化DMA
2.配置中断
3.实验结果
1.初始化DMA
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟
NVIC_Config(); //配置DMA
/*设置DMA源:内存地址&串口数据寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
/*内存地址(要传输变量的指针)*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
/*方向:从内存到外设*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
/*传输大小DMA_BufferSize=SENDBUFF_SIZE*/
DMA_InitStructure.DMA_BufferSize = SENDBUFF_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模式,一次传输,循环*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
/*优先级中*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
/*禁止内存到内存的传输 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/*配置DMA1的4通道*/
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断
}
2.配置中断
static void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置P[A|B|C|D|E]为中断源 */
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);
}
中断handle
void DMA1_Channel4_IRQHandler(void)
{
//判断是否发送完成
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
{
//LED关闭
LED1(ON);
printf("DMA1_Channel4_IRQHandler");
DMA_ClearFlag(DMA1_FLAG_TC4);
}
}
main.c
#include "stm32f10x.h"
#include "led.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "usart.h"
#include <stdio.h>
#include "stm32f10x_dma.h"
extern uint8_t SendBuff[SENDBUFF_SIZE];
void Delay(uint32_t nCount){
uint32_t i;
for(i=0;i<nCount;i++);
}
int main(){
uint32_t i;
LED_GPIO_Config();
USART1_Config();
DMA_Config();
/*开始数据填充*/
for(i=0;i<SENDBUFF_SIZE;i++)
{
SendBuff[i] = 0xff;
}
//开始传输.此时没有占CPU.当数据传输完成,触发中断
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
//开灯
LED1(ON);
while(1);
}
3.实验结果
LED亮 -> 数据传输完成 -> 触发中断 -> LED关
源代码:http://download.youkuaiyun.com/detail/aa375809600/9717144