Как записать переменную во флеш память 80c51f120
Перейти к содержимому

Как записать переменную во флеш память 80c51f120

  • автор:

Методическое пособие 59

WDTCN, чтобы предотвратить переполнение сторожевого таймера. WDT включается и сбрасывается в результате любого системного сброса [2]. Запись в регистр WDTCN значения 0xAD вслед за значением 0xDE отключает WDT. Следующий сегмент программного кода иллюстрирует операцию отключения WDT: CLR EA ; запрет всех прерываний MOV WDTCN,#0DEh ; отключение сторожевого таймера MOV WDTCN,#0ADh ; SETB EA ; разрешение прерываний Между записью значений 0xDE и 0xAD должно пройти не более четырех тактовых циклов, иначе операция отключения игнорируется. На время этой процедуры следует запретить прерывания во избежание задержки между двумя операциями записи, при этом механизм упреждающей выборки должен быть включен. Контрольные вопросы: 1) Какие действия происходят при сбросе процессора? 2) Какие источники сброса существуют? 3) Как программно реализовать сброс процессора?

Лабораторная работа №3 Долговременное хранение данных и программирование Flash-памяти Цель лабораторной работы заключается в изучении подключения и использования flash-памяти для работы с микропроцессором C8051F120. Задачи лабораторной работы: рассмотреть возможности использования flashпамяти; изучить методы защиты flash-памяти; создать программный код для записи данных во flash-память. Теоретические сведения Все МК содержат 128 Кбайт (C8051F12хи C8051F130/1) или 64 Кбайт (C8051F132/3) встроенной перепрограммируемой Flash-памяти, предназначенной для хранения программного кода и долго временного хранения данных. Кроме этого имеется дополнительный 256-байтный блок Flash-памяти, предназначенный для долговременного хранения данных. Flash-память может программироваться внутрисистемно посредством JTAG-интерфейса или из программы, используя команду MOVX. Если бит Flash-памяти сброшен в 0, то для того, чтобы установить его в 1, его необходимо стереть. Байты перед программированием должны стираются (устанавливаться в 0xFF). Временные интервалы операций записи и стирания, необходимые для корректной работы, устанавливаются автоматически аппаратными средствами. В течение операции записи или стирания Flashпамяти бит FLBUSY регистра FLSTAT устанавливается в 1. В течение этого времени команды, расположенные в буфере упреждающей выборки или в кэш-памяти программных ветвлений, могут выполняться, однако, если потребуется

извлечь команду из Flash-памяти, то процессор будет остановлен до завершения операции записи или стирания. Прерывания, которые уже загружены в кэш-память программных ветвлений, также могут быть обслужены в течение этого времени, если только текущий код также выполняется из буфера упреждающей выборки или из кэшпамяти программных ветвлений. Любые прерывания, которые не были предварительно загружены в кэш-память или которые произошли в то время, пока процессорное ядро было остановлено, будут удерживаться в состоянии ожидания в течение выполнения операций записи/стирания Flash-памяти и будут обслужены сразу же после окончания этих операций в порядке, определяемом их уровнями приоритета[2]. Flash-память может использоваться не только для хранения программного кода, но и для долговременного хранения данных. Это позволяет рассчитывать и сохранять во время выполнения программы такие данные, как калибровочные коэффициенты. Данные записываются и стираются с помощью команды MOVX и считываются с помощью команды MOVC. Биты COBANK регистра PSBANK определяют, какая часть Flash-памяти адресуется операциями записи и стирания при обращении к адресному пространству 0x8000 … 0xFFFF. В МК с Flash-памятью объемом 64 Кбайт биты COBANK должны всегда содержать значение ‘01’, иначе операции записи, чтения и стирания Flash-памяти могут выполняться некорректно [3]. МК содержат два дополнительных 128-байтных сектора Flash-памяти (всего 256 байт), предназначенных для долговременного хранения данных. По причине небольшого размера этих секторов их особенно выгодно использовать в качестве долговременной сверхбыстродействующей памяти общего назначения. Несмотря на то, что во Flash-память можно записывать по одному байту зараз, сначала необходимо стереть весь сектор. Чтобы изменить один байт в многобайтном наборе данных, необходимо поместить данные на временное хранение в какую-либо память. После того, как

сектор стерт, данные обновляются и возвращаются в исходный сектор. 128-байтный размер сектора позволяет организовать процесс обновления данных без расходования пространства памяти программ или ОЗУ. Эти 128-байтные сектора отображены (в режиме дублирования) на обычную Flashпамять и занимают диапазон адресов 0x00 — 0x7F и 0x80 – 0xFF. Доступ к этим 128-байтным секторам возможен только тогда, когда бит SFLE регистра PSCTL установлен в 1. Выполнение программного кода из этих 128-байтных секторов сверхоперативной памяти не допускается. Эти 128-байтные сектора можно стирать по отдельности или оба одновременно. Чтобы стереть оба сектора одновременно, необходимо адресовать ячейку памяти 0х0400в операции стирания при установленном в 1 бите SFLE [1]. CIP-51 имеет опции защиты, позволяющие защитить Flash-память от случайной модификации со стороны программы и исключить возможность просмотра патентованного программного кода и констант. Биты разрешения записи памяти программ (PSCTL.0), разрешения стирания памяти программ (PSCTL.1) и разрешения записи/стирания Flash-памяти (FLACL.0) защищают Flashпамять от случайной модификации со стороны программы. Эти биты должны быть явно установлены в 1, чтобы программа могла модифицировать или стирать Flash-память. Дополнительные функции защиты предотвращают чтение и изменение патентованного программного кода и констант посредством JTAG-интерфейса или программы, запущенной на системном контроллере [3]. Установка байтов защитной блокировки защищает Flash-память от чтения и изменения посредством JTAGинтерфейса. Каждый бит в байте защитной блокировки защищает один 16-Кбайтный блок памяти. Сброс бита в 0 в байте блокировки чтения защищает соответствующий блок Flash-памяти от чтения посредством JTAG-интерфейса. Сброс бита в 0 в байте блокировки записи/стирания защищает блок от записи и/или стирания посредством JTAG-интерфейса.

