Портирование приложений с семейства PIC18 на PIC24F
1.5. Сброс и старт
Система сброса семейства PIC24F может быть рассмотрена как расширенная система сброса PIC18:
- Сброс по включению питания (POR – Power-On Reset)
- Сброс по снижению напряжения питания (BOR – Brown-out Reset)
- Внешний сброс по выводу /MCLR
- Программный сброс (инструкция RESET)
- Сброс по переполнению сторожевого таймера (WDT - Watch-Dog Timer)
- Неустранимая ошибка стека (переполнение или опустошение)
В архитектуре PIC24F поддерживаются такие же или эквивалентные методы сброса. Кроме этого присутствуют дополнительные источники сброса и расширенный отчет об источнике. Состояние регистров специального назначение, а так же процедура старта микроконтроллера для архитектур PIC18 и PIC24F различаются (табл. 9)
Таблица 9. Основные различия источников сброса и процедуры старта семейств PIC18 и PIC24F
Параметр |
PIC18 |
PIC24F |
Источники сброса |
POR, BOR, /MCLR, программный сброс, ошибка стека, сторожевой таймер |
|
Дополнительные источники сброса |
Ошибка четности в слове конфигурации (PIC18FxxJ) |
Неверный код инструкции, неинициализированные рабочие регистры, ошибка четности в слове конфигурации, конфликт исключений |
Конфигурация сброса по снижению напряжения питания (BOR) |
Конфигурируется, программный доступ в большинстве устройств |
Привязана к регулятору на кристалле |
Сброс по ошибке стека |
Сброс |
Немаскируемое исключение |
Состояние регистров специального назначения после сброса* |
Зависит от источника сброса |
Не зависит от источника сброса |
Таймер старта по включению питания |
Конфигурируется |
Привязано к регулятору на кристалле |
* за исключением RCON и OSCCON |
1.5.1. Подробный отчет об источнике сброса
В микроконтроллерах PIC18 для отчета о причине сброса используется 7 битовых флагов, 5 из которых находятся в регистре RCON, и 2 – в регистре STKPTR (флаги ошибки стека). Микроконтроллеры PIC18 из семейства NanoWatt так же имеют контрольный бит SBOREN, состояние которого так же может косвенно говорить об источнике сброса. Все флаги в регистре RCON сбрасываются при возникновении события. Если флаг установлен, сброс произошел по другой причине. Проверка указанного набора флагов позволит судить приложению о точной причине сброса.
В семействе PIC24F для отчета о причине сброса используется 12 флагов, 11 из которых расположены в регистре RCON, и один (STKERR) – в регистре INTCON1. Каждый бит регистрирует одну из причин сброса. В дополнении к этому введены раздельные флаги режимов SLEEP и IDLE. В отличие от PIC18 флаги источников сброса устанавливаются при возникновении события.
Различия во флагах регистра RCON, индицирующих причину сброса для семейств PIC18 и PIC24F отмечены в табл. 10. В таблицах 11 и 12 указаны состояния флагов после событий сброса для семейств PIC24F и PIC18 соответственно.
Таблица 10. Основные различия флагов, индицирующих причину сброса для семейств PIC18 и PIC24F
Причина сброса |
Флаги PIC18 |
Флаги PIC24F |
Внешний сброс по выводу /MCLR |
- |
EXTR |
Программный сброс (инструкция RESET) |
/RI |
SWR |
Сброс по включению питания (POR) |
/POR |
POR |
Сброс по снижению напряжения питания (BOR) |
/BOR |
BOR |
Сброс по переполнению сторожевого таймера (WDT reset) |
/TO |
WDTO |
Сброс при конфликте исключений |
- |
TRAPR |
Неизвестный машинный код инструкции или не инициализированные рабочие регистры |
- |
IOPUWR |
Ошибка четности слова конфигурации |
- |
CM |
Режим SLEEP |
/PD |
SLEEP |
Режим IDLE |
/PD |
IDLE |
Переполнение стека |
STKFUL |
STKERR* |
Опустошение стека |
STKUNF |
STKERR* |
* Событие вызывает аппаратное немаскируемое исключение, а не сброс |
Таблица 11. Состояние отчетных флагов после сброса в семействе PIC24F
Событие |
Счетчик программ PC |
TRAPR |
IOPUWR |
EXTR |
SWR |
WDTO |
SLEEP |
IDLE |
CM |
BOR |
POR |
STKERR |
Сброс по включению питания (POR) |
0x00 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Н |
0 |
1 |
0 |
Программный сброс (инструкция RESET) |
0x00 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
Н |
0 |
0 |
0 |
Сброс по снижению напряжения питания (BOR) |
0x00 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Н |
1 |
0 |
0 |
Внешний сброс /MCLR: |
0x00 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
Н |
0 |
0 |
0 |
PC + 2 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
Н |
0 |
0 |
0 |
|
PC + 2 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
Н |
0 |
0 |
0 |
|
Сброс по WDT: |
0x00 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
Н |
0 |
0 |
0 |
PC + 2 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
Н |
0 |
0 |
0 |
|
PC + 2 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
Н |
0 |
|
0 |
|
Сброс по переполнению стека** |
0x00 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Н |
0 |
0 |
1 |
Сброс по опустошению стека** |
0x00 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Н |
0 |
0 |
1 |
Сброс при конфликте исключений |
0x00 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
Н |
0 |
0 |
0 |
Неизвестный машинный код инструкции или не инициализированные рабочие регистры |
0x00 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
Н |
0 |
0 |
0 |
Ошибка четности слова конфигурации |
0x00 |
Н |
Н |
Н |
Н |
Н |
Н |
Н |
1 |
Н |
Н |
Н |
Переход на вектор прерывания: |
*** |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Н |
0 |
0 |
0 |
*** |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
Н |
0 |
0 |
0 |
|
Режим IDLE (инструкция PWRSAV 1) |
PC + 2 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Н |
0 |
0 |
0 |
Режим SLEEP (инструкция PWRSAV 0) |
PC + 2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
Н |
0 |
0 |
0 |
Н = состояние не изменяется ** В микроконтроллерах семейства PIC24F ошибка стека вызывает немаскируемое исключение. |
Таблица 12. Состояние отчетных флагов после сброса в семействе PIC18
Событие |
Счетчик программ PC |
RCON |
STKPTR |
||||||
SBOREN* |
~RI |
~TO |
~PD |
~POR |
~BOR |
STKFUL |
STKUNF |
||
Сброс по включению питания (POR) |
0x00 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
Сброс по снижению напряжения питания (BOR) |
0x00 |
Н** |
1 |
1 |
1 |
Н |
0 |
Н |
Н |
Программный сброс (инструкция RESET) |
0x00 |
Н** |
0 |
Н |
Н |
Н |
Н |
Н |
Н |
Внешний сброс /MCLR: |
0x00 |
Н** |
Н |
Н |
Н |
Н |
Н |
Н |
Н |
0x00 |
Н** |
Н |
1 |
Н |
Н |
Н |
Н |
Н |
|
0x00 |
Н** |
Н |
1 |
0 |
Н |
Н |
Н |
Н |
|
Сброс по WDT: |
0x00 |
Н** |
Н |
0 |
Н |
Н |
Н |
Н |
Н |
PC + 2 |
Н** |
Н |
0 |
0 |
Н |
Н |
Н |
Н |
|
Сброс по переполнению стека (STVREN = 1) |
0x00 |
Н** |
Н |
Н |
Н |
Н |
Н |
1 |
Н |
Сброс по опустошению стека (STVREN = 1 или 0) |
0x00 |
Н** |
Н |
Н |
Н |
Н |
Н |
Н |
1 |
Выход по прерыванию из энергосберегающих режимов |
PC + 2 *** |
Н** |
Н |
Н |
0 |
Н |
Н |
Н |
Н |
Н = состояние не изменяется * Бит SBOREN не реализован в устройствах PIC18FxxJ и первых кристаллах с технологией NanoWatt |
1.5.2. Дополнительные источники сброса в архитектуре PIC24F
В дополнении к источникам сброса, которые присутствуют и в микроконтроллерах PIC18, PIC24F имеет три дополнительных источника сброса:
- IOPUWR: Сброс происходит при выборке команды с неизвестным машинным кодом (например, счетчик команд PC указывает на часть Flash памяти, в которой хранятся пользовательские константы). Так же этот вид сброса происходит при использовании неинициализированных W регистров в качестве указателей.
- CM: Сброс производится если данные в конфигурационном слове не соответствуют его положению в Flash памяти (например слово CON1 записано по адресу CON2), либо при ошибке четности конфигурационного слова.
- TRAPR: Сброс производится при конфликте исключений, т.е. при возникновении второго исключения в то время пока не обработано первое.
Эти источники сброса не имеют эквивалентов в архитектуре PIC18
1.5.3. Ошибки стека
В микроконтроллерах PIC18 при возникновении переполнения или опустошения стека происходит полный сброс, если установлен конфигурационный бит STVREN. Даже если прерывание по ошибке стека запрещено, счетчик команд PC сбрасывается на ноль. В зависимости от вида ошибки (переполнение, опустошение) устанавливаются сигнальные флаги STKFUL или STKUNF.
В микроконтроллерах PIC24F ошибка стека вызывает программное исключение (soft trap), при этом в счетчик команд PC загружается адрес вектора обработчика этого исключения – 0x000A. Следует заметить, что ошибки переполнения и опустошения стека имеют один вектор прерывания и один сигнальный бит STKERR. Более подробно программные и аппаратные исключения архитектуры PIC24F будут рассмотрены в п. 1.6.2 «Немаскируемые исключения».
1.5.4. Конфигурация сброса по снижению напряжения питания (BOR)
В микроконтроллерах PIC18 сброс BOR может быть разрешен или запрещен, а порог напряжения питания, при котором производится сброс, программируется в конфигурационном слове битами BORV1:BORV0. Новые микроконтроллеры PIC18 из семейства NanoWatt имеют возможность программной конфигурации BOR-сброса в режиме выполнения кода.
В микроконтроллерах PIC24F логика сброса по снижению напряжения питания объединена со стабилизатором напряжения ядра, расположенного на кристалле. Сброс BOR всегда активирован, если включен стабилизатор, а порог сброса лежит в пределах 2.35 – 2.60 В. Возможность семейства PIC24F обеспечивать максимальную производительность во всем диапазоне питающего напряжения делает конфигурацию BOR ненужной, в то время как для семейства PIC18 это необходимо (максимальная производительность, а точнее частота тактирования, зависит от напряжения питания). Следует заметить, что микроконтроллеры PIC18FxxJ имеют схему BOR сброса аналогичную PIC24F.
1.5.5. Состояние регистров специального назначения (SFR) после сброса
В микроконтроллерах PIC18 после сброса регистры специального назначения могут находиться в двух различных состояниях в зависимости от причины сброса. После сбросов по включению питания (POR) и снижению напряжения питания (BOR) регистры специального назначения находятся в первом состоянии. После всех остальных причин сброса регистры специального назначения находятся во втором состоянии. В зависимости от назначения регистра его значение в двух состояниях после сброса может быть одинаковым, однако для большинства регистров оно различно.
В микроконтроллерах PIC24F после любого вида сброса регистры специального назначения переходят в одно состояние по умолчанию, в зависимости от назначения регистра. Исключением являются регистры RCON и OSCCON. Состояние первого определяется причиной сброса, второго – словом конфигурации.
Для микроконтроллеров PIC18 определено состояние регистров специального назначения после выхода из энергосберегающего режима по переполнению сторожевого таймера. Для большинства регистров это состояние соответствует выходу из энергосберегающего режима по внешнему событию (wake-up event). Для микроконтроллеров семейства PIC24F состояние регистров SFR не меняется при выходе из энергосберегающего режима. За более подробной информацией можно обратиться к [1].
1.5.6. Задержка старта после сброса
В микроконтроллерах PIC18 присутствует специальный таймер с фиксированным периодом, задерживающий контроллер в состоянии сброса после подачи питания. Период таймера TPWRT выбран таким образом, чтобы все периферийные модули успели инициализироваться, а регистры специального назначения перейти в требуемое состояние. Таймер, задерживающий запуск микроконтроллера, может быть включен или выключен установкой бита в конфигурационном слове. В зависимости от выбранного источника тактирования и использования PLL к периоду таймера добавляется некоторое время, которое требуется для запуска генератора и установления петли ФАПЧ.
Для микроконтроллеров PIC24F время удержания в сбросе после BOR или POR событий зависит от конфигурации стабилизатора напряжения ядра. Если стабилизатор выключен, время удержания в сбросе равно TSTARTUP = TPWRT. Если стабилизатор включен – время удержания в сбросе равно TVREG. Интервал TPWRT фиксирован и составляет 64 мс, что сравнимо с задержкой старта семейства PIC18. Время TVREG составляет 10 мкс. Этого достаточно для запуска регулятора и стабилизации напряжения ядра. В дополнении к этому при сброшенном бите VREGS (RCON<8>) к интервалу задержки добавляется дополнительное время, которое требуется для запуска и стабилизации генератора и установления петли ФАПЧ, если используется умножение тактовой частоты.
1.5.7. Дополнительные возможности
Многие микроконтроллеры PIC18 с поддержкой NanoWatt технологии позволяют конфигурировать вывод внешнего сброса /MCLR как порт общего назначения (только на вход). Функция вывода /MCLR определяется битом конфигурации MCLRE.
В микроконтроллерах PIC24F вывод /MCLR, не может выполнять функции вывода общего назначения и всегда является выводом внешнего сброса.
1.5.8. Рекомендации по портированию приложения
Для приложений, в которых необходимо определять источник сброса, часть кода, отвечающая за опрос флагов сброса, должна быть изменена. Флаги причин сброса в PIC24F аналогичны флагам в PIC18, однако их больше, и они имеют несколько другие причины установки. В PIC24F нет необходимости проверять все флаги с целью принятия решения о причине сброса – для большинства ситуаций достаточно определить, какой флаг установлен. Следует помнить, что в PIC18 флаги сброса имеют активную величину 0, в то время как в PIC24F – 1.
В микроконтроллерах PIC24F время удержания микроконтроллера в сбросе будет больше, если не используется внутренний стабилизатор напряжения ядра. Если стабилизатор напряжения ядра используется – автоматически включается функция сброса по снижению напряжения питания (BOR).
Внимание: внутренний стабилизатор напряжения ядра не предназначен для питания внешних устройств! Микроконтроллер может быть поврежден при превышении тока, на который рассчитан стабилизатор.
Рекомендуется для архитектур PIC18 и PIC24F подтягивать вывод внешнего сброса /MCLR к шине VDD резистором с номиналом 1 кОм. В случае нештатных ситуаций он ограничит ток, втекающий в вывод /MCLR. При этом система может остаться частично работоспособной даже при физическом повреждении драйверов других портов.