Мало ли еще кому интересно. В проблеме частично разобрался. Дело в том, что для того, чтобы заново запустить DMA-транзакцию надо
- отключить DMA-канал
- забить в регистр CNDTR cоотв. канала DMA кол-во байт для передачи
- включить DMA
Т.о. вот что получилось чтобы отправить пакет заново:
Код
while (!DMA_GetFlagStatus(DMA1_FLAG_TC4));
DMA_Cmd (DMA1_Channel4, DISABLE); // Выключаем DMA
DMA_ClearITPendingBit(DMA1_FLAG_GL4); // Reset interrupt pending bits for DMA1 Channel4
DMA1_Channel4->CNDTR = USART1_TxBufferSize; // Устанавливаем кол-во байт для транзакции
DMA_Cmd (DMA1_Channel4, ENABLE); // Включаем DMA
while (!DMA_GetFlagStatus(DMA1_FLAG_TC4));
Отключать DMA нужно для того, чтобы записать произвести запись в регистр CNDTR т.к. данный регистр, если DMA не отключено, находиться в режите Read-Only.
Кстати, покопавшись в исходниках наших братьев по разуму - китайев, они перед очередной транзакцией делают DMA_Init() а потом включают канал.

))
Осталось только разобраться как всё же войти в прерывание
void DMA1_Channel4_IRQHandler(void) 
))
Причем как только добавляю NVIC_Configuration(); - сразу после отправки пакета контроллер встаёт даже не войдя в обработчик прерывания.
Вот код инициализации NVIC:
Код
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);
/* Enable the DMA Channel 4 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (& NVIC_InitStructure);
}
Сообщение отредактировал Halfback - Feb 10 2010, 16:48