ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
22 апреля
1579105 Топик полностью
Nikolay_Po (01.04.2026 18:34 - 02.04.2026 13:21, просмотров: 1505)
Говорила мне мама: "Не используй NRST как GPIO!" А я не послушался. CH32V006E8R6. 

На PC5 вход Reset. Оказывается. Видел, но знал, что перепрограммируется на вход/выход, никто не жаловался, вроде. Проблемы начались, когда попытался зашить первую плату с этим чипом, где используется PC5. Она просто не шилась, а чип определялся программатором один раз из 15, примерно. При этом, чип из этой же партии, на другой плате (PC5 не используется), шился нормально.

Стал искать разницу и вспомнил, что PC5 - это же NRST. Почитал RM. Оказывается, по-умолчанию включён. Ну, оно! У меня на выводе подтяжка к земле сильнее, чем встроенная к питанию в чипе для режима NRST.

Ну ОК, подключил резистор на плюс, чтобы поднять уровень до высокого. Чип стал определяться и программироваться нормально.


Вопрос: КАК ВЫКЛЮЧИТЬ RESET и сделать его GPIO?

Ответ: Запрограммировать USER OPTION BYTES.


Пока не получилось. Использовал библиотечные функции, по аналогии с проектом CH32V203, где писать получилось. Не работает. Опшн байтс не пишутся. Разбираюсь. Накопаю чего - отпишусь.


ДОКЛАДЫВАЮ


Всё в порядке. Дело обстоит так:


1. С завода, сброс на конкретной модели МК включён, RST_MODE=0b01. И вывод PC5 (в других корпусах PD7) используется как NRST, с включением встроенной подтяжки 35..55кОм к VDD. Поэтому если обвязка перетягивает PC5 к земле ниже чем 0.3*VDD+0.7В, МК может не обнаруживаться отладчиком/программатором и точно не будет прошиваться.

2. Если специальной процедурой стереть Option Bytes (читаются по адресу 0x1FFFF800 непосредственно из памяти, а регистр OBR содержит загруженное при включении МК значение), то значение RST_MODE получится 0b11, что означает отключение NRST и использование вывода как GPIO (в том числе и как выход-тянитолкай).

3. Правильно записывать нужное значение в Option Bytes нужно специальной процедурой, например, так:


        FLASH_Unlock();
        FLASH_EraseOptionBytes();
        FLASH_UserOptionByteConfig (OB_IWDG_SW,                   // Enable software watchdog control
                                    OB_STDBY_NoRST,               // Don't reset upon exiting standby mode
                                    OB_RST_NoEN,                  // Disable NRST input, use PC5 as GPIO
                                    OB_PowerON_Start_Mode_USER);  // Start execution from user code space (not from a bootloader)
        FLASH_Lock();


4. Помещаем вышеуказанную процедуру в код инициализации после загрузки (пропускаем выполнение, если NRST уже отключён).

5. При программировании, если обвязка держит сброс в активном состоянии, временно подаём высокий уровень на вывод NRST. Чип успешно программируется. После выполнения процедуры, нужна перезагрузка по питанию, чтобы в OBR прочиталось новое значение и МК мог запуститься при низком уровне на выводе, где был NRST.