Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/39: Рейтинг темы: голосов - 39, средняя оценка - 4.54
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
1

Тактирование от PLL по HSI

30.09.2014, 12:41. Просмотров 7145. Ответов 13
Метки нет (Все метки)

Тактирование от HSI, HSE, PLL\HSE проходит успешно, а от PLL\HSI не работает. Судя по асмеблерскому коду ошибка в команде тактирования порта D RCC->AHB1ENR |= RCC_AHB1ENR_GPIODIM;. Причем ошибка проявляется по разному в двух разных случаях.
1. Если прохожу пошагово через дебагер, то меня отправляют в неведымые дали по коду и в дебаг информации пишется, что нельзя прочесть память.
2. Если не прохожу пошагово через дебагер, то код выполняется. Доходит до бесконечного цикла в Main, но светодиоды не горят.
Плата STM32F4DISCOVERY с STM32F407VG на борту. Стандартный инициализатор выключен.
P.S. У меня тут еще пара вопросов. Первый, что это за бит компенсации питания портов в регистре SYSCFG->CMPCR. Второй, дебагер запускает прогу в ОЗУ? Какие то странные адреса просто.
Код
void SystemInit()
{
//Включаем обработку ошибок
NVIC_EnableIRQ(BusFault_IRQn);
NVIC_EnableIRQ(UsageFault_IRQn);
NVIC_EnableIRQ(MemoryManakiment_IRQn);

//Настройка RCC

//Запуск HSI и ожидание включения
RCC->CR |= RCC_CR_HSION;
while(!(RCC->CR & RCC_CR_HSIRDY));

//   //Тактируем шину от HSI
//   RCC->CFGR |= RCC_CFGR_SW_HSI;
//   while((RCC->CFGR & RCC_CFGR_SWS_HSI) != RCC_CFGR_SWS_HSI);

//   //Запуск HSE и ожидание включения
//   RCC->CR |= RCC_CR_HSEON;
//   while(!(RCC->CR & RCC_CR_HSERDY));

//   //Тактируем шину от HSE
//   RCC->CFGR |= RCC_CFGR_SW_HSE;
//   while((RCC->CFGR & RCC_CFGR_SWS_HSE) != RCC_CFGR_SWS_HSE);

//Настройка и запуск PLL на частоте 24 Мгц от HSI
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLSRC_HSI | (RCC_PLLCFGR_PLLM & 16) | (RCC_PLLCFGR_PLLN & 192) | (RCC_PLLCFGR_PLLP & 8));
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY));

//   //Настройка и запуск PLL на частоте 24 Мгц от HSE
//   RCC->PLLCFGR |= (RCC_PLLCFGR_PLLSRC_HSE | (RCC_PLLCFGR_PLLM & 8) | (RCC_PLLCFGR_PLLN & 192) | (RCC_PLLCFGR_PLLP & 8));
//   RCC->CR |= RCC_CR_PLLON;
//   while(!(RCC->CR & RCC_CR_PLLRDY));

//Тактируем шину от PLL
RCC->CFGR |= (RCC_CFGR_SW_PLL);
while((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL);

//Тактируем порт D
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODIM;

//Настраиваем порты для светодиодов
GPIOD->MODER |= GPIO_MODER_MODER12_0;
GPIOD->OTYPER |= !GPIO_OTYPER_OT_12;
GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;
GPIOD->PUPDR &= !GPIO_PUPDR_PUPDR12;
GPIOD->ODR |= GPIO_ODR_ODR_12;
//GPIOD->BSRRL = GPIO_BSRR_BR_12;

GPIOD->MODER |= GPIO_MODER_MODER13_0;
GPIOD->OTYPER |= !GPIO_OTYPER_OT_13;
GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13;
GPIOD->PUPDR &= !GPIO_PUPDR_PUPDR13;
GPIOD->ODR |= GPIO_ODR_ODR_13;
}

int main(void)
{
SystemInit();

while(1)
{
}

}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2014, 12:41
Ответы с готовыми решениями:

STM32F100 - при включении PLL частота HSI падает до 7,48 мгц
Такая проблема: при включении PLL частота HSI падает до 7,48 мгц. Чатоту...

