Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2018, 15:17

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
 Заголовок сообщения: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 30 дек 2017, 18:23 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 280
Подскажите, должен ли колебаться внешний осциллятор без инициализации в коде?
Пришла пора stm32l051 перевести на внешний кварц, но почему-то не работает даже пример из сниппетов/референсов.
Не знаю пока, толи плохо собрал прототип, толи в коде ошибка.
Осцилограф говорит, что на кварце тишина. Сам МК и плата работоспособны на внутреннем резонаторе.
А я вот не знаю, как-то не задумывался. По идее даже без кода должен кварц сам по себе дрыгаться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 30 дек 2017, 18:24 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4969
HSE включили? Выводы генератора настроены правильно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 30 дек 2017, 18:25 
Заглядывает иногда

Зарегистрирован: 12 дек 2013, 22:40
Сообщения: 131
Другой резонатор пробовали, они достаточно хрупкие. Емкости нагрузочные есть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 30 дек 2017, 18:41 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 280
Все три макета не работают.
Правда я не использовал там резистор 1Мом между выводами осциллятора, и брал кондеи 22пф.

#include "stm32l0xx.h"
#define SHORT_DELAY 200
#define LONG_DELAY 1000
#define ERROR_CSS 0x01
#define ERROR_HSE_LOST 0x02
#define ERROR_UNEXPECTED_RCC_IRQ 0x04
volatile uint16_t error = 0xFF; //initialized at 0xFF and modified by the functions
void ConfigureGPIO(void);
void StartHSE(void);
int main(void)
{
ConfigureGPIO();
SysTick_Config(8000);/* 1ms config with HSE 8MHz*/
StartHSE();
while (1) /* Infinite loop */
{
if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_HSE)
{
if (error == 0xFF)
{
error = 0;
}
}
else
{
if (error == 0)
{
error = ERROR_HSE_LOST;
}
}
}
}


__INLINE void ConfigureGPIO(void)
{
/* (1) Enable the peripheral clock of GPIOA and GPIOB */
/* (2) Select output mode (01) on GPIOA pin 5 */
/* (3) Select output mode (01) on GPIOB pin 4 */
RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN; /* (1) */
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODE5))
| (GPIO_MODER_MODE5_0); /* (2) */
GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODE4))
| (GPIO_MODER_MODE4_0); /* (3) */
}

__INLINE void StartHSE(void)
{
NVIC_EnableIRQ(RCC_CRS_IRQn); /* (1)*/
NVIC_SetPriority(RCC_CRS_IRQn,0); /* (2) */

RCC->CIER |= RCC_CIER_HSERDYIE; /* (1) */
RCC->CR |= RCC_CR_CSSHSEON | RCC_CR_HSEBYP | RCC_CR_HSEON; /* (2) */
}

void NMI_Handler(void)
{
if ((RCC->CIFR & RCC_CIFR_CSSF) != 0)
{
error = ERROR_CSS; /* Report the error */
RCC->CICR |= RCC_CICR_CSSC; /* Clear the flag */
}
}

void SysTick_Handler(void)
{
static uint32_t long_counter = LONG_DELAY;
static uint32_t short_counter = SHORT_DELAY;
static uint16_t error_temp = 0;

if (long_counter-- == 0)
{
if(error == 0)
{
GPIOB->ODR ^= (1 << 4);//toggle green led on PB4
long_counter = LONG_DELAY;
}
else if (error != 0xFF)
{
error_temp = (error << 1) - 1;
short_counter = SHORT_DELAY;
long_counter = LONG_DELAY << 1;
GPIOA->BSRR = (1 << 5); //set red led on PA5
GPIOB->BRR = (1 << 4); //switch off green led on PB4
}
}
GPIOA->ODR ^= (1 << 2);//toggle green led on PB4
for (int a=0; a<30000; a++) __NOP();
if (error_temp > 0)
{
if (short_counter-- == 0)
{
GPIOA->ODR ^= (1 << 5); //toggle red led
short_counter = SHORT_DELAY;
error_temp--;
}
}
}

