
用的是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的数据也并没有被篡改。 请各位大佬指教一下。 |
STM32H745XIH6不能进行双核调试,CM4不能进行在线调试
正点原子阿波罗H743使用DMA2D后普通刷出现问题
STM32U3 IIC通信后,SPI+GPDMA 进入循环发送,DMA无法使能 寄存器USEF=1
STM32CubeMX在配置DCMI的腳位時,在Mode的選項中, 只有8bits, 10bits與12bits, 為何沒有14bits?
STM32MP135D的TIM2使用ETR作为外部时钟时,无法使用PE15作为输入
STM32H7双核调试问题:CM7能成功调试但CM4始终报"Failed to read ROM table via AP 3"错误
MC SDK为什么不支持H743,看样子只支持H745H755
分享一个PWM+DMA的BUG
STM32的TIM触发SPI的DMA发送使用NSS时MSSI的问题
hrtim里update reset和reset update同时打开不会互相激励吗,另外为什么现在定时器周期值不用-1了
不过,你使用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区。