OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5125|回复: 3

stm32f407无法进入中断

[复制链接]

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-5-27
在线时间
8 小时
发表于 2016-3-16 18:18:34 | 显示全部楼层 |阅读模式
1金钱
在做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;
}



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

DMA.zip

6.32 MB, 下载次数: 96

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-5-27
在线时间
8 小时
 楼主| 发表于 2016-3-16 18:45:08 | 显示全部楼层
自己顶上来,给位加油
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-5-27
在线时间
8 小时
 楼主| 发表于 2016-3-16 20:13:45 | 显示全部楼层
贴上我的配置文件上面有点错误
[mw_shl_code=applescript,true]void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
          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 Stream */
  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_InitStructure.DMA_BufferSize = ndtr;//数据传输量
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  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
               
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TCIF0);
  DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE);
  //DMA_Cmd(DMA2_Stream7, ENABLE);
}
//开启一次DMA传输
//DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//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传输
}          [/mw_shl_code]
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-5-27
在线时间
8 小时
 楼主| 发表于 2016-3-16 20:14:31 | 显示全部楼层
问题在于不能够进入中断,我在中断里面清除标志位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表