[STM32H7] STM32H743用DMA输出DAC的奇怪问题

[复制链接]
 楼主| LSQHHH 发表于 2019-2-13 15:40 | 显示全部楼层 |阅读模式
用DMA输出DAC1,当输出数据定义成const uint16_t aEscalator8bit[2],DAC输出正常,定义成 uint16_t aEscalator8bit[2];DAC就没有输出。
测试官方的例程也是一样。不知哪里出了问题?初始化程序如下。

uint16_t aEscalator8bit[2] = {4000, 0};

DAC_HandleTypeDef       DacHandle;
DAC_ChannelConfTypeDef  sConfig;

void DAC_Config()
{
  __HAL_RCC_DAC12_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_DMA1_CLK_ENABLE();

  TIM6_Config(i);

  DacHandle.Instance = DAC1;
  HAL_DAC_DeInit(&DacHandle);
  HAL_DAC_Init(&DacHandle);

  sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1);

  HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_1, (uint32_t *)aEscalator8bit, 2, DAC_ALIGN_12B_R);
}
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
  DMA_HandleTypeDef hdma_dac1_ch1;

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hdac->Instance==DAC1)
  {
  /* USER CODE BEGIN DAC1_MspInit 0 */

  /* USER CODE END DAC1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_DAC12_CLK_ENABLE();
    __HAL_RCC_DMA1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**DAC1 GPIO Configuration   
    PA4     ------> DAC1_OUT1
    PA5     ------> DAC1_OUT2
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* DAC1 DMA Init */
    /* DAC1_CH1 Init */
    hdma_dac1_ch1.Instance = DMA1_Stream5;
    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_HALFWORD;
    hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_dac1_ch1.Init.Mode = DMA_CIRCULAR;
    hdma_dac1_ch1.Init.Priority = DMA_PRIORITY_HIGH;

    HAL_DMA_Init(&hdma_dac1_ch1);
    __HAL_LINKDMA(hdac,DMA_Handle1,hdma_dac1_ch1);
  }
}

 楼主| LSQHHH 发表于 2019-2-14 11:27 | 显示全部楼层
有没有大神指导一下可能哪里出了问题?通过中断发现传送的数据定义在RAM中启动DMA就发生DMA传输错误中断。定义在FLASH中就正常。
paotangsan 发表于 2019-3-3 13:17 | 显示全部楼层
他允许16位的读写吗
renzheshengui 发表于 2019-3-3 13:45 | 显示全部楼层
还没有用过h系列的呢
KB05177514 发表于 2019-4-2 17:21 | 显示全部楼层
引用别人的回复:
结贴,问题解决。还是ST官方论坛给力。
贴一下原文的回答:

Hello.
The STM32H743ZI has a different memory structure and software of STM32F7xx /STM32F4xx will not work.
When you search for "H743 DMA" you will find my answers regarding this.
Assuming you did not change the linker script, your data wil be located in DTCMRAM (0x20000000 - 0x20020000).
But the peripheral DMA controllers do not have access to this RAM block. There is no interconnection in the matrix.
(Take a brief look at page 99 and page 100 in the Reference Manual RM0433)
You have two options:
Simple way: Set the start address of your RAM to  0x24000000 in the linker script (D1 domain, page 109 in RM0433).
Advanced: Or use a .section command for your memory stream in the linker script and in your code.
- Joerg -
香水城 发表于 2019-4-2 20:56 | 显示全部楼层
对于H7芯片的DMA,不同的DMA是有他的访问空间限制的。你定义为Const时,数据在FLASH里,当定义为一般可读写类型RAM变量时,变量被编译器
安排的变量空间未必是你当前DMA可以访问的。
所以要注意你用的是哪个DMA,RAM放在哪个存储空间。
sxdahss 发表于 2019-7-3 16:16 | 显示全部楼层
楼主可方便留下源码学习一下,谢谢
香水城 发表于 2019-8-22 14:47 | 显示全部楼层
sxdahss 发表于 2019-7-3 16:16
楼主可方便留下源码学习一下,谢谢

这个主要涉及到芯片内部总线架构、存储访问安排方面的东西。
要看看芯片相关章节。具体到这里,不同的DMA有不同的访问范围。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

59

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部