コード例 #1
0
ファイル: fsl_dac.c プロジェクト: Archcady/mbed-os
void DAC_SetBufferConfig(DAC_Type *base, const dac_buffer_config_t *config)
{
    assert(NULL != config);

    uint8_t tmp8;

    /* DACx_C0. */
    tmp8 = base->C0 & ~(DAC_C0_DACTRGSEL_MASK);
    if (kDAC_BufferTriggerBySoftwareMode == config->triggerMode)
    {
        tmp8 |= DAC_C0_DACTRGSEL_MASK;
    }
    base->C0 = tmp8;

    /* DACx_C1. */
    tmp8 = base->C1 &
           ~(
#if defined(FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION) && FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION
               DAC_C1_DACBFWM_MASK |
#endif /* FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION */
               DAC_C1_DACBFMD_MASK);
#if defined(FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION) && FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION
    tmp8 |= DAC_C1_DACBFWM(config->watermark);
#endif /* FSL_FEATURE_DAC_HAS_WATERMARK_SELECTION */
    tmp8 |= DAC_C1_DACBFMD(config->workMode);
    base->C1 = tmp8;

    /* DACx_C2. */
    tmp8 = base->C2 & ~DAC_C2_DACBFUP_MASK;
    tmp8 |= DAC_C2_DACBFUP(config->upperLimit);
    base->C2 = tmp8;
}
コード例 #2
0
ファイル: dac.c プロジェクト: liubins313/rt-thread-1.2.0-k60
/**
 * @brief  设置DAC Buffer的水位
 *
 * @param  instance     :模块号
 *         @arg HW_DAC0 :芯片的DAC0 模块
 *         @arg HW_DAC1 :芯片的DAC1 模块
 * @param  value        :水位值 0-15
 * @retval None
 */
void DAC_SetWaterMark(uint32_t instance, DAC_WaterMarkMode_Type value)
{
    DAC_InstanceTable[instance]->C1 &= ~DAC_C1_DACBFWM_MASK;
	switch(value)
	{
		case kDAC_WaterMark_1Word:
			DAC_InstanceTable[instance]->C1 |= DAC_C1_DACBFWM(0);
			break;
		case kDAC_WaterMark_2Word:
			DAC_InstanceTable[instance]->C1 |= DAC_C1_DACBFWM(1);
			break;
		case kDAC_WaterMark_3Word:
			DAC_InstanceTable[instance]->C1 |= DAC_C1_DACBFWM(2);
			break;
		case kDAC_WaterMark_4Word:
			DAC_InstanceTable[instance]->C1 |= DAC_C1_DACBFWM(3);
			break;
		default:break;
	}
}
コード例 #3
0
/***********************************************************************************************
 功能:DAC初始化
 形参:DAC_InitStruct: DAC初始化结构
 返回:0
 详解:0
************************************************************************************************/
void DAC_Init(DAC_InitTypeDef* DAC_InitStruct)
{
	//参数检查
	assert_param(IS_DAC_TRIGGER_MODE(DAC_InitStruct->DAC_TrigerMode));
	assert_param(IS_DAC_BUFFER_MODE(DAC_InitStruct->DAC_BufferMode));
	assert_param(IS_DAC_WATERMARK_MODE(DAC_InitStruct->DAC_WaterMarkMode));
	
	//开启DAC模块时钟
	SIM->SCGC2|=SIM_SCGC2_DAC0_MASK;  
	//配置BUFFER模式
	switch(DAC_InitStruct->DAC_BufferMode)
	{
		case DAC_TRIGER_MODE_NONE:
			DAC0->C0 &= ~DAC_C0_DACTRGSEL_MASK;
			DAC0->C0 |= DAC_C0_DACSWTRG_MASK;
			break;
		case DAC_TRIGER_MODE_SOFTWARE:
			DAC0->C0 |= DAC_C0_DACTRGSEL_MASK;
			DAC0->C0 |= DAC_C0_DACSWTRG_MASK;
			break;
		case DAC_TRIGER_MODE_HARDWARE:
			DAC0->C0 &= ~DAC_C0_DACTRGSEL_MASK;
			DAC0->C0 &= ~DAC_C0_DACSWTRG_MASK;
			break;
		default:break;
	}
	//选择参考源2
	DAC0->C0 |= DAC_C0_DACRFS_MASK;  
	//开启DAC模块
	DAC0->C0 |= DAC_C0_DACEN_MASK ;
	
	//配置DAC_C1寄存器 配置BUFFER模式
	switch(DAC_InitStruct->DAC_BufferMode)
	{
		case BUFFER_MODE_NORMAL:
			DAC0->C1 |= DAC_C1_DACBFEN_MASK;
			DAC0->C1 |= DAC_C1_DACBFMD(0);
			break;
		case BUFFER_MODE_SWING:
			DAC0->C1 |= DAC_C1_DACBFEN_MASK;
			DAC0->C1 |= DAC_C1_DACBFMD(1);  
			break;
		case BUFFER_MODE_ONETIMESCAN:
			DAC0->C1 |= DAC_C1_DACBFEN_MASK;
			DAC0->C1 |= DAC_C1_DACBFMD(2);
			break;
		case BUFFER_MODE_DISABLE:
			DAC0->C1 &= ~DAC_C1_DACBFEN_MASK;
			break;
	}
	//设置水位
	switch(DAC_InitStruct->DAC_WaterMarkMode)
	{
		case WATER_MODE_1WORD:
			DAC0->C1 |= DAC_C1_DACBFWM(0);
			break;
		case WATER_MODE_2WORD:
			DAC0->C1 |= DAC_C1_DACBFWM(1);
			break;
		case WATER_MODE_3WORD:
			DAC0->C1 |= DAC_C1_DACBFWM(2);
			break;
		case WATER_MODE_4WORD:
			DAC0->C1 |= DAC_C1_DACBFWM(3);
			break;
		default:break;
	}

  //配置C2寄存器 设置上限和下线
	DAC0->C2 =  DAC_C2_DACBFUP(DAC_InitStruct->DAC_BufferUpperLimit);
	DAC0->C2 |= DAC_C2_DACBFRP(DAC_InitStruct->DAC_BufferStartPostion);
}
コード例 #4
0
ファイル: ebox_dac.cpp プロジェクト: link271991396/ebox_k60
/*
 * dac_int
 * DAC初始化函数,使能DAC各项功能
 * 
 * 参数:
 *    dac_init_struct--DAC初始化结构体,
 *                        具体定义见DAC_InitTypeDef
 *
 * 输出:
 *    0--配置错误
 *    1--配置成功
 */
