问题描述
我已经尝试了几天,为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_CCR_MSIZE_8BIT);
dma_set_peripheral_size(DMA1,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,DMAMUX_CxCR_DMAREQ_ID_TIM17_CH1);
dma_set_peripheral_address(DMA1,(uint32_t)&TIM17_CCR1);
dma_set_memory_address(DMA1,(uint32_t)&ledBackBuffer);
dma_set_number_of_data(DMA1,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的数据。