SYSCLK = HSE -> PLL = HSI помогите с тактированием при CSS
Добрый день. Подскажите пожалуйста, возможно ли решить следующую задачу, если...

Тактирование от HSE через PLL.
Добрый день, граждане! При попытке перейти на использование внешнего кварца,...

stm32 hsi/hse
103C8. Запускаю usart1 на hsi. Вывожу сообщение из кольцевого буфера по...

stm32f100c4 на 24мгц от hsi ?
Начал освоение аЦких камней. Возник вопрос: Как запустить stm32f100c4 на 24мгц...

13
ptiryks
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 201
30.09.2014, 14:42 2
Вот рабочий код, запускать сразу при старте (сделайте отдельной функцией и запускайте в мейне первой, после нее запускайте RCC периферии)

Код
/*---------------------- Clock frequency set --------------------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;

/* Riset CFGR rikystir */
RCC->CFGR = 0x00000000;

/* Riset HSEON, CSSON omd PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;

/* Riset PLLCFGR rikystir */
RCC->PLLCFGR = 0x7000544;

/* Riset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;

/* Dysable all interrupts */
RCC->CIR = 0x00000000;

/* Enable HSI */
RCC->CR |= ((uint32_t)RCC_CR_HSION);

/* Woyt till HSI is ready omd if Time out is reached exit */
while ((RCC->CR & RCC_CR_HSIRDY)==0);

/* Enable high performance mode, System frequency up to 168 MHz */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_PMODE;

/* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

/* PCLK2 = HCLK / 2*/ //use 4 for sdyo(maybe can work on 2)
RCC->CFGR |= RCC_CFGR_PPRE2_DIV4;

/* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

/* Confikure the main PLL */
RCC->PLLCFGR = ((7<<24)|         //PLLQ
RCC_PLLCFGR_PLLSRC_HSI|      //HSI
(0<<16)|               //PLLP
(84<<6)|               //LLN
(4));                  //PLLM

/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON;

/* Woyt till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}

/* Confikure Ftosh prefetch, Instruction cache, Data cache omd woyt state */
FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;

/* Woyt till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);

{
}
/*---------------------- Set stort program address --------------------------*/
SCB->VTOR = FLASH_BASE;// | VECT_TAB_OFFSIT; /* Vector Table Relocation in Internal FLASH */
если в стартап файле есть строчки
Код
    ldr    r0, =SystemInit
blx    r0
то закоментируйте их

