Я хочу управлять выходом GPIO с помощью DMA и таймера. Цель генерирует сигнал CLK частотой 1 МГц и управляет PB0, синхронизированным с CLK.
В качестве платы для разработки я использую Nucleo-F411RE. Я последовал инструкциям с форума и настроил программу.
Конфигурация:
ХКЛК: 100 МГц
Таймер3:
Программа в main.c:
uint32_t dummy_data[7] = {0} ;
dummy_data[0] = 0x00000001 ;
dummy_data[1] = 0x00010000 ;
dummy_data[2] = 0x00000000 ;
dummy_data[3] = 0x00000000 ;
dummy_data[4] = 0x00000001 ;
dummy_data[5] = 0x00010000 ;
dummy_data[6] = 0x00000000 ;
HAL_DMA_Start(&hdma_tim3_ch4_up, (uint32_t)dummy_data, (uint32_t)&(GPIOB->BSRR), 7) ;
HAL_TIM_Base_Start(&htim3) ;
HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_4) ;
TIM3->DIER |= (1 << 8 ) ;
Я ожидаю увидеть импульс на PB0, синхронизированный с ШИМ PC9 (вывод сравнения выходов). Но на выходе я получаю только ШИМ с частотой 1 МГц в PC9, а в PB0 никаких изменений нет. Я что-то упускаю? Любые предложения будут полезны.
Вы включили часы для DMA? В конце концов, DMA — это периферийное устройство, как и любое другое, и его тактовая частота должна быть включена, как и любой порт GPIO.
@Илья, часы для DMA включены.
Для STM32 F4 нет возможности подключения DMA1 к периферийным устройствам AHB. Итак, вместо DMA1 в TIM3 я настроил TIM1 PWM CN1 (APB2) для запуска потока 5 DMA2 в памяти в периферийный режим для записи слов в GPIOB->BSRR. Теперь это работает (может успешно записать регистр GPIOB->BSRR).
Просто для STM32 F411RE:
GPIOB(AHB1) is connected with DMA2 (Using DMA2 Stream 5)
DMA2 is connected with APB2 (Using TIM1 PWM CN1)
Хороший улов! И спасибо, что поделились этим ресурсом с ошибками.
Вы опустили слишком большую часть своего кода. PB0 инициализирован как выход GPIO? (Хорошо.) Является ли
dummy_data
локальной переменной? (Плохой.)