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的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥杯扩展板模块(基于新版STM32G431)——ADC按键