Lyq510 发表于 2024-1-22 15:14:05

STM32H743V DMA传输DAC输出正弦波 无波形

STM32H743V 通过DMA传输DAC来输出正弦波,用示波器显示无波形输出,输出正弦波却有,以下部分配置:



TIM_MasterConfigTypeDef sMasterConfig;
       
                /* TIM6 时钟使能 */
        __HAL_RCC_TIM6_CLK_ENABLE();


        /* 配置定时器外设 */
        htim.Instance = TIM6;


        htim.Init.Period            = 20-1;
        htim.Init.Prescaler         = 0;
        htim.Init.ClockDivision   = 0;
        htim.Init.CounterMode       = TIM_COUNTERMODE_UP;
        htim.Init.RepetitionCounter = 0;
        HAL_TIM_Base_Init(&htim);


        /* TIM6 TRGO 选择 */
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;


        HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);


        /* 使能定时器 */
        HAL_TIM_Base_Start(&htim);



sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;      /* 关闭采样保持模式,这个模式主要用于低功耗 */
        sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;                  /* 采用定时器6触发 */
        sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;         /* 使能输出缓冲 */
        sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;/* 不将DAC连接到片上外设 */
        sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;            /* 使用出厂校准 */


        if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }



hdma_dac1.Instance = DMA1_Stream0;            /* 使用的DAM1 Stream0 */
        hdma_dac1.Init.Request= DMA_REQUEST_DAC1_CH1;   /* DAC触发DMA传输 */
        hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;/* 存储器到外设 */
        hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE;    /* 外设地址禁止自增 */
        hdma_dac1.Init.MemInc = DMA_MINC_ENABLE;      /* 存储器地址自增 */
        hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* 外输操作数据宽度,半字 */
        hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;    /* 存储器操作数据宽度,半字 */
        hdma_dac1.Init.Mode = DMA_CIRCULAR;                           /* 循环模式 */
        hdma_dac1.Init.Priority = DMA_PRIORITY_HIGH;                  /* 优先级高 */


        HAL_DMA_Init(&hdma_dac1);


        /* 关联DMA句柄到DAC句柄下 */
        __HAL_LINKDMA(&DacHandle, DMA_Handle1, hdma_dac1);
       
        /* 启动DAC DMA 输出正弦波 */
        if (HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_1, (uint32_t *)Sine12P, 30, DAC_ALIGN_12B_R) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }


eric2013 发表于 2024-1-22 16:06:16

关闭DMA缓冲说使用RAM空间的Cache。

另外缓冲不要被安排到TCM RAM空间了,这个空间不支持通用DMA

Lyq510 发表于 2024-1-22 16:48:06

eric2013 发表于 2024-1-22 16:06
关闭DMA缓冲说使用RAM空间的Cache。

另外缓冲不要被安排到TCM RAM空间了,这个空间不支持通用DMA

是这样数组定义吗: __attribute__((section (".RAM_D3"))) uint32_tSine12P;

eric2013 发表于 2024-1-23 08:02:21

Lyq510 发表于 2024-1-22 16:48
是这样数组定义吗: __attribute__((section (".RAM_D3"))) uint32_tSine12P;

可以,这种方式的话,你的分散加载文件也要设置的。

注意看MAP文件,确实分配到RAM_D3的地址空间了。

Lyq510 发表于 2024-2-2 15:47:25

eric2013 发表于 2024-1-23 08:02
可以,这种方式的话,你的分散加载文件也要设置的。

注意看MAP文件,确实分配到RAM_D3的地址空间了。

你好,MAP文件中正确分配地址了,正弦波还是没有,我不用DMA只单纯DAC输出正弦波也无波形
页: [1]
查看完整版本: STM32H743V DMA传输DAC输出正弦波 无波形