STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Ага. Примерно так?

Код: Выделить всё

  NVIC_SetPriority(PendSV_IRQn, 7);
потом в высокоуровневом делаю

Код: Выделить всё

SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
и получаю вызов в

Код: Выделить всё

void PendSV_Handler(void)
о, и код уже раскрашен....
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А кто это прерывание вызовет?
Что значит "кто"? У вас же прерывание по таймеру каждые 2.5 мс, вот таймер и вызовет. Просто пока данных нет,прерывание запрещено, и обработчик вызываться не будет.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Кхе,там у меня нет прерываний. Два канала сравнения таймера объединённые по ИЛИ (c использованием Peripheral Reflex System) пинают АЦП который снимает два набора данных с фотосенсоров без подсветки и с подсветкой. А третий канал данных включает и выключает эту подсветку. Всё самостоятельно, без прерываний. Ну и АЦП делает запросы ПДП чтобы скинуть результат. И вот только тут есть прерывание по окончании трансфера.

А, я могу добавить прерывание по переполнению таймера. Мне это в голову не пришло, так как переполнение происходит между этими двумя измерениями. А, если как вы говорите разрешать и запрещать, тогда, действительно, ямогу его отложить. Ок, пусть будет это ПланБ, если с PendSV у меня что-то не понравится.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

возникла мысль, а не вызывать ли её по прерыванию. Причем приоритет задать самый низкий, чтобы не мешать другим прерываниямх.
Кхе,там у меня нет прерываний.
Так есть прерывания или нет?
В любом случае можно и просто рандомный флаг прерывания выставлять вручную. Ну не знаю, I2C неиспользуемого например.
С другой стороны, если у вас опрос относительно медленный, может проще опрашивать в основном цикле флаг DMA или какой-нибудь программный.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Продолжение глупого вопроса не по stm32, а по вообще ARM. А как называется функция, которая обслуживает PendSV прерывание?

В EFM32GG12 я назвал её PendSV_Handler и всё прекрасно работает.

Код: Выделить всё

void PendSVInit(void) {
  NVIC_SetPriority(PendSV_IRQn, PendSV_IRQ_priority);
}

void PendSV_Handler(void) {
  profiler();
}
Но теперь пытаюсь это перенести на Cypress PSoC cy8c5268 и вместо этой функции я вылетаю в IntDefaultHandler:
Спойлер

Код: Выделить всё

/*******************************************************************************
* Function Name: IntDefaultHandler
****************************************************************************//**
*
*  This function is called for all interrupts, other than a reset that gets
*  called before the system is setup.
*
* Theory:
*  Any value other than zero is acceptable.
*
*******************************************************************************/
CY_ISR(IntDefaultHandler)
{
    /***************************************************************************
    * We must not get here. If we do, a serious problem occurs, so go into
    * an infinite loop.
    ***************************************************************************/
Может кто знает как сделать, чтобы оно тут работало?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Открываем startup-файл, ищем там таблицу векторов прерываний и смотрим/прописываем там нужный.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

В стартап лезть грязными ручками? я - боюсь. или что-то поломаю, или при пересборке железной части PSoC Creator вернет всё на место.

Вообще то, ожидал ответа типа, что установка приоритета сделана не правильно. Несмотря на то что NVIC_SetPriority из СиликонЛабовского SDK обрабатывает PendSV_IRQn (который -2), Инфинеоновский с таким работать не умеет (надо будет еще Code Compose Studio глянуть, как там эта функция устроена). И если у всех нормальных SDK, что у SL, ST, TI все векторы прерываний назначены уже на WEAK функции и линкер сам сделает всё что надо, то кипарис/инфинеон - нет. Хотяяяяя... это, наверное, тоже связано с хардварной частью кристалла. Ведь, модуль могут назвать как угодно.
Потрогал лапой паяльник
Сообщения: 317
Зарегистрирован: Ср дек 09, 2020 18:38:07

Сообщение koeltrad »

Почему например для регистра MODER значение 00 означает Input и в то же время reset state?
00: Input (reset state)
Вход это ведь не то же самое что и сброшенное состояние когда входное сопротивление должно быть большим.
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Тоже самое. Состояний пина может быть только два. Это когда драйвер выхода подключен и когда он отключен. Первое из них - низкоомный импеданс, а второе - высокоомный. Отключать вход от пина нет никакого смысла. Немного сложнее ситуация с аналоговой функцией пина, если она имеется, но непринципиально. Смысл остается тем же.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

Сообщение НовыйДень »

Reset state - это указание, что это состояние битов в регистре будет по умолчанию после сброса микроконтролера. Посмотрите упоминание про Reset values регистра MODER.
То есть, после сброса микроконтроллера в регистре MODER будут нули и вывод будет находиться в состоянии Input. Режим цифрового входа - это и есть высокоомное состояние, но с включенным триггером шмитта. Поэтому в некоторых сериях (L-серия) после сброса пины находятся в состоянии Analog Input с отключенными триггерами, уменьшая ток потребления.
По схеме, аналоговый вход подключен всегда. А цифровой вход - через триггер шмитта. Этим триггером как раз и управляет регистр MODER с комбинациями [00] и [11]. И для уменьшения тока потребления, особенно в режимах низкого потребления рекомендуется переводить неиспользуемые входы в режим Analog Input, отключая входные триггеры. На практике довольно хорошо заметно по току потребления.

Изображение
Потрогал лапой паяльник
Сообщения: 317
Зарегистрирован: Ср дек 09, 2020 18:38:07

Сообщение koeltrad »

Обязательно ли явно задавать состояние регистра, если в сброшенном состоянии, состояние регистра уже такое как мне надо?
Например регистр OTYPER в сброшенном состоянии имеет 00, то же самое Pull Push
Всё работает даже если явно не задавать GPIOD->OTYPER=0;
Наверное просто для уверенности и для порядка надо это писать?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не надо.
Потрогал лапой паяльник
Сообщения: 317
Зарегистрирован: Ср дек 09, 2020 18:38:07

Сообщение koeltrad »

Где(по какому адресу) находятся регистры общего назначения в STM32F407?
На блок диаграмме не нахожу эти регистры.
register.png
(137.39 КБ) 88 скачиваний
Или это регистры процессора arm. И я что то не то написал?
https://developer.arm.com/documentation ... er-summary
Ок, это регистры arm процессора. Из которых r0-r12 являются регистрами общего назначения.
Остальные предназначены для хранения определённых данных.
Какой программой можно посмотреть содержимое этих регистров?
С помощью Keil можно, но почти все регистры не заполнены там почему то.
register1.png
(51.62 КБ) 85 скачиваний
STM32CubeProgrammer, но не всегда показывает
register2.png
(41 КБ) 75 скачиваний
STM32 ST-LINK Utility
register3.png
(9.38 КБ) 83 скачивания
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="koeltrad",url="/forum/viewtopic.php?p=4229351#p4229351"]Или это регистры процессора arm.[/uquote]
Да, это РОНы ядра ARM.
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229351#p4229351"]Какой программой можно посмотреть содержимое этих регистров?
С помощью Keil можно, но почти все регистры не заполнены там почему то.[/uquote]
Вы что то не то смотрите. Правда под рукой нет железа, поэтому приведу скрин в симуляторе Кейла:
Изображение
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

