Простенький трансфер я делать научился: из памяти в регистр и обратно байтики пересылаю без проблем по запросу устройства.
А теперь хочу пересылать данные по таймеру. Но у меня ничего не получается.
Т.е. приходит сигнал от таймера по переполнению, и мне надо послать одно 16-битное слово.
Спойлер
Код: Выделить всё
volatile uint16_t videobuff[4];
LDMA_TransferCfg_t dispXferCfg = LDMA_TRANSFER_CFG_PERIPHERAL(ldmaPeripheralSignal_TIMER0_UFOF);
LDMA_Descriptor_t
disp_descriptor = LDMA_DESCRIPTOR_SINGLE_M2P_BYTE(videobuff, &(USART0->TXDOUBLE), sizeof(videobuff)/sizeof(videobuff[0]) );
void InitTransfer(void) {
// USART0 сконфигурирован...
TIMER0->CFG = TIMER_CFG_MODE_UP | TIMER_CFG_PRESC_DIV2 |
TIMER_CFG_SYNC_DISABLE | TIMER_CFG_DISSYNCOUT_EN ;
TIMER_DEVICE->EN = TIMER_EN_EN;
timer_freq = CMU_ClockFreqGet(cmuCLOCK_TIMER0);
divider = (usart_freq/(2 * 4* 125)) - 1; // 500us
TIMER0->TOP = divider;
// Enable LDMA clock
CMU_ClockEnable(cmuClock_LDMA, true);
LDMA_Init_t init = LDMA_INIT_DEFAULT;
// Initialize LDMA
LDMA_Init(&init);
// Enable LDMA Interrupt
NVIC_ClearPendingIRQ(LDMA_IRQn);
NVIC_SetPriority(LDMA_IRQn, 3);
NVIC_EnableIRQ(LDMA_IRQn);
disp_descriptor.xfer.size = ldmaCtrlSizeHalf;
disp_descriptor.xfer.blockSize = 1;
LDMA_StartTransfer(DYNAMIC_DISPLAY_LDMA_CH, &dispXferCfg, &disp_descriptor);
TIMER_DEVICE->CMD = TIMER_CMD_START;
}