реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32: сброс всей периферии перед переходом из загрузчика в основную прошивку
k000858
сообщение May 21 2014, 03:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



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

К примеру как это предлагается делать в HAL библиотеках:
RCC->APB1RSTR = 0xFFFFFFFF; // FORCE_RESET
RCC->APB1RSTR = 0x00; // RELEASE_RESET
Go to the top of the page
 
+Quote Post
adnega
сообщение May 21 2014, 03:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(k000858 @ May 21 2014, 11:53) *
Достаточно ли отключить тактирование определенной шины, что бы сбросить всю периферию, сидящую на этой шине?

К примеру как это предлагается делать в HAL библиотеках:
RCC->APB1RSTR = 0xFFFFFFFF; // FORCE_RESET
RCC->APB1RSTR = 0x00; // RELEASE_RESET

Есть регистр, отвечающий за тактирование, а есть регистр, отвечающий за сброс периферии. Вы их не путаете?
Go to the top of the page
 
+Quote Post
k000858
сообщение May 21 2014, 03:52
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(adnega @ May 21 2014, 11:57) *
Есть регистр, отвечающий за тактирование, а есть регистр, отвечающий за сброс периферии. Вы их не путаете?

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

т.е. записав в эти регистры, сбросится вся периферия, сидящая на шине?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 21 2014, 03:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Самый кошерный способ - это сбросить МК полностью и сразу после сброса перейти в основную прошивку. Собственно, так я всегда и делаю.
Go to the top of the page
 
+Quote Post
Axel
сообщение May 21 2014, 03:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Отключение тактирования точно ничего не сбрасывает. Так что - или регистры RSTR, или общий ресет.
Go to the top of the page
 
+Quote Post
k000858
сообщение May 21 2014, 03:58
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(scifi @ May 21 2014, 12:03) *
Самый кошерный способ - это сбросить МК полностью и сразу после сброса перейти в основную прошивку. Собственно, так я всегда и делаю.

тогда попутный вопрос: при сбросе мк с помощью функции NVIC_SystemReset (из core_cm4.h CMSIS библиотеки) происходит полный сброс контроллера, включая сброс периферии (особенно интересуют прерывания) ?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 21 2014, 04:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Да.
Go to the top of the page
 
+Quote Post
k000858
сообщение May 21 2014, 04:07
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



а есть способ запретить все прерывания, а не одно какое то конкретное?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 21 2014, 05:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



глобальным флагом?
#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()
Go to the top of the page
 
+Quote Post
k000858
сообщение May 21 2014, 05:43
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Golikov A. @ May 21 2014, 13:45) *
глобальным флагом?
#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(); запрещает все прерывания?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 21 2014, 07:16
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не все, а только обычные
__disable_fiq() - остальные
но есть не маскируемые типа ресета, которые никак не запретишь...
и это в кейле, в других средах, могут быть переопределены по другому, там битики в регистре устанавливаются...

Go to the top of the page
 
+Quote Post
scifi
сообщение May 21 2014, 07:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ May 21 2014, 15:26) *
__disable_fiq() - остальные

Какой такой fiq? Это же Cortex-M, нет там никакого fiq. Уважаемый, не вводите общественность в заблуждение.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 21 2014, 07:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я просто не в курсе, неужели STM32 - это только кортексы М? ну нет фик, и нет, плохого ничего не будет, можете запрещать, можете не запрещатьsm.gif
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение May 21 2014, 07:49
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



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

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 21 2014, 08:07
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(A. Fig Lee @ May 21 2014, 15:59) *
А каким образом по ресету Вы собираетесь переходить в основную программу?
Загрузчик разве не по начальному аддрессу?
Так Вы туда опять и попадете

Это же совсем просто: в самом начале загрузчика проверять специальный флаг и прыгать в основную прошивку или продолжать выполнять загрузчик.
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016