Когда ваш проект вырос до стадии релиза, то возникает потребность защитить свои авторские права путем защиты прошивки от чтения и копирования. Можно полагаться на ручную установку защиты в программе 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
<< Предыдущий урок || Следующий урок >>
Телеграм канал по профессиональной разработке электроники

