Перейти к содержанию
    

STM32: сброс всей периферии перед переходом из загрузчика в основную прошивку

Достаточно ли отключить тактирование определенной шины, что бы сбросить всю периферию, сидящую на этой шине?

 

К примеру как это предлагается делать в HAL библиотеках:

RCC->APB1RSTR = 0xFFFFFFFF; // FORCE_RESET

RCC->APB1RSTR = 0x00; // RELEASE_RESET

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Достаточно ли отключить тактирование определенной шины, что бы сбросить всю периферию, сидящую на этой шине?

 

К примеру как это предлагается делать в HAL библиотеках:

RCC->APB1RSTR = 0xFFFFFFFF; // FORCE_RESET

RCC->APB1RSTR = 0x00; // RELEASE_RESET

Есть регистр, отвечающий за тактирование, а есть регистр, отвечающий за сброс периферии. Вы их не путаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть регистр, отвечающий за тактирование, а есть регистр, отвечающий за сброс периферии. Вы их не путаете?

да. все верно. затупил.

выше описанный регистр как раз относится к регистру сброса.

 

т.е. записав в эти регистры, сбросится вся периферия, сидящая на шине?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый кошерный способ - это сбросить МК полностью и сразу после сброса перейти в основную прошивку. Собственно, так я всегда и делаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отключение тактирования точно ничего не сбрасывает. Так что - или регистры RSTR, или общий ресет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый кошерный способ - это сбросить МК полностью и сразу после сброса перейти в основную прошивку. Собственно, так я всегда и делаю.

тогда попутный вопрос: при сбросе мк с помощью функции NVIC_SystemReset (из core_cm4.h CMSIS библиотеки) происходит полный сброс контроллера, включая сброс периферии (особенно интересуют прерывания) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда попутный вопрос: при сбросе мк с помощью функции NVIC_SystemReset (из core_cm4.h CMSIS библиотеки) происходит полный сброс контроллера, включая сброс периферии (особенно интересуют прерывания) ?

Да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глобальным флагом?

#define INTERRUPT_DISABLE_STORE(flag1, flag2) (flag1) = __disable_irq(); (flag2) = __disable_fiq()

#define INTERRUPT_RESTORE(flag1, flag2) if(!(flag1)) __enable_irq(); if(!(flag2)) __enable_fiq()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глобальным флагом?

#define INTERRUPT_DISABLE_STORE(flag1, flag2) (flag1) = __disable_irq(); (flag2) = __disable_fiq()

#define INTERRUPT_RESTORE(flag1, flag2) if(!(flag1)) __enable_irq(); if(!(flag2)) __enable_fiq()

а. т.е. функция __disable_irq(); запрещает все прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не все, а только обычные

__disable_fiq() - остальные

но есть не маскируемые типа ресета, которые никак не запретишь...

и это в кейле, в других средах, могут быть переопределены по другому, там битики в регистре устанавливаются...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__disable_fiq() - остальные

Какой такой fiq? Это же Cortex-M, нет там никакого fiq. Уважаемый, не вводите общественность в заблуждение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я просто не в курсе, неужели STM32 - это только кортексы М? ну нет фик, и нет, плохого ничего не будет, можете запрещать, можете не запрещать:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда попутный вопрос: при сбросе мк с помощью функции NVIC_SystemReset (из core_cm4.h CMSIS библиотеки) происходит полный сброс контроллера, включая сброс периферии (особенно интересуют прерывания) ?

А каким образом по ресету Вы собираетесь переходить в основную программу?

Загрузчик разве не по начальному аддрессу?

Так Вы туда опять и попадете

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А каким образом по ресету Вы собираетесь переходить в основную программу?

Загрузчик разве не по начальному аддрессу?

Так Вы туда опять и попадете

Это же совсем просто: в самом начале загрузчика проверять специальный флаг и прыгать в основную прошивку или продолжать выполнять загрузчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...