请问CH32F103R8T6的DMA和DAC问题

之前使用的是stm32,单位采购替换了贵公司的CH32F103R8T6,使用HAL库配置DAC_CH2和DMA circle模式,如何正确修改?

原来的程序如下:


主函数中语句

HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,DAC1_Value,1,DAC_ALIGN_12B_R);


dac.c中语句

void MX_DAC_Init(void)

{

  DAC_ChannelConfTypeDef sConfig = {0};

  hdac.Instance = DAC;

  if (HAL_DAC_Init(&hdac) != HAL_OK)

  {

    Error_Handler();

  }

  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;

  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;

  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK)

  {

    Error_Handler();

  }

}


void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(dacHandle->Instance==DAC)

  {

    __HAL_RCC_DAC_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();


    GPIO_InitStruct.Pin = DAC_Pin;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    HAL_GPIO_Init(DAC_GPIO_Port, &GPIO_InitStruct);


    hdma_dac_ch2.Instance = DMA2_Channel4;

    hdma_dac_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH;

    hdma_dac_ch2.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_dac_ch2.Init.MemInc = DMA_MINC_ENABLE;

    hdma_dac_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

    hdma_dac_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

    hdma_dac_ch2.Init.Mode = DMA_CIRCULAR;

    hdma_dac_ch2.Init.Priority = DMA_PRIORITY_LOW;

    if (HAL_DMA_Init(&hdma_dac_ch2) != HAL_OK)

    {

      Error_Handler();

    }


    __HAL_LINKDMA(dacHandle,DMA_Handle2,hdma_dac_ch2);

  }

}


尝试将DMA2_Channel4修改为DMA1_Channel4,无输出;不使用DMA可以正常输出

您好,关于DAC和DMA的问题,主要区别在于CH32F103只有一个DMA,其中DAC-CH2输出对应PA5引脚,对应DMA通道为DMA1通道4,在使用DMA的时候,注意要使能DMA时钟,在你附的代码中没有看到DMA时钟的使能,你可以检查一下代码中是否有遗漏。后续若有问题,可将问题发我邮箱(lzs@wch.cn)联系。



void MX_DMA_Init(void)

{


  /* DMA controller clock enable */

  __HAL_RCC_DMA1_CLK_ENABLE();

//  __HAL_RCC_DMA2_CLK_ENABLE();


  /* DMA interrupt init */

  /* DMA1_Channel1_IRQn interrupt configuration */

//  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);

//  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

//  /* DMA1_Channel2_IRQn interrupt configuration */

//  HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);

//  HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);

//  /* DMA1_Channel3_IRQn interrupt configuration */

//  HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);

//  HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);

//  /* DMA1_Channel6_IRQn interrupt configuration */

//  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);

//  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);

//  /* DMA2_Channel4_5_IRQn interrupt configuration */

//  HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 0, 0);

//  HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);


}


DMA时钟使能了


HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,DAC1_Value,1,DAC_ALIGN_12B_R);函数内不知道需要修改哪些语句,通过邮件发送过去了,能帮我看一下吗


您好,邮件已回复,请注意查收


只有登录才能回复,可以选择微信账号登录