我已经尝试了几天,为G4创建一个简单的DMA程序。但是没有HAL (使用libopencm3 )。的目标是配置DMA从缓冲区读取数据(在循环模式下)并将它们发送到TIM17_CCR1。--我以前用HAL编写了代码,但在libopencm3方面没有任何进展。我在mem2mem模式下设法将数据从缓冲区传输到OCR (尽管我需要mem2perif)来尝试。但我不知道如何从mem2perif开始。配置DMA不是什么大事,但我迷失在DMAMUX部分。
你甚至需要配置它吗?您如何正确地配置它?我完全迷失在ST的文档中,没有HAL就找不到任何使用DMAMUX的现有代码。你们中有谁有我能看的例子吗?最好是一些裸金属C,这样我就可以检查寄存器了。任何有助于某些文档的东西(除了STs自己的)?我会很感激的。
非常感谢!
发布于 2020-10-12 19:43:15
即使在库中,我也能让它正常工作,只需要再测试一天:
以下是任何受访人的代码:
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的数据。
https://stackoverflow.com/questions/64295632
复制相似问题