Еще раз все перепроверил.
Разбираюсь с STM32F407.
Запустил его на 168 МГц (5.92 нс цикл) включены все FLASH->ACR = FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_5WS.
Выдаю на PA1 простой меандр:
Код
PM_(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN) = 1; // GPIOA clock enabled
PM_(GPIOA->MODER, GPIO_MODER_MODER1_0) = 1; // PA1 - General purpose output mode
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1; // PA1 - 100 MHz High speed
while (1)
{
GPIOA->BSRR = GPIO_BSRR_BS_1;
GPIOA->BSRR = GPIO_BSRR_BR_1;
GPIOA->BSRR = GPIO_BSRR_BS_1;
GPIOA->BSRR = GPIO_BSRR_BR_1;
GPIOA->BSRR = GPIO_BSRR_BS_1;
GPIOA->BSRR = GPIO_BSRR_BR_1;
GPIOA->BSRR = GPIO_BSRR_BS_1;
GPIOA->BSRR = GPIO_BSRR_BR_1;
GPIOA->BSRR = GPIO_BSRR_BS_1;
GPIOA->BSRR = GPIO_BSRR_BR_1;
}
Компилируется так:
Код
STR r1,[r0,#0x18]
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]
STR r2,[r0,#0x18]
B |L1.6|
На осциллографе вижу такой сигнал:
Это означает что инструкция Branch выполняться на самом деле за 3 такта?
Я отлаживаю в Keil на stm32f4discovery.
На инструкции Branch счетчик циклов в Keil (States) увеличивается на +1.
Дополнительно использую SysTick и DWT->CYCCNT, они так же увеличивается на +1 на инструкции Branch.
Почему так? Кто-то врет, не может быть так как что бы один системный такт был то 6 ns, то 18 ns.