STM32G431 带 TIM17 + DMAMUX 的循环 DMA

Posted

技术标签:

【中文标题】STM32G431 带 TIM17 + DMAMUX 的循环 DMA【英文标题】:STM32G431 circular DMA with TIM17 + DMAMUX 【发布时间】:2021-01-25 10:55:31 【问题描述】:

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

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

非常感谢!

【问题讨论】:

using libopencm3 做它注册级别。不要使用魔法库。我敢打赌,假设您以前从未这样做过,您将在 2-3 小时内准备好。 如果您在使用无人知道的库时遇到困难,不妨开始使用 STM32 HAL 并在此处寻求一些支持 正如我所说,我之前已经成功地使用 HAL 完成了它,不需要任何帮助 ;) 【参考方案1】:

即使使用库,我也可以使用它,只需要再测试一天:(

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

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

【讨论】:

以上是关于STM32G431 带 TIM17 + DMAMUX 的循环 DMA的主要内容,如果未能解决你的问题,请参考以下文章

STM32G0学习手册——使用定时器中断(HAL库)

蓝桥杯扩展板模块(基于新版STM32G431)——ADC按键

蓝桥杯扩展板模块(基于新版STM32G431)——ADC按键

蓝桥杯扩展板模块(基于新版STM32G431)——数码管

蓝桥杯扩展板模块(基于新版STM32G431)——数码管

TIM2 溢出不会触发 TIM2_IRQHandler @ STM32G031J6