带 TIM17 + DMAMUX 的 STM32G431 循环 DMA

STM32G431 circular DMA with TIM17 + DMAMUX

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

你还要配置吗?你如何正确配置它?我完全迷失在 ST 的文档中,找不到任何使用 DMAMUX 而不使用 HAL 的现有代码。 你们有没有我可以看的例子?最好是一些裸机 C,这样我就可以检查寄存器。任何对某些文件有帮助的东西(除了 ST 自己的文件)?将不胜感激。

非常感谢!

我什至可以使用库,只需要再测试一天:(

这里是任何感兴趣的人的代码:

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 的数据。