9976|4

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103ADC+DMA和UART2中断冲突问题求助 [复制链接]

程序中使用了TIM2,UART1,UART2和ADC+DMA1中断,不加上UART2时都正常,加上UART2中断后,运行几分钟后ADC+DMA1的中断就不能进去了,更改了几种中断优先级方式后都没有解决。请大家看看是什么原因?
void NVIC_Configuration(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  /* Enable the TIM2 gloabal Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
  /* Enable the DMA channel1 gloabal Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);  
  /* Enable Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);  
  /* Enable Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//   NVIC_Init(&NVIC_InitStructure);  
}
此帖出自stm32/stm8论坛

最新回复

楼主怎么解决了   详情 回复 发表于 2017-10-11 22:23
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
但定时中断一直能正常运行,启动ADC,
void TIM2_IRQHandler(void)
{
static INT16U count = 0;

  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    // Start ADC1 Software Conversion     
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + TimerCount_500);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
  }
}
此帖出自stm32/stm8论坛
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
void DMA1_Channel1_IRQHandler(void)
{
        static INT8U        channel = 0;
        static INT8U        vchannel = 0;

        if(DMA_GetITStatus(DMA1_IT_TC1)==SET)
        {
        gAllSampleData[channel]= ADC_ConvertedValue[0]&0x0fff;                 //ADC_IN0
        gVSampleData[vchannel] = ADC_ConvertedValue[1]&0x0fff;                 //ADC_IN1
        gDCSampleData[channel] = ADC_ConvertedValue[2]&0x0fff;                 //ADC_IN8
        if(++channel ==4){
              //一次的采样完成,设置数据处理标志位
            channel = 0;
              ADFinished = TRUE;
        }
          else {
              ADC_SoftwareStartConvCmd(ADC1,ENABLE);                                      /* Start ADC1 Software Conversion     */
        }
           DMA_ClearITPendingBit(DMA1_IT_TC1);       
        }
        else if(DMA_GetITStatus(DMA1_IT_HT1)==SET)
        {
           DMA_ClearITPendingBit(DMA1_IT_HT1);
        }

}

void USART1_IRQHandler(void)
{

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                UART1_Rec_Isr();
                /* Clear the USART1 Receive interrupt */
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        }
        else if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
        {
                UART1_Send_Isr();
                /* Clear the USART1 Receive interrupt */
                USART_ClearITPendingBit(USART1, USART_IT_TXE);
        }
}

/*******************************************************************************
* Function Name  : USART2_IRQHandler
* Description    : This function handles USART2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
                UART2_Rec_Isr();
                /* Clear the USART1 Receive interrupt */
                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        }
        else if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
        {
                UART2_Send_Isr();
                /* Clear the USART1 Receive interrupt */
                USART_ClearITPendingBit(USART2, USART_IT_TXE);
        }
}
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 路过
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主怎么解决了
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表