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

定时器使用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的数据也并没有被篡改。

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

举报

1个回答
xmshao 回答时间:半小时前
咋听起来还是有点奇怪的。


不过,你使用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区。

所属标签

相似问题

官网相关资源

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