CMSIS STM32 Урок 10. Установка защиты от чтения (RDP level 1)

Когда ваш проект вырос до стадии релиза, то возникает потребность защитить свои авторские права путем защиты прошивки от чтения и копирования. Можно полагаться на ручную установку защиты в программе ST-Link Utility, но и на "старуху бывает проруха" - кто-то забудет, кто-то пропустит. Рутинные операции могут стать причиной утечки ценных данных, что на рынке приравнивается к потерям прибыли. Поэтому можно автоматизировать процесс установки защиты. 

Защита происходит так: программа при запуске проверяет, есть защита или нет, если ее нет, то она установится. И так первый запуск устройства автоматически защитит прошивку. Установить RDP (Readout protection) Level 1 STM32F1 на CMSIS можно следующим образом:

void SetReadOutProtection(void) {
	uint32_t temp = FLASH->OBR & 0x02;
	if (!temp) { // если нет защиты
		__disable_irq();
		// Разблокировка основной памяти FLASH
		WRITE_REG(FLASH->KEYR, FLASH_KEY1);
		WRITE_REG(FLASH->KEYR, FLASH_KEY2);
		// Ожидаем готовность
		while (FLASH->SR & FLASH_SR_BSY) __NOP();
		// Разблокировка Option Bytes
		WRITE_REG(FLASH->OPTKEYR, FLASH_KEY1);
		WRITE_REG(FLASH->OPTKEYR, FLASH_KEY2);
		// Ожидаем готовность
		while (FLASH->SR & FLASH_SR_BSY) __NOP();
		// Запускаем стирание Option Bytes
		FLASH->CR |= FLASH_CR_OPTER;  // Option byte erase
		FLASH->CR |= FLASH_CR_STRT;   // Start operation
		// Ожидаем готовность
		while (FLASH->SR & FLASH_SR_BSY) __NOP();
		// Включаю режим программирования опций
		FLASH->CR |= FLASH_CR_OPTPG;  
		WRITE_REG(OB->RDP, 0x00); // Защита от чтения Level 1
		CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE); // Заблокировать OptionBytes
		SET_BIT(FLASH->CR, FLASH_CR_LOCK); // Заблокировать Flash
		__enable_irq();
		NVIC_SystemReset(); 
	}
}

В настройках самого проекта (например в main.h) можно добавить такое определение, которое можно закомментировать или раскомментировать

#define IT_RELEASE

Макрос будет определять - релиз это или программа в разработке. Он позволит программисту отключать автоматическую блокировку памяти (с защитой невозможно отлаживать программу). Я обычно делаю условие, которое для релиза активирует защиту от чтения и сторожевой таймер.

// Главная функция
int main(void) {
	#ifdef IT_RELEASE
	SetReadOutProtection(); // Защита прошивки от чтения
	IWDG_Setup();			// Настройка сторожевого таймера
	#endif
	// Код main
}

На этом все. Легкой вам работы и рабочего кода.

Обсудить этот урок или задать свой вопрос можно ТУТ https://t.me/ipasoftel/41 

<< Предыдущий урок || Следующий урок >>

Телеграм канал по профессиональной разработке электроники