Timer STM32G431带TIM17和x2B的循环DMA;DMAMUX

Timer STM32G431带TIM17和x2B的循环DMA;DMAMUX,timer,stm32,dma,Timer,Stm32,Dma,我已经尝试了几天,为G4创建一个简单的DMA程序但是没有HAL(使用libopencm3)。目标是将DMA配置为从缓冲区读取数据(以循环模式)并将其发送到TIM17_CCR1。我以前已经在HAL中编写了代码,但没有使用libopencm3的运气。我已经设法在mem2mem模式下将数据从缓冲区传输到OCR(尽管我需要mem2perif)只是为了尝试。但我不知道如何从mem2perif开始。配置DMA没什么大不了的,但我在DMAMUX部分迷失了方向 你甚至需要配置它吗?如何以正确的方式配置它?我完全

我已经尝试了几天,为G4创建一个简单的DMA程序但是没有HAL(使用libopencm3)。目标是将DMA配置为从缓冲区读取数据(以循环模式)并将其发送到TIM17_CCR1。我以前已经在HAL中编写了代码,但没有使用libopencm3的运气。我已经设法在mem2mem模式下将数据从缓冲区传输到OCR(尽管我需要mem2perif)只是为了尝试。但我不知道如何从mem2perif开始。配置DMA没什么大不了的,但我在DMAMUX部分迷失了方向

你甚至需要配置它吗?如何以正确的方式配置它?我完全迷失在ST的文档中,在没有HAL的情况下找不到任何使用DMAMUX的现有代码。 你们中有谁有我可以看的例子吗?最好是一些裸金属C,这样我就可以查看寄存器了。对某些文档(STs自己的文档除外)有帮助吗?非常感谢


非常感谢

我甚至可以在库中使用它,只需要再测试一天:(

以下是任何感兴趣的人的代码:

gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_FRONT_LED | GPIO_BACK_LED);
gpio_set_output_options(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_FRONT_LED | GPIO_BACK_LED);
gpio_set_af(GPIOB, GPIO_AF10, GPIO_BACK_LED);

//Setup for back led
dma_set_priority(DMA1, DMA_CHANNEL1, DMA_CCR_PL_LOW);
dma_set_memory_size(DMA1, DMA_CHANNEL1, DMA_CCR_MSIZE_8BIT);
dma_set_peripheral_size(DMA1, DMA_CHANNEL1, DMA_CCR_PSIZE_16BIT);
dma_enable_memory_increment_mode(DMA1, DMA_CHANNEL1);
dma_enable_circular_mode(DMA1, DMA_CHANNEL1);
dma_set_read_from_memory(DMA1, DMA_CHANNEL1);

dmamux_set_dma_channel_request(DMAMUX1, DMA_CHANNEL1, DMAMUX_CxCR_DMAREQ_ID_TIM17_CH1);

dma_set_peripheral_address(DMA1, DMA_CHANNEL1, (uint32_t)&TIM17_CCR1);
dma_set_memory_address(DMA1, DMA_CHANNEL1, (uint32_t)&ledBackBuffer);
dma_set_number_of_data(DMA1, DMA_CHANNEL1, LED_BACK_BUFFER_SIZE);

timer_enable_preload(TIM17);
timer_update_on_overflow(TIM17);
timer_set_dma_on_update_event(TIM17);
timer_enable_irq(TIM17, TIM_DIER_CC1DE);
timer_generate_event(TIM17, TIM_EGR_CC1G);
timer_set_oc_mode(TIM17, TIM_OC1, TIM_OCM_PWM1);
timer_enable_oc_output(TIM17, TIM_OC1);
timer_enable_break_main_output(TIM17);
timer_set_period(TIM17, 179);

timer_enable_counter(TIM17);
dma_enable_channel(DMA1, DMA_CHANNEL1);

ledBackBuffer是一个基本的uint8_t阵列,其中填充了要传输到所有LED的数据。

使用libopencm3进行注册级别。不要使用魔法库。我打赌,假设您以前从未使用过,您将在2-3小时内准备好。如果您在未知的库中很难做到这一点,也许可以开始使用STM32 HAL并要求这样做我在这里的支持正如我所说,我以前和哈尔一起成功地做到了这一点,那里不需要任何帮助;)