OpenEdv-开源电子网

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

关于DMA2 Channel5进不了中断的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2021-4-27
在线时间
0 小时
发表于 2021-4-27 09:21:50 | 显示全部楼层 |阅读模式
1金钱
在使用DMA的时候,DMA1_Channel1的配置已经成功,但是当配置DMA2 Channel5的时候,却进不了中断。
DMA2_Channel5  ADC3_Channel7  PF9  



引掉的是另一个成功的DAM


main函数:


int main(void)
{   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//         MYDMA1_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&currentadc1,1);     
        MYDMA2_Config(DMA2_Channel5,(u32)&ADC3->DR,(u32)&currentadc3,1);   
      delay_init();
      uart_init(115200);     
      LED_Init();
      KEY_Init();     
      TPAD_Init(6);
//        Adc1_Init();
        Adc3_Init();
//      TIM2_PWM_Init(T1-1,pre1-1);
      TIM3_PWM_Init(T2-1,pre2-1);
      LCD_Init();
      LCD_Clear(BLACK);     
        while(1)
        {
            printf("currentadc3:%u\r\n",currentadc3);
            printf("adc3:%u\r\n",adcx3[t3]);
            printf("Flag:%u\r\n",DMA_GetITStatus(DMA2_IT_TC5));
            delay_ms(300);
        }     
}

中断
void DMA2_Channel4_5_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA2_IT_TC5)!=RESET)
    {
        adcx3[t3]=currentadc3;
        t3++;
        if(t3==NPT)
        {
            t3=0;
            adc3_flag=1;//ADC采样完成
            DMA_Cmd(DMA2_Channel5, DISABLE);        //失能DMA
        }
        DMA_ClearITPendingBit(DMA2_IT_TC5);
    }
}

DMA

void MYDMA2_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);    //使能DMA传输
   
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
    DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
    DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读取发送到内存//
    DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度为16位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
    DMA_Init(DMA_CHx, &DMA_InitStructure);  //ADC1匹配DMA通道1
   
    DMA_ITConfig(DMA2_Channel5,DMA2_IT_TC5,ENABLE);    //使能DMA传输中断   
   
    //配置中断优先级
    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
    NVIC_Init(&NVIC_InitStructure);   

    DMA_Cmd(DMA2_Channel5,ENABLE);//使能DMA通道
}

串口打印数据:
currentadc3有数据,说明ADC成功,但是却没有传到DMA的数组中

G113~SYW@`0U7VB_IREBU1N.png


G%Z]XF_UXYO%0JJT}{J7)~O.png

BCQ2LAGK70V]9{K`8~EIT`5.png



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

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1999
金钱
1999
注册时间
2021-4-16
在线时间
510 小时
发表于 2021-4-27 11:34:48 | 显示全部楼层
你可以单独配置DMA2-channel5试试
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-4-27 15:21:00 | 显示全部楼层
先单独配置DMA2-channel5,再结合中断去使用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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