Область сверхоперативной памяти (СОЗУ) блокируется для операций чтения или записи/стирания только тогда, когда все биты в соответствующих байтах защитной блокировки сброшены в 0 [1]. В МК C8051F12х и C8051F130/1 байты защитной блокировки находятся по адресам 0x1FBFE (байт блокировки записи/стирания)и 0x1FBFF (байт блокировки чтения). ВМК C8051F132/3 байты защитной блокировки находятся по адресам 0x0FFFE (байт блокировки записи/стирания) и 0x0FFFF (байт блокировки чтения). 1024-байтный сектор, содержащий байты защиты, можно программно записывать, но нельзя программно стирать. Операция чтения заблокированных для чтения байт возвратит в качестве результата неопределенные данные. Отладка кода в заблокированном для чтения секторе с помощью JTAGинтерфейса невозможна. Биты блокировки всегда могут быть прочитаны и сброшены в 0 независимо от параметров защиты блока, содержащего байты защиты. Это позволяет защитить дополнительные блоки уже после того, как был защищен блок, содержащий байты защиты [4]. Задание на лабораторную работу Самый простой способ программирования Flash-памяти заключается в использовании JTAG-интерфейса и средств программирования, предлагаемых фирмой SiliconLabs или независимыми производителями. Это единственный способ программирования неинициализированного МК. Flash-память можно программировать программным путем, используя команду MOVX с адресом и байтом данных в качестве обычных операндов. Перед записью во Flash-память с использованием команды MOVX операции записи Flashпамяти необходимо разрешить установкой в 1 бита разрешения записи памяти программ PSWE (PSCTL.0). Это приведет к тому, что операции записи с помощью команды MOVX будут относиться не к памяти XRAM (устанавливается

по умолчанию), а к Flash-памяти. Бит PSWE остается установленным в 1 до сброса его программным путем. Чтобы предотвратить случайную запись во Flash-память, рекомендуется запрещать прерывания на все время, пока бит PSWE установлен в 1. Для чтения Flash-памяти следует использовать команду MOVC. Чтение с использованием команды MOVX всегда относится к памяти XRAM, независимо от состояния бита PSWE. ВМК с Flash-памятью объемом 128 Кбайт биты COBANK регистра PSBANK определяют, какой из трех старших банков Flash-памяти отображается на адресное пространство 0x08000-0x0FFFF (для операций записи, чтения и стирания Flash-памяти). В МК с Flash-памятью объемом 64 Кбайт биты COBANK должны всегда содержать значение ‘01’, иначе операции записи, чтения и стирания Flash-памяти могут выполняться некорректно. Чтобы гарантировать целостность содержимого Flashпамяти, строго рекомендуется включить схему слежения за напряжением питания, соединив вывод MOVEN с шиной питания VDD и установив в 1 бит PORSF в регистре RSTSRC. Это касается любых систем, которые содержат код, осуществляющий запись/стирание Flash-памяти программным путем. Запись во Flash-память может сбросить в 0 биты, но не может установить их в 1. Только операция стирания может установить в 1 биты во Flash-памяти. Поэтому ячейку памяти, которую требуется запрограммировать, необходимо предварительно стереть, чтобы можно было записать новое значение. Управление временными интервалами операций записи и стирания осуществляется автоматически аппаратными средствами. Следует иметь ввиду, что в МК с Flash-памятью объемом 128 Кбайт зарезервирован блок памяти объемом 1024 байт, начинающийся с адреса 0x1FC00. Операции

записи/стирания ячеек Flash-памяти, расположенных в этой зарезервированной области, недопустимы. Байты Flash-памяти можно записывать по одному заразили небольшими блоками. Бит CHBLKW регистра CCH0CN определяет, что записывается во Flash-память в процессе операции записи: один байт или блок байтов. Если CHBLKW = 0, то запись во Flash-память будет осуществляться по одному байту за раз. Если CHBLKW = 1, то запись во Flashпамять будет осуществляться блоками по четыре байта по адресам в области памяти программ или блоками по два байта по адресам в области СОЗУ. Длительность операций записи блока равна длительности операций записи одного байта, что позволяет сэкономить процессорное время при сохранении больших объемов данных во Flash-памяти. При записи данных во Flash-память по одному байту за раз байты записываются по отдельности, и запись во Flashпамять выполняется после каждой команды записи MOVX. Ниже приведена рекомендуемая последовательность действий для записи данных во Flash-память по одному байту за раз: 1. Запретить прерывания. 2. Сбросить в 0 бит CHBLKW (CCH0CN.0) для выбора однобайтного режима записи. 3. Если осуществляется запись байт в банке 1, в банке 2 или в банке 3, то настроить соответствующим образом биты COBANK (PSBANK.5-4). 4. Если осуществляется запись байт в области СОЗУ, то установить в 1 бит SFLE (PSCTL.2). 5. Установить в 1 бит FLWE (FLSCL.0), чтобы разрешить операции записи/стирания Flash-памяти из программы пользователя. 6. Установить в 1 бит PSWE (PSCTL.0) для перенаправления действия команд MOVX на запись Flashпамяти. 7. Использовать команду MOVX для записи байта данных по определенному адресу памяти (повторять столько, сколько необходимо).

8. Сбросить в 0 бит PSWE (PSCTL.0) для перенаправления действия команд MOVX на пространство памяти данных XRAM. 9. Сбросить в 0 бит FLWE (FLSCL.0), чтобы запретить операции записи/стирания Flash-памяти. 10. Если стираемая страница расположена в области СОЗУ, то сбросить в 0 бит SFLE (PSCTL.2). 11. Разрешить прерывания. Контрольные вопросы: 1) Как в процессорах используется Flash-память? 2) С помощью каких операторов реализовать обращение к Flash-памяти?

Лабораторная работа №4 Режимы работы асинхронного полнодуплексного последовательного порта (УАПП1) Цель лабораторной работы состоит в изучении принципов работы и настройки асинхронного полнодуплексного последовательного порта. Задачи лабораторной работы: рассмотреть структуру асинхронного полнодуплексного последовательного порта; изучить режим генерации скорости передачи данных; исследовать поддержку связи с несколькими микропроцессорами. Теоретические сведения УАПП1 представляет собой асинхронный полнодуплексный последовательный порт, способный работать в режимах 1 и 3 стандартного (для архитектуры 8051) УАПП. Поддержка усовершенствованного режима генерации скорости передачи данных позволяет использовать для генерации стандартных скоростей обмена различные источники тактирования. Буферизация принимаемых данных позволяет УАПП1 начать прием второго входящего байта данных до того, как программа закончит чтение предыдущего байта данных [1]. С работой УАПП1 связаны следующие регистры специального назначения: регистр управления УАПП1 (SCON1) и буфер данных УАПП1 (SBUF1). Одна и та же ячейка памяти, адресуемая как SBUF1, обеспечивает доступ и к регистру передатчика, и к регистру приемника. При чтении регистра SBUF1 осуществляется доступ к регистру приемника, а при записи регистра SBUF1 — к регистру передатчика [2,4].

Если прерывания от модуля УАПП1 разрешены, то запрос прерывания генерируется при завершении передачи байта данных (установка в 1 флага TI1 в регистре SCON1) или при получении байта данных (установка в 1 флага RI1 в регистре SCON1). Флаги прерываний от УАПП1 не сбрасываются аппаратно при переходе к процедуре обслуживания прерывания. Они должны сбрасываться программно. Это позволяет программе определить причину, вызвавшую прерывание от УАПП1 (завершение передачи или завершение приема) [3]. Скорость передачи данных УАПП1 генерируется Таймером 1, работающим в 8-разрядном режиме с автоперезагрузкой. Частота передатчика (ТХ) определяется переполнением регистра TL1; частота приемника определяется переполнением регистра-копии регистра TL1, который недоступен из программы пользователя. Скорость передачи данных передатчика и приемника равна деленной на два частоте переполнения регистров TL1 и RX-Таймер соответственно. RX-Таймер работает тогда, когда включен Таймер 1 и использует то же самое значение перезагрузки (TH1). Однако перезагрузка регистра RX-Таймер происходит в тот момент, когда на выводе RX обнаруживается событие START. Это позволяет начать прием данных в любой момент при обнаружении события START, независимо от состояния Таймера ТХ [2].

Программирование флэш-памяти Проверка флэш-памяти

Характеристики режимов программирования и проверки флеш памяти

Примечание:Параметры действительны только для режима программирования 12В.

Временные характеристики режимов программирования и проверки флэш-памяти

Предельно допустимые параметры:

Рабочая температура . -55 C +125 C Температура хранения . -65 C +150 C Напряжение на Любом выводе относительно земли . -1.0В +7.0В Максимальное напряжение питания . 6.6В Выходной ток (лог 1) . 25.0 мА

Программирование микроконтроллера АТ89С2051

Порядок создания программ для микроконтроллера AT89C2051 таков:

Сначала нужно разработать схему будущего микропроцессорного устройства. Определиться к каким портам, какие управляемые цепи будут подключаться. К каким портам и как будут подключаться различные датчики и органы управления. Нужно понимать в принципе, алгоритм процессора в данной схеме. Затем нужно спаять макет будущего устройства. Можно не делать сразу все устройство целиком. Удобнее разбить весь процесс разработки на этапы. Например, сначала можно сделать блок индикации. Затем поставьте задачу — разработать подпрограмму вывода на индикатор, дополнив ее небольшой процедуркой, выводящей на индикатор что-то осмысленное. Ну, если это цифровой семи сегментный индикатор, выведите на него какую либо цифру, отличную от 8. В общем, что угодно. Лишь бы можно было увидеть результат.

Следующий этап — написание текста программы. Перед тем как писать текст программы, нужно изучить архитектуру и систему команд микропроцессора. Под архитектурой понимают то, какие внутренние регистры имеет процессор. Так как микроконтроллер AT89C2051 имеет внутреннее ОЗУ, совмещенное с регистрами общего назначения, нужно хорошо ориентироваться в структуре этого ОЗУ. Кроме того, в понятие архитектуры входит наличие портов ввода вывода. Система команд — это совокупность всех команд микропроцессора. Нужно понимать, что делает и на что влияет каждая команда.

Так как микроконтроллер AT89C2051 специально разрабатывался таким образом, что бы быть максимально совместимым с микросхемой iMCS-51 фирмы Intel, то архитектура и система команд этих двух контроллеров практически во всем схожи. Поэтому для изучения микропроцессора AT89C2051 необходимо сначала прочесть описание самого контроллера (см. ссылку «Описание AT89C2051«). А затем нужно прочесть описание микроконтроллера iMCS-51.

Следующее, что нужно знать прежде, чем начинать написание программы — это то, какую программу-транслятор вы будете использовать. От этого будет зависеть текст будущей программы. Для каждого процессора существует обычно множество модификаций программ трансляторов. Они, конечно, отличаются не по набору команд (набор команд определяется процессором), а по форме написания программы. Программы для контроллера AT89C2051 пишутся обычно на языке Ассемблера. Проверенный транслятор с этого языка Ассемблера для микроконтроллера iMCS-51 вы можете скачать здесь. Именно этот транслятор удобнее всего использовать в данном случае для создания программ. Описание особенностей ассемблера вы найдете в том же архиве, что и сам транслятор.

Описанный выше транслятор работает под управлением DOS. Поэтому и текст программы удобнее писать в DOS. Для этого подойдет практически любой текстовый редактор, работающий под DOS. Автор использует для работы со всеми программами, описанными в этом разделе файловый менеджер «Dos Navigator». Можете использовать так же «Norton Commander» под DOS или «Volkov Commander». У всех этих «командеров» имеется встроенный редактор текстов, вызываемый по клавише F4.

После того, как вы напишите текст программы и запишите его на диск в виде файла с расширением asm (например, myprog.asm), приступайте к трансляции программы. Для этого поместите файл с текстом программы и файл программы транслятора (Asm51.exe) в одну директорию. Эта директория должна появиться в активной панели вашего навигатора (командера). Наберите в командной строке следующую команду: asm51 myprog.asm и нажмите клавишу Enter. По окончании работы программы, она должна выдать сообщение о количестве найденных ошибок при трансляции. Кроме того, в той же директории появится несколько новых файлов. Файл myprog.lst — это листинг трансляции. Он содержит тот же текст программы, но справа добавлен столбец, где показаны результаты трансляции. Это коды, которыми программа заменила команды, написанные на языке ассемблера и адреса ячеек памяти программ, куда необходимо эти коды поместить. Там же содержится описание всех найденных ошибок. Пометки делаются прямо в тексте программ, и стрелочкой отмечается место, где найдена ошибка. Исправьте все ошибки и повторите трансляцию программы.

Еще один файл, который появится в результате трансляции — это myprog.hex. Это и есть исходный код программы, предназначенный для прошивки в память программ. Но не торопитесь его прошивать. Во первых формат этого файла не подходит для программатора. А во вторых, прежде чем прошивать программу в процессор, нужно опробовать ее работу в программе — отладчике. Программа отладчик имитирует работу микроконтроллера и при этом показывает на экране содержимое всех регистров и ячеек памяти процессора. Программу можно выполнять, как пошагово, так и в режиме автоматического выполнения с постановкой точек перехвата. Для каждого процессора имеется своя программа — отладчик. Хороший отладчик для микроконтроллера AT89C2051 вы можете скачать на нашем сайте в разделе Download. Когда вы скачаете архив с программой, то в нем, кроме самой программы, вы обнаружите ее описание. При помощи отладчика вылавливаются ошибки алгоритма, которые невозможно отловить в процессе трансляции. Исправьте ошибки и повторите трансляцию и отладку.

После того, как в отладчике программа заработает, так как нужно, можно приступать к прошивке программы в память программ микроконтроллера. Но перед этим нужно перевести объектный код из формата HEX в формат BIN. HEX формат — это специальный текстовый формат, в котором все байты кода программы, а так же адреса их размещения записываются в виде шестнадцатеричного кода. BIN формат — это просто набор кодов, составляющих программу. Для перевода из одного формата в другой и обратно служит пара программ: hex2bin.exe и bin2hex.exe. вы их так же можете скачать в разделе Download. Для того, что бы при помощи программы hex2bin.exe перевести файл из HEX формата в BIN формат, нужно поместить в одну директорию файл программы и исходный HEX файл и набрать в командной строке следующую команду: hex2bin myprog.hex И нажмите клавишу Enter. В результате работы программы появится файл myprog.bin.

Теперь можно приступать к программированию. Предварительно вы должны купить или спаять программатор, предназначенный для работы с вашим микроконтроллером. Существует множество разных схем программаторов. Для микроконтроллера AT89C2051 проще всего применить программатор, схему, описание и управляющую программу которого можно скачать в Download. Сначала спаяйте схему программатора. Подключите ее к источникам стабилизированного питания 12В и 5В. При помощи соответствующего разъема, подключите программатор к LPT порту компьютера. Вставте микросхему микроконтроллера в панельку программатора. Для запуска процесса программирования поместите в одну директорию, управляющую программу bi2051.exe и ваш файл программы (myprog.bin). В командной строке наберите следующую команду bi2051 myprog.bin И нажмите клавишу Enter. Сначала программа выдаст сообщение об авторских правах. Затем, если все нормально, начнется процесс программирования. Процесс должен быть длительный. Его продолжительность зависит от длинны программного кода, который вы пытаетесь записать. В процессе программирования на экране появится, и будет постепенно расти строка из точек. По окончании процесса программирования программа сама вернется в Dos Navigator или в ту программу, из которой вы ее запускали. Если микросхема вставлена неверно, если она просто дефектная, если, наконец, вы допустили ошибки при сборе схемы программатора, то программа выдаст соответствующую надпись (No device?) и откажется программировать.

