Написал тестовую программку под STM32F0Discovery, чтобы проверить метод. Возможно кому-то поможет с настройкой.
Пины платы PA8 и PA9, PA10 и PA11 попарно соединены джамперами. На пинах PA8 и PA10 ловлю фронты таймером TIM1 (1 и 3 каналы таймера соответственно). Пины PA10 и PA11 вручную устанавливаю/сбрасываю.
По захвату на каждом из каналов DMA копирует младший или старший байт порта GPIOB (в зависимости от "сработавшего" канала) в старший байт порта GPIOC. В младшем и старшем байтах порта GPIOB записаны такие значения, при копировании которых загорается синий или зеленый светодиоды.
CODE
#include "stm32f0xx.h"
#include <stdint.h>
int main(void)
{
//uint8_t port = 0x01;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_DMA1EN;
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9;
GPIOC->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9);
GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9);
GPIOC->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0;
GPIOA->AFR[1] |= (2 << ((8 - 8) << 2)) | (2 << ((10 - 8) << 2));
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR11;
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_11);
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR11);
GPIOA->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_0 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_0;
DMA1_Channel2->CNDTR = 1;
DMA1_Channel2->CPAR = (uint32_t)&GPIOC->ODR + 1;
DMA1_Channel2->CMAR = (uint32_t)&GPIOB->ODR;
DMA1_Channel2->CCR |= DMA_CCR_EN | DMA_CCR_DIR | DMA_CCR_CIRC | DMA_CCR_PL ; // из CMAR в CPAR, циклическая передача, размер данных - 8 бит
DMA1_Channel5->CNDTR = 1;
DMA1_Channel5->CPAR = (uint32_t)&GPIOC->ODR + 1;
DMA1_Channel5->CMAR = (uint32_t)&GPIOB->ODR + 1;
DMA1_Channel5->CCR |= DMA_CCR_EN | DMA_CCR_DIR | DMA_CCR_CIRC | DMA_CCR_PL; // из CMAR в CPAR, циклическая передача, размер данных - 8 бит
TIM1->CCMR1 |= TIM_CCMR1_CC1S_0; // Настраиваем канал 1 на вход без ремапа, фильтр отключен
TIM1->CCMR2 |= TIM_CCMR2_CC3S_0; // Настраиваем канал 3 на вход без ремапа, фильтр отключен
TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC3E; // Настраиваем каналы 1 и 3 на захват фронта и включаем их
TIM1->DIER |= TIM_DIER_CC1DE | TIM_DIER_CC3DE; // Захваты по каналам 1 и 3 сгенерируют запросы DMA
GPIOB->ODR = 0x0102;
for(;;) {
GPIOA->BSRR = GPIO_BSRR_BR_11 | GPIO_BSRR_BS_9;
for (int i = 0; i < 500; i++)
__NOP();
GPIOA->BSRR = GPIO_BSRR_BR_9 | GPIO_BSRR_BS_11;
for (int i = 0; i < 500; i++)
__NOP();
}
}