RTC на STM32F103C8T6
- Войдите на сайт для отправки комментариев
Ср, 01/04/2020 - 19:36
Всем привет! Имеется STM32F103C8T6 (Blue Pill). Необходимо запустить часы реального времени, тем более что и кварц часовой стоит. В сети нашел примеры:
https://github.com/stm32duino/STM32RTC - эта библиотека у меня вообще попала в раздел "не поддерживаемые", хотя ядро STM стоит именно stm32duino.
Пробовал примеры библиотеки RTClock, которая идет вместе с ядром.
Результат во всех случаях одинаковый - "тиканье" секунд происходит нестабильно с разной продолжительностью времени.
Простой пример:
#include <RTClock.h> RTClock rt (RTCSEL_LSE); // initialise uint32 tt; #define LED_PIN PC13 // This function is called in the attachSecondsInterrpt void blink () { digitalWrite(LED_PIN,!digitalRead(LED_PIN)); } void setup() { pinMode(LED_PIN, OUTPUT); Serial1.begin(115200); rt.attachSecondsInterrupt(blink);// Call blink } void loop() { if (rt.getTime()!=tt) { tt = rt.getTime(); Serial1.print("time is: "); Serial1.println(tt); } }
Светодиод на PC13 мигает с плавающей частотой 1-3 секунды, а должен менять свое состояние ровно 1 раз в сек.
Примеры от STM32RTC не заработали. Выдает ошибку компиляции:
ПРЕДУПРЕЖДЕНИЕ: библиотека STM32RTC-master должна запускаться на архитектурах stm32 и может быть несовместима с вашей платой на архитектуре STM32F1. In file included from D:\TEMP\arduino_modified_sketch_91395\SimpleRTC.ino:39:0: C:\Users\�����\Documents\Arduino\libraries\STM32RTC-master\src/STM32RTC.h:46:2: error: #error "RTC configuration is missing. Check flag HAL_RTC_MODULE_ENABLED in variants/board_name/stm32yzxx_hal_conf.h" #error "RTC configuration is missing. Check flag HAL_RTC_MODULE_ENABLED in variants/board_name/stm32yzxx_hal_conf.h" ^ exit status 1 Ошибка компиляции для платы Generic STM32F103C series.
Что можете посоветовать?
Такой еще вопрос, обязательно ли подключать питание на пин VB? Мне не нужно чтобы часы тикали в отключенном состоянии, по этому я не подключал батарейку. Может ли это влиять?
Вы всё врёте. Ваша программа компилируется без ошибок.
nik182, я же не сказал что совсем не работает, работает, но частота гуляет. Ради теста кинул +3.3 на пин VB. Ни к каким результатам это не привело.
Код, который я привел, с библиотекой RTClock.h, у меня нормально компиллируется и прошивается (читайте внимательно). У меня не компиллируется библиотека STM32RTC.
STM-ок у меня больше десятка. Разные партии, куплены в разное время. Даже визуально немного отличаются. На всех проявляется одно и та же проблема.
Заметил еще такой момент: частота может измениться от простого прикосновения к плате....
Супер. А где код который не компилируется?
Да любой из библиотеки STM32RTC. Эта библиотека вообще стоит в "Несовместимых"....
На пример SimpleRTC:
Выдает ошибку:
Особенно меня порадовала строчка: "ПРЕДУПРЕЖДЕНИЕ: библиотека STM32RTC-master должна запускаться на архитектурах stm32 и может быть несовместима с вашей платой на архитектуре STM32F1."
forfrends - для начала возьмите паяльник и пройдитесь по всем выводам часового кварца. У меня на половине блю-пиллов без пропайки RTС вообще не работает.
вот такой псевдо-код в моем проекте часов работает совершенно устойчиво:
b707, Спасибо. Сейчас попробую пропаять кварцы. А на пин VB у вас идет питание?
А на пин VB у вас идет питание?
да
Скетч из #5 нормально откомпилировался на другом ядре. Работу завтра проверю.
Спасибо, все оказалось и проще. Я питал СТМку от STLink-a, и похоже просто не хватало питания для корректной работы часов. Хотя никакой дополнительной обвязки нет...
Запитал от USB и часы затикали ровно и без сбоев. Так же проверил, подал внешнее питание 3.3 вольта - тоже все отлично работает. Похоже просто оказался слабый китайский STLink, и не выдавал необходимую мощность.
b707, еще подскажите, часы точно идут? Или время от времени их нужно подстраивать?
b707, еще подскажите, часы точно идут? Или время от времени их нужно подстраивать?
я не помню, вроде порядка 2-3 секунды в сутки уход. Насколько помню, в аддоне Кларка есть метод подстройки точности RTC, так что этот показатель можно улучшить.
Но я не заморачивался. у меня все равно каждые 6 часов идет обновление времени по NTP - заодно это избавляет от необходимости начальной установки времени.
А как вы устанавливаете часы? У вас отдельные переменные для часов, минут, секунд, или все хранится в регистрах RTC?
А как вы устанавливаете часы? У вас отдельные переменные для часов, минут, секунд, или все хранится в регистрах RTC?
Сервер NTP отдает время в т.н. UnixTime - одном числе типа uint32_t. Точно в таком же формате работает внутренний RTC на STM32, так что я время не храню и не преобразовываю, а сразу загружаю в RTC строчкой:
Вопрос почти в тему : поскольку только собираюсь к stm32 начать работать, правильно я понимаю, достаточно батарейку ~3 вольта подцепить к stm и при отключении питания общего мы получаем относительно вечный RTC?
Судя по паспорту ток RTC в нормальных условиях 1.4 мкА. Батарейка 2032 240 мА*ч . Срок службы батареи 10 лет. За это время f103 выест батарею только на половину. Это если будет всё время спать , а не показом времени заниматься.
Хм. Столкнулся со странностью: часы останавливаются если отключить внешнее питание. Батарейка CR2032 (3.02 вольта) подключена к минусу и к VB. Подключен i2c дисплей SSD1306. При подключении питания все тикает, время на дисплее отображается. Если отключить питание то время в RTC останавливается. То есть при повторной подаче питания время пойдет с того же момента, на котором питание отключилось. На пример, время было: 21:15:45, отключаю питание, батарейка при этом остается подключенной, жду несколько минут, подключаю питание, и часы продолжают идти с 21:15:45 ....
Что это может быть? Вот скетч:
Заметил отличие:
у меня стоит настройка: RTClock rt (RTCSEL_LSI);
Хотя в посте #6 в примере стит другая настройка: RTCSEL_LSE
но с RTCSEL_LSE у меня часы вообще не тикают...
но с RTCSEL_LSE у меня часы вообще не тикают...
Значит проблема с внешним часовым кварцем.
LSI - low speed internal - внутренний (встроенный в МК) низкочастотный осциллятор
LSE - low speed external - внешний низкочастотный кварц
но с RTCSEL_LSE у меня часы вообще не тикают...
так вы кварц пропаяли, как я советовал? Возьмите припоя на паяльник, приложите к ножке кварца и держите, пока нога хорошо не прогреется и припой не растечется на ножке ровным слоем и не затекет под ножку.
и так с каждой ногой кварца.
Я не знаю, почему брак именно тут - но блюпилы просто пачками идут с али с не припаянным кварцем
Мне пришло 5 штук с припаянным, но не работающим. Пришлось прямо поверх ног припаять свой в виде трубочки. Работает нормально через ноги оригинального.
Кварц я пропаял. Потыкал осциллографом - на пине PC15 (питание кварца) вместо стабильного напряжения идет какой-то синосоподобный сигнал с частотой 50 000 Гц, и амплитудой до 0,35 - 0,4 вольта. Соответственно кварц не работает. На PC14 нет тактирующего сигнала от кварца.
И так на всех платах... Либо все платы бракованные, либо кварцевые генераторы, либо код. Сейчас попробую выпаять кварц и посмотрю что происходит на PC15. Надо еще по схеме посмотреть, может конденсатор пробит (на всех платах???) и садит питание...
Результат: без кварца на PC15 и PC14 присутствует непонятный сигнал с частотой 50 000 Гц... и теперь как узнать, это МК бракованный или код кривой?...
и теперь как узнать, это МК бракованный или код кривой?...
код из примера #6 - это буквально одна строка, что там может быть кривого?:) - он рабочий
Я имею в виду не сам скетч, а то что находится внутри библиотеки. Может там где-то ошибка.
Вот как выглядит сигнал. Он очень сильно реагирует на наводки (изменяется амплитуда)
Ошибка, был плохой контакт на щупе осцила.
Сигнал выглядит вот так:
Частота 50 000 Гц, амплитуда 0,18 - 0,38 вольт...
Это без подключенного кварца на PC15. Скетч пустой:
это не 50 000 Гц (50 КГц), а просто 50 Гц - самая обычная наводка от квартирной электропроводки... или от плохого блока питания
Получается на PC15 просто не подымается питание кварца? Надо ковырять библиотеку...
Получается на PC15 просто не подымается питание кварца? Надо ковырять библиотеку...
хотите, ковыряйте. Я уже устал повторять. что у меня эта библиотека - работает.
я больше склоняюсь к предположению niк182 - кварц мертвый
Это все без кварца. Так или иначе, для его работы должно подыматься питание на PC15 , (или я ошибаюсь?) а этого нет.
Это все без кварца. Так или иначе, для его работы должно подыматься питание на PC15 , (или я ошибаюсь?) а этого нет.
во-первых. если правильно помню - не на pc15(OSC32_OUT), а на PC14 (OSC32_In)
А во вторых - вы на Vb не забываете 3.3в подавать при этих измерениях?
хотя нет, не должно на рс14 и рс15 ничего подаваться, это самые обычные GPIO и ими можно пользоваться независимо от RTC
короче. если до вечера не разберетесь и желание не пропадет - могу взять заведомо рабочую блю-пилл и померять. что там появляется на этих ножках
Да, питание на Vb подается.
Только что поставил кварц с заведомо рабочего устройства. Результат абсолютно тот же
Буду очень признателен если посмотрите.
Буду очень признателен если посмотрите.
ок, где-нить после 21 час по Мск
На всякий случай выкладываю проект, созданный Ардуино при компиллировании:
https://drive.google.com/open?id=1MMi_umWEKQxa1bvNzdgOZtnZ8Lx3HEM2
Попробуйте его прошить в свою STM, так можно будет проверить проблему с Ядром или библиотекой.
Сам скетч минимальный:
Сам скетч минимальный:
какой-то он уж слишком минимальный, хотя бы добавьте вывод времени в Сериал. иначе как понять, что RTC "тикает" ?
После очередной перепрошивки, часы заработали... Прошивал стандартный скетч:
Плата с батарейкой. Перепаивал на ней все вдоль и поперек + поменял кварц, и после прошивки часы пошли и продолжают идти даже с отключенным питанием (от батарейки)... ХЗ что с платой было. Но все остальные платы все так же отказываются работать.
Попробую вернуть на место старый кварц и посмотрю на результат.
Еще нюанс: стоит щупом дотронуться до любого контакта кварца, как часы сразу останавливаются. На осциллографе пусто. Нет никакого сигнала. Такое чувство, будто у STM не хватает мощности. но я питаю сразу от 2-х источников, от STLink-а и от USB-TTL конвертера.
я так понял, проверять подачу питания на рс14 рс15 уже не надо?
Осциллографом можно подключаться только на PC15 для LSE. Желательно не тыкать, а на пределе 1:10 на щупе подключить щуп до инициализации. Тыкая щупом Вы вносите емкость в кварцевый генератор и сбиваете генерацию. Особенно если это РС14.
Интернет заглючил, только сегодня смог зайти.
Да, проблема была не программная, а физическая. Так как в библиотеке я ничего не успел изменить, и плата заработала после перепаиваний. Но! Через некоторое время опять перестала работать. 5 плат, и все не работают... Распечатал 6-ю. Сразу прошил тестовым скетчем (где светодиод мигает по прерыванию секунд). Работает! Запаял гребенки. Прошелся щеткой со спиртом. Включаю... Не работает!
Проблема оказалась во флюсе, который нарушал работу кварца. Плата вновь заработала только после 3-х циклов поочередной промывке Вода - Спирт.
Вот и вся беда. А проблем мне создало на несколько вечеров.
Перепроверил и другие платы. После тщательной промывки они тоже заработали.
Проблема оказалась во флюсе,
кислотный наверно? - я пользуюсь обычным ЛТИ. он берет все и совершенно безопасен для контактов и элементов. Если бы не визуально "грязный" вид - его можно было бы даже не смывать.
А вот у заказчиков уже несколько раз сталкивался с тем. что люди по неграмотности купят какой-то агрессивный флюс - и потом мучаются с постоянными глюками оборудования.
Я пользуюсь вот этим припоем: https://www.proline-tools.com.pl/ru/%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/olovo-payalnoe-60320
Больше ничем платы не обрабатываю (кроме спирта). С подобной ситуацией столкнулся впервые.
Я пользуюсь вот этим припоем...
Больше ничем платы не обрабатываю (кроме спирта).
посмотрел - припой без флюса. Если ничем больше не пользоваться - как же вы паяете? У вас же сплошной непропай будет
Вот и я наступил на эти грабли. Воткнул в первую попавшуюся плату из стола - не работает. Во второй работает. У меня в программе стоит проверка на правильный запуск LSE - через неё программа не перепрыгивает. Соответственно сразу диагностика.
b707, Там не только олово но и флюс внутри. А какой - не известно. Паяется очень хорошо. Контакты лудятся быстро.
nik182, вы через отладчик проверяли, или просто в скетче поставили условие? Если через отладчик, то в какой среде его включаете?
b707, Там не только олово но и флюс внутри. А какой - не известно. Паяется очень хорошо. Контакты лудятся быстро.
в описании флюса нет...
Припой Sn60 Pb40 2.5%
2.5% - количество припоя. Хотя его состав нигде не прописан.
Припой Sn60 Pb40 2.5%
2.5% - количество припоя. Хотя его состав нигде не прописан.
ага олово - 60%, свинец - 40... я наверно что-то в школе недоучил. но 60+40 =100, куды ж еще 2.5% девать? :))))
:))))
Там все проще: флюс + припой = 100%, из которых 2.5% - припой. Остается 97,5% флюса. А флюс состоит: олово - 60%, свинец - 40%
:))))
Там все проще: флюс + припой = 100%, из которых 2.5% - припой. Остается 97,5% флюса. А флюс состоит: олово - 60%, свинец - 40%
ты ничо не попутал? Флюс - это, наабарот, канифоль, а не олово+свинец (это как раз - припой).
Может и перепутал :)