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

用STM32H750的DAC用DMA输出正弦波

[复制链接]
husankeke 提问时间:2019-10-29 19:57 /
本人用STM32F334实现了DAC采用DMA方式输出正弦波,用定时器控制频率。后来我用STM32H750芯片尝试,发现DAC和定时器都是正常工作,DMA输出不了数据,看了好多遍H750的手册,DMA的配置以我现有的水平看不出有任何问题。想请各位前辈来看看我这出了什么问题。
正弦信号输出程序:
void sin_Generation(void)
{
uint16_t n;
for(n=0;n<tableSize;n++)
{
  sinTable[n] = (sin(2*PI*n/tableSize)+1)*2047;
}
}
主函数部分:   
int main(void)
{

      HAL_Init();

      SystemClock_Config();
      sin_Generation();
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_DAC1_Init();
      MX_TIM6_Init();
      HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,sinTable,tableSize,DAC_ALIGN_12B_R);
      while (1)
     {


     }
}
DAC的初始化函数:

static void MX_DAC1_Init(void)
{

    DAC_ChannelConfTypeDef sConfig = {0};

    hdac1.Instance = DAC1;
    if (HAL_DAC_Init(&hdac1) != HAL_OK)
    {
         Error_Handler();
    }

    sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
    sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
    sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
    sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
    sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
    if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }

}
定时器6的初始化:
static void MX_TIM6_Init(void)
{

    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim6.Instance = TIM6;
    htim6.Init.Prescaler = 2;
    htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim6.Init.Period = 99;
    htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
    {
        Error_Handler();
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }

    HAL_TIM_Base_Start(&htim6);

}
DMA的时钟开启:
static void MX_DMA_Init(void)
{
  
    __HAL_RCC_DMA1_CLK_ENABLE();

    HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
   
    HAL_NVIC_SetPriority(DMAMUX1_OVR_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMAMUX1_OVR_IRQn);
}
    到此main.c文件结束,DMA的配置和DAC的IO口配置在msp.c文件中


void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(hdac->Instance==DAC1)
    {

        __HAL_RCC_DAC12_CLK_ENABLE();
  
        __HAL_RCC_GPIOA_CLK_ENABLE();
  
    //PA4     ------> DAC1_OUT1

        GPIO_InitStruct.Pin = GPIO_PIN_4;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        hdma_dac1_ch1.Instance = DMA1_Stream1;
        hdma_dac1_ch1.Init.Request = DMA_REQUEST_DAC1;
        hdma_dac1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
        hdma_dac1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
        hdma_dac1_ch1.Init.MemInc = DMA_MINC_ENABLE;
        hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
        hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
        hdma_dac1_ch1.Init.Mode = DMA_CIRCULAR;
        hdma_dac1_ch1.Init.Priority = DMA_PRIORITY_MEDIUM;
        hdma_dac1_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        if (HAL_DMA_Init(&hdma_dac1_ch1) != HAL_OK)
        {
             Error_Handler();
        }
         __HAL_LINKDMA(hdac,DMA_Handle1,hdma_dac1_ch1);

    }
}

相关代码已经附上,求教DMA为何不通。



收藏 评论12 发布时间:2019-10-29 19:57

举报

12个回答
husankeke 回答时间:2019-10-29 19:58:12
顶一下
husankeke 回答时间:2019-10-30 14:54:25
问题还是没有解决
husankeke 回答时间:2019-10-30 15:55:04
问题还是没有解决啊,我还试了定时器更新触发DMA,也不行
husankeke 回答时间:2019-10-30 15:56:28
?为啥我回复还需要审核
husankeke 回答时间:2019-10-30 15:56:57
husankeke 回答时间:2019-10-30 17:29:50
我看了DAC寄存器的内容,发现DMA并没有把数据发给DHR寄存器,请问这是为什么啊 ?
likang1202 回答时间:2019-10-30 19:21:50
  hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
        hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
改成半字试试
likang1202 回答时间:2019-10-30 19:22:36
我没用过750
husankeke 回答时间:2019-10-30 20:04:10
likang1202 发表于 2019-10-30 19:21
hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
        hdma_dac1_ch1.Init.MemDataAl ...

我都试过了,后来发现是DMA数据流的使能位没有置1,这个位我怎么都置不了1,我直接配置寄存器的位都不行,不知道出什么问题了。
12下一页

所属标签

相似问题

官网相关资源

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