void RCC_CRS_IRQHandler(void)
{
if ((RCC->CIFR & RCC_CIFR_HSERDYF) != 0) /* (1) */
{
RCC->CICR |= RCC_CICR_HSERDYC; /* (2) */
RCC->CFGR = ((RCC->CFGR & (~RCC_CFGR_SW)) | RCC_CFGR_SW_HSE); /* (3) */
}
else
{
error = ERROR_UNEXPECTED_RCC_IRQ; /* Report an error */
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 30 дек 2017, 21:32 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 517
Я насчитал 12 ошибок.
Можно сказать так - в ваших ошибках разумного кода не обнаружено.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 31 дек 2017, 09:56 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1146
Откуда: Сочи
У меня было, что без резистора кварц не генерил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 01 янв 2018, 05:25 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
antonluba писал(а):
У меня было, что без резистора кварц не генерил.

У STMicro есть чудный апнот о дружбе кварцев с их микроконтроллерами - AN2867. И честно, лучше его прочитать. Кварцы штуки деликатные, там можно много чего сделать не так. И даже если запустится "на столе", еще не доказывает что потом схема запустится где-то еще или что будет запускаться всегда. В апноте есть несколько критериев, которые следует проверить, глядя в даташит кварца. А еще это нежная слаботочная высокочастотная цепь, критичная к шумам и паразитным параметрам. В апноте показано как ее делать правильно. И неправильно, чтобы не делать так. А еще STM здорово начудили местами, особенно с часовым кварцем в ранних сериях STM32. Половина процов by design не способны использовать 12.5пФ ("low drift") кварцы. Круто, блин.

Интересно, STM не приходило в голову перевыпустить ранние серии типа F1, L1 и т.п. с учетом грабель, внедрив новые версии периферийных блоков, где грабли устранены? Или я чего-то упускаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 01 янв 2018, 14:51 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4851
Откуда: Усинск, республика Коми
LinuxPowered писал(а):
Интересно, STM не приходило в голову перевыпустить ранние серии типа F1, L1 и т.п. с учетом грабель, внедрив новые версии периферийных блоков, где грабли устранены? Или я чего-то упускаю?

Чтобы окончательно забить голову разработчикам? Намного проще и эффективней, на самом деле, после выхода в серию создать список найденных грабель и выдать его разработчикам.

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 01 янв 2018, 17:54 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 280
Код скопирован из официальных сниппетов один в один. А какие в нем ошибки?
Так все таки должен или нет колебаться осцилятор, подключенный к stm32, но не проинициализированный?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 15:57 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2361
До явной установки бита HSE - не должен. Потому как выключен усилитель обратной связи внутри МК на выводах кварца.
Если используете сгенерированный в Кубе код, то кварц может включаться этим кодом, либо если не используете Куб, то кварц может включаться в результате исполнения стартового кода, написанного в файле system_stm32f???.с, который исполняется еще до точки остановки в main() и обычно не виден.
Просмотрите файл system_stm32f???.с - там увидите много интересного.
Вызов функции SystemInit() явным образом прописан в файле startup_stm32f????.s в виде ассемблерной инструкции bl SystemInit


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 17:23 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
BigLeha писал(а):
Чтобы окончательно забить голову разработчикам?

Назвать нормально, чтобы было явно понятно. STM32F1xx V2.0, unfucked edition. Я тут посмотрел на даташит F0 и осознал что у F1xx например RTC убог по сравнению с "младшей" серией F0. Это вообще нормально? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 17:46 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2361
Нет смысла переделывать F1. Если его переделать, это получится уже старшая серия.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 18:03 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4969
Вначале сделали F1, потом F0. Всё правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 18:41 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2361
А чой-то про F2 никто не вспоминает? :))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 02 янв 2018, 21:03 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 517
Jaguar_showjumping писал(а):
Код скопирован из официальных сниппетов один в один. А какие в нем ошибки?


1 RCC_CR_HSEBYP - использование внешнего генератора, stm использует один контакт для тактовой частоты, второй контакт можно использовать как угодно. "Кварц" генерировать не будет хоть ты тресни, автономный кварцевый генератор - да, причём даже без чипа st.

2 RCC_CRS_IRQHandler + NMI_Handler - странное использование сигнала сбоя тактовой частоты. В момент сбоя сбрасываются все таймеры, а так-же вырубаются блоки PLL, микшер автоматически выбирает внутренний генератор, но он у вас не включен явным образом... Прерывание само по себе предназначено для внеочередного выполнения кода, сбой генератора - это значительное событие, которое просто невозможно игнорировать. У вас произошёл сбой - глупо надеяться на контрольную точку где-то в основном коде, до которого ещё необходимо дойти - чтобы обработать исключение. До этого момента код на 100% упрётся в бесконечное ожидание от таймера. По этой причине необходимо выполнить настройку pll прямо в теле прерывания, с повторным инсталлом таймеров.

3 SysTick_Handler для моргания светиками, как апофеоз стиля ардуино. Даже материться не хочется.