Если процесс программирования прошел успешно, то нужно вынуть микросхему из панельки программатора и вставить в панельку отлаживаемого устройства. Включите питание и наблюдайте результат. Если вы получили то, что ожидали, спаяйте следующую часть схемы, дополните текст программы и повторите весь процесс заново. Если не получилось то, что вы ожидали, проанализируйте результат. Постарайтесь догадаться, в чем может быть причина. Придумайте, как изменить программу, что бы проверить различные версии, того, почему программа не работает как надо. Измените программу и повторите весь процесс.

ОРГАНИЗАЦИЯ ОДНОКРИСТАЛЬНЫХ МИКРОКОНТРОЛЛЕРОВ

Вводные замечания

Отдельный класс МС представляют однокристальные микроЭВМ. Интеграция всех составных частей МС (ЦП, памяти, подсистемы ВВ средств поддержки режима реального времени) привела к ряду ограничений на принципы ее организации, потребовала развития архитектуры в направлении, не свойственном для многокристальных компоновок.

Организация однокристальных микроЭВМ ориентирована на применение встраиваемых в изделие недорогих управляющих МС реального времени, рабочая программа которых расположена в ПЗУ системы. По этой причине находящаяся на кристалле физическая память микроЭВМ делится на постоянную для записи программ и оперативную для хранения различных переменных, а сами приборы называются однокристальными микроконтроллерами. Такому делению физической памяти способствовали и технологические ограничения, свойственные системам на одном кристалле.

Развитие интегральной технологии и расширение области применения одно­кристальных МК привели к дальнейшему совершенствованию архитектурных и структурных принципов их организации. Современные однокристальные МС обладают такими вычислительными ресурсами и возможностями управления в режиме реального времени, для получения которых раньше необходимы были более дорогие многокристальные компоновки. Применение МК на одном кристалле особенно эффективно в системах, где наряду с небольшой памятью требуются интенсивно используемые средства ВВ в реальном масштабе времени.

Периодом становления архитектуры 8-разрядных однокристальных МК счи­тают 1977—1979гг., когда появились первые приборы этого класса: 8048 фирмы Intel, 3870 фирмы Mostek и 9940 фирмы Texas Instruments Inc. Приборы 3870, 9940 были программно совместимы с многокристальными системами и во многом дублировали их архитектурные признаки, МК 8048 имели оригинальную органи­зацию.

В течение четырех лет, начиная с 1976 г., фирмой Intel было разработано семейство 8-разрядных однокристальных МК iMCS-48 [41], получившее широкое распространение, в основе которого лежит МК 8048 (табл. 4.1). В составе семейства 12 микроЭВМ с единой базовой архитектурой, но различными функциональными возможностями, реализованными непосредственно на кристалле. Семейство вклю­чает также ряд расширителей, согласованных с базовой архитектурой микроЭВМ и содержащих те части памяти программ и данных, а также средств ВВ, которые не включены в состав основного кристалла.

Базовая вычислительная среда iMCS-48 включает до 4К байт программного ПЗУ, формируемого как внутренними, так и внешними по отношению к микроЭВМ средствами. 64/128/256 байт внутренней и 256 байт внешней памяти данных, до 27 внутренних и 16 внешних линий ВВ, 8-разрядный таймер/счетчик, а также одноуровневую систему прерываний с двумя источниками запросов. Микроконтроллер 8021 является младшей моделью семейства, в которой отсут­ствуют средства подключения внешней памяти и система прерываний. На его основе создан простой прибор 8022 [31], в котором предусмотрен 8-разрядный аналого-цифровой преобразователь (АЦП) с двумя коммутируемыми аналоговыми входами. В отличие от остальных БИС 8041 [62] имеет встроенный системный адаптер (СА) для его подключения к шине более мощных систем в качестве программно-управляемого контроллера. Становление архитектуры МК было завершено к 1980 г., когда весь набор однокристальных МК и расширителей к ним был полностью освоен промышленностью. Сегодня элементы семейства iMCS-48 рассматриваются как стандартные компоненты для проектирования микропроцес­сорных средств и систем.

В 1980 г. фирмой Intel было разработано новое семейство однокристальных МК iMCS-51 [32, 57], базовым представителем которого является прибор 8051 (см. табл. 4.1). Новое семейство обеспечивает совместимость с архитектурой iMCS-48, но обладает более обширными адресными пространствами памяти программ и данных, усовершенствованными средствами ВВ и поддержки режима реального времени. В архитектуре предусмотрено до 64К байт ПЗУ, часть которого реализуется на кристалле, 128/256 байт внутреннего ОЗУ, до 64К байт внеш­него ОЗУ, 32 линии физического ВВ, программируемый последовательный интерфейс, два или три 16-разрядных таймера/счетчика и двухуровневая система прерываний с пятью или шестью источниками запросов. Дальнейшее развитие получила система команд и способы доступа к отдельным элементам данных. В состав системы введены команды умножения и деления, реализован булев подпроцессор. Сейчас в семействе iMCS-5I более восьми однокристальных микроЭВМ с различными физическими возможностями. Развитие семейства продолжается.

В 1983г., когда появилась возможность интеграции на одном кристалле кремния более чем 100 тыс. транзисторов, фирмой Intel было предложено семейство 16-разрядных однокристальных МК iMCS-96 [57]. В основе семейства лежит БИС 8096 (см. табл. 4.1), содержащая 120 тыс. транзисторов на одном кристалле, что позволило разместить на нем 16-разрядный ЦП, 8К байт программной памяти, 232 байт памяти данных, а также подсистему аналогового и цифрового ВВ с развитыми средствами поддержки режима реального времени, включая скоростной ВВ (СВВ). Практическое освоение перспективных 16-разряд­ных МК семейства iMCS-96, ориентированных на применение в 90-х гг.. находится в начальной стадии. Областью их использования будут сложные управляющие устройства с повышенными арифметическими возможностями.

