Отладчик ломает чтение по DMA
Добавлено: Вс сен 16, 2018 02:32:06
Всем привет. Читаю данные из SPI флэш через USART с использованием DMA. Один канал DMA пишет 1024 байта во флэш, второй одновременно принимает 1024 байта и сохраняет в буфер. Когда все 1024 байта отправлены и получены DMA передает контроллеру запросы прерываний TX и RX и вызываются их обработчики. Читаю где-то по 100 килобайт за секунду со скоростью 4 млн бод.
Проблема в том, что при запуске прошивки через отладчик через какое-то время возникает ситуация, когда на приеме последний 1024-й байт посылки куда-то теряется и перестает вызываться обработчик RX прерывания. Причем обработчик TX прерывания вызывается стабильно.
Что вижу в отладчике:
1. Счетчик DMA переданных байт равен 0, а прочитанных 1. То есть по DMA передано 1024 байта, а прочитано только 1023. DMA ждет последний байт посылки и так как его нет - нет и прерывания.
2. Флаги ошибок равны 0
3. В регистре чтения USART лежит последний байт посылки (0x89). То есть последний (1024-й) байт посылки похоже таки пришел в контроллер. Но счетчик DMA почему-то не обнулился и как следствие DMA не запросил RX прерывание контроллеру.
Самое интересное: такая истуация возникает только при запуске прошивки через отладчик. Может возникнуть в любой момент: через несколько секунд или позже (но, как правило, работает не больше 20 минут). А когда запускаю девайс без отладчика - все нормально работает по несколько часов (самое долгий тест 16 с чем-то часов).
Я в недоумении. Это косяк в моем коде, косяк в отладчике или косяк контроллера? У кого-нибудь возникали подобные ситуации? В чем может быть проблема?
Проблема в том, что при запуске прошивки через отладчик через какое-то время возникает ситуация, когда на приеме последний 1024-й байт посылки куда-то теряется и перестает вызываться обработчик RX прерывания. Причем обработчик TX прерывания вызывается стабильно.
Что вижу в отладчике:
1. Счетчик DMA переданных байт равен 0, а прочитанных 1. То есть по DMA передано 1024 байта, а прочитано только 1023. DMA ждет последний байт посылки и так как его нет - нет и прерывания.
2. Флаги ошибок равны 0
3. В регистре чтения USART лежит последний байт посылки (0x89). То есть последний (1024-й) байт посылки похоже таки пришел в контроллер. Но счетчик DMA почему-то не обнулился и как следствие DMA не запросил RX прерывание контроллеру.
Самое интересное: такая истуация возникает только при запуске прошивки через отладчик. Может возникнуть в любой момент: через несколько секунд или позже (но, как правило, работает не больше 20 минут). А когда запускаю девайс без отладчика - все нормально работает по несколько часов (самое долгий тест 16 с чем-то часов).
Я в недоумении. Это косяк в моем коде, косяк в отладчике или косяк контроллера? У кого-нибудь возникали подобные ситуации? В чем может быть проблема?