Перейти к содержанию
    

STM32F407 на частоте 168МГц код работает как на 16МГц (в 10 раз медленнее)

8 минут назад, AlexKai сказал:

чему там 10 тактов выполняться? и откуда там нопам взяться? это всего пара инструкций.

В ассемблерном виде посмотрите, сколько там и чего или сами на асме напишите...

Nop-ам там действительно делать нечего (в цикле, в смысле)..

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, AlexKai сказал:

каким образом? чему там 10 тактов выполняться? и откуда там нопам взяться? это всего пара инструкций.

Листинг - в студию!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);
if(RCC_WaitForHSEStartUp() == ERROR) Fail("HSE not started");
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
while(RCC_GetSYSCLKSource() != 0x04);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
RCC_HSICmd(DISABLE);

FLASH->ACR |= FLASH_ACR_LATENCY_4WS;
RCC_PLLConfig(RCC_PLLSource_HSE, 8, 168, 2, 4);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);

void Delay(__IO uint32_t nCount)
{
	while(nCount--);
}

while(1)
{
  GPIO_SetBits(GPIOB, GPIO_Pin_15);
  Delay(1000000);
  GPIO_ResetBits(GPIOB, GPIO_Pin_15);
  Delay(16000000);
}

диод мигает примерно раз в секунду

Изменено пользователем AlexKai
добавлено

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых, листинг ассемблерных команд нужен.

Во вторых, о, GPIO_SetBits, Cube привет! Там у вас все 20 тактов должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я с AVR-ов перебираюсь) там такой код вопросов не вызывает

Только что, ViKo сказал:

Во первых, листинг ассемблерных команд нужен.

Во вторых, о, GPIO_SetBits, Cube привет! Там у вас все 20 тактов должно быть.

кокос асмы генерит? я не нашел

20 тактов на вкл/выкл диода это не проблема

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 минут назад, AlexKai сказал:

__IO uint32_t nCount

Это значит, что при каждом обращении к nCount она читается из памяти, над ней совершаются операции и она пишется в память. То есть, на один цикл она (читается из SRAM в РОН, декрементируется в РОН, записывается в SRAM, читается из SRAM, сравнивается с нулём). 10 тактов как нефиг делать.

 

Вот так будет значительно быстрее. С включенной оптимизацией, само собой.

void Delay(uint32_t nCount)
{
	while(nCount--) __NOP();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

..т.с. думал что Си выполняется в режиме одна команда за такт?

Добро пожаловать в реальный мир, представляю ваше разочарование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, VladislavS said:

Это значит, что при каждом обращении к nCount она читается из памяти, над ней совершаются операции и она пишется в память.

GCC, например, такой ерундой не занимается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, aaarrr сказал:

GCC, например, такой ерундой не занимается.

Интересно, а как же он на __IO реагирует? Если бы это было так, то работа с регистрами периферии на С была бы невозможна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, VladislavS said:

Если бы это было так, то работа с регистрами периферии на С была бы невозможна.

Ну а где в этом цикле что-то похожее на работу с регистрами периферии?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, aaarrr сказал:

Ну а где в этом цикле что-то похожее на работу с регистрами?

полагаю по хорошему перед циклом переменная должна копироваться в регистр и цикл уже работать с регистром

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, aaarrr сказал:

Ну а где в этом цикле что-то похожее на работу с регистрами?

__IO uint32_t nCount
1 минуту назад, AlexKai сказал:

полагаю по хорошему перед циклом переменная должна копироваться в регистр и цикл уже работать с регистром

Уберите __IO, так и будет. Только тогда пустой цикл без __NOP() оптимизатор выкинет к чертям собачим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

aaarrr, посмотрите как определены регистры периферии в заголовочном файле микроконтроллера и не спорьте.

А ещё лучше посмотрите листинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, VladislavS said:

посмотрите как определены регистры в заголовочном файле микроконтроллера и не спорьте.

Вот сами и посмотрите - у них есть одно очень важное отличие от nCount.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...