Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Программирование во FLASH микроконтроллера CH32V203C8T6

Сб апр 29, 2023 14:21:35

Доброе время суток всем котам и кошечкам. Столкнулся с проблемой записи во FLASH память микроконтроллера CH32V203C8T6.
Задача стоит такая. Производится запись во FLASH память некоторые параметры и при следующем включении запуск программы должен быть с этими же параметрами. Делаю это так:
1. В линке указываю секцию для параметров ".mySegment 0x00005000 : {KEEP(*(.mySection))}"
2. В проге указываю адрес FLASH где хранятся параметры и задаю первоначальные параметры
Код:
#define FLASH_ADDR   ((uint32_t)0x08005000)

const uint8_t Flash_Par[256] __attribute__((section(".mySection"))) = {
      0xFA,
      0xFF,
      0xFF,
      0xFF,
      0xFD,
};

В общем как ведёт себя прога. Если не менять параметры, то работает нормально. При изменении параметров (записи во FLASH ), всё записывает, в отладчике вижу что по адресу записал нормально, всё работает. А теперь и сама проблема. После перезагрузки (снял питание, потом подал), по адресу во FLASH записано 0xFF. Что я не так делаю? Помогите!!!

Re: Программирование во FLASH микроконтроллера CH32V203C8T6

Сб апр 29, 2023 14:34:54

1) Write KEY1 = 0x45670123 to the FLASH_KEYR register (must operate KEY1 first);
2) Write KEY2 = 0xCDEF89AB to the FLASH_KEYR register (must operate KEY2 secondly).

ну и вообще, Вы ни слова не сказали о действиях, типа:
1) Check the LOCK bit in the FLASH_CTLR register. If it is 1, you need to perform the "Release Flash Memory Lock" operation.
2) Set the PG bit in the FLASH_CTLR register to ‘1’ to enable the standard programming mode.
3) Write the half word to be programmed to the designated flash memory address (even address).
4) When the BYS bit changes to '0' or the EOP bit in the FLASH_STATR register to be '1', it indicates the end of programming. Clear the EOP bit to 0.
5) Check the FLASH_STATR register to see if there is an error, or read the programming address data for verification.
6) To continue programming, you can repeat steps 3-5, end programming and clear the PG bit to 0.

Только какие-то сегменты привели....

Re: Программирование во FLASH микроконтроллера CH32V203C8T6

Сб апр 29, 2023 14:46:43

Если Вы про это:
Код:
void Saving_Flash(void)
{
    __disable_irq();
    uint32_t write_buf[64]= {0xFFFFFFFF};
    write_buf[0] = Par.Addr;
    write_buf[0] = (write_buf[0] << 8) + Par.Serial_0;
    write_buf[0] = (write_buf[0] << 16) + Par.Serial_1;
    write_buf[0] = (write_buf[0] << 24) + Par.Serial_2;
    write_buf[1] = R3_CRC_Init;

    FLASH_Unlock_Fast();

    FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP |FLASH_FLAG_WRPRTERR);
    FLASH_ErasePage_Fast(FLASH_ADDR);
    FLASH_ProgramPage_Fast(FLASH_ADDR, write_buf);

    FLASH_Lock_Fast();

    __enable_irq();
}


То тут всё работает. Основная задача чтобы прога запускалась с новыми параметрами, а она их затирает, точнее обнуляет (записывает 0xFF).
Я же говорю, запись во FLASH работает. проблема в том, что запуск проги происходит согласно параметрам. Т.е. запись заранее известных параметров при перезагрузке вернёт те, которые записали в самом начале (в этом случае смысла записи нет). Мне же нужно, чтоб с разными всегда мог заходить

Re: Программирование во FLASH микроконтроллера CH32V203C8T6

Сб апр 29, 2023 15:06:13

Я про то, что всегда надо приводить всю информацию. И даже эта неполная, кто знает, что вы там наменяли внутри функций.
И зачем такое издевательство над write_buf[0]? что-то мешает записать в одну строчку?

Добавлено after 1 minute 43 seconds:
Я же говорю, запись во FLASH работает.

AlexandrRa писал(а): Столкнулся с проблемой записи во FLASH

в общем, определяйтесь, либо работает, либо проблема. Формулируйте вопрос точно, приводите все данные.

Re: Программирование во FLASH микроконтроллера CH32V203C8T6

Вт май 02, 2023 10:23:21

Всем спасибо! Проблему решил, правда не знаю правильно или нет. После сохранения данных во FLASH, сделал программный сброс системы и всё заработало как нужно.
Ответить