我已经尝试了几天,为G4创建一个简单的DMA程序但没有HAL(使用libopencm3(目标是将DMA配置为从缓冲区读取数据(以循环模式(,并将其发送到TIM17_CCR1。我以前曾在HAL中使用过该代码,但在libopencm3方面运气不佳。我已经设法在mem2mem模式下将数据从缓冲区传输到OCR(尽管我需要mem2perif(,只是为了尝试。但我不知道如何从mem2perif开始。配置DMA没什么大不了的,但我对DMAMUX部分很感兴趣。
你甚至必须配置它吗?您如何以正确的方式配置它?我完全迷失在ST的文档中,在没有HAL的情况下,找不到任何使用DMAMUX的现有代码。你们中有谁能给我举个例子吗?最好是一些裸金属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的数据。