Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Вопрос по RESET

Ср июн 08, 2022 11:42:10

Всем доброго времени суток! Я новичок, потихоньку познаю микроконтроллер stm32, возник вопрос по таблицы, что описывается в столбике "Main function(3) (after reset)" ? (фото приложил). Как я понял это режимы выводов после сброса. Но как происходит сброс? По моему пониманию это осуществляется следующим образом - программа работает в цикле while, при нажатии кнопки reset, программа начинает работать с самого начала, то-есть с начала функции main, правильно ли я понимаю? 
Вложения
11.png
(47.26 KiB) Скачиваний: 55

Re: Вопрос по RESET

Ср июн 08, 2022 12:04:09

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

Re: Вопрос по RESET

Ср июн 08, 2022 12:07:37

Сброс происходит:
- при подаче питания на микроконтроллер и выполнения POR (Power On Reset)
- при подаче сигнала низкого уровня на вход NRST
- в остальных случаях: по сигналу вачдогов, по сигналу детектора пониженного напряжения, по выходу из режима Standby, по программному сигналу.
В общем, суть в том, что микроконтроллер после выполнения процедуры сброса приходит в первоначальное состояние - все регистры устанавливаются в состояние, помеченное как Reset State, счетчик программ устанавливается на начало адресов памяти программ, выбранной для загрузки (например, на 0x0800'0000). Выбор режима загрузки и адреса старта производится пинами Boot0, Boot1 или через биты регистра опций, если таковые есть.. В начале адресов загрузки должна быть размещена таблица векторов - по сути это просто таблица адресов перехода, куда обращается микроконтроллер, когда ему надо, в частности, при сбросе. Из нее микроконтроллер берет адрес вершины стека (как правило последний адрес SRAM) и адрес, по которому будет расположена первая исполняемая инструкция - Reset Vector. Счетчик программ устанавливается на этот адрес и начинается работа, выполняет то, что дальше уж было написано.
До входа в main() там выполняется довольно много чего, на что обычно не обращают внимания. В принципе, всё это - произвольно и в разных реализациях старта-файлов может написано по-разному. Посмотрите файл startup_stm32...., чаще всего он ассемблерный. В нем ищите строчку Reset_Handler:
Вот именно оттуда и начнёт работать микроконтроллер после сброса. Как правило, там выполняется подготовка переменных для Си, затем запускается функция SystemInit (находится в файле system_stm32...), и лишь после неё будет запущена main.
Состав функции SystemInit достаточно условный и в принципе то произвольный, но чаще всего там выполняется настройка частот тактирования и режимов питания.

Re: Вопрос по RESET

Ср июн 08, 2022 12:38:52

НовыйДень писал(а):Сброс происходит:
- при подаче питания на микроконтроллер и выполнения POR (Power On Reset)
- при подаче сигнала низкого уровня на вход NRST
- в остальных случаях: по сигналу вачдогов, по сигналу детектора пониженного напряжения, по выходу из режима Standby, по программному сигналу.
В общем, суть в том, что микроконтроллер после выполнения процедуры сброса приходит в первоначальное состояние - все регистры устанавливаются в состояние, помеченное как Reset State, счетчик программ устанавливается на начало адресов памяти программ, выбранной для загрузки (например, на 0x0800'0000). Выбор режима загрузки и адреса старта производится пинами Boot0, Boot1 или через биты регистра опций, если таковые есть.. В начале адресов загрузки должна быть размещена таблица векторов - по сути это просто таблица адресов перехода, куда обращается микроконтроллер, когда ему надо, в частности, при сбросе. Из нее микроконтроллер берет адрес вершины стека (как правило последний адрес SRAM) и адрес, по которому будет расположена первая исполняемая инструкция - Reset Vector. Счетчик программ устанавливается на этот адрес и начинается работа, выполняет то, что дальше уж было написано.
До входа в main() там выполняется довольно много чего, на что обычно не обращают внимания. В принципе, всё это - произвольно и в разных реализациях старта-файлов может написано по-разному. Посмотрите файл startup_stm32...., чаще всего он ассемблерный. В нем ищите строчку Reset_Handler:
Вот именно оттуда и начнёт работать микроконтроллер после сброса. Как правило, там выполняется подготовка переменных для Си, затем запускается функция SystemInit (находится в файле system_stm32...), и лишь после неё будет запущена main.
Состав функции SystemInit достаточно условный и в принципе то произвольный, но чаще всего там выполняется настройка частот тактирования и режимов питания.

Я, в общем и целом понял, но если абстрактно обьясняться, то в этом столбике(Main function(3) (after reset) ) указаны режимы выводов, которые будут установлены еще дом выполнения main, верно полагаю?

Re: Вопрос по RESET

Ср июн 08, 2022 12:47:30

Вполне возможно, если до входа в main их настройки не будут изменены в функции SystemInit, о которой я ранее писал

Re: Вопрос по RESET

Ср июн 08, 2022 13:05:54

НовыйДень писал(а):Вполне возможно, если до входа в main их настройки не будут изменены в функции SystemInit, о которой я ранее писал
Понял, спасибо!

Re: Вопрос по RESET

Вт июн 14, 2022 12:43:22

в этом столбике(Main function(3) (after reset) ) указаны режимы выводов, которые будут установлены еще дом выполнения main, верно полагаю?
Не обязательно. Это зависит также от состояния BOOT-пинов. Если выбираются режимы, использующие встроенный бутлоадер (см. раздел "Boot configuration" RM, table "Boot modes", line "System memory"), то (в зависимости от того какой бутлоадер активируется) ноги, необходимые коммуникационному интерфейсу бутлоадера, будут также проинициализированы для него.
Ответить