Restarting UART DMA using HAL
HAL_DMA_Abort
HAL_UART_DMAStop
and recalling the DMA initialisation routine but it still doesn't restart correctly
add
__HAL_USART_CLEAR_OREFLAG(&huart1);
====================================================
DMA_Cmd(DMA1_Channel1, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel1, 3000);
DMA_Cmd(DMA1_Channel1, ENABLE);
1. выключить канал dma
2. записать в CNDTR размер буфера
3. включить dma
при отладке с остановами работаеттолько такой код:
1a. выключить uart
1. выключить канал dma
2. записать в CNDTR размер буфера
2.a записать CCR то что писалось при инициализации
3. включить dma
3a. включить uart
============================================================
void DMA1_Channel4_IRQHandler(void)
{
DMA1->IFCR |= DMA_ISR_TCIF4;//очистить флаг окончания обмена.
}
HAL_DMA_Abort
HAL_UART_DMAStop
and recalling the DMA initialisation routine but it still doesn't restart correctly
add
__HAL_USART_CLEAR_OREFLAG(&huart1);
====================================================
DMA_Cmd(DMA1_Channel1, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel1, 3000);
DMA_Cmd(DMA1_Channel1, ENABLE);
1. выключить канал dma
2. записать в CNDTR размер буфера
3. включить dma
при отладке с остановами работаеттолько такой код:
1a. выключить uart
1. выключить канал dma
2. записать в CNDTR размер буфера
2.a записать CCR то что писалось при инициализации
3. включить dma
3a. включить uart
============================================================
void DMA1_Channel4_IRQHandler(void)
{
DMA1->IFCR |= DMA_ISR_TCIF4;//очистить флаг окончания обмена.
}
========================================================
To start another DMA transaction you should program a transaction length. It can be programmed only when a DMA channel disabled. So in your case code might looks like this:
void DMA1_Channel5_IRQHandler(void) {
DMA_ClearITPendingBit(DMA1_IT_TC5);
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA1_Channel5->CNDTR = UART_PACKET_SIZE; // <--- transaction length
DMA_Cmd(DMA1_Channel5, ENABLE);
}
Or you can use your function uart_receive_dma(), but you should disable a DMA channel prior to calling it.
void DMA1_Channel5_IRQHandler(void) {
DMA_ClearITPendingBit(DMA1_IT_TC5);
DMA_Cmd(DMA1_Channel5, DISABLE);
uart_receive_dma();
}
Second variant will do same thing as first, but will take much more time.
Комментариев нет:
Отправить комментарий