硬汉嵌入式论坛

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

[DMA] 定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常。

[复制链接]

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 前天 11:29 | 显示全部楼层 |阅读模式
本帖最后由 jump14 于 2025-4-24 11:32 编辑

用的是STM32H743开发板。

代码如下:

static const uint32_t s_tim_dma[] = {1600, 0x00000000, 500}; //定义为const时正常,去掉const则异常。



    TimPwmHandle3.Instance = TIM8;
    TimPwmHandle3.Init.Prescaler         = 2 - 1;                               /* 10ns */
    TimPwmHandle3.Init.Period            = 400 - 1;
    TimPwmHandle3.Init.CounterMode       = TIM_COUNTERMODE_UP;
    TimPwmHandle3.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;
    TimPwmHandle3.Init.RepetitionCounter = 0;
    TimPwmHandle3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    HAL_TIM_OnePulse_Init(&TimPwmHandle3, 0);

    /* Set the parameters to be configured */
    hdma_tim.Init.Request = DMA_REQUEST_TIM8_CH1;
    hdma_tim.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim.Init.Mode = DMA_NORMAL;
    hdma_tim.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_tim.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    hdma_tim.Init.PeriphBurst = DMA_PBURST_SINGLE;
    hdma_tim.Init.MemBurst = DMA_MBURST_SINGLE;
    hdma_tim.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
    /* Set hdma_tim instance */
    hdma_tim.Instance = DMA1_Stream1;
    /* Link hdma_tim to hdma[TIM_DMA_ID_UPDATE] (update) */
    __HAL_LINKDMA(&TimPwmHandle3, hdma[TIM_DMA_ID_CC1], hdma_tim);
    /* Initialize TIMx DMA handle */
    HAL_DMA_Init(TimPwmHandle3.hdma[TIM_DMA_ID_CC1]);
    /* NVIC configuration for DMA transfer complete interrupt */
    HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);

  
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 200;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_SET;
    HAL_TIM_PWM_ConfigChannel(&TimPwmHandle3, &sConfigOC, TIM_CHANNEL_1);
   
    HAL_TIM_DMABurst_MultiWriteStart(&TimPwmHandle3, TIM_DMABASE_ARR, TIM_DMA_CC1, s_tim_dma, TIM_DMABURSTLENGTH_3TRANSFERS, 3* 3);

    HAL_TIM_PWM_Start(&TimPwmHandle3, TIM_CHANNEL_1);

其中s_tim_dma定义为const时正常,去掉const则异常。

用官方用例代码测试,结果是一样的。

关掉cache没用。s_tim_dma的数据也并没有被篡改。

请各位大佬指教一下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 前天 11:50 | 显示全部楼层
“去掉const则异常”

这个说明你的这个 s_tim_dma可能是分配到DTCM RAM空间了。看下map文件。

DTCM RAM空间不支持通用DMA
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 前天 15:25 | 显示全部楼层
eric2013 发表于 2025-4-24 11:50
“去掉const则异常”

这个说明你的这个 s_tim_dma可能是分配到DTCM RAM空间了。看下map文件。

确实是这个问题,感谢指导。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 02:05 , Processed in 1.056167 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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