OpenEdv-开源电子网

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

stm32的dma的中断怎么进入呀

[复制链接]

17

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2021-9-6
在线时间
59 小时
发表于 2022-1-25 10:58:05 | 显示全部楼层 |阅读模式
1金钱
void ADC_DMA_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    DMA_InitTypeDef DMA_InitStructure; // ×¢£ºADCΪ12λģÊýת»»Æ÷£¬Ö»ÓÐADCConvertedValueµÄµÍ12λÓÐЧ

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//ʹÄÜDMAʱÖÓ
   
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;//´®¿Ú1ÊÇDMA1_4ͨµÀ ADC
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ǿռ0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//×Ó1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);


    DMA_DeInit(DMA1_Channel1);  
   
// DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//DMA¶ÔÓ¦µÄÍâÉè»ùµØÖ·
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//DMA¶ÔÓ¦µÄÍâÉè»ùµØÖ·
        
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab; //ÄÚ´æ´æ´¢»ùµØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMAµÄת»»Ä£Ê½ÎªSRCģʽ£¬ÓÉÍâÉè°áÒÆµ½ÄÚ´æ
  DMA_InitStructure.DMA_BufferSize = 32;//DMA»º´æ´óС£¬1¸ö
  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; //DMA°áÒÆÊý¾Ý³ß´ç£¬HalfWord¾ÍÊÇΪ16λ
  DMA_InitStructure.DMA_Mode =DMA_Mode_Normal;//Ñ­»·×ª»»Ä£Ê½
   
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMAÓÅÏȼ¶¸ß
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//M2Mģʽ½ûÓÃ
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);         
  DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);//ʹÄÜ´«ÊäÍê³ÉÖжÏ
  DMA_Cmd(DMA1_Channel1, ENABLE);

}

void  DMA1_Channel1_IRQHandler(void)         // ʹÓÃDMAÖжϲɼ¯Êý¾Ý£¬²»»áÈÝÒ×¶ªÊ§Êý¾Ý
{
   if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET)
         {                                    
         DMA_ClearITPendingBit(DMA1_IT_TC1);
               flag=1;                              //×Ô¼ºµÄÖжϴ¦Àí´úÂë µ«ÊǼÇס³ÌÐò²»ÒªÌ«¸´ÔÓ  ×îºÃ²»Òª³¬¹ýÖжÏʱ¼ä
            
     }
}
这是dma的配置的,主程序就正常的打印缓存里的数据,但是只能打印一次,然后从正常模式改为循环模式,就能一直输出数据,是不是说明在正常模式下就只进入了一次中断?
下面是主程序的一部分
while(1)
     {
         if(flag)
         {
             flag=0;
                     for( int i=0;i<32;i++)
                    {
                        printf("%d ",ADC_RegularConvertedValueTab[i]);   
            
                    }            printf("\r\n  \r\n");
         }
     }



最佳答案

查看完整内容[请看2#楼]

是的,就是这个意思
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2146

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4886
金钱
4886
注册时间
2015-1-10
在线时间
611 小时
发表于 2022-1-25 10:58:06 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 18:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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