Проверил еще раз, с тактовой частотой всё нормально. Какие-то проблемы с изменением состояния пина.
Проверял так:
CODE
int main(void)
{
uint32_t loops_const = (uint32_t)((double)1 * 120000000 / 3000000.0);
uint32_t loops;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
__disable_irq();
while(1)
{
loops = loops_const;
GPIOA->BSRRL = GPIO_Pin_15;
GPIOB->BSRRL = GPIO_Pin_12;
asm volatile (
"1: SUBS %[loops], %[loops], #1 \n"
" BNE 1b \n"
: [loops] "+r"(loops)
);
GPIOB->BSRRH = GPIO_Pin_12;
GPIOA->BSRRH = GPIO_Pin_15;
GPIOA->BSRRL = GPIO_Pin_15;
GPIOA->BSRRH = GPIO_Pin_15;
GPIOA->BSRRL = GPIO_Pin_15;
GPIOA->BSRRH = GPIO_Pin_15;
loops = loops_const;
asm volatile (
"1: SUBS %[loops], %[loops], #1 \n"
" BNE 1b \n"
: [loops] "+r"(loops)
);
}
}
При включении оптимизации по размеру или по скорости, всё работает нормально, делается задержка на 1мкс между 1 и 0 вывода GPIOB.GPIO_Pin_12, после этого идут переключения с частотой 120МГц вывода GPIOA.GPIO_Pin_15.
Если отключить оптимизацию, то задержка 1мкс также формируется, но время между переключениями состояния на выводе GPIOA.GPIO_Pin_15 становится по 25нс.
Почему так происходит понять не могу.
UPD1:
Ассемблерный код генерируется нормальный:
Код
606 039c 0B4B ldr r3, .L48
607 039e 4FF48052 mov r2, #4096
608 03a2 1A83 strh r2, [r3, #24] @ movhi
609 03a4 094B ldr r3, .L48
610 03a6 4FF48052 mov r2, #4096
611 03aa 5A83 strh r2, [r3, #26] @ movhi
...
626 .L48:
627 03cc 00040240 .word 1073873920
Где искать проблему?
UPD2:
Разобрался, что-то я опять затупил, без оптимизации будет 3 команды по 8нс, как раз выйдет 24нс, а с оптимизацией будет просто последовательные strh и выйдет по 8нс.
UPD3:
Вот только при включении оптимизации перестает работать передача по USB. Прием работает.
UPD4:
Исправил отключением оптимизации для цикла отправки данных для ПК, выделив это в одну функцию и добавив её атрибут __attribute__((optimize("-O0"))).
Сообщение отредактировал BaN - Apr 30 2013, 09:35