Перейти к содержанию
    

CH32F2 Не работает DMA+Sleep

Китайский CH32F205. Перестает работать DMA когда ухожу в  Sleep режим(WFI) 😂, если WFI нет, то DMA работает, прерывания по Transfer Complete приходят, добавляю WFI, прерывания перестают генерироваться, но когда срабатывает другое прерывания, например от таймера, микроконтроллер просыпается и следом влетаю в прерывание DMA. Такое ощущение что DMA вместе с ядром спит...
Написал китайцам, не знаю ответят ли, по этому задаю вопрос здесь, может кто-то встречался с подобном? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А это аналог STM32?

И второе - в каком режиме работает DMA и кто его пинает?

И третье - содержимое регистра включения тактирования AHB периферии из под отладчика - ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, Arlleex said:

А это аналог STM32?

На сколько я понял за основу был взят STM32F205 но туда был добавлен USB-PHY HIGH Speed, дерево клоков соответственно отличается
 

30 minutes ago, Arlleex said:

И второе - в каком режиме работает DMA и кто его пинает?

DMA работает в режиме Normal, пинает его... я пробовал два варианта:
1 - I2S, причем клок на выводе CK есть всегда
2 - Таймером дергать DMA
Оба варианта c WFI не работают, без WFI все OK

Кoнфигурациия DMA:

    _dma_i2s_rx_params.DMA_PeripheralBaseAddr = (uint32_t)&RECORD_I2S_INSTANCE->DATAR;
    _dma_i2s_rx_params.DMA_DIR = DMA_DIR_PeripheralSRC;
    _dma_i2s_rx_params.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    _dma_i2s_rx_params.DMA_MemoryInc = DMA_MemoryInc_Enable;
    _dma_i2s_rx_params.DMA_Mode = DMA_Mode_Circular;
    _dma_i2s_rx_params.DMA_Priority = DMA_Priority_VeryHigh;
    _dma_i2s_rx_params.DMA_M2M = DMA_M2M_Disable;
    /* 32bit word will places as two 16bit, so need use only Half Words */
    _dma_i2s_rx_params.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    _dma_i2s_rx_params.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    _dma_i2s_rx_params.DMA_MemoryBaseAddr = (uint32_t)&_dma_i2s_left_right_data_buffer;
    _dma_i2s_rx_params.DMA_BufferSize =
        sizeof(_dma_i2s_left_right_data_buffer) / 2;  // two 16bit samples per channel, for two channels
    
    //
    _dma_mem2mem_params.DMA_PeripheralBaseAddr = ((uint32_t)&_dma_i2s_left_right_data_buffer) + 4;
    _dma_mem2mem_params.DMA_DIR = DMA_DIR_PeripheralSRC;
    _dma_mem2mem_params.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    _dma_mem2mem_params.DMA_MemoryInc = DMA_MemoryInc_Enable;
    _dma_mem2mem_params.DMA_Mode = DMA_Mode_Normal;
    _dma_mem2mem_params.DMA_Priority = DMA_Priority_VeryHigh;
    _dma_mem2mem_params.DMA_M2M = DMA_M2M_Disable;  // M2M Disable because Timer5 Driven it
    _dma_mem2mem_params.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    _dma_mem2mem_params.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

 

 

41 minutes ago, Arlleex said:

И третье - содержимое регистра включения тактирования AHB периферии из под отладчика - ?

Сейчас не отвечу, но скажу что я туда 0xFFFFFFFF от безнадёги записывал, Ну и видел одну тему в инете, с подобными симптомами, там человек клок SRAM'а включал, я тоже так делал, не помогло...
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Integro сказал:

Китайский CH32F205. Перестает работать DMA когда ухожу в  Sleep режим(WFI)

Точно "sleep mode"? Вам известно, что WFI может переводить и в другие режимы энергосбережения (не только sleep)? В зависимости от регистров конфигурации. И в тех режимах какие-то клоки/питания могут отключаться.

И с какой памятью работает DMA?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, jcxz said:

Вам известно, что WFI может переводить и в другие режимы энергосбережения (не только sleep)?

Да, конечно, я тоже об этом сразу подумал, SCB_SCR_SLEEPDEEP, PWR_CTLR_PDDS и PWR_CTLR_PDDS установлены в нули, и повторюсь, паралельно работает таймер(простой таймер, не RTC), он то может разбудить MCU, плюс клоки на I2S есть во время сна, значит периферия работает, по какойто причине перестает работать DMA. Из Stop режима я могу выйти только через EXTI и RTC из Standby по RTC и одному пину, так что вариант что я заходу в другой режим сна я почти сразу отбросил...

Здесь все похоже что это какой-то брак или баг в кристале(например ядро вешает шину и DMA не может работать), в чем я очень сомневаюсь, но не исключаю такой вариант, либо есть какаято особенность в клоках

 

6 hours ago, jcxz said:

И с какой памятью работает DMA?

Там только одна SRAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, Integro сказал:

Там только одна SRAM

В некоторых МК (например - в семействе LPC17xx) часть внутренней ОЗУ отключается во время даже минимального сна (WFI/WFE). Отключается доступ к ней. Об этом сказано в мануале. Хотя в вашем вроде единственный общий регион ОЗУ...

Советую попробовать WFE вместо WFI. Почему кстати именно WFI, а не WFE?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 минут назад, jcxz сказал:

Советую попробовать WFE вместо WFI. Почему кстати именно WFI, а не WFE?

А в чем преимущество WFE? Еще и в одноядерном МК.

Цитата

В некоторых МК (например - в семействе LPC17xx) часть внутренней ОЗУ отключается во время даже минимального сна (WFI/WFE).

