硬汉嵌入式论坛

 找回密码
 立即注册
查看: 340|回复: 4
收起左侧

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

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2024-1-22 15:14:05 | 显示全部楼层 |阅读模式
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__);
        }


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-1-22 16:06:16 | 显示全部楼层
关闭DMA缓冲说使用RAM空间的Cache。

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

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-1-22 16:48:06 | 显示全部楼层
eric2013 发表于 2024-1-22 16:06
关闭DMA缓冲说使用RAM空间的Cache。

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

是这样数组定义吗: __attribute__((section (".RAM_D3"))) uint32_t  Sine12P[120];
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-1-23 08:02:21 | 显示全部楼层
Lyq510 发表于 2024-1-22 16:48
是这样数组定义吗: __attribute__((section (".RAM_D3"))) uint32_t  Sine12P[120];

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

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

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-2-2 15:47:25 | 显示全部楼层
eric2013 发表于 2024-1-23 08:02
可以,这种方式的话,你的分散加载文件也要设置的。

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

你好,MAP文件中正确分配地址了,正弦波还是没有,我不用DMA只单纯DAC输出正弦波也无波形
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 18:05 , Processed in 0.181044 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表