STM32 - проблемы с тактированием

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

Друзья, помогите разобраться с тактированием GPIO STM32.
Пытаюсь получить минимальный по времени импульс.
Но получаю при установке GPIO_Speed_50MHz ВСЕГО порядка 600KHz (RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_4). Выжимал макс. 5MHz на делитете 16).

Изображение

При простом цикле:
GPIOA->BSRR = GPIO_BSRR_BR9;
GPIOA->BSRR = GPIO_BSRR_BS9;
На PA8 (MCO - типа дебага проверок тактирования в stm32) вывожу половину реальной частоты тактирования RCC_MCO_PLLCLK_Div2, получаю как и требуется - 8MHz (16/2)

Изображение

В чем может быть проблема? Куда уходит ресурс? Прерывания отключал - картина не меняется.
Должно же быть на GPIO теже 8MHz?

Помогите разобраться плз.
Вот код. Вроде все минимизировал для читаемости:

Код: Выделить всё

void main (void)
{
  init_gpio();
  while (1)
 {
      GPIOA->BSRR = GPIO_BSRR_BR9;
      GPIOA->BSRR = GPIO_BSRR_BS9;
 }
}
 
void init_pll(void)
{
    RCC_DeInit(); //    сброс настроек тактового генератора
    RCC_HSEConfig(RCC_HSE_OFF); //    отключение внешнего тактового генератора
    //RCC_HSEConfig(RCC_HSE_ON);
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_4); //    тактирование от HSI с делителем 2: 8 / 2 * 4 = 16МГц
    RCC_HSICmd(ENABLE);
    RCC_PLLCmd(ENABLE); //    Включаем PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //    На системную шину подаем тактирование с множителя PLLMUL
}
 
void init_gpio()
{
 
  init_pll();

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    // Тактуем порт
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
}
P.S. Чип - STM32F103C8T6 (8Mhz)
Реклама
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 - проблемы с тактированием

Сообщение scorpi_0n »

VladimirVladimirovitch писал(а): В чем может быть проблема? Куда уходит ресурс? Прерывания отключал - картина не меняется.
Должно же быть на GPIO теже 8MHz?
Не должно, ни при каких условиях. Забудьте просто. Максимальная последовательная долговременная частота ногодрыга при вашей тактовой 16МГц всего 4МГц - два такта на установку пина, два на сброс. Но даже и это никому не нужно, в этом просто нет никакого смысла.
Последний раз редактировалось scorpi_0n Пт апр 28, 2017 15:07:21, всего редактировалось 2 раза.
Реклама
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

scorpi_0n писал(а):Максимальная последовательная непрерывная частота ногодрыга при вашей тактовой 16МГЦ всего 4МГц - два такта на установку пина, два на сброс.
Логично. 4Mhz это бы я понял. Но у меня - 600KHz. Вот в чем загадка. При простейшем и прозрачном коде. Почему с PLL на GPIO приходит 600KHz? Где я мог забыть убрать делитель?
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 - проблемы с тактированием

Сообщение scorpi_0n »

Нет там никаого делителя. Смотрите что накосячил компилятор. Но даже и это вам не поможет. Ещё раз - забудьте. Не тратьте зря время на преждевременную оптимизацию.
Реклама
Эиком - электронные компоненты и радиодетали
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

scorpi_0n писал(а):Нет там никаого делителя. Смотрите что накосячил компилятор. Но даже и это вам не поможет. Ещё раз - забудьте. Не тратьте зря время на преждевременную оптимизацию.
Не. Немного не так. Я не про оптимизацию. Я сейчас только начал изучение stm32, и трачу время (уже 2 дня потратил :-) чтобы теорию свести с практикой. Ногодрыгом делать ничего, по возможности, не буду.
В теории - на GPIO должно быть, как Вы заметили, 4Mhz. А у меня - 600KHz. Пока не найду где косяк - идти дальше в постижении нет смысла - если сыпется тактирование в GPIO - дальше уже никакого доверия :))

Не пойму, как компилятор мог накосячить, если на PA8 четкий такт в 8MHz, а в порт дает 600Khz... Может проц статикой убит?
Реклама
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 - проблемы с тактированием