Как записать переменную во флеш память 80c51f120

Здесь приведен перевод апноута AVR106: C functions for reading and writing to Flash memory [1], посвященного подпрограммам чтения и записи памяти FLASH на языке C для микроконтроллеров AVR. Рассмотрены функции чтения и записи одного байта FLASH, чтение и записи одной страницы FLASH, опциональное восстановление после неожиданного пропадания питания. Рассмотренные функции могут использоваться с любым устройством (микроконтроллером AVR), которое имеет возможность записи памяти программ из кода приложения [2] (это почти вся линейка AVR микроконтроллеров Atmel). Вместе с апноутом AVR106 приведен также проект примера программы [3], использующей секцию памяти программ для сохранения параметров.

Почти все микроконтроллеры AVR® компании Atmel имеют так называемую возможность самопрограммирования (Self programming Program memory). Самопрограммирование является одной из особенностей технологии AVR. Чтобы лучше разобраться с этим, обратитесь к апноуту AVR109 [2]. Самопрограммирование позволяет AVR перепрограммировать собственную память FLASH во время работы программы. Это подходит для приложений, которые нуждаются в самостоятельном обновлении кода firmware (bootloader, загрузчики, бутлоадеры) или сохранении какой-либо информации в области памяти FLASH. Этот апноут предоставляет функции на языке C, которые позволяют получить доступ к области памяти FLASH.

[Ассемблерная инструкция SPM]

Память FLASH может быть запрограммирована с помощью инструкции SPM (Store Program Memory). На устройствах, поддерживающих самопрограммирование, память программ FLASH часто делится на 2 основные секции: секция основной программы (память приложения, Application Flash Section) и секция загрузки (Boot Flash Section). Прим. переводчика: секция основной программы начинается с адреса 0x0000, а секция загрузки занимает маленький блок памяти обычно 2..4 килобайта в конце FLASH.

На устройствах, которые имеют блок памяти загрузки (boot block), инструкция SPM имеет возможность записи во всю область памяти FLASH, но только в том случае, если она выполняется из области памяти загрузки. Выполнение SPM из секции приложения не дает никакого эффекта. На младших устройствах AVR, к которых нет блока загрузки, инструкция SPM может работать из любого места памяти FLASH.

Во время записи FLASH в секции загрузки работа CPU всегда останавливается. Однако большинство устройств могут выполнить код (чтение) из секции загрузки, когда происходит запись области памяти приложения (Application section). Очень важно, чтобы код, выполняемый при записи Application section, не пытался читать из Application section. Если это вдруг произойдет, то может быть нарушено общее выполнение программы.

Размер и область размещения этих двух областей памяти FLASH зависит от типа устройства и установки его фьюзов. Некоторые устройства имеют возможность выполнять инструкцию SPM из любого места области памяти FLASH.

[Процедура записи FLASH]

Технология памяти FLASH устроена так, что записывается эта память постранично. Запись осуществляется путем сохранения всей страницы во временном буфере страницы, перед тем, как страница будет записана во FLASH. Адрес, по которому будет записаны данные страницы, определяется по содержимому Z-регистра и RAMPZ-регистра. Страница должна быть очищена (erase) перед тем, как на страницу могут быть записаны данные из временного буфера. Функции, которые содержит этот апноут, используют следующую процедуру для записи страницы FLASH:

• Заполнение буфера страницы
• Очистка страницы
• Запись страницы

Как можно заметить, возможна потеря данных, если во время этой процедуры неожиданно произойдет сброс или пропадание питания сразу после очистки страницы. Потери данных можно избежать, если предварительно применить буферизирование записываемых данных в энергонезависимой памяти (nonvolatile memory, обычно EEPROM). Функции записи, содержащиеся в этом апноуте, предоставляют опциональное буферизирование при записи. Эти функции далее рассматриваются в секции «Описание firmware». Для устройств, которые имеют фичу read-while-write (чтение во время записи), бутлоадер может выполняться во время записи, и из функций не произойдет возврат, пока запись не завершится.

[Адресация FLASH]

Память FLASH в AVR поделена на 16-битные слова. Это означает, что каждый адрес FLASH означает ячейку из 2 байт данных. Для ATmega128 можно адресовать до 65k слов или 128k байт данных FLASH. В некоторых случаях память FLASH упоминается адресованной словами, и в других случаях — адресованной побайтно, что вносит некоторую путаницу. Все функции, содержащиеся в этом апноуте, используют байтовую адресацию. Соотношение между байтовым адресом и адресом слова следующее:

Байтовый адрес = Адрес слова * 2

Страница FLASH адресуется с использованием адреса байта для первого байта на странице. Соотношение между номером станицы (0, 1, 2, . ) и адресом байта следующее:

Байтовый адрес = номер страницы * размер страницы (в байтах)

Пример байтовой адресации: размер страницы FLASH у ATmega128 равен 256 байт. Байтовый адрес 0x200 (512) укажет на следующее:

• Байт FLASH 0x200 (512), что соответствует байту 0 на странице 2
• Страница 2 FLASH

Когда адресуется страница ATmega128, младший байт адреса всегда 0. Когда адресуется слово, то младший бит (LSB) адреса всегда 0.

[Реализация проекта примера, работающего с FLASH]

