инициализация такая:
Код
USART_InitStructure.USART_BaudRate = 125000;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_2;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode =/* */USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* for speed */
USART1->BRR = 0x0C << 4; //125 кбит/с скорость
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_Address;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
Код
for(;i<=MAXSIZE_UART_BUF-1; i++)
UART_Buf_Rx[i]=0; // очищаем буфер куда скадывает ДМА
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
NVIC_SetPriority (DMA1_Channel5_IRQn, 14);
NVIC_EnableIRQ (DMA1_Channel5_IRQn);
NVIC_SetPriority (USART1_IRQn, 15);
NVIC_EnableIRQ (USART1_IRQn);
NVIC_SetPriority (DMA1_Channel4_IRQn, 13);
NVIC_EnableIRQ (DMA1_Channel4_IRQn);
DMA1_Channel5_IRQHandler();
UART_Buf_Rx[i]=0; // очищаем буфер куда скадывает ДМА
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
NVIC_SetPriority (DMA1_Channel5_IRQn, 14);
NVIC_EnableIRQ (DMA1_Channel5_IRQn);
NVIC_SetPriority (USART1_IRQn, 15);
NVIC_EnableIRQ (USART1_IRQn);
NVIC_SetPriority (DMA1_Channel4_IRQn, 13);
NVIC_EnableIRQ (DMA1_Channel4_IRQn);
DMA1_Channel5_IRQHandler();
Код
void DMA1_Channel5_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC5))
{
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC5);
DMA_ClearITPendingBit(DMA1_IT_TC5);
flag_state_ready_dma = STOP_DMA_UART;
Send_DMA_UART(STOP_TRANSFER_ATTRIBUTE); // послыаем 2 байта через ДМА канал 5 по USART1
}
else
{
DMA1_Channel5->CNDTR = MAXSIZE_UART_BUF;
DMA1_Channel5->CMAR = (uint32_t) &UART_Buf_Rx[0];
USART_Cmd(USART1, ENABLE);
DMA1_Channel5->CNDTR = MAXSIZE_UART_BUF;
DMA_Cmd(DMA1_Channel5, ENABLE);
Send_DMA_UART(CONTINE_TRANSFER_ATTRIBUTE); // послыаем 2 байта через ДМА канал 5 по USART1
}
}
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC5))
{
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC5);
DMA_ClearITPendingBit(DMA1_IT_TC5);
flag_state_ready_dma = STOP_DMA_UART;
Send_DMA_UART(STOP_TRANSFER_ATTRIBUTE); // послыаем 2 байта через ДМА канал 5 по USART1
}
else
{
DMA1_Channel5->CNDTR = MAXSIZE_UART_BUF;
DMA1_Channel5->CMAR = (uint32_t) &UART_Buf_Rx[0];
USART_Cmd(USART1, ENABLE);
DMA1_Channel5->CNDTR = MAXSIZE_UART_BUF;
DMA_Cmd(DMA1_Channel5, ENABLE);
Send_DMA_UART(CONTINE_TRANSFER_ATTRIBUTE); // послыаем 2 байта через ДМА канал 5 по USART1
}
}
Инициализация проходит успешно, первый массив принимается, этот канал DMA останавливается. Массив обрабатывается и все дальше DMA не хочет запускаться
Счетчик стоит в 3FF, бит EN в 1 и все! ничего не идет. Так же используется канал 6 DMA на нем висит I2C прием. Камень F100C4, среда IAR 6.40
Что делать? Кто-нибудь сталкивался?