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

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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版