uint8_t Dac::dac_int(DAC_InitTypeDef dac_init_struct)
{
  uint8_t x;
  DAC_Type *dacx = dac_init_struct.DAC_Dacx;
  uint8_t work_mode = dac_init_struct.DAC_BufferWorkMode;
  uint8_t watermark = dac_init_struct.DAC_BufferWatermarkSel;
  uint8_t upper = dac_init_struct.DAC_BufferUpperLimit;
  DAC_ISR_CALLBACK rdptbot_isr = dac_init_struct.DAC_ReadPointerBottomIsr;
  DAC_ISR_CALLBACK rdpttop_isr = dac_init_struct.DAC_ReadPointerTopIsr;
  DAC_ISR_CALLBACK watermk_isr = dac_init_struct.DAC_BufferWatermarkIsr;
  
  upper = (upper==NULL?1:upper);
    
  //参数检查
  ASSERT( work_mode <= BUFFER_MODE_ONETIMESCAN );  //判断模式选择
  ASSERT( watermark <= WATERMARK_4WORDS );      //判断缓冲区水印选择
  ASSERT( upper <= 16);         //判断缓冲区上限数值
    
  //配置DAC时钟
  if(dacx == DAC0)
  {
    x = 0;
    SIM->SCGC2 |= SIM_SCGC2_DAC0_MASK;   //开启DAC0时钟
  }
  else if(dacx == DAC1)
  {
    x = 1;
    SIM->SCGC2 |= SIM_SCGC2_DAC1_MASK;   //开启DAC1时钟
  }
  else 
  {
    return 0;
  }
  
  //配置C2寄存器
  dacx->C2 = DAC_C2_DACBFUP(upper - 1);     //配置缓冲区上限数值
  
  //配置C1寄存器
  dacx->C1 = 0;
  if(dac_init_struct.DAC_BufferEnable == TRUE)
  {
    dacx->C1 |= DAC_C1_DACBFEN_MASK;    //使能缓冲区 
  }
  dacx->C1 |= DAC_C1_DACBFMD(work_mode);        //缓冲区工作模式配置
  dacx->C1 |= DAC_C1_DACBFWM(watermark);        //缓冲区水印选择配置
  if(dac_init_struct.DAC_DmaEnable == TRUE)
  {
    dacx->C1 |= DAC_C1_DMAEN_MASK;      //使能DMA
  }
  
  //配置C0寄存器
  dacx->C0 = 0;
  if(dac_init_struct.DAC_ReadPointerBottomIntEnable == TRUE && rdptbot_isr != NULL)
  {
    dacx->C0 |= DAC_C0_DACBBIEN_MASK;   //使能缓冲区底部中断
    DAC_RDPTBOT_ISR[x] = rdptbot_isr;
  }
  if(dac_init_struct.DAC_ReadPointerTopIntEnable == TRUE && rdpttop_isr != NULL)
  {
    dacx->C0 |= DAC_C0_DACBTIEN_MASK;   //使能缓冲区顶部中断
    DAC_RDPTTOP_ISR[x] = rdpttop_isr;
  }
  if(dac_init_struct.DAC_BufferWatermarkIntEnable == TRUE && watermk_isr != NULL)
  {
    dacx->C0 |= DAC_C0_DACBWIEN_MASK;   //使能缓冲区水印中断
    DAC_WATERMK_ISR[x] = watermk_isr;
  }
  if(dac_init_struct.DAC_SoftTrgEnable == TRUE)
  {
    dacx->C0 |= DAC_C0_DACTRGSEL_MASK;  //使能软件触发缓冲区
  }
  dacx->C0 |= DAC_C0_DACRFS_MASK;       //使能DACREF_2(VDDA)为参考电压
  
  //使能DAC模块,可编程参考发生器开始工作
  dacx->C0 |= DAC_C0_DACEN_MASK;
  
  return 1;
}