Сообщение scorpi_0n »

VladimirVladimirovitch писал(а): В теории - на GPIO должно быть, как Вы заметили, 4Mhz. А у меня - 600KHz.
Это не только в теории, а и на практике, но при последовательном долговременном ногодрыге, чего у вас и нет. Смотрите листинг дизасма, считайте такты (хотя и это напрасный труд), если уж так заклинило.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 - проблемы с тактированием

Сообщение Мурик »

Почему ядро тактируется частотой 16 МГц, а не положенной ему 72? Более того обычно нормально работает в разгоне выше 100 МГц.

Оптимизация по скорости включена?
Проверьте файлы из архива.
Вложения
Test.zip
(4.78 КБ) 247 скачиваний
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 - проблемы с тактированием

Сообщение uk8amk »

Всё верно. Одна строчка на языке высокого уровня может разворачиваться в длинный список машинных инструкций. Хотите полной определённости - переходите на ассемблер.
Изображение
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

Мурик писал(а):Почему ядро тактируется частотой 16 МГц, а не положенной ему 72?
Тактировал и 72Mhz. Получал на GPIO 5MHz. Начинаю догонять - как ниже uk8amk написал - 4 такта идет на выставление бита в порту. В этом вся и хрень похоже.
Мурик писал(а):Оптимизация по скорости включена?
Нет. А где это ставится в eclipse? не нашел
Мурик писал(а):Проверьте файлы из архива.
Прошивку залил (./st-flash write 16.hex 0x8000000), а что смотреть? на каких пинах? на PA8 у меня в ней чето ничего нет. с 72.hex тоже тишина..

Добавлено after 4 minutes 55 seconds:
uk8amk писал(а):Всё верно. Одна строчка на языке высокого уровня может разворачиваться в длинный список машинных инструкций. Хотите полной определённости - переходите на ассемблер.
Да. Похоже что так. Четыре такта на запись выходит.
Пытаюсь с ассемблером разобраться, но пока не очень выходит :)
Гдеб простой пример найти, чтобы только в порт записать бит?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 - проблемы с тактированием

Сообщение Мурик »

VladimirVladimirovitch писал(а):А где это ставится в eclipse?
В настройках проекта в разделе компилятора.
VladimirVladimirovitch писал(а):а что смотреть? на каких пинах?
На тех же. Скомпилирован этот код с оптимизацией максимальной скорости.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 - проблемы с тактированием

Сообщение Reflector »

VladimirVladimirovitch писал(а):Тактировал и 72Mhz. Получал на GPIO 5MHz. Начинаю догонять - как ниже uk8amk написал - 4 такта идет на выставление бита в порту. В этом вся и хрень похоже.
Для F1 вроде не 4 такта, а 6, через DMA - 9. Хотя может при низких частотах с 0 латентностью 4 такта и получится...
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

Мурик писал(а):Скомпилирован с оптимизацией максимальной скорости.
16.hex -
Изображение
2,4MHz Против моих 600KHz

72.hex -
Изображение
8MHz против моих 5

здорово. узнать бы теперь как оптимизация выставляется. в инете не нашел.
P.S. спасибо за помощь!!
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 - проблемы с тактированием

Сообщение Reflector »

VladimirVladimirovitch писал(а):8MHz против моих 5
Точно, 6 тактов - это был вывод в порт с чтением из памяти, т.е. 2 команды...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 - проблемы с тактированием

Сообщение Мурик »

VladimirVladimirovitch писал(а):здорово. узнать бы теперь как оптимизация выставляется.
В EmBitz, в котором компилировал, оптимизация выбирается в опциях сборки проекта.
СпойлерИзображение
Ищите что-то похожее в вашей IDE.
Вложения
EmBitz.png
(38.27 КБ) 898 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: STM32 - проблемы с тактированием

Сообщение ARV »

scorpi_0n писал(а):считайте такты (хотя и это напрасный труд)
[offtopic]налицо последствия "современного уровня" развития вычислительной техники: зачем считать такты, если можно взять кристалл на 100500 гигагерц и не парить мозг? зачем думать об оптимизации, если памяти немеряно, мегагерцев несчитано? дураки те, кто до сих пор сидит на 8-битниках, в то время как весь прогрессивный мир заглядывается на 64-битные микроконтроллеры...[/offtopic]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

