搜索
bottom↓
回复: 7

CPU执行其他程序时为何没响应DMA的中断?

[复制链接]

出0入14汤圆

发表于 2020-7-7 16:13:25 | 显示全部楼层 |阅读模式
通过串口给单片机发送命令,执行其他的指令,但是设想的前提是每隔一段时间来计算电流值,通过DMA buffer满了,CPU响应他的中断,如果电流过大,及时关断回路。但是实际执行的时候,CPU一直在执行那个case, 没来响应dma的中断。想问下是为什么?dma的中断优先级设置的是最高的,设置的是0组的,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出16170入6148汤圆

发表于 2020-7-7 16:26:21 来自手机 | 显示全部楼层
打赏!

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

出0入20汤圆

发表于 2020-7-7 16:54:36 | 显示全部楼层
你把中断设置成4,16级中断,并把UART的中断级数填好:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);


        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =rUART2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


出0入20汤圆

发表于 2020-7-7 16:58:13 | 显示全部楼层
                /* Enable DMA1 channel6 IRQ Channel */
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);

出0入20汤圆

发表于 2020-7-7 17:02:09 | 显示全部楼层
这是STM32F151的采集ADC 数据,并发送的实例。

//分配16级中断的优先级        ,不设置自动按硬件优先级处理! USART1_IRQChannel
void Set_NVIC_SUB(void){
        NVIC_InitTypeDef NVIC_InitStructure;
    // Configure the NVIC Preemption Priority Bits 2012-7-23 设置成4位=16级嵌套中断!
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       
          /* TIM3 IRQChannel enable */  
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =4;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
          /* TIM9 IRQChannel enable */  
  NVIC_InitStructure.NVIC_IRQChannel = TIM9_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /* Enable DMA1 channel6 IRQ Channel */
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

  /* TIM2 IRQChannel enable */  
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
}

出0入20汤圆

发表于 2020-7-7 17:09:44 | 显示全部楼层
另外还要看DMA的中断初始化程序,以及中断处理程序。

出0入20汤圆

发表于 2020-7-7 17:11:44 | 显示全部楼层
/*********************************************************************
分配DMA3位DAC2服务!
输入Flash的数据表格地址,和长度!

**********************************************************************/
void DMA_SetChannel3_for_DAC2(const unsigned short *flashAdr,unsigned int cnt){
                DMA_InitTypeDef            DMA_InitStructure;       
       
                DMA_DeInit(DMA1_Channel3);
                DMA_InitStructure.DMA_PeripheralBaseAddr =(unsigned int)&(DAC->DHR12R2);   //指向右对齐寄存器12位
                DMA_InitStructure.DMA_MemoryBaseAddr =(u32)flashAdr;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
                DMA_InitStructure.DMA_BufferSize = cnt;
       
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;               //数据采用覆盖方式
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
                DMA_Init(DMA1_Channel3, &DMA_InitStructure);
                /* Enable DMA1 Channel3 */
                DMA_Cmd(DMA1_Channel3, ENABLE);
}

/*************************************************************************************
分配DMA2位DAC1服务!
输入Flash的数据表格地址,和长度!
**************************************************************************************/
void DMA_SetChannel2_for_DAC1(const unsigned short *flashAdr,unsigned int cnt){
                DMA_InitTypeDef            DMA_InitStructure;       
       
                DMA_DeInit(DMA1_Channel2);
                DMA_InitStructure.DMA_PeripheralBaseAddr =(unsigned int)&(DAC->DHR12R1);   //指向右对齐寄存器12位
                DMA_InitStructure.DMA_MemoryBaseAddr =(u32)flashAdr;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
                DMA_InitStructure.DMA_BufferSize = cnt;
       
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;               //数据采用覆盖方式
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
                DMA_Init(DMA1_Channel2, &DMA_InitStructure);
                /* Enable DMA1 Channel3 */
                DMA_Cmd(DMA1_Channel2, ENABLE);
}
/*************************************************************************************************
定时器6触发,同步输出DAC1,DAC2
必须事先生成双字节数据表在Flash里。 DAC_DHR12RD
**************************************************************************************************/
void DMA_Set_for_DAC12(unsigned int *flashAdr,unsigned int cnt){
       
                DMA_InitTypeDef            DMA_InitStructure;       
       
                DMA_DeInit(DMA1_Channel3);
                DMA_InitStructure.DMA_PeripheralBaseAddr =(unsigned int)&(DAC->DHR12RD);   //指向右对齐寄存器12位
                DMA_InitStructure.DMA_MemoryBaseAddr =(u32)flashAdr;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
                DMA_InitStructure.DMA_BufferSize = cnt;
       
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;               //数据采用覆盖方式
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
                DMA_Init(DMA1_Channel3, &DMA_InitStructure);
                /* Enable DMA1 Channel3 */
                DMA_Cmd(DMA1_Channel3, ENABLE);
}
//**************************************************************************
//DMA for ADC
//DMA 1 为ADC-1-2服务
void DMA_SetChannel1_for_ADC1(unsigned short *pBuf,unsigned int cnt){
                DMA_InitTypeDef                    DMA_InitStructure;       
         /* DMA1 channel1 configuration */
                DMA_DeInit(DMA1_Channel1);
                DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&(ADC1->DR);
                DMA_InitStructure.DMA_MemoryBaseAddr = (unsigned int)pBuf;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        //adc-->ram
                DMA_InitStructure.DMA_BufferSize = cnt;
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable;// DMA_MemoryInc_Disable;//当前存储器地址不变!
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;                         //传送完毕后产生中断,并停止!
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
                DMA_Init(DMA1_Channel1, &DMA_InitStructure);
                /* Enable DMA1 Channel6 Transfer Complete interrupt */
                DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);       
       
                /* Enable DMA1 channel1 */
    DMA_Cmd(DMA1_Channel1, DISABLE);
}
//**************************************************************************
//DMA 1 为ADC-3ch-6ch服务
void DMA_SetChannel1_for_ADC3(unsigned short *pBuf,unsigned int cnt){
                DMA_InitTypeDef                    DMA_InitStructure;       
         /* DMA1 channel1 configuration */
                DMA_DeInit(DMA1_Channel1);
                DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&(ADC1->DR);
                DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&pBuf;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;        //adc-->ram
                DMA_InitStructure.DMA_BufferSize = cnt;
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable;
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
                DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;                         //传送完毕后产生中断,并停止!
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
                DMA_Init(DMA1_Channel1, &DMA_InitStructure);
                /* Enable DMA1 Channel6 Transfer Complete interrupt */
                DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, DISABLE);       
                /* Enable DMA1 channel1 */
                DMA_Cmd(DMA1_Channel1, ENABLE);
}




出0入14汤圆

 楼主| 发表于 2020-7-7 18:02:31 | 显示全部楼层
mon51 发表于 2020-7-7 17:11
/*********************************************************************
分配DMA3位DAC2服务!
输入Flas ...

哈哈,我想错了,其实之前设置的是对的,只是我只是设置的一个标志位,之前觉得太多计算放在中断函数里面不太好,然后挪到其他的地方去了,然后现在计算电流值的函数在其他地方。设置了更高的优先级后,标志位其实是置位了,当然这个标志位就算置位,其他地方的函数也不会马上计算电流值显示出来了,怪不得我没看到电流值显示出来,还以为他没进到中断里面呢。现在改成其他方式处理了,已经解决了。谢谢你的代码!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 22:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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