打印
[STM32H7]

STM32H743用DMA输出DAC的奇怪问题

[复制链接]
3016|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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系列的呢

使用特权

评论回复
5
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 -

使用特权

评论回复
6
香水城| | 2019-4-2 20:56 | 只看该作者
对于H7芯片的DMA,不同的DMA是有他的访问空间限制的。你定义为Const时,数据在FLASH里,当定义为一般可读写类型RAM变量时,变量被编译器
安排的变量空间未必是你当前DMA可以访问的。
所以要注意你用的是哪个DMA,RAM放在哪个存储空间。

使用特权

评论回复
7
sxdahss| | 2019-7-3 16:16 | 只看该作者
楼主可方便留下源码学习一下,谢谢

使用特权

评论回复
8
香水城| | 2019-8-22 14:47 | 只看该作者
sxdahss 发表于 2019-7-3 16:16
楼主可方便留下源码学习一下,谢谢

这个主要涉及到芯片内部总线架构、存储访问安排方面的东西。
要看看芯片相关章节。具体到这里,不同的DMA有不同的访问范围。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

58

帖子

3

粉丝