Проект firmware сделан для компилятора IAR. Функции могут быть портированы на другие компиляторы, но могут потребоваться некоторые усилия, поскольку используется специфическая мнемоника (intrinsic functions) компилятора IAR. Функции доступны через подключение файла Self_programming.h в главный модуль C, и добавление модуля Self_programming.c к проекту. Когда используется Self-programming (самопрограммирование), то важно, чтобы функции для записи размещались в пределах секции загрузки (Boot section) памяти FLASH. Размещение функций управляется путем использования определений сегмента памяти в файле конфигурации линкера (*.xcl). Все другие необходимые конфигурации, касающиеся firmware, сделаны в файле Self_programming.h.

PAGESIZE. Константа PAGESIZE должна быть определена равной размеру страницы FLASH (в байтах) используемого устройства.

__FLASH_RECOVER. Определение константы __FLASH_RECOVER разрешает опцию восстановления Flash, чтобы избежать потери данных при случайных пропаданиях питания. Когда восстановление разрешено, одна страница Flash выделена под буфер восстановления. Значение __FLASH_RECOVER будет определять адрес страницы FLASH, которая используется для этого. Адрес должен быть байтовым, указывающим на начало страницы FLASH, и функции записи не смогут записывать в эту страницу. Восстановление FLASH происходит вызовом функции RecoverFLASH() при старте программы (program startup).

ADR_LIMIT_LOW и ADR_LIMIT_HIGH. Диапазон памяти, в котором функциям разрешено записывать FLASH, задается константами ADR_LIMIT_LOW и ADR_LIMIT_HIGH. Функции могут записывать по адресам больше или равным ADR_LIMIT_LOW и меньше или равным ADR_LIMIT_HIGH.

[Размещение всего кода внутри секции загрузки]

Необходимо перезадать диапазон сегментов, определенных в файле настройки линкера по умолчанию (файл *.xcl), чтобы разместить весь код приложения в секции загрузки (Boot section) FLASH. Размещение и размер Boot section зависит от устройства и установок его фьюзов. Программирование фьюза BOOTRST перенесет вектор сброса в начало секции загрузки. Также можно перенести все вектора прерывания в секцию загрузки. Обратитесь к секции даташита на устройство, посвященной прерываниям, за инструкциями, как это сделать. Определения сегмента, которые должны быть изменены для размещения всего программного кода в секции загрузки:

TINY_F, NEAR_F, SWITCH, DIFUNCT, CODE, FAR_F, HUGE_F, INITTAB, TINY_ID, NEAR_ID и CHECKSUM.

В этом апноуте предоставляется в качестве примера файл lnkm128s.xcl, где задано размещение всего кода программы в 8 килобайт секцию загрузки Atmega128. Этот файл можно просто модифицировать для использования с другими устройствами, и в нем содержатся инструкции, как это осуществить.

[Размещение в секции загрузки только некоторых функций]

В качестве альтернативы можно разместить только некоторые функции в заданном сегменте памяти FLASH. В нашем случае в секции загрузки нужно разместить только функции записи. Это можно сделать заданием нового сегмента FLASH, эквивалентного области памяти загрузки, и использование оператора @ для размещения нужных функций в этом сегменте. Оператор @ не распространяется на функции, которые вызываются внутри функций, помеченных @.

Определение сегмента загрузки (Boot segment) в файле *.xcl для ATmega128 с размером 8 килобайт:

1. Сделайте новое определение размера секции загрузки.

-D_..X_BOOTSEC_SIZE=2000 /* 4096 слов */ 

2. Задайте новый сегмент для всей секции загрузки, основанный на определении шага 1.

-Z(FARCODE)BOOT_SEGMENT=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-_..X_FLASH_END

Размещение функций C в заданном сегменте:

void ExampleFunction() @ BOOT_SEGMENT < //код функции . >

Пример кода на языке C, приведенный выше, разместит функцию ExampleFunction() в определенный сегмент памяти BOOT_SEGMENT.

[Описание firmware]

Код firmware состоит из 5 функций на языке C, и один проект примера для IAR версии 2.28a / 3.10c для ATmega128. Проект примера сконфигурирован так, чтобы разместить код всего приложения в секцию загрузки (Boot section) памяти FLASH. Этот код можно использовать как стартовую точку Вашей программы, которая может записывать FLASH. В таблице показаны функции, которые осуществляют доступ к памяти FLASH.

Функция Аргументы Возвращает
ReadFlashByte() MyAddressType flashAdr unsigned char
ReadFlashPage() MyAddressType flashStartAdr, unsigned char *dataPage unsigned char
WriteFlashByte() MyAddressType flashAddr, unsigned char data unsigned char
WriteFlashPage() MyAddressType flashStartAdr, unsigned char *dataPage unsigned char
RecoverFlash() void unsigned char

Тип данных MyAddressType определен в Self_programming.h. Размер этого типа зависит от используемого устройства. Для устройств, у которых FLASH больше 64 килобайт, он будет задан как long int, и int для устройств, у которых объем FLASH меньше или равен 64 килобайта (адрес байта 16-битный). Типы данных в реальности используются как указатели __flash или __farflash (соответственно 16 и 24 бит). Причина определения нового типа в том, что использование целочисленных типов более удобно, чем типов указателя.

ReadFlashByte() возвращает 1 байт, который размещен по адресу FLASH, указанном во входном аргументе.

ReadFlashPage() читает одну страницу памяти FLASH от адреса ucFlashStartAdr, и сохраняет данные в массиве pucDataPage[]. Количество сохраняемых байт зависит от размера страницы FLASH. Функция вернет FALSE, если входной адрес не является адресом страницы FLASH, иначе вернет TRUE.

WriteFlashByte() запишет байт ucData по адресу FLASH ucFlashAddr. Функция вернет FALSE, если входной адрес не является допустимым адресом FLASH для записи, иначе вернет TRUE.

