Миландр
http://forum.milandr.ru/

запись во флеш память контроллера К1886ВЕ2У
http://forum.milandr.ru/viewtopic.php?f=4&t=2377
Страница 1 из 1

Автор:  guest [ 2015-янв-31 17:47 ]
Заголовок сообщения:  запись во флеш память контроллера К1886ВЕ2У

Здравствуйте, первый раз работаю с контроллером К1886ВЕ2У, не могу разобраться с записью во флеш память. Помимо записи использую прерывания для передачи по USART2 и АЦП. Смотрел пример из каталога ./IDE1886/Examples/Eval8_WRFlash. Вот реализация моей функции:

static unsigned char WRDIV @ 0x717;
...
void write_flash(unsigned long addr, unsigned long data)
{
unsigned char ucDataL,ucDataH;

GLINTD = 1;
TMR3L = 0;
TMR3H = 0;
PIE1 = 0;
PIE2 = 0;
RC2IF = 0;
clrwdt();
WRDIV = (5*32);

PR3H = 0x0A; // (32 * 5 * 32/2) = 0xA00
PR3L = 0x00;
TBLPTRH = (unsigned char)(addr>>8);
TBLPTRL = (unsigned char)addr;

ucDataL = (unsigned char)data;
ucDataH = (unsigned char)(data>>8);

PEIE = 1;
TMR3IE = 1;
TMR3ON = 1;
#asm
tlwt 1, ucDataH
tablwt 0, 0,ucDataL
#endasm

TMR3IF = 0;
TMR3ON = 0;
clrwdt();
GLINTD = 0;

}

Еще я так понял, что необходимо чтобы на ноге MCLR, был выставлен уровень +12В. Вопрос, это реализуется программно, или только в железе?

Автор:  oleg [ 2015-фев-02 12:28 ]
Заголовок сообщения:  Re: запись во флеш память контроллера К1886ВЕ2У

guest писал(а):
Здравствуйте, первый раз работаю с контроллером К1886ВЕ2У, не могу разобраться с записью во флеш память. Помимо записи использую прерывания для передачи по USART2 и АЦП. Смотрел пример из каталога ./IDE1886/Examples/Eval8_WRFlash. Вот реализация моей функции:

static unsigned char WRDIV @ 0x717;
...
void write_flash(unsigned long addr, unsigned long data)
{
unsigned char ucDataL,ucDataH;

GLINTD = 1;
TMR3L = 0;
TMR3H = 0;
PIE1 = 0;
PIE2 = 0;
RC2IF = 0;
clrwdt();
WRDIV = (5*32);

PR3H = 0x0A; // (32 * 5 * 32/2) = 0xA00
PR3L = 0x00;
TBLPTRH = (unsigned char)(addr>>8);
TBLPTRL = (unsigned char)addr;

ucDataL = (unsigned char)data;
ucDataH = (unsigned char)(data>>8);

PEIE = 1;
TMR3IE = 1;
TMR3ON = 1;
#asm
tlwt 1, ucDataH
tablwt 0, 0,ucDataL
#endasm

TMR3IF = 0;
TMR3ON = 0;
clrwdt();
GLINTD = 0;

}

Еще я так понял, что необходимо чтобы на ноге MCLR, был выставлен уровень +12В. Вопрос, это реализуется программно, или только в железе?


В спецификации это всё очень доступно описано. Нужно выполнить следующие действия:
- подать на MCLR 12 вольт,
- загрузить WRDIV исходя из тактовой частоты,
- запретить лишние прерывания, чтобы не мешали,
- настроить прерывание для завершения операции записи (время не менее длительности операции записи (см. соответствующую таблицу)),
- сбросить WDT чтобы он не прервал,
- выполнить собственно запись,
- прерывание (либо по вектору, либо просто) окончит запись и продолжит выполнение программы.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/