24.12.2013, 21:07
|
|
Прописка
Регистрация: 26.10.2011
Сообщений: 122
Сказал спасибо: 53
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
STM32 Изменить тактовую частоту во время выполнения
Собственно вопрос озвучен в названии темы. Во время выполнения программы есть желание изменить прескаллеры AHB и APB2. Возможно ли это сделать не сбрасывая контроллер? Если да, подскажите пожалуйста последовательность действий. Спасибо.
|
|
|
|
24.12.2013, 22:16
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Конечно, возможно.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
24.12.2013, 23:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
|
|
|
Сказали "Спасибо" omercury
|
|
|
25.12.2013, 01:26
|
|
Прописка
Регистрация: 26.10.2011
Сообщений: 122
Сказал спасибо: 53
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Спасибо, только это немного не то.... Как выставить нужную частоту я уже поняла, поигравшись с файлом system_stm32f10x.c Прошлаcь пошагово
SystemInit() -› SetSysClock() -› SetSysClockToHSE() именно в SetSysClockToHSE() (в моей конфигурации) выставляются все делители и множитель PLL в регистрах CFGR и CFGR2, там же включаем PLL и выбираем PLL в качестве системной частоты и последнее вызывается SystemCoreClockUpdate.
Ну вот система инициализирована, начинает выполняться main.... И вот по прошедствии энного колличества времени мне вздумалось изменить прескаллер APB2
Системная частота уже выставлена, мне нужно изменить только APB2
какова последовательность?
|
|
|
|
25.12.2013, 07:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Сообщение от Jane9226
|
Ну вот система инициализирована, начинает выполняться main.... И вот по прошедствии энного колличества времени мне вздумалось изменить прескаллер APB2
Системная частота уже выставлена, мне нужно изменить только APB2
какова последовательность?
|
Никакой последовательности
Тупо меняем биты в одном-единственном регистре, например, записью
RCC-›CFGR = 0x30009402;
Неужели так страшно открыть даташит??
|
|
|
|
26.12.2013, 00:27
|
|
Прописка
Регистрация: 26.10.2011
Сообщений: 122
Сказал спасибо: 53
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Сообщение от niXto
|
Никакой последовательности
|
Вы точно в этом уверены?
Провела тест: В бесконечном цикле проверяю состояние кнопки и в зависимости от этого состояния меняю прескаллер
Код:
|
//Объявляем переменную для хранения состояния кнопки
uint8_t buttonState = 0;
.
.
.
while(1)
{
//считываем состояние кнопки
buttonState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if (buttonState == 1)
{
/* APB2 */
RCC-›CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
}
else
{
/* APB2 делим на 16, итого получим 24 000 000 / 16 = 1 500 000*/
RCC-›CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
}
} |
Программа исправно выполняет инструкцию, только вот состояние битов PPRE2 не меняется! Такое впечатление что они заблокированы во время выполнения. Поэтому я и прошу помощи, спрашивая последовательность действий. На скриншотах это видно. Еще раз для уточнения. Проверяется все в железе плата STM32VLDISCOVERY, IDE Keil uVision4. Когда я прохожу по шагам (после сброса) функцию SetSysClockToHSE(void) в файле system_stm32f10x.c эти биты исправно устанавливаются в соответствии с инструкциями. После, в главном цикле НЕТ.
|
|
|
|
26.12.2013, 01:25
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Всё там переключается, не надо извращаться над кодом.
Код:
|
RCC-›CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV16;
__NOP();
__NOP();
RCC-›CFGR &= ~(uint32_t)RCC_CFGR_PPRE2_DIV16;
__NOP();
__NOP(); |
|
|
|
Сказали "Спасибо" nahimovv
|
|
|
26.12.2013, 01:31
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
nahimovv а нопы зачем? там вроде без паузы
|
|
|
|
26.12.2013, 01:51
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Для бряков и пошагать.
|
|
|
|
26.12.2013, 02:25
|
|
Прописка
Регистрация: 26.10.2011
Сообщений: 122
Сказал спасибо: 53
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: STM32 Изменить тактовую частоту во время выполнения
Цитата:
|
Не уверен? Не спорь, будешь выглядить глупым!
|
Подпись понравилась. Поняла свою ошибку. Перед тем как установить, нужно сразу сбросить... 0х07 = 00000111 естественно 0х07 | 0x00 даст 0х07 Что собственно я и делала. Еще раз спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:43.
|
|