Здравствуйте, уважаемые мурковчане!) Помогите новичку разобраться с HSE на отладочной плате stm32f3-discovery. Объясняю свой трехдневный затык. Во время настройки системы тактирования я столкнулся с тем, что частота этого тактирования вообще не такая, какая должна по идее быть. После прочтения мануала от st, оказалось, что на упомянутой плате отсутствует кварцевый резонатор, подключенный к контроллеру, однако он есть на st-link, встроеном в плату и следует использовать именно его. Также я нашёл/покрутил пример кода от st, однако при включении соотв.опций ничего не поменялось. Почему/что я делаю не так? Мой код:
Код:
uint8_t RCC_Init(void) { /* Clear bits */ RCC->CR |= (uint32_t)0x00000001; /* Reset CFGR register */ RCC->CFGR &= 0xF87FC00C; /* Reset HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xFEF6FFFF; /* Reset HSEBYP bit */ RCC->CR &= (uint32_t)0xFFFBFFFF; /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE bits */ RCC->CFGR &= (uint32_t)0xFF80FFFF; /* Reset PREDIV1[3:0] bits */ RCC->CFGR2 &= (uint32_t)0xFFFFFFF0; /* Reset USARTSW[1:0], I2CSW and TIMs bits */ RCC->CFGR3 &= (uint32_t)0xFF00FCCC; /* Disable all interrupts */ RCC->CIR = 0x00000000; /* Using 8Mhz crystal */ RCC->CR |= RCC_CR_HSEBYP | RCC_CR_HSEON; /*Вот здесь вот, при установке bypass ничо не меняется, тактирование вообще не слушает меня; чисто визуально, по миганию светодиода частота раз в 15 меньше, чем должна быть. (По SysTick - точнo также) Код мигания самый тривиальный, задержка через цикл for, нет смысла сюда приводить. На счет mco ничего, увы, не могу сказать, я пока шкет и у меня осциллографа нету */ /* Wait for crystal */ uint16_t i = 0; while (!(RCC->CR & RCC_CR_HSERDY)){ if (i == UINT16_MAX){ return 1; } ++i; } /* Flash 48 <= HCLK <= 72 */ FLASH->ACR |= FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1й; /* PLL input = 8Mhz, output = 72Mhz */ RCC->CFGR |= RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL9; RCC->CR |= RCC_CR_PLLON; i = 0; /* Wait for PLL */ while (!(RCC->CR & RCC_CR_PLLRDY)){ if (i == UINT16_MAX){ return 1; } ++i; } /* Divide PLL for APB1*/ RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; /* Switch on PLL */ RCC->CFGR |= RCC_CFGR_SW_PLL; /* Wait for switching on PLL */ i = 0; while (!(RCC->CFGR & RCC_CFGR_SWS_PLL)){ if (i == UINT16_MAX){ return 1; } ++i; } RCC->CR &= ~(RCC_CR_HSION); return 0; }
P.S. Когда использовал хал, проблем с этим не было, все работало. Пробовал посмотреть, как сделал все куб, но как то слегка запутался. Помогите, пожалуйста! Заранее благодарю
оказалось, что на упомянутой плате отсутствует кварцевый резонатор, подключенный к контроллеру, однако он есть на st-link, встроеном в плату и следует использовать именно его.
Не знаю как вы собрались использовать кварцевый резонатор эмулятора, но контроллеры STM32 вполне успешно могут работать вообще без какого либо кварцевого резонатора. Ищите в мануале раздел про тактирование и изучайте.
PS: Сильно сомневаюсь в возможности использовать для тактирования МК резонатор эмулятора. Хотя схему вашей платы не вижу в своём хрустальном шаре - посему утверждать не буду.
Вы тут пытаетесь сбросить весь регистр? Если да, то вместо этого в младшем бите устанавливается единица, а остальные не изменяются. Точно не перепутали "побитовое ИЛИ" ( | ) и "побитовое И" ( & )?
на упомянутой плате отсутствует кварцевый резонатор, подключенный к контроллеру, однако он есть на st-link, встроеном в плату и следует использовать именно его.
внутренняя схема генератора рассчитана на непосредственное подключение кварцевого резонатора, а не использование его от какого-то st-link и совместно с ним. Это же просто странно. Другое дело, тактироваться от внешней частоты...
ну, тогда так и надо говорить, что тактирование внешней частотой. А не какое-то совместное использование кварца. А есть ли оно там - jcxz уже сказал, что неизвестно.
Добавлено after 54 seconds: Установить внешний резонатор тож можно...
Добавлено after 4 minutes 25 seconds: а вообще, оказывается, если посмотреть документацию на эту штуку, то там есть такое:
Цитата:
2.3 PLL_SOURCE_HSE_BYPASS In this mode, the HSE is bypassed with an external clock (fixed at 8 MHz, coming from STLINK circuit). It is used to clock the PLL, and the PLL is used as the system clock source. Some hardware modifications are necessary to bypass the HSE with the clock coming from the ST-LINK circuit. For more details, refer to section "4.10 OSC clock" in "STM32F3 discovery kit User manual (UM1570)". Note: PLL_SOURCE_HSE_BYPASS is the default clock configuration.
Т.н. HSE - это генератор. У него есть соответствующая аппаратура (усилитель и прочая), которая ПОДКЛЮЧАЕТСЯ к ногам по параметру HSEON. Второе. Режим Byp означает, что используется прямое соединение и на специальный порт подается внешняя частота логичекого уровня. Третье. При включении =генератора= HSE. Так еще раз, для особо непонятливых - не HSE, а генератора HSE, той самой аппаратуры, которая подключена к выводам для (кварцевого) резонатора. При включении начинается процесс раскачивания резонатора и через ощутимый интервал времени (указано в DS) генерация признается нормальной и выставляется соответствующий бит готовности. Программно надо сидеть и тупо ждать, когда генерация станет устойчивой. Для этого есть соответствующая строчка кода. Теперь, пихают непойми что на ход внешней частоты (сигнал логический, АСЬ??), после этого ТС включает режим Byp (что вообще не понятно, т.к. Byp с синусом непоймичего работать не обязан) и HSEON (погдключение аппаратуры генератора). Понятное дело, что генератор внутри MCU от столь [гм] обращения наверняка свалится. Хорошо, смотрим код - ожидание RDY достигнуто, значит генератор как-то запустился. Хорошо! ... бы. Наличие HSE_RDY позволяет переключить тактирование на него, что и делается. Но, STM32 имеет защиту от [вписывается], при отказе HSE он перейдет в странный режим, но продолжит работу. Всё это описано в RM. Итак, генератор HSE работает, но не всегда, т.к. на него вплавили странный сигнал. Т.е. HSE_RDY пропадает, что вызывает серьезный exception (отвал системной частоты процессора) и сваливание на тактирование HSI с делителем. Что делать в этой ситуации? Прочитать раздел HSE в RM и исправить самостоятельно.
демонстрационный код и блок схема мк не предполагает иного включения внешнего тактирования, кроме как через HSEON. Если точнее: RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP);
...ничо не меняется,... если я правильно понял Вы 8МГц от внутреннего ген. меняете на 8МГц от f103 и хотите увидеть разницу? для задержки исп. цикл for() - забудьте, для конкретных таймингов исп. апп. таймер. здесь Вам не avr. ... должно быть в 15 раз ... Вы видели в какие asm инструкции компилятор превратил ваш цикл ? вероятно - нет, так откуда уверенность про "15 раз"
Последний раз редактировалось a797945 Вт авг 01, 2023 06:33:30, всего редактировалось 1 раз.
Большое спасибо всем, особенно, вам, Martian. Посмотрел user manual, всего то нужно было замкнуть SB12. Тем не менее, на счет некоторых мнений - вообще то, я опирался на код из примеров от st, где несколько товарищей углядели ошибки . В доказательство приведу (форкнутый кем-то, кто ВОЗМОЖНО совершил ошибку) оригинал:
/* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { }
/* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) { } #else #if defined (PLL_SOURCE_HSE) /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); #elif defined (PLL_SOURCE_HSE_BYPASS) /* HSE oscillator bypassed with external clock */ RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP); #endif /* PLL_SOURCE_HSE */
/* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
/* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { }
/* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ } #endif /* PLL_SOURCE_HSI */ }
Может быть, конечно, я не прав, попробую разобраться
на упомянутой плате отсутствует кварцевый резонатор, подключенный к контроллеру, однако он есть на st-link, встроеном в плату и следует использовать именно его.
Т.е. - использовать он хотел не логический выходной сигнал некоего генератора, а сам кварцевый резонатор. Что очень вряд-ли возможно. О чём я сразу и написал. Разве что если пожертвует тем ST-LINK-ом.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения