Кто любит RISC в жизни, заходим, не стесняемся.
Сб окт 13, 2018 19:25:39
Уважаемые коты! Подключил Watch Dog в stm32f767 (плата NUCLEO-F767ZI). Библиотек в кубе почему-то не оказалось. Написал вручную, как чувак рассказывает в этом ролике
https://www.youtube.com/watch?v=xzM3NxqSchshiwdg.Init.Reload = 1000;
IWDG -> KR=((uint32_t)0x5555); // (Key Register Write) Access Enable Watch Dog
IWDG -> PR=((uint32_t)((uint8_t)(0<<2|0<<1|0<<0))); // Prescaler = 4
IWDG -> KR=((uint32_t)0xCCCC); // Start Watch Dog
while (1)
{
IWDG -> KR=((uint32_t)0xAAAA); // Reset Watch Dog. 32000/4/1000=8 resets per second.
}
Работает нормально. Сделал эксперимент. Зажег пин и поставил задержку несколько секунд. 8 раз в секунду осциллограмма дергается вниз - микроконтроллер перезагружается.
Но вот что интересно. Подаю число через переходник usb-uart на uart микроконтроллера (пользуюсь LabView). На плате 767 есть ethernet-разъем. Если не подавать данные на USART (выдернуть провода), watch dog 8 раз в секунду моргает оранжевой лампочкой - со скоростью сброса Watch Dog . Если подавать данные - не моргает. Почему так? Я ethernet не активировал. Как индикация работы Watch Dog конечно прикольно, но наверное ethernet работает независимо и Watch Dog его постоянно перезагружает. Можно ли его отключить?
Еще я слышал, что Watch Dog после срабатывания включает какой-то флаг. Его надо потом сбрасывать или необязательно? Может ли быть перезагрузка ethernet из-за каких-нибудь несброшенных флагов? Предполагаю, что на каждом периферийном узле стоит такой флаг, и его надо вручную сбрасывать.
Пн окт 15, 2018 11:47:08
похоже бот писал
AI на отладке
Ср окт 17, 2018 00:18:50
Почему бот? Я жив!
Добавлено after 25 minutes 5 seconds:
Кажется дошло.WatchDog перезагружает не ethernet, а весь микроконтроллер целиком. Если выдернуть провода, функция HAL_UART_Receive похоже не пропускает программу дальше, и WDG переполняется. Подскажите, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться.
Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Ср окт 17, 2018 07:55:06
Почему бот? Я жив!
Разве ж это жизнь...
Подскажите, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены?
А что это изменит? Подключенный провод разве гарантирует поступление данных?
Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Логику надо менять. Пришли данные -> считал -> обработал.
Ср окт 17, 2018 17:27:44
А если нули пришли?
Ну так как мне сделать чтобы узнать, что пришли данные?
Ср окт 17, 2018 17:36:27
Как что? Как и озвучивал ранее, перестать тыкаться в калокубе и начать читать и думать.
Ср окт 17, 2018 17:46:35
А если нули пришли?
Нули такие же числа, ничем не хуже других.
Ну так как мне сделать чтобы узнать, что пришли данные?
Ну это уже не смешно. Почитай хоть пару ссылок гугла по ключевым словам "UART", "STM32 UART".
Ср окт 17, 2018 17:55:41
Ну так от отключенных проводов данные прийти не могут.
Если я подтягивающие резисторы на rx и tx поставлю на +питания (и они будут гнать логические нули), это поможет, как думаете?
Ср окт 17, 2018 18:07:27
Достаточно включить внутренний пулдаун на RX.
Ср окт 17, 2018 19:10:37
Ну так от отключенных проводов данные прийти не могут.
И что? Если у вас с подключенными проводами данные перестанут передаваться, то микрокотроллер будет по WDG перегружаться?
Если я подтягивающие резисторы на rx и tx поставлю на +питания (и они будут гнать логические нули),
Вам вот такая картинка о чём-нибудь говорит? В частности зелёные биты START и STOP?
это поможет, как думаете?
Слово ПРЕРЫВАНИЕ вам о чём-то говорит?
Ср окт 17, 2018 21:22:54
Дааа! Ух ты, с прерыванием-то все нормально работает! И WDG отключать не пришлось!
Написал __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
И в бесконечном цикле вызываю прерывание HAL_UART_Receive_IT(&huart3, &X, 1);
Если данные не приходят, вызов прерывания тупо пропускается и WDG в следующей строке сбрасывается IWDG -> KR=((uint32_t)0xAAAA);.
VladislavS , я с вами дружу! Надо сказать BusMasterу, чтобы возвращал мне мою карму взад!
Ср окт 17, 2018 21:26:52
И в бесконечном цикле вызываю прерывание HAL_UART_Receive_IT(&huart3, &X, 1);
Чегой? Снова куча минусов к карме
Ср окт 17, 2018 21:38:38
Прерывание в бесконечном цикле вызываю, вызвать его на стороне не получается. Там какой-то глюк в Кубе.
Хотя конечно глупо, прерывание на то и прерывание, чтобы откуда угодно вызываться.
Ср окт 17, 2018 21:47:09
Офигеть, да ты чЁ. Прямо таки колбэк и не вставить в хэндлер?
Ср окт 17, 2018 21:54:39
Тьфу, херню написал. Вызывается откуда угодно, а функция обработчика прерываний пишется в сторонке. А где там функция для обработчика по приему на UART пока не разобрался.
Ср окт 17, 2018 22:05:33
Вообще-то по вменямому, вся обработка должна быть в хэндлере, без всяких колбэков и прочей ереси и как можно короче. Нет , тогда выставляем флаг и обрабатываем в суперлупе.
Это для вашего уровня...
Ср окт 17, 2018 22:28:07
Управляю ШИМом через uart. Написал в бесконечном цикле вот так:
while(1)
{
IWDG -> KR=((uint32_t)0xAAAA); // Сброс WDG.
HAL_UART_Receive_IT(&huart3, &X, 1); // Вызов прерывания по uart.
TIM1->CCR1 = X; // Записываем в счетный регистр принятое по uart число X.
}
Работает. Но хорошо бы все написанное в обработчик кинуть, а цикл освободить, мало ли для чего пригодится. Но как это сделать?
Добавлено after 9 minutes 45 seconds:
Простите, а хэндлер это что?
Ср окт 17, 2018 22:41:23
Pazitiff25 писал(а):хэндлер это что?
Обработчик прерывания.
Это функция которая для USART может иметь имя USART3_IRQHandler.
Ср окт 17, 2018 22:49:55
Pazitiff25, "передача" по одному байту? По UART?
ЧистА поиграться ?
Ср окт 17, 2018 22:59:22
Управление-то вручную, зачем мне быстрее одного байта.
А вообще как положено делать? Упаковывать в пакет и посылать всем скопом? Если например ацп задействовать? Однажды возился с платой сбора данных, там по 4000 точек сразу посылалось.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.