4 HSERDYIE прерывание в момент выхода внешнего кварца на нормальный рабочий режим. Может использоваться в момент начальной инициализации периферии в system_stm32fххх. Суть использования - экономия времени на совмещении двух задач в самой начальной стадии: ожидание стабилизации кварцев, PLL, и активный инсталл периферии не зависящей от сбоя часов. Для реализации конечного автомата необходим внешний флаг в памяти защищённой от сброса. По номеру флага выполняется поочерёдное выполнение алгоритма настойки всего тракта RCC_ - в момент срабатывания очередного хххRDYIE. То-есть вместо ожидания готовности очередного блока RCC_ в пустом цикле ожидания - выполняется вполне полезная работа по настройке периферии. Достигается экономия времени до 250мс, что иногда бывает очень критически.
После выхода из функции system_stm32fххх - прерывание по хххRDYIE теряет актуальность.

5 майн с возвратом (куда?) в бесконечном цикле проверки переключателя выбора внешнего кварца и rc генератора. Оно конечно будет работать, но не имеет смысла.

Мелкие ошибки я игнорировал, иначе получится слишком много текста. Но смысл очень простой - этот код предназначен для демонстрации автоматического переключения микшера. И он действительно работает, но только на макетке от st - с внешним тактированием. Демонстрация заключается в выдёргивании перемычки и наблюдением за состоянием флага. Достаточно глупое занятие.

И это всё потому, что у вас нет желания изучать официальную документацию по выбранному чипу. Алгоритм "скачал и запустил" не работает с чипами st, тут нужно думать собственной головой.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 03 янв 2018, 08:32 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
BusMaster писал(а):
Нет смысла переделывать F1. Если его переделать, это получится уже старшая серия.

F1 как раз и есть старший относительно F0. Что следует и из маркировки, более хорошего процессорного ядра, максимальных частот некоторых представителей, общего соотношения периферии и цен. А вот то что некоторые периферийные блоки F1 сливают облегченным и дешевым F0 - не логично нихрена. А старшие и так есть, F3, F4/L4 с еще более суровым процессорным ядром, кучей памяти и полным фаршем. Я ж не требую адской периферии и мег флеша, всего лишь подтянуть некоторые блоки до актуальных версий. Даже та же калибровка RTC. STM32F1 умеет толььо тормозить слишком быстрые часы. А разгонять слишком медленные не умеет. Офигенно, да? В ряде других серий этот тупняк исправлен, однако. Почему бы не сделать респин F1 с улучшенной версией блока, спрашивается? За столько лет можно наверное и сподвигнуться, если уж процесс поставлен на поток.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 03 янв 2018, 13:12 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2361
Я ж грю - на пьяну голову лучше ничего не пишите :))) потом по трезвянке прикините, покумекаете... да и плюнете, нафик там заморочки такие. ...это вам щас кажется, что бац - и одномоментно по всему миру вдруг стали везде F1 v2.0. Ан-нет, дедморозовое чудо закончилось, волшебства не будет :)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 03 янв 2018, 20:16 
Заглядывает иногда

Зарегистрирован: 15 окт 2017, 22:24
Сообщения: 180
Полазив по сайту STM обнаружил что что дед мороз в принципе бывает, но почему-то не там. С L1 как раз примерно что-то такое сделали, то что получилось стало называться L1 ... A. И там ряд улучшений, в том числе и блока RTC и проч. Но актуальнее было бы с F1xx это проделать, как мне кажется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 03 янв 2018, 21:17 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2361
L1 - это отдельная серия, с другим набором периферии.
И че вы за этот RTC. Он не часто используется в принципе то.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 05 янв 2018, 14:37 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 280
BusMaster писал(а):
До явной установки бита HSE - не должен. Потому как выключен усилитель обратной связи внутри МК на выводах кварца.
Если используете сгенерированный в Кубе код, то кварц может включаться этим кодом, либо если не используете Куб, то кварц может включаться в результате исполнения стартового кода, написанного в файле system_stm32f???.с, который исполняется еще до точки остановки в main() и обычно не виден.
Просмотрите файл system_stm32f???.с - там увидите много интересного.
Вызов функции SystemInit() явным образом прописан в файле startup_stm32f????.s в виде ассемблерной инструкции bl SystemInit


Спасибо, парни! Так и сделал. Посмотрел system_stm32l0xx.c
Вырезал команды, пошуршал, и осцилkятор заколебался :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Должен ли колебаться внешний осциллятор без инициализации?
СообщениеДобавлено: 05 янв 2018, 19:02 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 280
ух ты блин.... тактирование выучил изнутри.... никогда бы не подумал, что придется....


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB