我使用stm32H750VB单片机,使用定时器15的ch1触发dma进行spi写,然后使用spi rx dma 来接收数据
使用normal模式,在spi dma完成中断中重新开启dma
但是发现一个问题,就是在我开启dma后,开启定时器pwm前,会触发一次spi写操作
也就是说tim15_cc1触发dma满了之后,因为pwm还在继续,所以有一个类似触发标志位的位是置位的,重新开启dma后立即触发了一次dma
而这个标志位不会因为关闭dma、重启dma而清零。
我尝试关闭tim15的UIF和CC1IF,但是并没有起作用。但是dma中也只有半满、满、错误等标志位,没有单次触发标志位
我的代码:
[C] 纯文本查看 复制代码
//tim15 dma 初始化
hdma_tim15_ch1.Instance = DMA1_Stream3;
hdma_tim15_ch1.Init.Request = DMA_REQUEST_TIM15_CH1;
hdma_tim15_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim15_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim15_ch1.Init.MemInc = DMA_MINC_DISABLE;
hdma_tim15_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim15_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim15_ch1.Init.Mode = DMA_NORMAL;
hdma_tim15_ch1.Init.Priority = DMA_PRIORITY_LOW;
hdma_tim15_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
//开启dma
ALIGN_32BYTES(__attribute__((section(".axi_ram"))))
static uint16_t tx_data = 0xffff;
HAL_DMA_Start(&hdma_tim15_ch1, (uint32_t)&tx_data, (uint32_t)&hspi4.Instance->TXDR, 4096);
__HAL_SPI_ENABLE(&hspi4);
SET_BIT(hspi4.Instance->CR1, SPI_CR1_CSTART);
__HAL_TIM_ENABLE_DMA(&htim15, TIM_DMA_CC1);
HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
//dma中断
ALIGN_32BYTES(__attribute__((section(".axi_ram"))))
static uint16_t tx_data = 0xffff;
//HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
htim15.Instance->CR1 &= ~(TIM_CR1_CEN);
__HAL_TIM_SET_COUNTER(&htim15, 65535);
__HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_UPDATE);
__HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_CC1);
HAL_DMA_Abort(&hdma_spi4_rx);
HAL_DMA_Abort(&hdma_tim15_ch1);
HAL_DMA_Start(&hdma_tim15_ch1, (uint32_t)&tx_data, (uint32_t)&hspi4.Instance->TXDR, 4096);
//即使不开启pwm,也会触发一次spi写操作
//HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
|