Прошил в железо, три светодиода на портах PB0, PB1, PC13 по очереди зажигаются на 0,5сек итого цикл 1,5 сек.
Действительно ли микроконтроллер у меня заработал на 72мГц (кварц на 8мГц) а порт на 50мГц с такими настройками,
(72000000*1,5)/(0x5AE8BA*3) = 6,042... не слишком ли много машинных циклов на цикл ожидания?
Почему в Протеусе 8.7 если выставить частоту кристалла 8мГц циклы в осциллографе растягиваются как будто надо поставить
72мГц, но если поставить 72мГц то симуляция вообще зависает? (При 50Мгц ещё не зависает)
Я правильно понимаю, в Протеусе у этой модели глючит режим GPIO_Mode_Out_PP, т.е. никогда не подключаются выходы к
+ питания?
Есть ли разница в какой последовательности следуют блоки кода "настройка портов" и "настройка тактирования" ?
main.cpp из проекта:
Спойлер
Код: Выделить всё
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
int main(void)
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int i;
//******************************************************************************************************************************
{ //настройка портов
GPIO_InitTypeDef GPIO_InitStructure; /* Initialize Leds mounted on STM32 board */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Initialize LED which connected to PC13, Enable the Clock*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------------------------------------------------------------------------------------------------------------------------
//GPIO_InitTypeDef GPIO_InitStructure; /* Initialize Leds mounted on STM32 board */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Initialize LED which connected to PC13, Enable the Clock*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; /* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------------------------------------------------------------------------------------------------------------------------
}
{ //настройка тактирования
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
RCC_DeInit(); /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */
RCC_HSEConfig( RCC_HSE_ON); /* Включаем HSE (внешний кварц) */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Ждем пока HSE будет готов */
if (HSEStartUpStatus == SUCCESS) /* Если с HSE все в порядке */
{
/* Следующие две команды касаются исключительно работы с FLASH.
Если вы не собираетесь использовать в своей программе функций работы с Flash,
FLASH_PrefetchBufferCmd( ) та FLASH_SetLatency( ) можно закомментировать */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); /* Включаем Prefetch Buffer */
/* FLASH Latency.
Рекомендовано устанавливать:
FLASH_Latency_0 - 0 < SYSCLK? 24 MHz
FLASH_Latency_1 - 24 MHz < SYSCLK ? 48 MHz
FLASH_Latency_2 - 48 MHz < SYSCLK ? 72 MHz */
//FLASH_SetLatency( FLASH_Latency_2);
RCC_HCLKConfig( RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */
RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */
RCC_PCLK1Config( RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */
/* PLLCLK = 8MHz * 9 = 72 MHz */
/* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */
/* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd( ENABLE); /* Включаем PLL */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Ждем пока PLL будет готов */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Переключаем системное тактирование на PLL */
while (RCC_GetSYSCLKSource() != 0x08) {} /* Ждем пока переключиться */
}
else /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */
{
while (1) {} /* Пока тут заглушка - вечный цикл*/
}
}
while (1)
{
// GPIOC->ODR ^= GPIO_Pin_13; /* Toggle LED which connected to PC13*/
// GPIOB->ODR ^= GPIO_Pin_0;
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // Set C13 to Low level ("0")
for(i=0;i<0x5AE8BA;i++); /* delay */
GPIO_SetBits(GPIOC, GPIO_Pin_13); // Set C13 to High level ("1")
GPIO_SetBits(GPIOB, GPIO_Pin_0);
for(i=0;i<0x5AE8BA;i++); /* delay */
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
for(i=0;i<0x5AE8BA;i++); /* delay */
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