WriteFlashPage() запишет данные из массива pucDataPage[] в страницу FLASH по адресу ucFlashStartAdr. Количество записываемых байт зависит от размера страницы FLASH. Функция вернет FALSE, если входной адрес не является допустимым адресом страницы FLASH для записи, иначе вернет TRUE.

RecoverFlash() прочитает переменную состояния в EEPROM, и восстановит страницу FLASH, если это необходимо. Функция должна быть вызвана в начале программы, если разрешена опция восстановления FLASH (__FLASH_RECOVER). Функция вернет TRUE, если имело место восстановление, иначе вернет FALSE.

[Как работает восстановление FLASH]

Когда разрешена опция восстановления FLASH, запись страницы вовлекает предварительное сохранение данных в выделенную страницу восстановления FLASH, перед тем как произойдет действительная запись во FLASH. Адрес записываемой страницы сохраняется в EEPROM совместно с байтом статуса, который показывает, что страница восстановления FLASH содержит данные. Этот байт состояния будет очищен, когда произойдет успешное завершение операции записи указанной страницы. Переменные в EEPROM и буфер восстановления FLASH используются функцией восстановления RecoverFlash(), чтобы восстановить данные, если это необходимо. Запись одного байта в EEPROM занимает примерно такое же время, как и запись всей страницы во FLASH. Так что нужно иметь в виду, что разрешение опции восстановления приведет к значительному увеличению времени записи. EEPROM используется вместо FLASH, потому что выделение нескольких байт в FLASH исключит гибкое использование всей страницы, которая будет содержать эти байты.

[Блок-схемы алгоритмов]

Рис. 2. Алгоритм работы функции ReadFlashByte().

AVR106-ReadFlashPage-fig3

Рис. 3. Алгоритм работы функции ReadFlashPage().

AVR106-WriteFlashByte-fig4

Рис. 4. Алгоритм работы функции WriteFlashByte().

AVR106-WriteFlashPage-fig5

Рис. 5. Алгоритм работы функции WriteFlashPage().

AVR106-RecoverFlash-fig6

Рис. 6. Алгоритм работы функции RecoverFlash().

[Ссылки]

1. AVR106: C functions for reading and writing to Flash memory site:atmel.com .
2. AVR109: самопрограммирование AVR.
3. AVR106.zip.

Как записать переменную во флеш память 80c51f120

Текущее время: Ср янв 24, 2024 19:56:46

Часовой пояс: UTC + 3 часа

Загрузка массива чисел во FLASH память МК С8051f320

Страница 1 из 1 [ Сообщений: 6 ]

Заголовок сообщения: Загрузка массива чисел во FLASH память МК С8051f320
Добавлено: Вт май 20, 2014 19:29:48

Нашел транзистор. Понюхал.

Добрый день! Существует необходимость постоянного хранения в памяти (энергонезависимой) микроконтроллера c8051f320 достаточно большого массива чисел (255 строк 3 столбца), сами числа от 0x00 до 0xFF. Поглядев даташит мк (опыта работы с ним не имею), пришел к выводу, что для подобных задач предназначена 16-килобайтная FLASH память, однако инструкции, как ей пользоваться не нашел.

Кратко говоря, мне нужно:
1) Заранее записать в память мой массив (в наличии присутствует developing kit: http://www.silabs.com/products/mcu/Pages/C8051F320DK.aspx , подсоедененный через USB)
2) Считывать данные из массива в ходе работы основной программы МК (Пишу в стандартном IDE, язык C-51)

Буду благодарен за любую помощь!

Заголовок сообщения: Re: Загрузка массива чисел во FLASH память МК С8051f320
Добавлено: Вт май 20, 2014 22:26:41

Поставщик валерьянки для Кота

Не совсем понятно что вы имеете в виду. Надо хранить массив данных в flash, который готовится на этапе создания прошивки и никогда более не изменяется, либо изменяется на лету самой программой?

В первом случае в компиляторе определено какое-то специальное ключевое слово вроде const или flash, говорящее линкеру воткнуть массив в определенный тип памяти. Обращаться с константными массивами и переменными как и с любыми остальными, только писать в них нельзя.
Во втором случае используются функции bootloader-а или программирования приложением(IAP). Как обстоят дела с этим конкретно у С8051 не знаю, но по идее все(почти) современные МК так умеют.

Заголовок сообщения: Re: Загрузка массива чисел во FLASH память МК С8051f320
Добавлено: Вт май 20, 2014 22:38:01

Нашел транзистор. Понюхал.

uk8amk, у меня первый случай. В том и проблема, что опыта работы с 8051 не имею, а каких либо инструкций не нашел

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Заголовок сообщения: Re: Загрузка массива чисел во FLASH память МК С8051f320
Добавлено: Вт май 20, 2014 23:05:06

Поставщик валерьянки для Кота

Для IDE должна быть online и offline справка. Поиск по ключевому слову const и flash.

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока. На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции.

Заголовок сообщения: Re: Загрузка массива чисел во FLASH память МК С8051f320
Добавлено: Ср май 21, 2014 11:04:01

Если в даташите указан режим самопрогорамммирования ПЗУ — возможно.
С силапсами не работал.
В «стандартном» mcs51 подобная операция отсутствует — однако вполне возможна при вводе дополнительных функций через «свободную» область РСФ (на усмотрение разработчиков фирмы-изготовителя). Требуется доскональное «вкуривание» даташита на конкретный МК и юзерс гвиде изготовителя на группу МК.

Ежли речь идет о записи в EEPROM — то также даташит в лапы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *