Jump to content

    
Sign in to follow this  
RomanRom

Реальный пример установки защиты

Recommended Posts

Что означает распространенная в Интернете фраза о том, что после установки бита защиты LCKR снять защиту можно только после сброса. Сброса какого? Аппаратного кнопкой RESET или программного? Кто-нибудь может привести короткую программу, на которой четко было бы видно - вот есть защита (светодиод светится), вот что-тосбрасываем, а вот защита снимается (светодиод не светится)?

Share this post


Link to post
Share on other sites

Ладно, упростим вопрос.

Из перевода референс манула STM32F10x:

 

...Когда последовательность процедуры блокировки была применена к биту порта (LCKR), то его конфигурацию больше нельзя изменить до следующего сброса.

 

О каком сбросе идет речь? О нажатии кнопки сброса, об автоматическом сбросе при просадках питания, о сбросе программном или что-то другое?

 

 

 

Share this post


Link to post
Share on other sites

Да и так понятно, зачем еще цитату. Еще попросите на английском языке писать вопросы, тогда ваабще не к чему придраться.

Из программы читаем регистр по адресу F800, Если FF то CP. Если A5 -Default. Вот и напишите программу для светодиода на нужном потру.

Share this post


Link to post
Share on other sites

Вот цитата и перевод из интернетовского документа STM32_DOC_RU.chm

 

This register is used to lock the configuration of the port bits when a correct write sequence is applied to bit 16 (LCKK). The value of bits [15:0] is used to lock the configuration of the GPIO. During the write sequence, the value of LCKR[15:0] must not change. When the LOCK sequence has been applied on a port bit it is no longer possible to modify the value of the port bit until the next reset.

 

Этот регистр используется для блокировки конфигурации битов порта, когда применена правильная последовательность записи к биту 16 (LCKK). Для блокировки конфигурации GPIO используется значение битов [15:0]. Во время последовательности записи значение LCKR [15:0] не должно изменяться. Когда последовательность процедуры блокировки была применена к биту порта, то его конфигурацию больше нельзя изменить до следующего сброса.

 

То есть, правильно ли я понимаю, что слово "reset" относится не к сбросу микроконтроллера, а всего лишь к сбросу бита в LCKR?

Share this post


Link to post
Share on other sites
То есть, правильно ли я понимаю, что слово "reset" относится не к сбросу микроконтроллера, а всего лишь к сбросу бита в LCKR?

Нет. По смыслу цитаты речь идёт о сбросе контроллера.

Share this post


Link to post
Share on other sites
По смыслу цитаты речь идёт о сбросе контроллера.

Именно. Причем по моему опыту сброс через внешний вход ~RESET не помогает. После стирания битов еще приходится делать Power Cycling - тогда только защита гарантировано отключается.

 

Share this post


Link to post
Share on other sites
Именно. Причем по моему опыту сброс через внешний вход ~RESET не помогает. После стирания битов еще приходится делать Power Cycling - тогда только защита гарантировано отключается.

Вопрос 1 - Power Cycling относится к установке защиты GPIO или к защите флэш-памяти. Как в программе сделать Poer Cycling?

 

Вопрос 2. В нижеприведенной программе сначала зажигается лампочка на PC8, затем ставится защита LCKR, а затем PC8 переводится в режим входа. Если защита установлена правильно, то лампочка должна гореть, а у меня она гаснет (хотя если убрать блок из 4 нижних строк, то светится). Почему не устанавливается защита?

 

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

 

int main(void)

{ int tmp;

//Конфигурирование GPIOC.8

RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование GPIOC

GPIOC->CRH &= ~GPIO_CRH_MODE8; //очистить разряды MODE

GPIOC->CRH &= ~GPIO_CRH_CNF8; //очистить разряды CNF

GPIOC->CRH |= GPIO_CRH_MODE8_0; //выход, 10MHz

GPIOC->CRH &= ~GPIO_CRH_CNF8; //общего назначения, симетричный

GPIOC->BSRR = GPIO_BSRR_BS8; //GPIOC.8=1

 

GPIOC->LCKR |= GPIO_LCKR_LCK8; //включение защиты настроек

GPIOC->LCKR |= GPIO_LCKR_LCKK; //Записать в LCKK "1”-"0”-"1”

GPIOC->LCKR &= ~GPIO_LCKR_LCKK; //

GPIOC->LCKR |= GPIO_LCKR_LCKK; //

tmp = GPIOC->LCKR; //Две операции чтения регистра LCKR

tmp = GPIOC->LCKR;

 

//Конфигурирование GPIOC.8

GPIOC->CRH &= ~GPIO_CRH_MODE8; //очистить разряды MODE

GPIOC->CRH &= ~GPIO_CRH_CNF8; //очистить разряды CNF

GPIOC->CRH |= GPIO_CRH_CNF8_1; //дискретный вход, подтяжка к "земле"

GPIOC->BSRR = GPIO_BSRR_BR8; //включить подтягивающий резистор

 

while(1);

}

 

Share this post


Link to post
Share on other sites

Может ли кто-то проверить по указанному выше листингу установку защиты на линии PC8?

 

Возможно требуется включить еще какое-то дополнительное тактирование в регистрах RCC или вводить задержки во времени?

Share this post


Link to post
Share on other sites

Попробуйте вот так:

    GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    GPIOC->LCKR = GPIO_LCKR_LCK8;
    GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    GPIOC->LCKR = GPIO_LCKR_LCK8;
    tmp = GPIOC->LCKR;

Share this post


Link to post
Share on other sites
Именно. Причем по моему опыту сброс через внешний вход ~RESET не помогает. После стирания битов еще приходится делать Power Cycling - тогда только защита гарантировано отключается.

Я прошу прощения - я думал что речь идет о Code Read Protection - вот он только по Power Cycling снимается.

А GPIO LCKR должен бы по любому сбросу процессора деактивироваться.

Share this post


Link to post
Share on other sites
Попробуйте вот так:

    GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    GPIOC->LCKR = GPIO_LCKR_LCK8;
    GPIOC->LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCKK;
    GPIOC->LCKR = GPIO_LCKR_LCK8;
    tmp = GPIOC->LCKR;

Изменений нет (и защиты тоже). Кстати, я в Инете как-то не нашел реальных (а не теоретических) листингов с установкой защиты GPIO и с ее последующей проверкой

 

И еще одно. В дебаггере тоже регистр GPIO_LCKR не изменяется даже при прямом вводе

GPIOC->LCKR = 0x0000FFFF;

Тут или в названии регистра что-то не то, или нет какой-то предварительной установки.

Проверяю на STM32VLDISCOVERY. Может быть на другом камне по-другому?

Share this post


Link to post
Share on other sites
:bb-offtopic:

А для чего может потребоваться такая защита на практике?

Это может потребоваться при отладке программы. Например, разработчик где-то допустил ошибку по невнимательности, а могут быть баги компилятора, когда вдруг "разваливается" стек с непредсказуемыми результатами установки регистров. Если схема критична к изменению входа на выход (или наоборот), то будут проблемы.

 

А если честно, то дело принципа. Везде на умных сайтах приводят последовательность команд, которые блокируют линии GPIO. А вот проверяли ли авторы этот момент на практике?

 

P.S. Посмотрел дизассемблером команды записи в регистр GPIO_LCKR, кажется, что правильный базовый адрес 0x40011000 и смещение #24 (0x18) и в регистре r2 происходит смена 1-0-1.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this