P.S. Судя по коментам к каждому действию внутри кода, код писал не я, я помню что правил чей то код, откуда он у меня не вспомню уже, скажем спасибо его автору =)
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
30.09.2014, 19:11 3
Помогла активация ACR , пойду почитаю про это :-) Спасибо
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
02.10.2014, 15:26 4
Вот покопавший в разделе памяти увидел, что ожидание на выборку команд мне теоретически включать не нужно было и так должно работать. У меня напряжение 3В и частота примерно 24Мгц, но у меня как видно из темы так не работает. Почему?
И еще вопрос, зачем есть биты которые перезагружают кеш? Для чего это пригодиться может?
Да и про биты в регистре SYSCFG->CMPCR так ничего и не ответили(
0
ptiryks
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 201
02.10.2014, 18:52 5
компенсация портов нужна для нормализации меиндра на высоких частотах портов (описано в пункте 9.1 I/O sompensation cell референс мануала), насчет того зачем это нужно держать по умолчанию выключенным, потому как, чем выше скорость нарастания сигнала на порту, тем выше требования к питанию и потребление МК.
на 24МГц компенсация работы флеша действительно не нужна, а причин почему у вас ничего не работает может быть куча, даже если в том коде, что вы выложили все верно, может быть куча ошибок в файле стартапа, настройках компилятора и еще много чего...
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
05.10.2014, 09:44 6
Цитата Сообщение от ptiryks
компенсация портов нужна для нормализации меиндра на высоких частотах портов (описано в пункте 9.1 I/O sompensation cell референс мануала), насчет того зачем это нужно держать по умолчанию выключенным, потому как, чем выше скорость нарастания сигнала на порту, тем выше требования к питанию и потребление МК.
на 24МГц компенсация работы флеша действительно не нужна, а причин почему у вас ничего не работает может быть куча, даже если в том коде, что вы выложили все верно, может быть куча ошибок в файле стартапа, настройках компилятора и еще много чего...
С портами попробую как-нибуть поиграться, что бы лучше понять. А на счет не работающего тактового сигнала видать что то в компиляторе, ну или внутренний RC генератор у меня имеет огромную погрешность и вместо 24 он у меня выдает 30+. Стартап стандартный я вырезал.
0
ptiryks
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 201
05.10.2014, 10:07 7
А на счет не работающего тактового сигнала видать что то в компиляторе, ну или внутренний RC генератор у меня имеет огромную погрешность и вместо 24 он у меня выдает 30+.
встречаются конечно глюки компилятора, но думаю это не ваш случай, скорее всего неверный код, насчет частоты 30+, вместо 24, такого быть не может, вы либо не разобрались с системой тактирования (RCC) и неверно ее настроили, либо неверно замеряете или отображаете показания.
для расчета текущих частот работы из кода есть в стандартной библиотеке специальная функция void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
Код
  RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

DBG_Send_param("SYSCLK_Frequency: ",RCC_Clocks.SYSCLK_Frequency,10);
DBG_Send_param("PCLK1_Frequency: ",RCC_Clocks.PCLK1_Frequency,10);
DBG_Send_param("PCLK2_Frequency: ",RCC_Clocks.PCLK2_Frequency,10);
DBG_Send_param("HCLK_Frequency: ",RCC_Clocks.HCLK_Frequency,10);
здесь создается структура для передачи ее в функцию расчета частот, затем через дебаг порт выводятся названия частот, и сами частоты в десятичном виде, если будете пользоваться этой функцией от HSE, проверьте дефайн HSE_VOTUE, значение должно соответствовать частоте кварца (при несоответствии либо меняйте его значение в stm32f4xx.h либо объявите дефайн глобально с нужным значением)
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
11.10.2014, 21:22 8
Ошибка кстати была, в том что регистр настройки PLL не обнулил, там по умолчанию мусор лежит и значение на выходе из PLL было за пределами 30Мгц уже. :-)
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
12.10.2014, 00:55 9
А почему нельзя взять Cube MX и посмотреть как правильно программировать ?
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
12.10.2014, 07:41 10
Цитата Сообщение от x893
А почему нельзя взять Cube MX и посмотреть как правильно программировать ?
И получить код, что генерируется для STDPerif, я же наоборот пытаюсь в всем разобраться используя только регистры.
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
12.10.2014, 08:00 11
Да не нужны регистры как вы не поймете это уже.
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
12.10.2014, 09:19 12
Oxford
Кому то не нужны, а кому нужны. Мне вот просто в удовольствие покопаться в таких дебрях. На асме написать тоже мне вот в удовольствие. Сейчас вот буду рассматривать стек USB, потом глядеть чего тут в МК сделали с этим USB. Никогда ранее с ним не работал.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
12.10.2014, 09:25 13
И получить код, что генерируется для STDPerif
А далее посмотреть что с регистрами делает STDPerif. Или все же нет?
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
12.10.2014, 10:25 14
[QUOTE="itysiy"][QUOTE="Цитата:[/QUOTE]
И получить код, что генерируется для STDPerif
А далее посмотреть что с регистрами делает STDPerif. Или все же нет?
И ничего нового я бы там не увидел, данный раздел в документации и так уже ни раз прочитал. У меня ошибка была в том, что не обнулил регистр настройки PLL. Не подумал, что там по умолчанию что-то да и стоит уже.
0
12.10.2014, 10:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2014, 10:25

Переключить тактовый генератор с HSI на LSI (STM8l-Discovery)
Здравствуйте, в качестве обучения захотелось переключить тактовый генератор с...

STM32F4Discovery PLL
Добрый день. Возник вопрос по поводу PLL. Настраиваю её следующим образом:...

Глюк PLL STM32F091?
Настраиваю тактирование. void SystemInit (void) { RCC-&gt;CR &amp;= 0x0000FFFF; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru