cancel
Showing results for 
Search instead for 
Did you mean: 

Why HAL DMA functions are not working?

TurboSlow
Associate II

Hello Guys,

I am trying to read data via I2C bus using HAL_I2C_Master_Receive_DMA and HAL_I2C_Mem_Read_DMA, but both are not working

If I use HAL_I2C_Master_Receive it is working

I tried to manually disable and then re-enable DMA channel used by setting enable bit but this doesn't help

If I add DMA function in addition to HAL_I2C_Master_Receive iw also stoped working except on first use.

Also in debugger instruction marker is skipping DMA functions

I tried to add volatile to array definition and to set compilator optimization level to 0, but nothing helped

I tried my simple code in uVision5 and True Studio debuggers and result is the same, DMA functions are not working

Could you help me with this issue and give me some examples of using above functions?

11 REPLIES 11
RMirz.1
Associate

Доброго времени �?уток, �?толкнул�?�? �? похожей проблемой при работе �? DMA на контроллере f103. В проекте и�?пользовали�?ь два DMA один дл�? каналов �?ЦП (DMA ADC), второй дл�? отправки преобразованных значений �?ЦП на второй микроконтроллер f103, дл�? отображени�? их на tft �?кране (USART DMA). DMA �?ЦП �? и�?пользовал в режиме circular, а DMA USART вызывал в теле бе�?конечного цикла. В итоге таким образом ничего не работало, USART DMA не отправл�?л значени�?, работал только обычный USART Tx, но его �?коро�?ти мне не до�?таточно. Вы�?�?нил что USART DMA не �?бра�?ывает флаг готовно�?ти HAL_UART_STATE_BUSY, он в�?егда зан�?т �? так пон�?л из за circular в �?ЦП. Убрал circular в �?ЦП и начал его опрашивать в бе�?конечном цикле, �?то помогло но �?коро�?ть в�?ей �?и�?темы почему-то упала, так как на втором f103 который управл�?л tft, на �?кране было видно �?ловно чи�?ла формируют�?�?, �?то т�?жело объ�?�?нить но в общем медленнее. В итоге вернул circular, и начал про�?то �?бра�?ывать �?тот флаг в ручную по�?ле отправки значений �? USART DMA.

Вот так:

HAL_UART_Transmit_DMA(&huart2,(uint8_t *) str, sizeof(str)-1);

huart2.gState = HAL_UART_STATE_READY;

В�?е заработало, �?коро�?ть �?и�?темы выро�?ла в разы.

Возможно �?то неправильно, вот надею�?ь вы мне поможете, решить проблему без "ко�?тылей".

wish they published examples. they must have them to test the hardware....