你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常。测试官方用例一样,是何原因?

[复制链接]
jump 提问时间:2025-4-24 11:26 / 已解决
用的是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);

HAL_TIM_PWM_Start(&TimPwmHandle3, TIM_CHANNEL_1);


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

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

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

请各位大佬指教一下。
收藏 评论2 发布时间:2025-4-24 11:26

举报

2个回答
xmshao 最优答案 回答时间:7 小时前
咋听起来还是有点奇怪的。


不过,你使用STM32H7系列芯片的话,就有可能碰到这个现象。


你现在用于DMA传输是内存数据定义为常量数组时正常,而定义为变量数组时则传输异常。结合你的代码来看,你使用的是DMA1.


当定义为常量型数组时,数据存放在flash区,此时DMA就是在FLASH区和TIMERE寄存器间实现传输,这是没问题的。


当定义为变量型数组时,数据被编译器安排在RAM区,到底被安排在哪个RAM区,就跟你当时默认使用的RAM区有关,如果说被安排到


DTCM区,即0x2000,0000地址开始的RAM区,此时DMA1是访问不了TCM RAM的,出现传输异常就不奇怪了。这样的话,你需要在


IDE里调整下默认使用的RAM区,比方SRAM1 SRAM2 或者AXI SRAM,或者手动为数组给存储地址落在DMA1可以访问到的RAM区。
jump 回答时间:6 小时前

xmshao 发表于 2025-4-24 14:05
咋听起来还是有点奇怪的。</p>
<p>

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

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版