你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0多通道轮进入EOC死等待

[复制链接]
keed 提问时间:2016-11-21 16:56 /
最近在使用STM32F0做一个AVR控制简单逻辑,比较奇怪的是,只开启前8个通道一切正常,大于8个以上会进入死EOC死等待,读取AD使用同一个函数,具体如下:

void STM32_RCC_Init(void)
{

        RCC->CR |= RCC_CR_HSION;
        while((RCC->CR&RCC_CR_HSIRDY)== 0);
//        RCC->CFGR |= RCC_CFGR_SWS_PLL;
//        RCC->CFGR |= RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV2;
        RCC->CFGR |= RCC_CFGR_PLLSRC_HSI_DIV2;
        RCC->CFGR |= RCC_CFGR_SW_PLL;
        RCC->CFGR |= RCC_CFGR_PLLMUL12;
        RCC->CR |= RCC_CR_PLLON;
        while((RCC->CR&RCC_CR_PLLRDY) == 0);
//        RCC->APB2RSTR |= RCC_APB2RSTR_TIM16RST;
//        RCC->APB2RSTR |= RCC_APB2RSTR_TIM1RST;
//        RCC->APB2RSTR |= RCC_APB2RSTR_ADCRST;
       
        RCC->AHBENR = RCC->AHBENR|RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOBEN\
                      |RCC_AHBENR_GPIOCEN|RCC_AHBENR_GPIODEN;
        RCC->APB2ENR = RCC->APB2ENR|RCC_APB2ENR_SYSCFGCOMPEN\
                      |RCC_APB2ENR_ADCEN|RCC_APB2ENR_TIM16EN|RCC_APB2ENR_TIM1EN;
       
        RCC->CR2 |= RCC_CR2_HSI14ON;
       
        while(RCC_CR2_HSI14RDY == 0);       
}


void STM32_GPIO_Init(void)
{
        GPIOA->MODER = 0x6955ffff;
//        GPIOA->MODER = 0x2800ffff;
        GPIOB->MODER = 0x55565557;
        GPIOB->AFR[1] = 0x02;
       
        GPIOC->MODER = 0x00115fff;
       
        GPIOD->MODER = 0x00000010;
       
}


void STM32_ADC_Init(void)
{
        ADC1->SMPR |= ADC_SMPR_SMP_2|ADC_SMPR_SMP_0;
        ADC1->CR |= ADC_CR_ADCAL;
        while(((ADC1->CR)&ADC_CR_ADCAL) != 0);
        ADC1->CFGR1 |=  ADC_CFGR1_OVRMOD;
        ADC1->CR |= ADC_CR_ADEN;
        while(((ADC1->ISR)&ADC_ISR_ADRDY) == 0);
}



//读取AD值函数
unsigned short ADConvertValues(unsigned char ADChanel)
{
        unsigned char ADC_DelayCNT = 0;
        while(((ADC1->ISR)&ADC_ISR_ADRDY) == 0);
        ADC1->CHSELR = (1<<ADChanel);
        ADC1->CR |= ADC_CR_ADSTART;
        while (!((ADC1->ISR) & ADC_ISR_EOC));
        /*
        {
                ADC_DelayCNT++;
                if(ADC_DelayCNT>250)
                {
                        return ADC1->DR;
                }
        }
        */
        return ADC1->DR;
}


//前面8通道读取在定时器TIM1里面做的,一切正常。
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
  static unsigned short PowButtonCheckcnt;
  static unsigned short PageDownCheckcnt;
  static unsigned short LcdCnt;
  unsigned short DataTep;
  unsigned short DataTepA;
        unsigned short DataTepB;
        unsigned short DataTepC;
  unsigned long DataComp;
  unsigned char ADCCH;
  TIM1->SR = 0x00;
  McLedBoostOn;       
  for(ADCCH=0;ADCCH<9;ADCCH++)
  {
                DataTep = ADConvertValues(ADCCH);
    if(DataTep >= AdOffSetValue)
    {
       DataTep = DataTep - AdOffSetValue;
    }
    else
    {
       DataTep = AdOffSetValue - DataTep;
    }
    DataComp = DataTep;
    DataComp = DataComp*DataTep;

    switch(ADCCH)
    {
     //InputVoltageRMS/
                        case 0:
        NewInPutAPhaseVoltageBuff = NewInPutAPhaseVoltageBuff+DataComp;
      break;
                        case 1:
        NewInPutBPhaseVoltageBuff = NewInPutBPhaseVoltageBuff+DataComp;
      break;
                        case 2:
        NewInPutCPhaseVoltageBuff = NewInPutCPhaseVoltageBuff+DataComp;
      break;
                       
                        //OutputVoltageRMS/  
                        case 3:
        NewOutPutAPhaseVoltageBuff = NewOutPutAPhaseVoltageBuff+DataComp;
        DataTepA = DataTep;
      break;
                        case 4:
        NewOutPutBPhaseVoltageBuff = NewOutPutBPhaseVoltageBuff+DataComp;
        DataTepB = DataTep;
      break;
                        case 5:
        NewOutPutCPhaseVoltageBuff = NewOutPutCPhaseVoltageBuff+DataComp;
        DataTepC = DataTep;
      break;
                       
                        //OutputVoltageCurrent/
                        case 6:
        NewOutPutAPhaseCurrentBuff = NewOutPutAPhaseCurrentBuff+DataComp;
        DataComp = DataTepA;
        DataComp = DataComp*DataTep;
        NewOutPutAPhaseWatBuff = NewOutPutAPhaseWatBuff+DataComp;
      break;
                        case 7:
        NewOutPutBPhaseCurrentBuff = NewOutPutBPhaseCurrentBuff+DataComp;
        DataComp = DataTepB;
        DataComp = DataComp*DataTep;
        NewOutPutBPhaseWatBuff = NewOutPutBPhaseWatBuff+DataComp;
      break;
                        case 8:
        NewOutPutCPhaseCurrentBuff = NewOutPutCPhaseCurrentBuff+DataComp;
        DataComp = DataTepC;
        DataComp = DataComp*DataTep;
        NewOutPutCPhaseWatBuff = NewOutPutCPhaseWatBuff+DataComp;
      break;
    }
   }
   AD_CONV_CNT++;
         NTC_Check_Funcion();
   if(AD_CONV_CNT == 0x36)
   {
      GPIOA->BRR =  (~(unsigned short)(AVRControl_REG<<8))&0xff00;
   }
   if(AD_CONV_CNT == 0x4a)
   {
     if(New_mode != OutRang_mode)
     {
        GPIOA->BSRR = (unsigned short)(AVRControl_REG<<8)&0xff00;
     }
   }

}

