Страница 1 из 3

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

Добавлено: Пт апр 28, 2017 13:27:42
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)

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

Добавлено: Пт апр 28, 2017 14:31:29
scorpi_0n
VladimirVladimirovitch писал(а): В чем может быть проблема? Куда уходит ресурс? Прерывания отключал - картина не меняется.
Должно же быть на GPIO теже 8MHz?
Не должно, ни при каких условиях. Забудьте просто. Максимальная последовательная долговременная частота ногодрыга при вашей тактовой 16МГц всего 4МГц - два такта на установку пина, два на сброс. Но даже и это никому не нужно, в этом просто нет никакого смысла.

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

Добавлено: Пт апр 28, 2017 14:37:33
VladimirVladimirovitch
scorpi_0n писал(а):Максимальная последовательная непрерывная частота ногодрыга при вашей тактовой 16МГЦ всего 4МГц - два такта на установку пина, два на сброс.
Логично. 4Mhz это бы я понял. Но у меня - 600KHz. Вот в чем загадка. При простейшем и прозрачном коде. Почему с PLL на GPIO приходит 600KHz? Где я мог забыть убрать делитель?

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

Добавлено: Пт апр 28, 2017 14:48:07
scorpi_0n
Нет там никаого делителя. Смотрите что накосячил компилятор. Но даже и это вам не поможет. Ещё раз - забудьте. Не тратьте зря время на преждевременную оптимизацию.

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

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

Не пойму, как компилятор мог накосячить, если на PA8 четкий такт в 8MHz, а в порт дает 600Khz... Может проц статикой убит?

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

Добавлено: Пт апр 28, 2017 15:12:18
scorpi_0n
VladimirVladimirovitch писал(а): В теории - на GPIO должно быть, как Вы заметили, 4Mhz. А у меня - 600KHz.
Это не только в теории, а и на практике, но при последовательном долговременном ногодрыге, чего у вас и нет. Смотрите листинг дизасма, считайте такты (хотя и это напрасный труд), если уж так заклинило.

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

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

Оптимизация по скорости включена?
Проверьте файлы из архива.

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

Добавлено: Пт апр 28, 2017 20:27:05
uk8amk
Всё верно. Одна строчка на языке высокого уровня может разворачиваться в длинный список машинных инструкций. Хотите полной определённости - переходите на ассемблер.
Изображение

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

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

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

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

Добавлено: Пт апр 28, 2017 21:59:09
Мурик
VladimirVladimirovitch писал(а):А где это ставится в eclipse?
В настройках проекта в разделе компилятора.
VladimirVladimirovitch писал(а):а что смотреть? на каких пинах?
На тех же. Скомпилирован этот код с оптимизацией максимальной скорости.

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

Добавлено: Пт апр 28, 2017 22:07:06
Reflector
VladimirVladimirovitch писал(а):Тактировал и 72Mhz. Получал на GPIO 5MHz. Начинаю догонять - как ниже uk8amk написал - 4 такта идет на выставление бита в порту. В этом вся и хрень похоже.
Для F1 вроде не 4 такта, а 6, через DMA - 9. Хотя может при низких частотах с 0 латентностью 4 такта и получится...

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

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

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

здорово. узнать бы теперь как оптимизация выставляется. в инете не нашел.
P.S. спасибо за помощь!!

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

Добавлено: Пт апр 28, 2017 22:55:19
Reflector
VladimirVladimirovitch писал(а):8MHz против моих 5
Точно, 6 тактов - это был вывод в порт с чтением из памяти, т.е. 2 команды...

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

Добавлено: Сб апр 29, 2017 08:48:44
Мурик
VladimirVladimirovitch писал(а):здорово. узнать бы теперь как оптимизация выставляется.
В EmBitz, в котором компилировал, оптимизация выбирается в опциях сборки проекта.
СпойлерИзображение
Ищите что-то похожее в вашей IDE.

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

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

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

Добавлено: Сб апр 29, 2017 12:14:26
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]");

но чета пока не выходит :(

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

Добавлено: Сб апр 29, 2017 12:36:56
Мурик
ARV писал(а):налицо последствия "современного уровня" развития вычислительной техники....
...дураки те, кто до сих пор сидит на 8-битниках, в то время как весь прогрессивный мир заглядывается на 64-битные микроконтроллеры
STM32 значительно "современнее" чем 8-ти битные PIC и AVR. В них есть конвейер инструкций и возможна ситуация необходимости перезагрузки конвейера при ветвлении или вызове подпрограммы. Также возможна приостановка ядра на несколько тактов при занятости шины, например контроллером DMA. Все это не позволяет точно сказать за какое время будет выполнен код, поскольку возможны кратковременные приостановки ядра.
VladimirVladimirovitch писал(а):Нашел
Там есть выпадающий список "Optimization Level". В нем нет -Ofast?

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

Добавлено: Сб апр 29, 2017 13:14:41
scorpi_0n
ARV писал(а):налицо последствия "современного уровня" развития вычислительной техники: зачем считать такты, если можно взять кристалл на 100500 гигагерц и не парить мозг?
load/store, кэш, конвейер, занятость шины, ДМА, вложенные прерывания - считайте такты, никто же не против.
зачем думать об оптимизации, если памяти немеряно, мегагерцев несчитано?
Преждевременная оптимизация такое же зло как и goto, volatile не к месту, незнание архитектуры и беспощадный ногодрыг, по привычке, который не в тему.
дураки те, кто до сих пор сидит на 8-битниках, в то время как весь прогрессивный мир заглядывается на 64-битные микроконтроллеры...
Хорошо что вы это понимаете.

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

Добавлено: Сб апр 29, 2017 18:37:14
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...

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

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