Сообщение НовыйДень »

Запустите отладку микроконтроллера и посмотрите вот тут:
Изображение

Они, в принципе, вам не нужны. Доступ к ним - через ассемблерные инструкции типа add r0, r0, r1 и об этом заботится компилятор языка Сию Поэтому не парьтесь. Хотя, для общего понимания - через эти регистры ядро микроконтроллера выполняет все арифметико-логические действия. Загружает из SRAM числа, выполняет с ними чего-то и записывает обратно в SRAM или в регистры периферии.
Потрогал лапой паяльник
Сообщения: 317
Зарегистрирован: Ср дек 09, 2020 18:38:07

Сообщение koeltrad »

У меня скрин был при запуске программы.
Надо было шагать по программе чтоб значения изменялись. Step
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="koeltrad",url="/forum/viewtopic.php?p=4229431#p4229431"]У меня скрин был при запуске[/uquote]
А с какого перепуга РОНы при запуске будут что то кроме нулей содержать?
Можно шагами, а можно брейкпойнт поставить где-нибудь и до него стартануть.
И что у вас за странный код? Вы знаете что такое CMSIS? Зачем вы пользуетесь абсолютными адресами вместо имен регистров?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

Сообщение НовыйДень »

Да не, запустите CubeIDE, создайте проект с микроконтроллером F407, скомпилируйте и запустите в режиме отладки (кнопка F11). Рабочая область переключится в режим отладки (Debug) и сбоку должна появиться вкладка Registers, поищите её среди прочих вкладок. Если что, то ее можно найти в меню Window->Show View->Registers.

Содержимое регистров r0 - r12 после сброса в общем случае неизвестно:
Изображение

Регистры заполненными оказываются еще и потому, что до входа в main, и вообще, до первой сишной строчки выполняется весьма много действий, скрытых от нелюбопытного глаза пользователя. Если найти ассемблерный файл startup_stm... и в нем поставить брекпоинт на строчке Reset_Handler:, то можно попасть как раз в самое-самое начало работы.
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="НовыйДень",url="/forum/viewtopic.php?p=4229437#p4229437"]Да не[/uquote]
:))) :))) :)))
Да да...
Несложно понять, что у ТС нет железа и он смотрит в симуляторе. Именно поэтому наблюдает не рандомные значения РОНов, а нулевые. Симулятор, в отличии от железа, ИМЕЕТ начальные значения РОНов равными нулю.
В приведенных им скринах я комментировал скрин Кейла, где нет стрелки-указателя PC в листинге Си. Это какгбэ намекаэ нам на то, что в настройках стартом выбран не main, а старт-ап асм-код.
Потрогал лапой паяльник
Сообщения: 317
Зарегистрирован: Ср дек 09, 2020 18:38:07

Сообщение koeltrad »

КРАМ писал(а):А с какого перепуга РОНы при запуске будут что то кроме нулей содержать?
НовыйДень писал(а): Регистры заполненными оказываются еще и потому, что до входа в main, и вообще, до первой сишной строчки выполняется весьма много действий, скрытых от нелюбопытного глаза пользователя.
У меня максимально маленький код, поэтому наверное нули в регистрах при старте.

Код: Выделить всё

#include "main.h"
int main(void)
{
//RCC
*((uint32_t*)(0x40023830))|=1<<3;
//ospeedr
*((uint32_t*)(0x40020C08))=0; 
//moder
*((uint32_t*)(0x40020C00))|=1<<24;
GPIOD->ODR|=1<<12;
  while (1)
  {
  }
}
КРАМ писал(а): И что у вас за странный код? Вы знаете что такое CMSIS? Зачем вы пользуетесь абсолютными адресами вместо имен регистров?
Я пытаюсь понять что за командами CMSIS происходит.
КРАМ писал(а): Несложно понять, что у ТС нет железа и он смотрит в симуляторе. Именно поэтому наблюдает не рандомные значения РОНов, а нулевые.
Недавно купил STM32F407 Discovery, уже есть железо.
Подержанную за 20 уе.
Раньше столько новые стоили кажется.
Ответить

Вернуться в «ARM»