-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
Ну и что вы там отладчиком хотите на 1 МГц увидеть? Выводите на какую-нибудь ногу сигнал и смотрите осциллоглядом.
А вообще, 1М прерываний в секунду это жесткач...
-
При остановке в отладчике таймер продолжает работать. Пока вы SR считаете заново, флаг уже запросто штатным образом установится. С какой частотой он у вас должен срабатывать?
-
Если у вас всегда только по одному флагу, то можно всё сильно упростить
void TIM3_IRQHandler() { TIM3->SR =0; // Полезное действие }
ЗЫ: Компилятор у вас случайно не в режиме С++? А то надо extern "C" void TIM3_IRQHandler().
-
У таймеров флаги статусов прерывания сбрасываются записью нуля.
Есть одна тонкость, на высокоскоростных контроллерах команда очистки флага не должна быть в конце прерывания. Иначе, можно очистить флаг, выйти из прерывания, а он ещё физически не очистился и залетаем в прерывание снова.
-
Никуда. Просто производите "запись данных по адресу" как будто FLASH стала просто RAM.
*(volatile uint32_t *)adr = data;
-
22 минуты назад, Obam сказал:
vpn разве от адресата скрывает?
Конечно.
-
Без паники! Паникёров расстреливают первыми. vpn пока не отменили.
-
Он же 16-битный.
8М/43/32077 = 5.799997
4М/44/15674 = 5.799993
Подбирайте...
-
6 часов назад, do_not_know_Linux сказал:
скиньте пожалуйста адрес для регистра FLASH_KEYR1
Не царское это дело. Пусть компилятор сам посчитает &FLASH->KEYR1.
-
17 минут назад, do_not_know_Linux сказал:
а вы как думаете это адрес или смещение?
Будет очень полезно, если вы это сами в документации найдёте.
-
В RM читать раздел 36.3.2 GPIOs controlled by the RTC и раздел 36.6.19 RTC option register (RTC_OR)
Подозреваю, что SYSCFGR должен быть затактирован для этого.
-
Хозяйке на заметку: Заголовочный файл stm32h750xx.h имеет всё что нужно. Доступ к регистру FLASH->CR1. Адрес регистра &FLASH->CR1.
Зачем благородному дону знать адрес именно в цифрах даже не представляю.
-
Когда вы подключаете заголовочный файл от микроконтроллера, то он автоматом тянет за собой core_cm7.h, в котором все регистры определены. Не занимайтесь ерундой.
Что касается собственно DWТ, то документация гласит, чтобы CYCCNT тикал надо чтобы два бита были установлены. Проверить что они установлены не трудно.
-
1 час назад, jcxz сказал:
Смысла отлаживать в QSPI-памяти нет никакого, но можно сделать аналогично процедуре с SDRAM.
Для QSPI наверняка готовый FlashLoader есть, тем более для девборда.
2 часа назад, eu1cc сказал:Очевидно, вначале должны стартануть процедуры работы с этой памятью, и где-то в теле программы надо сказать какие куски кода куда складывать?
При штатной работе из Flash, самом собой, стартовый код и будет инициализировать SDRAM. Обратите внимание, чтобы SystemInit() вызывался раньше кода инициализации данных - в нём и включите SDRAM. При отладке перед загрузкой данных в SDRAM отладчик может/должен сделать это сам. Тут есть два пути - написать простенький загрузчик, на подобии того как это делается для QSPI, либо скриптами отладчика. Смотря что для вас проще. А куда что складывать делается через линкерскрипт - он для этого и нужен. Добавляете в него регионы памяти, прописываете какие секции в них размещать. Тут, на самом деле, творческий подход нужен, потому что очень многое зависит от задачи, которую вы решаете. В стартапе всё и разложите по местам согласно таблицами инициализации, которые линкер создаст. Рекомендую стартап на C сразу найти/взять, так будет сильно проще. Для нестандартных конфигураций его править надо будет по любому. Ну и разобраться, в конце концов, придётся - это вам не Cortex-M0.
-
2 часа назад, eu1cc сказал:
Поменял в STM32F750N8HX_FLASH.ld
1. Это неправильный подход. Посмотрите приложенный скрипт.
2. Ещё не забудьте в стартапе по Reset_Handler загрузить правильное значение указателя стека. Не все отладчики делают это автоматически. На С это как-то так выглядит. Если у вас стартап на асме (что скорее всего), то поколдуйте.
void Reset_Handler() { #ifdef __DEBUG_SRAM__ __set_MSP((uint32_t)&_estack); #endif SystemInit();
3. При отладке из SRAM с тем линкерскриптом, что я приложил, можно/нужно пропустить код копирования инициализированного сегмента данных, он же и так уже в RAM слинкован и загружен. У меня как-то так. В своём стартапе найдите код делающий то же самое.
#ifndef __DEBUG_SRAM__ extern uint32_t _sidata[], _sdata[], _edata[]; for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ; #endif
4. Обязательно проверьте какое значение у вас в SCB->VTOR загружается. Прежде чем разрешить какие-нибудь прерывания где-нибудь в SystemInit() надо делать что-то типа
extern void(*__vector_table[])(); SCB->VTOR = (uint32_t)&__vector_table;
5. Проверьте, чтобы в стартапе таблица векторов прерываний размещалась в той же секции, что указана в линкерскрипте. Сталкивался, что где-то в CMSIS она .isr_vector, где-то просто .vectors - лучше сразу проверить, а не ловить "интересности".
6. Если будете загружать код для отладки в SDRAM, то внимательно прочитайте сообщение jcxz про инициализацию SDRAM перед загрузкой кода.
-
В какой IDE работаете?
-
2 часа назад, eu1cc сказал:
Не могу найти информации, как эту связку запустить в отладке?
Как любой другой STM32. Там же на борту ST-Link. Создаёте проект в любой известной вам IDE, нажимаете кнопку Debug и понеслась...
-
Найти в нерезиновой st-link или j-link это слишком просто :)
-
Да, чуть не забыл, дело совсем не в многоядерности. Разные банки памяти даже на младших контроллерах бывают.
-
Память бывает разная. Где-то можно код выполнять, где-то нельзя. К одной есть доступ DMA, к другой нет. Одна кешируется, другая нет. Соответственно её и использовать можно по разному. В одной стек лучше разместить, в другой ethernet-пакеты гонять, в третьей прерывания выполнять. Это же Cortex-M7, он чутка посложнее AVR-ки по архитектуре. Курите RM и Cortex-M7 programming manual. Его с наскоку не возьмёшь.
PS: Как там переход на машкоды идёт? :)))
-
Кстати, название контроллер тайна? А то ведь обычный H750 и двуядерный H745 это две большие разницы. Я может и рассказал бы, какие блоки SRAM у него выключены при включении питания, но продолжайте шифроваться.
-
Сделайте нормальный проект со стартапом, линкерскриптом, заголовочным файлом от контроллера и CMSIS. Не ипите ни нам, ни себе мозг.
-
Откуда же нам знать, если вы тулчеин в секрете держите.
-
Посмотрите заголовочный файл chrono, там найдёте. В IAR, например, это функция clock_t _Xtime_get_ticks();
STM32F722 не выходит из прерывания TIM3
в STM
Опубликовано · Пожаловаться
DMB вообще из другой оперы. Читать SR можно, но это бесполезная трата времени (а там 1М прерываний в секунду, если что). Надо всего лишь сброс флага сделать в начале прерывания, а за ним полезные действия.
Ну вот, что я и предполагал. Осталось подумать зачем вам 1М прерываний, можно ли от этого уйти.