//后面8通道用于NTC采样,只要开启一组就有问题,无论该函数放在中断也好,主函数也好,采取单通道扫描也会出现一样问题。

void NTC_Check_Funcion(void)
{
        switch(NTC_AD_CNT)
        {
                case 9:
                        NTC_RSCR_Ad_Buff = NTC_RSCR_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 10:
                        NTC_SSCR_Ad_Buff = NTC_SSCR_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 11:
                        NTC_TSCR_Ad_Buff = NTC_TSCR_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 12:
                        NTC_RTX_Ad_Buff = NTC_RTX_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 13:
                        NTC_STX_Ad_Buff = NTC_STX_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 14:
                        NTC_TTX_Ad_Buff = NTC_TTX_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
                case 15:
                        NTC_ENV_Ad_Buff = NTC_ENV_Ad_Buff+ADConvertValues(NTC_AD_CNT);
                break;
        }       
        NTC_AD_CNT++;
        if(NTC_AD_CNT == 10)
        {
                NTC_AD_CNT = 9;
                NTC_CheckCnt ++;
        }
  if(NTC_CheckCnt == 16)
  {
    NTC_CheckCnt = 0;
    NTC_RSCR_Ad_Buff = NTC_RSCR_Ad_Buff>>4;
          NTC_SSCR_Ad_Buff = NTC_SSCR_Ad_Buff>>4;
                NTC_TSCR_Ad_Buff = NTC_TSCR_Ad_Buff>>4;
                NTC_RTX_Ad_Buff = NTC_RTX_Ad_Buff>>4;
                NTC_STX_Ad_Buff = NTC_STX_Ad_Buff>>4;
                NTC_TTX_Ad_Buff = NTC_TTX_Ad_Buff>>4;
                NTC_ENV_Ad_Buff = NTC_ENV_Ad_Buff>>4;
               
    NTC_RSCR_Level = NTC_Level_Dect(NTC_RSCR_Ad_Buff);
                NTC_SSCR_Level = NTC_Level_Dect(NTC_SSCR_Ad_Buff);
                NTC_TSCR_Level = NTC_Level_Dect(NTC_TSCR_Ad_Buff);
                       
                NTC_RTX_Level = NTC_Level_Dect(NTC_RTX_Ad_Buff);
                NTC_STX_Level = NTC_Level_Dect(NTC_STX_Ad_Buff);
                NTC_TTX_Level = NTC_Level_Dect(NTC_TTX_Ad_Buff);
                       
                NTC_ENV_Level = NTC_Level_Dect(NTC_ENV_Ad_Buff);
                       
                NTC_RSCR_Ad_Buff = 0;
                NTC_SSCR_Ad_Buff = 0;
                NTC_TSCR_Ad_Buff = 0;
                NTC_RTX_Ad_Buff = 0;
                NTC_STX_Ad_Buff = 0;
                NTC_TTX_Ad_Buff = 0;
                NTC_ENV_Ad_Buff = 0;
               
    if((NTC_RSCR_Level == 0xff)||(NTC_SSCR_Level == 0xff)||(NTC_TSCR_Level == 0xff)\
                        ||(NTC_RTX_Level == 0xff)||(NTC_STX_Level == 0xff)||(NTC_TTX_Level == 0xff)\
                        ||(NTC_ENV_Level == 0xff))
                {
                        STAT_FLAGE.TepError = 1;
                }
  }   
}


收藏 1 评论15 发布时间:2016-11-21 16:56

举报

15个回答
assssdz 回答时间:2016-11-21 21:09:55
keed 回答时间:2016-11-21 22:11:05
没人用寄存器版本操作吗,个人觉得寄存器执行效率还是会高一点
peter001 回答时间:2016-11-22 00:34:34
顶一下
无薪税绵 回答时间:2016-11-24 08:23:41
会不会是堆栈溢出了吧。
z258121131 回答时间:2016-11-24 08:57:41
不明觉厉
lulugl 回答时间:2016-11-24 09:10:22
学习学习再学习
myfocus-2048857 回答时间:2016-11-24 09:19:28
楼主,建议下,把你贴出的代码 放到一个文件中,添加附件

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wolfgang 回答时间:2016-11-24 09:33:30
AVR控制?
是不是中断状态没有释放?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

斜阳 回答时间:2016-11-24 09:35:13
mark等待结果
Paderboy 回答时间:2016-11-24 10:07:40
不会寄存器的,飘过。。
五哥1 回答时间:2016-11-24 10:39:39
分析寄存器太麻烦了,
囧囧 回答时间:2016-11-24 11:04:26
用寄存器,没注释,得去找手册一个个对着分析,可移植性太差。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zbber 回答时间:2016-11-24 14:31:41
顶一下,楼主威武,强烈支持……
飞翔的荷兰人号 回答时间:2016-11-26 10:53:35
switch语句没有default是很危险的,建议加上

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版