初级会员

- 积分
- 61
- 金钱
- 61
- 注册时间
- 2014-5-27
- 在线时间
- 8 小时
|
1金钱
在做407实验的时候用查询法DMA可以成功,我改成中断方式就失败了,
#include "dma.h"
#include "sys.h"
/*****************************************************************
*函数名:MYDMA_Config
*说明:DMA配置
*输入: *DMA_Streamx DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
* chx MA数据流的通道选择DMA_Channel_0~DMA_Channel_7
* par:外设地址
* mar:存储器地址
* ndtr:数据传输量
*输出:无
******************************************************************/
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if(((u32)DMA_Streamx)>((u32)(DMA2)))
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); /*使能DMA2时钟*/
}
else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); /*使能DMA1时钟*/
}
DMA_DeInit(DMA_Streamx); /*将数据流初始化*/
while(DMA_GetCmdStatus(DMA_Streamx) != DISABLE); /*等待数据流可以配置*/
/******配置DMA的数据流*********/
DMA_InitStructure.DMA_Channel = chx; /*配置数据流的通道*/
DMA_InitStructure.DMA_PeripheralBaseAddr = par; /*配置DMA外设地址*/
DMA_InitStructure.DMA_Memory0BaseAddr = mar; /*配置DMA存储器0的地址*/
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /*配置DMA的数据方向为存储器到外设*/
DMA_InitStructure.DMA_BufferSize = ndtr; /*配置DMA的数据传输量*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*完成1次传输以后外设地址不增量*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*完成1次数据传输以后内存地址增量*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*设置外设数据长度为Byte*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*设置内存数据长度为Byte*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*设置DMA工作在单词模式下*/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*设置数据流的优先级为中等优先级*/
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /*不使能FIFO模式*/
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /*存储器突发单次传输*/
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /*外设突发单次传送*/
DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
}
/****************************************************************************
*函数名:MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
*说明:触发1次DMA传输
*输入: DMA_Streamx 需要触发的数据源
* ndtr传输的数据量
*输出:无
*****************************************************************************/
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
DMA_Cmd(DMA_Streamx, DISABLE); /*关闭DMA传输 */
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} /*确保DMA可以被设置*/
DMA_SetCurrDataCounter(DMA_Streamx,ndtr); /*数据传输量 */
DMA_Cmd(DMA_Streamx, ENABLE); /*开启DMA传输*/
}
int main(void)
{
u8 t = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
KEY_Init();
MYDMA_Config(DMA2_Stream7,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,外设为串口1,存储器为SendBuff,长度为:SEND_BUF_SIZE.
while(1)
{
t=KeyScan(0);
if(t==KEY0_PRES) //KEY0按下
{
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能串口1的DMA发送
DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE);
MYDMA_Enable(DMA2_Stream7,10); //开始一次DMA传输!
}
if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)//等待DMA2_Steam7传输完成
{
DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);//清除DMA2_Steam7传输完成标志
LED0 = !LED0;
}
}
}
void DMA2_Stream7_IRQnHandler(void)
{
if((DMA2->HISR)&(1<<27) )
{
LED1 = !LED1;
}
DMA2->HIFCR = 1<<27;
}
各位麻烦看一下我的配置有什么问题
|
|