|
本帖最后由 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的数据也并没有被篡改。
请各位大佬指教一下 |
|