У всех STM и десятков клонов тоже отключается, но это отключение, хорошо что, контролируемое битом в одном из регистров. Выше я спрашивал, что там с этим битом - ТС ответил, что все правильно настроил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

51 minutes ago, jcxz said:

Почему кстати именно WFI, а не WFE?

В прерывании логика переключения буфера, так как есть действующее прерывание по этому и WFI

Ради теста попробую WFE но думаю врядли что то измениться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Integro сказал:

Ради теста попробую WFE но думаю врядли что то измениться

Попробуйте, очень интересно. Однако (для примера взял STM32F103) на WFE

Цитата

Exiting Sleep mode

If the WFI instruction is used to enter Sleep mode, any peripheral interrupt acknowledged by the nested vectored interrupt controller (NVIC) can wake up the device from Sleep mode.
If the WFE instruction is used to enter Sleep mode, the MCU exits Sleep mode as soon as an event occurs. The wakeup event can be generated either by:

  • enabling an interrupt in the peripheral control register but not in the NVIC, and enabling the SEVONPEND bit in the Cortex®-M3 System Control register. When the MCU resumes from WFE, the peripheral interrupt pending bit and the peripheral NVIC IRQ channel pending bit (in the NVIC interrupt clear pending register) have to be cleared.
  • or configuring an external or internal EXTI line in event mode. When the CPU resumes from WFE, it is not necessary to clear the peripheral interrupt pending bit or the NVIC IRQ channel pending bit as the pending bit corresponding to the event line is not set.


Т.е., как видно, требуется не разрешать прерыания на стороне NVIC. И как тогда действовать после пробуждения? Руками разрешать нужное прерывание после WFE в NVIC?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, Arlleex сказал:

А в чем преимущество WFE? Еще и в одноядерном МК.

Многоядерность не при чём. Работа WFI и WFE даже в пределах одного ядра - различаются. В мануале на CH32F в описании входа/выхода в low power modes команды WFI и WFE рассматриваются отдельно:

image.thumb.png.4bfe4267dfe63aad1d81599a1d4d2daf.png

....и далее читать.

image.thumb.png.24d9d7c8b4a2685e0d82fe51750ababa.png

У ТСа проблема с DMA. Может быть как раз WFE ему поможет, раз в описании указано, что пробуждение от wake-up event, а не IRQ.

Но конечно - надо читать подробнее....

17 минут назад, Arlleex сказал:

Т.е., как видно, требуется не разрешать прерыания на стороне NVIC. И как тогда действовать после пробуждения? Руками разрешать нужное прерывание после WFE в NVIC?

В смысле как действовать? Как обычно.

PS: Я всегда на всех Cortex-M использую WFE, а не WFI.

31 минуту назад, Integro сказал:

В прерывании логика переключения буфера, так как есть действующее прерывание по этому и WFI

Ради теста попробую WFE но думаю врядли что то измениться

А прерывание у вас кем генерится? DMA-контроллером? А может он генерить это прерывание например если МК вошёл в сон по WFI?

Может быть и нет. Тогда может помочь WFE.

55 минут назад, Arlleex сказал:

Еще и в одноядерном МК.

По логике работы, DMA - это другой bus master. В этом он как раз похож на другое ядро.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, Integro сказал:

паралельно работает таймер(простой таймер, не RTC), он то может разбудить MCU...

А в каком месте стоит WFI?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

PS: Я всегда на всех Cortex-M использую WFE, а не WFI.

А если во сне работает несколько периферийных блоков, и каждый из них генерирует разные события, при этом просыпаться надо только от одной конкретной периферии? WFE тем и плох, что ему пофиг, кто конкретно пробудит процессор. Все события так или иначе заводятся в ядро на один сигнал - RXEV. А вот WFI ждет конкретный сигнал - прерывание, а выделить одно конкретное прерывание (для пробуждения) можно уже штатными средствами NVIC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги спасибо за активное участие, WFE ситуацию не изменило...:sorry:

В отладчике вывел регистр DMA CNTR, которой инкриминируется по мере заполнения буфера, без режима сна активно меняются значения, в режиме сна "стоит" до тех пор пока не сработает прерывание таймера и ядро не проснется.
Выходит что,
1. Либо DMA вместе с ядром засыпает
2. Либо шина не работает в этот момент, но в этот момент я бы какой нибудь BusFault словил, хотя не уверен в этом...
3. Либо DMA не получает request от периферии, повторюсь, DMA я пробовал запускать напрямую от I2S(SPI) и от таймера, результат одинаков. Кроме того, клок I2S фигачит даже во сне, значит периферия работает
4. Либо есть что-то о чем я не знаю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответила техподдержка, не работает DMA во сне, предложили прерывание от периферии использовать что бы проц будить.

А так хорошо все начиналось, уже начал думать что CH32F это лучший китайский производитель. 😀 
 

Quote

Hello,  

DMA cannot wake up in sleep mode. DMA needs to receive data before it can interrupt. However, when the chip is in sleep mode, it cannot accept data and cannot interrupt, so it cannot wake up the chip. You can configure an interrupt line for the signal port. If data is received, it will cause the IO port to jump and interrupt, achieving the purpose of awakening the CPU

Quote

At present , CH32F and CH32Vx series product all have this problem. However, we are aware of this issue and will solve it in future product. I will contact you when our product solve this problem.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, Integro сказал:

А так хорошо все начиналось, уже начал думать что CH32F это лучший китайский производитель. 😀

О сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг 

"О сколь ещё открытий чудных готовит сей китайский чип. Внезапных багов и парадоксов друг..."  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...