打印
[STM32H7]

STM32H743用DMA输出DAC的奇怪问题

[复制链接]
2158|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhenykun|  楼主 | 2021-7-6 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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);
  }
}

使用特权

评论回复
沙发
zhenykun|  楼主 | 2021-7-6 21:50 | 只看该作者
有没有大神指导一下可能哪里出了问题?

使用特权

评论回复
板凳
zhenykun|  楼主 | 2021-7-6 21:52 | 只看该作者
通过中断发现传送的数据定义在RAM中启动DMA就发生DMA传输错误中断。定义在FLASH中就正常。

使用特权

评论回复
地板
chuxh| | 2021-7-6 21:54 | 只看该作者
他允许16位的读写吗

使用特权

评论回复
5
pengf| | 2021-7-6 21:57 | 只看该作者
还没有用过h系列的呢

使用特权

评论回复
6
zhanghqi| | 2021-7-6 21:59 | 只看该作者
对于H7芯片的DMA,不同的DMA是有他的访问空间限制的

使用特权

评论回复
7
香水城| | 2021-7-7 08:33 | 只看该作者
请注意楼上的提醒,H7芯片里不同的DMA是有不同访问权限或说访问区域的。H7的SRAM也有好几块区域,你打开手册看看。

STM32H743从RAM启动异常的案例分享

使用特权

评论回复
8
stly| | 2021-7-7 18:57 | 只看该作者
你定义为Const时,数据在FLASH里,当定义为一般可读写类型RAM变量时,变量被编译器

使用特权

评论回复
9
juventus9554| | 2021-7-7 19:00 | 只看该作者
安排的变量空间未必是你当前DMA可以访问的。

使用特权

评论回复
10
llljh| | 2021-7-7 19:04 | 只看该作者
所以要注意你用的是哪个DMA,RAM放在哪个存储空间。

使用特权

评论回复
11
jiajs| | 2021-7-7 19:06 | 只看该作者
这个主要涉及到芯片内部总线架构、存储访问安排方面的东西。

使用特权

评论回复
12
wyjie| | 2021-7-7 19:08 | 只看该作者
要看看芯片相关章节。具体到这里,不同的DMA有不同的访问范围。

使用特权

评论回复
13
zhenykun|  楼主 | 2021-7-7 19:11 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
14
zhenykun|  楼主 | 2021-7-7 19:14 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
15
renzheshengui| | 2021-8-6 13:38 | 只看该作者
这个有错误码吗

使用特权

评论回复
16
paotangsan| | 2021-8-6 13:44 | 只看该作者
每个芯片的dma都相差很多吗

使用特权

评论回复
17
labasi| | 2021-8-6 13:49 | 只看该作者
每个功能的dma还有不同的权限?!

使用特权

评论回复
18
木木guainv| | 2021-8-6 13:52 | 只看该作者
没有用过就不了解啊

使用特权

评论回复
19
xiaoqizi| | 2021-8-6 13:55 | 只看该作者
是通过什么进行限制的呢

使用特权

评论回复
20
silly111| | 2022-5-5 13:39 | 只看该作者
请问这个问题你解决了嘛??

使用特权

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

本版积分规则

868

主题

11535

帖子

3

粉丝