123
返回列表 发新帖
楼主: retome

[已解决] k60 mk60fx512dn 的adc2的DMA如何配置(已解决)

[复制链接]

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-19 10:21:05 | 显示全部楼层
retome 发表于 2014-12-18 17:25
如何在IAR打开MK60FX512的硬件浮点运算,好像我一选上这个VFPv4选项,我就无法启动PDB模块!! ...

应该是直接勾选VFPv4,你说你无法启动PDB是什么情况呢?
有没有跟踪PDB的寄存器?
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-19 16:32:05 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-19 10:21
应该是直接勾选VFPv4,你说你无法启动PDB是什么情况呢?
有没有跟踪PDB的寄存器? ...

进入PDB初始化函数就出错了,无法进行下一步,usart一直发出硬件中断的错误,不选vfpv4,就不会出现这种情况
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-19 16:32:57 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-19 10:21
应该是直接勾选VFPv4,你说你无法启动PDB是什么情况呢?
有没有跟踪PDB的寄存器? ...

屏蔽PDB_init就正常
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-19 16:34:00 | 显示全部楼层
static void PDB_init()
{
        //**********************************************//
        //Step 3.配置PDB,用于触发ADC
        pdb_init_struct.PDB_CounterPeriodUs = 50;                               //PDB计数器周期,这个决定了4个通道每采集一次的间隔
        pdb_init_struct.PDB_LoadModeSel = LOADMODE_0;
        pdb_init_struct.PDB_ContinuousModeEnable = TRUE ;                       //使能连续工作模式,即只需要开始触发一次,以后PDB就会连续工作
        pdb_init_struct.PDB_TriggerInputSourceSel = TRIGGER_SOFTWARE;           //TRIGGER_PIT0; //软件触发模式,即不需要用其他模块触发PDB工作
      
        
        /*PDB中断相关*/
        pdb_init_struct.PDB_Isr = PDB_IRQHandler;
       //pdb_init_struct.PDB_IntEnable = TRUE;
       //pdb_init_struct.PDB_DelayMs = 500;
        
        //初始化PDB
        LPLD_PDB_Init(pdb_init_struct);
        //配置PDB预触发功能
        
        //使能ADC2-A组的预触发功能
        LPLD_PDB_AdcTriggerCfg(ADC2, PRETRIG_EN_A|PRETRIG_DLY_A, 0);
        
        //LPLD_PDB_AdcTriggerCfg(ADC2, PRETRIG_EN_A|PRETRIG_DLY_A, 0);
        //使能ADC0-A组的预触发功能
        LPLD_PDB_AdcTriggerCfg(ADC0, PRETRIG_EN_A|PRETRIG_DLY_A, 0);                   //测试,此处不能配置为BB,否则不能采集
        //使能ADC0-B组的预触发功能,并使用Back to Back模式
        LPLD_PDB_AdcTriggerCfg(ADC0, PRETRIG_BB_B|PRETRIG_EN_B|PRETRIG_DLY_B, 0);      //延时最好设为0,否则,不够准确
        //使能ADC1-A组的预触发功能,并使用Back to Back模式
        LPLD_PDB_AdcTriggerCfg(ADC1, PRETRIG_BB_A|PRETRIG_EN_A|PRETRIG_DLY_A, 0);
        //使能ADC1-B组的预触发功能,并使用Back to Back模式
        LPLD_PDB_AdcTriggerCfg(ADC1, PRETRIG_BB_B|PRETRIG_EN_B|PRETRIG_DLY_B, 0);
        //软件触发PDB开始工作
        LPLD_PDB_SoftwareTrigger();
        
        //temp_pdmod   = PDB0->MOD;
        //初始化PIT参数
        //pit0_init_struct.PIT_Pitx = PIT0;                                     //选择PIT0
        //pit0_init_struct.PIT_PeriodUs = 50;                                   //PIT0计数周期500ms
        //初始化PIT0
        //LPLD_PIT_Init(pit0_init_struct);
}
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-19 16:34:26 | 显示全部楼层
uint8 LPLD_PDB_Init(PDB_InitTypeDef pdb_init_struct)
{
  uint32 us = pdb_init_struct.PDB_CounterPeriodUs
            + pdb_init_struct.PDB_CounterPeriodMs*1000
            + pdb_init_struct.PDB_CounterPeriodS*1000000;
  uint32 delayus = pdb_init_struct.PDB_DelayUs
            + pdb_init_struct.PDB_DelayMs*1000
            + pdb_init_struct.PDB_DelayS*1000000;
  uint8 loadmode = pdb_init_struct.PDB_LoadModeSel;
  uint8 trriger = pdb_init_struct.PDB_TriggerInputSourceSel;
  //g_bus_clock   =   bus_clk_khz*1000;
  uint32 bus_clk = g_bus_clock/1000000;
  uint8 prescaler, mult;
  uint32 mod;
  float32 temp;
  
  //参数检查
  ASSERT( loadmode <= LOADMODE_3 );       //加载模式选择
  ASSERT( trriger <= TRIGGER_SOFTWARE );  //触发输入源选择
  
/*
*************************************************
  【LPLD注解】PDB关键系数
  prescaler(总线时钟预分频系数): 2^n(n:0~7)
  mult(prescaler的倍数): 1、10、20、40
  mod(计数器模数,影响计数器周期): 0~0xFFFF
  计数器周期 = (prescaler*mult*mod)/bus_clk
*************************************************
*/
  
  //根据期望的计数器周期自动设定prescaler、mult和mod的值
  for(uint8 i=0; i<4; i++)
  {
    mult = i;
    for(uint8 j=0; j<8; j++)
    {
      prescaler = j;
      mod = (bus_clk*us)/((1<<j)*pdb_sc_mults[i]);
      if(mod <= 0xFFFFu)
        break;
    }
    if(mod <= 0xFFFFu)
      break;
    else if(i == 3)
      return 0;         //PDB计数周期设置的过小,计算错误
  }
  
  //使能PDB时钟
  SIM_SCGC6 |= SIM_SCGC6_PDB_MASK;
  
  //初始化SC寄存器
  PDB0->SC = 0x00;
  //使能PDB
  PDB0->SC |= PDB_SC_PDBEN_MASK;
  PDB0->SC |= PDB_SC_MULT(mult);
  PDB0->SC |= PDB_SC_PRESCALER(prescaler);
  //配置MOD、IDLY、CHnDLYm、INTx和POyDLY寄存器的加载模式
  PDB0->SC |= PDB_SC_LDMOD(loadmode);
  //配置触发输入源
  PDB0->SC |= PDB_SC_TRGSEL(trriger);
  
  //是否使能连续模式
  if(pdb_init_struct.PDB_ContinuousModeEnable == TRUE)
    PDB0->SC |= PDB_SC_CONT_MASK;
  else
    PDB0->SC &= ~(PDB_SC_CONT_MASK);
  
  //是否使能DMA
  if(pdb_init_struct.PDB_DmaEnable == TRUE)
    PDB0->SC |= PDB_SC_DMAEN_MASK;
  else
    PDB0->SC &= ~(PDB_SC_DMAEN_MASK);
  
  if(pdb_init_struct.PDB_Isr != NULL)
  {
    PDB_ISR[0] = pdb_init_struct.PDB_Isr;
    //是否使能PDB中断
    if(pdb_init_struct.PDB_IntEnable == TRUE)
      PDB0->SC |= PDB_SC_PDBIE_MASK;
    else
      PDB0->SC &= ~(PDB_SC_PDBIE_MASK);
  }
  
  if(pdb_init_struct.PDB_SeqErrIsr != NULL)
  {
    PDB_SE_ISR[0] = pdb_init_struct.PDB_SeqErrIsr;
    //是否使能PDB序列错误中断
    if(pdb_init_struct.PDB_SeqErrIntEnable == TRUE)
      PDB0->SC |= PDB_SC_PDBEIE_MASK;
    else
      PDB0->SC &= ~(PDB_SC_PDBEIE_MASK);
  }
  
  //设置PDB中断延时时间
  if( delayus <= us )
  {
    temp = (float32)mod/(float32)us;
    PDB0->IDLY = (uint32)(delayus*temp);
  }
  
  
  //set_vector_handler(PDB0_IRQn , PDB_IRQHandler);
  //加载值
  PDB0->SC |= PDB_SC_LDOK_MASK;
  
  return 1;
}
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-19 16:35:19 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-19 10:21
应该是直接勾选VFPv4,你说你无法启动PDB是什么情况呢?
有没有跟踪PDB的寄存器? ...

后面是我的源代码,PDB初始化函数,
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-19 16:37:00 | 显示全部楼层
retome 发表于 2014-12-19 16:32
进入PDB初始化函数就出错了,无法进行下一步,usart一直发出硬件中断的错误,不选vfpv4,就不会出现这种情 ...

楼主,其实这个是一个新问题,你能不能重新发一个帖子出来呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 20:35 , Processed in 0.097523 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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