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

用STM32H750的DAC用DMA输出正弦波

[复制链接]
虎三可可 提问时间: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为何不通。



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

举报

15个回答
虎三可可 回答时间:2019-10-29 19:58:12
顶一下
虎三可可 回答时间:2019-10-30 14:54:25
问题还是没有解决
虎三可可 回答时间:2019-10-30 15:55:04
问题还是没有解决啊,我还试了定时器更新触发DMA,也不行
虎三可可 回答时间:2019-10-30 15:56:28
?为啥我回复还需要审核
虎三可可 回答时间:2019-10-30 15:56:57
虎三可可 回答时间:2019-10-30 17:29:50
我看了DAC寄存器的内容,发现DMA并没有把数据发给DHR寄存器,请问这是为什么啊 ?
李康1202 回答时间:2019-10-30 19:21:50
  hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
        hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
改成半字试试
李康1202 回答时间:2019-10-30 19:22:36
我没用过750
虎三可可 回答时间: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,我直接配置寄存器的位都不行,不知道出什么问题了。
虎三可可 回答时间:2019-10-30 20:07:35
经过研究发现 CR寄存器.png ,我的DMA寄存器的数据流使能位一直处于禁止状态,我直接在程序里写HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t *)&sinTable,tableSize,DAC_ALIGN_12B_R);
  DMA2_Stream7->CR|=1<<0;
这两句话都不能将EN位使能置一,有没有人遇到过这种情况?
虎三可可 回答时间:2019-10-30 20:17:36

兄弟,你回复帖子用等待审核吗
你若安好_清风徐来 回答时间:2020-3-18 17:55:58
H7系列  内存区域换掉了嘛  DMA 都需要在指定内存的  
uniqueeefocus33 回答时间:2020-12-17 14:09:20
最进也遇到同样问题,该如何解决?
heart蓝色CD 回答时间:2020-12-18 08:44:24
uniqueeefocus33 发表于 2020-12-17 14:09
最进也遇到同样问题,该如何解决?

STM32H750 RAM起始地址0x20000000无法被DMA访问,把RAM2 0x24000000打勾即可
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版