stm32f407无法进入中断

2019-07-20 23:26发布

在做407实验的时候用查询法DMA可以成功,我改成中断方式就失败了,
#include "dma.h"
#include "sys.h"

/*****************************************************************
*函数名:MYDMA_Config
*说明:DMA配置
*输入: *DMA_Streamx  DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
*      chxMA数据流的通道选择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;
}



各位麻烦看一下我的配置有什么问题

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。