Перейти к содержанию
    

Сергей Борщ

Модератор
  • Постов

    10 894
  • Зарегистрирован

  • Посещение

  • Победитель дней

    30

Весь контент Сергей Борщ


  1. Модератор: прошу всех желающих отметиться в этой теме еще раз перечитать правила раздела "Предлагаю работу" и потом не обижаться.
  2. Замените R1 на 470 Ом и выносите кнопку хоть на два метра.
  3. Так проблема в этом? OpenOCD такое умеет, но время подключения может быть до 6.5 сек. Я-то думал надо подключиться и перехватить управление буквально с первых команд - такого, наверное, не умеет никто.
  4. Остановите отладчиком, прочитайте и сохраните на бумажку или в блокнот на компе значение регистров RCC, TMR, PWR. Запустите, дождитесь сбоя, остановите, сравните. Несущая частота ШИМа тоже пропорционально меняется? У F103 не особо много возможностей менять тактирование таймеров - в отличие от более новых тут оно прибито гвоздями к APB. То есть причина либо в измененном делителе APB (если UART, который продолжает работать висит на другой APB), либо в предделителе самого таймера (в обоих этих случаях должна меняться несущая частота ШИМ), либо в программной ошибке, из-за которой значения в CCR таймера грузятся в N раз реже (это если несущая частота не меняется). Я делаю ставку на последний вариант. Ой, да хватит пугать. Китаиса их делают так долго и в таких количествах, что все ошибки кристалла давно вылизали.
  5. Запускать без отладчика. В интересующих местах программы дергать ногами, писать их состояние логическим анализатором. Выводить диагностику в USART, смотреть ее в терминалке на компе.
  6. Да, вы правы - в первом случае DIEROK не выставляется.
  7. Следите за руками. Вот так не работает: LPTIM1->DIER = 0 | 0 * LPTIM_DIER_UEIE // Update event DMA request enable | 0 * LPTIM_DIER_CMP2OKIE // CCR2 update complete interrupt enable | 1 * LPTIM_DIER_CC2IE // Capture/Compare 2 interrupt enable | 0 * LPTIM_DIER_REPOKIE // RCR update interrupt enable | 0 * LPTIM_DIER_UEIE // Update event interrupt enable | 0 * LPTIM_DIER_DOWNIE // Direction change to down interrupt enable | 0 * LPTIM_DIER_UPIE // Direction change to up interrupt enable | 0 * LPTIM_DIER_ARROKIE // ARR update complete interrupt enable | 0 * LPTIM_DIER_CMP1OKIE // CCR1 update complete interrupt enable | 0 * LPTIM_DIER_EXTTRIGIE // External trigger valid edge interrupt enable | 0 * LPTIM_DIER_ARRMIE // Autoreload match interrupt enable | 0 * LPTIM_DIER_CC1IE // Capture/Compare 1 interrupt enable ; // enable timer LPTIM1->CR = 0 | 0 * LPTIM_CR_RSTARE // Reset after read enable, can be set when LPTIM is enabled | 0 * LPTIM_CR_COUNTRST // Reset counter, can be set when LPTIM is enabled | 0 * LPTIM_CR_CNTSTRT // Start in continuous mode, can be set when LPTIM is enabled | 0 * LPTIM_CR_SNGSTRT // Start in single pulse mode, can be set when LPTIM is enabled | 1 * LPTIM_CR_ENABLE // Enable ; А вот так работает: // enable timer LPTIM1->CR = 0 | 0 * LPTIM_CR_RSTARE // Reset after read enable, can be set when LPTIM is enabled | 0 * LPTIM_CR_COUNTRST // Reset counter, can be set when LPTIM is enabled | 0 * LPTIM_CR_CNTSTRT // Start in continuous mode, can be set when LPTIM is enabled | 0 * LPTIM_CR_SNGSTRT // Start in single pulse mode, can be set when LPTIM is enabled | 1 * LPTIM_CR_ENABLE // Enable ; LPTIM1->DIER = 0 | 0 * LPTIM_DIER_UEIE // Update event DMA request enable | 0 * LPTIM_DIER_CMP2OKIE // CCR2 update complete interrupt enable | 1 * LPTIM_DIER_CC2IE // Capture/Compare 2 interrupt enable | 0 * LPTIM_DIER_REPOKIE // RCR update interrupt enable | 0 * LPTIM_DIER_UEIE // Update event interrupt enable | 0 * LPTIM_DIER_DOWNIE // Direction change to down interrupt enable | 0 * LPTIM_DIER_UPIE // Direction change to up interrupt enable | 0 * LPTIM_DIER_ARROKIE // ARR update complete interrupt enable | 0 * LPTIM_DIER_CMP1OKIE // CCR1 update complete interrupt enable | 0 * LPTIM_DIER_EXTTRIGIE // External trigger valid edge interrupt enable | 0 * LPTIM_DIER_ARRMIE // Autoreload match interrupt enable | 0 * LPTIM_DIER_CC1IE // Capture/Compare 1 interrupt enable ; Хотя в в обоих случаях отладчик показывает, что нужные биты в DIER устанавливаются. Для регистров CCRx, ARR, RCR в документации явно указано, что писать их можно только при активированном (enabled) таймере, для CFGR - наоборот, при неактивном. На запись в DIER никаких ограничений в документации нет. Куб оказался ни при чем, но помог. В его проекте DIER вообще не трогался и влияющих на него галочек я не обнаружил. Куб просто запускал таймер и когда я, остановив программу, отладчиком включал нужные биты в DIER на уже включенном активированном и запущенном таймере - прерывания запускались. Вычитывать DIER после записи пробовал - не помогало.
  8. В кубовом проекте прерывание происходит. "Будем искать".
  9. Это учтено. Флаги в ISR у меня выставляются. Если их сбросить - выставляются снова. Тут все хорошо. Ставлю куб от безысходности...
  10. Ой. 13 таблиц. Но да, тут два канала и соответствующий флаг в ISR выставляется. А проблема с любым флагом. Ни одно событие, взводящее флаг в ISR, не вызывает прерывание. На APB включен делитель 2. Попробовал 16 - не помогает.
  11. В руководстве пользователя 12 таблиц в разделе, посвященном LPTIM. Ни под одной из них я упоминания CC2IE не нашел. Какую именно таблицу вы имеете ввиду?
  12. Это условие выполняется. Код в исходном сообщении исправил. А смысл делать это вручную? Таймер должен сам взвести именно этот бит, но не взводит.
  13. Не взлетело - ни в одном ISPR ни один бит не взводится. В другие прерывания заходит...
  14. Да, как обычный таймер. Спячки тоже пока нет.
  15. Тоже пробовал - то же яйцо, только в профиль.
  16. Забыл упомянуть, что остальные задействованные прерывания (USB, USART, GPDMA, TIM1, TIM3, COMP, EXTI_10) в это время работают. А с LPTIM не доходит до выставления флагов в NVIC. Причем и с LPTIM1 и с LPTIM2. Интересная мысль. Маловероятно, но сейчас проверю.
  17. Инициализация: Таймер стартует, импульсы на выходе вижу, в регистре LPTIMx->ISR нужные флаги появляются, а в NVIC->ISPR2 соответствующий бит не взводится и обработчик прерывания, соответственно, не вызывается. Что я делаю не так???
  18. Предположу, что высох C1, после чего пробило микросхему и уже это явилось причиной перегорания L1. Проверьте на замыкание выходной ключ в микросхеме. Мы не знаем, какими знаниями, умениями и навыками вы обладаете. В зависимости от них, возможно, имеет смысл сразу отдать эту плату на ремонт специалисту, чтобы потом не пришлось после вашего "ремонта" платить за ее восстановление гораздо дороже.
  19. Так и для дисплея же любая команда - поток байтов. Наша задача - объяснить компилятору, что любую команду надо трактовать как набор N байтов с некоего начального адреса. Увы, это два int. Старшие байты будут нулями. Придумал их только как массив шестнадцатиричных кодов символов (вроде исправил в сообщении, но почему-то не сохранилось): send_command({'\x01', '\x02'}); А я все команды описываю в виде осмысленных структур и уже структуры отсылаю через template<typename T> void send_command(T const & what) { send_command(&what, sizeof(T)); } примерно так:
  20. Так? void send(uint8_t id, void const * from, size_t size); void send_command(void const * from, size_t size) { send(0, from, size); } template <typename T> void send_command(T const & what) { send_command(&what, sizeof(T)); } template <typename T, size_t items> void send_command(T const (&what)[items]) { send_command(&what, sizeof(T) * items); } template<size_t length> void send_command(char (&string)[length]) { send_command(&what, size - 1); } void test() { send_command(0x12); send_command({0x12, 0x34, 0x56}); send_command("Hello"); }
  21. Понятия не имею - давно пересел на линух.
  22. На прошлой неделе делал очередной подход в борьбе с этой же фигней. На этот раз победил. Вкратце: этом gdb гвоздями прибито использование питона 3.8. В вашей системе стоит более свежий. Надо доставить 3.8. Инструкция, например, здесь.
  23. Если считаете, что пользователь неправ - жмите кнопку "жалоба" на его сообщении. За всеми не уследить.
  24. В пульте нет PD. И раньше от этой же зарядки этот пульт прекрасно заряжался. Просто не повезло.
  25. Понятно. Это, наверное, ключевой момент. Это вряд ли. До этого же все нормально заряжалось. Уточнил - зарядка была воткнута в роземку, кабель валялся, то есть ее не перетыкали из одного устройства в другое. Значит, просто такт совпало. Может статикой выбили. Спасибо.
×
×
  • Создать...