Мурик писал(а):Ищите что-то похожее в вашей IDE.
Нашел:
СпойлерИзображение
Спасибо. Выставил -Ofast. Значительно быстрее стало.

Добавлено after 4 minutes 50 seconds:
ARV писал(а):зачем считать такты, если можно взять кристалл на 100500 гигагерц и не парить мозг?
Не совсем так. Я как раз и хочу разобраться с тактами. Просто некоторые вещи не очень понятны. Где в AVR компилируется С за один такт - в stm32 за четыре - шесть :)
Пытаюсь вот на асме освоить :
asm ("LDR R0, =0x40020C10");
asm("MOV R1, 0x1000");
asm("STR R1, [R0]");
asm("LDR R0, =0x40020C10");
asm("MOV R1, 0x1000 << (1*16)");
asm("STR R1, [R0]");

но чета пока не выходит :(
Последний раз редактировалось VladimirVladimirovitch Сб апр 29, 2017 15:14:45, всего редактировалось 1 раз.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 - проблемы с тактированием

Сообщение Мурик »

ARV писал(а):налицо последствия "современного уровня" развития вычислительной техники....
...дураки те, кто до сих пор сидит на 8-битниках, в то время как весь прогрессивный мир заглядывается на 64-битные микроконтроллеры
STM32 значительно "современнее" чем 8-ти битные PIC и AVR. В них есть конвейер инструкций и возможна ситуация необходимости перезагрузки конвейера при ветвлении или вызове подпрограммы. Также возможна приостановка ядра на несколько тактов при занятости шины, например контроллером DMA. Все это не позволяет точно сказать за какое время будет выполнен код, поскольку возможны кратковременные приостановки ядра.
VladimirVladimirovitch писал(а):Нашел
Там есть выпадающий список "Optimization Level". В нем нет -Ofast?
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 - проблемы с тактированием

Сообщение scorpi_0n »

ARV писал(а):налицо последствия "современного уровня" развития вычислительной техники: зачем считать такты, если можно взять кристалл на 100500 гигагерц и не парить мозг?
load/store, кэш, конвейер, занятость шины, ДМА, вложенные прерывания - считайте такты, никто же не против.
зачем думать об оптимизации, если памяти немеряно, мегагерцев несчитано?
Преждевременная оптимизация такое же зло как и goto, volatile не к месту, незнание архитектуры и беспощадный ногодрыг, по привычке, который не в тему.
дураки те, кто до сих пор сидит на 8-битниках, в то время как весь прогрессивный мир заглядывается на 64-битные микроконтроллеры...
Хорошо что вы это понимаете.
VladimirVladimirovitch
Встал на лапы
Сообщения: 126
Зарегистрирован: Чт мар 15, 2007 10:48:10

Re: STM32 - проблемы с тактированием

Сообщение VladimirVladimirovitch »

Мурик писал(а):Там есть выпадающий список "Optimization Level". В нем нет -Ofast?
Не. Списка нет. Я пишу в доп. опцию
Изображение

Добавлено after 3 hours 13 minutes 13 seconds:
Переписал на асме:

Код: Выделить всё

	asm("LDR	R0, =0x40010C10"); // пишем адрес BSRR для GPIOB
while(1)
// включаем/ выключаем 12пин
	{
	asm  (
	      "MOV   R1, 0x1000\n"\
	      "STR   R1, [R0]\n"\

	      "MOV   R1, 0x10000000\n"\
	      "STR   R1, [R0]");
	}
}
и получаю вообще сказочную хрень:
Изображение

ну как "лишние" такты убежали в периоде B еще понятно. Но куда убежали такты в периоде C... Чем может быть занята шина, если тактирование только на GPIOB?
Загадочный продукт этот stm32...
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 - проблемы с тактированием

Сообщение scorpi_0n »

Латентность флэша и конвейер никто не отменял. Главное что вам нужно запомнить, что время выполнения недерминировано. Можете НОПами ещё поиграться, для интереса. Или вообще загрузить прогу в ОЗУ.
Ответить

Вернуться в «Разные вопросы по МК»