Не сталкивался ли кто с таким эффектом, что при применении режима DOZE с динамическом переключении частоты CPU, начинают глючить UART-ы на прием. Т.е. при включении бита ROI (CLKDIV): Recover on Interrupt bit, который автоматически увеличивает частоту CPU при вхождении в прерывание, или при ручном вкл/выкл бита DOZEN (CLKDIV): Doze Enable bit, который меняет частоту CPU там, где хочется обработать функцию побыстрее.
Сбои выглядят так, что случайным образом при приеме взводятся биты ошибок приема Frame Err и Overrun Err При этом софт бракует принятый пакет и обмен рушится.
Немного подробностей: PIC24F32KA304 работал на кварце 7.3728 МГц Два UART-а на 115.2 кбит/с, загрузка не слишком большая, несколько пакетов в секунду. Такой вариант выпускался несколько лет сотнями, проблем не было.
Решил я ускорить обработку, запустил PLL x 4. На этой частоте работает периферия. CPU можно включать на кратной пониженной частоте. Так вот, при статическом режиме, когда я не переключаю на ходу делители, все работает стабильно: Fosc=7.3728 МГц, PLL x 4, CPU 1:1 или 1:2 или 1:4
Как только начинаю динамически переключать тактирование CPU 1:1/1:2 или 1:1/1:4 - работа UART-ов рушиться. Причем все остальное вроде работает, средние токи потребления PIC24F32KA304 соответствуют выставляемым делителям. Такое впечатление, что из-за скачков потребления самопроизвольно взводятся флаги ошибок.
В Errate ничего не нашел...
|