04.05.2017, 13:40
|
|
Частый гость
Регистрация: 03.05.2017
Сообщений: 32
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Спасибо попробую. Но с кубом работать не хочу, слушком уж непонятный код он генерит..лучше SPL
|
|
|
|
04.05.2017, 14:06
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
По умолчанию системная обычно сконфигурирована на максимальную 168 МГы через умножитель частоты PLL.
В файле system_stm32f4xx. с это вверху в заголовке и описано, правда, там подразумевается, что кварц будет на 25 МГц. На дискаверине кварц 8 МГц, поэтому МК будет работать на частоте ниже 168 в 25/8 раз (около 54 МГц).
Исправив строчку
#define PLL_M 25
на
#define PLL_M 8
получим 168 МГц системной.
Заодним, надо откорректировать соответственно строчку
#define HSE_VALUE ((uint32_t)25000000) /*!‹ Value of the External oscillator in Hz */
таким же образом - 8000000
дабы при обращении к SystemCoreClockUpdate получать верное значение.
Для начальных опытов можно вообще закомментить сточку SetSysClock(); в функции SystemInit (void) - и МК будет гарантированно работать на 16 МГц от внутреннего HSI.
По мере освоения и прочтения о модуле RCC, можно будет приступать к экспериментам с повышением тактовой.
Сообщение от DanilinSA
|
В самом проекте есть неявный вызов SystemInit().
|
Эта функция явно вызывается из ассеблерного стартового файла startup_stm32f40xx.s,:
/* Call the clock system intitialization function.*/
bl SystemInit
, еще до вызова main-функции, и лишь после завершения той функции идет вызов
/* Call the application's entry point.*/
bl main
Отладчик пропускает предыдущие операции и останавливается на начале main, потому как у него задано такое поведение.
Поставив брекпоинт, можно остановить и увидеть исполнение "неявных" функций.
PS. Куб удобно использовать, чтобы подсмотреть графически взаимосвязи в системе тактирования, значения делителей и получаемые частоты, ибо может быть там всё настолько запутанно, особенно в F7хх, что без поллитры стопудово хрен разберешься и черта с два запомнишь на память.
Последний раз редактировалось NewWriter; 04.05.2017 в 14:37.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
04.05.2017, 14:48
|
|
Частый гость
Регистрация: 03.05.2017
Сообщений: 32
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Спасибо, обязательно сегодня поэкспериментирую с PLL_M. Но почему это может влиять на "незапуск" программы? Из-за "SystemCoreClockUpdate" ?
|
|
|
|
04.05.2017, 15:40
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Нет. Функция SystemCoreClockUpdate вызывается только явно самим программистом и используется для обновления переменной SystemCoreClock при смене системной частоты во время работы проги. Переменная SystemCoreClock используется опять же для корректировки частотно-зависимых параметров. Кароч говоря, чтобы например таймер продолжал считать секундные интервалы верно, если меняется системная частота во время работы. Ну, бывает такое, динамическое управление частотой МК для энергосбережения.
Касательно запуска МК. Как я написал ранее - закомментируйте строчку SetSysClock() - МК должен запуститься от внутреннего 16 МГц.
Поставьте брекпоинт на main() и посмотрите, доходит ли до этого места вообще. И далее, пошагово, пошагово.
Напишите вот такую прогу:
PHP код:
|
int main(void) { int i = 0; RCC-›AHB1ENR |= RCC_AHB1ENR_GPIODEN ;
GPIOD-›MODER |= GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0 ; GPIOD-›ODR = 0xFFFF; while (1) { i++; } }
|
должны зажечься все светодиоды.
Если этого не происходит, у вас значит не правильно собран проект. Я не знаю, как там в IAR, но попробуйте создать проект с STM32F407VG, по идее должны быть подключены все необходимые файлы.
|
|
|
|
04.05.2017, 19:05
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
NewWriter, извиняюсь за нескромный вопрос, да ещё и не совсем по теме - но зачем нужна переменная i в этом примере?
|
|
|
|
04.05.2017, 20:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Не нужна она там.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
04.05.2017, 21:11
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
используется для нужд отладчика
|
|
|
|
05.05.2017, 05:24
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy, я даже подозреваю, что её там и нету (в листинге, а значит и в самой прошивке).
NewWriter, теперь возник вопрос - почему отладчик в ней нуждается и для чего он её использует (если, конечно, компилятор её не выкинул в этом примере). Ну очень интересно.
|
|
|
|
05.05.2017, 06:51
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вы не правы. Если бы сами попробовали, то знали бы. Просто так компилятор не выбросит i, нужны веские на то основания. А эти самые "веские основания" в пошаговой отладке неприменимы.
Предлагаю с этим вопросом вам разобраться самостоятельно.
while (1)
{
i++;
20000246: 687b ldr r3, [r7, #4]
20000248: 3301 adds r3, #1
2000024a: 607b str r3, [r7, #4]
} /* while (1) */
|
|
|
|
05.05.2017, 09:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от NewWriter
|
Просто так компилятор не выбросит i, нужны веские на то основания
|
Зависит от уровня оптимизации. Именно поэтому если у вас -O2 или -O3, необходимо втыкать nop() в тело пустого цикла. А отладочную переменную — счетчик пустых циклов — объявить как volatile.
Хотя, подозреваю, что отлаживаете вы все-таки с -O0.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:13.
|
|