Jump to content

    

LAS9891

Участник
  • Content Count

    223
  • Joined

  • Last visited

Community Reputation

0 Обычный

About LAS9891

  • Rank
    Местный

Recent Profile Visitors

2327 profile views
  1. Учтемс. Хотя эту часть кода генерит STM32CubeMX и эту область предполагается не менять.
  2. Я в курсе. Меня интересует именно работа прерываний, останавливать таймеры или нет - детали. Правильные callback функции я выбрал? Правильно разрешил прерывания? Если - да, то почему работает не как как хотелось? То о чем вы говорите устанавливается настройкой Output compare preload в значение Disable. При этом как только таймер получил новое значение для сравнения то сразу будет учитывать его. Кстати работоспособность этого можно увидеть на первой осциллограмме - переполнение ещё не наступило, новое значение для сравнение записано, и после прерывания видим импульс с измененным заполнением.
  3. CPU clock 400 MHz APB2 Timer Clocks 200 MHz Сейчас бы выяснить где косяк в прерываниях
  4. Уточнение: Первое прерывание возникает по TIM2 по совпадению регистра CNT со значением Pulse в STM32CubeMX. Pulse = 12-1 = 11. На осциллограммах видно что два первоначальных импульса формируются за 12 тактов, после чего формируется прерывание. Второе прерывание должно формироваться по переполнению TIM2. Для TIM2 Counter Period = 18-1 = 17.
  5. Пробую написать программу на STM32 используя HAL библиотеки. В программе инициализируются три таймера номер 3 (TIM3) , номер 5 (TIM5), номер 2 (TIM2). TIM3 тактируется от внутреннего источника (от шины), работает в режиме ШИМ и формирует на выходе меандр с частотой 1,2 МГц. TIM5 тактируется от TIM3, работает в режиме ШИМ. TIM2 тактируется от TIM3, работает в режиме сравнения. Как хотелось бы чтобы работало: Таймеры запускаются одновременно. Разрешается прерывание по TIM2 по значению Pulse в STM32CubeMX. TIM2 отсчитывает интервал времени в течение которого TIM5 сформирует на выходе два импульса ШИМ с заданной частотой и заполнением. Когда TIM2 досчитывает до конца временного интервала (значение Pulse в STM32CubeMX), формируется прерывание. В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5. Запрещается прерывание TIM2 по значению Pulse и разрешается прерывание TIM2 по переполнению. Далее таймеры продолжают считать. TIM5 формирует один импульс с измененным заполнением и возникает переполнение по переполнению TIM2. В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5, на изначальное значение. Запрещается прерывание TIM2 по переполнению, разрешается прерывание TIM2 по значению Pulse. И так по кругу... TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д. Написал такой код main.c: MX_GPIO_Init(); MX_TIM3_Init(); MX_TIM2_Init(); MX_TIM5_Init(); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } Обработка прерываний такая: void HAL_TIM_OC_DelayElapsedCallback (TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) // Необходимо сформировать последний в кадре импульс INT. { HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_OC_Stop_IT (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы без формированием прерывания. TIM5->CCR1 = 4; __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start (&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); } else return; } } //---Прерывание по переполнению счетчика-------------------------------------------------------------------------------------------- void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_OC_Stop (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы без формированием прерывания. __HAL_TIM_DISABLE_IT (&htim2, TIM_IT_UPDATE ); TIM5->CCR1 = 3; HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); } else return; } Начинаю отлаживать. Пробую сначала работу без второго обработчика прерывания. Вижу следующую картину Верхний сигнал это сигналы TIM3, нижний - сигналы TIM5. Видно два первых импульса, прерывание - когда все таймеры остановлены, и последующие импульсы с меньшим заполнением. Все как хотел. Дальше проверяю с двумя обработчиками прерываний. Устанавливаю точку остановки (break) во втором обработчике прерываний на строчке TIM5->CCR1 = 3. Ожидаю увидеть два первых импульса, прерывание и один импульс с меньшим заполнением. Вижу следующее: Два первых импульса есть, прерывание есть и тишина. Где один импульс с меньшим заполнением? Ниже картина от начала времен без остановки: Виден странный перепад на линии TIM3 и импульсы с изначальным заполнением. Далее картина не лучше: Предположение такое - по какой-то причине второе прерывание возникает сразу после выхода из первого, и короткий импульс не успевает сформироваться. Подскажите в чем проблема?
  6. Разрабатываю проект в STM32Cube для Keil. В проекте имеется два таймера: TIM5 и TIM3. TIM3 настраиваю как Master. TIM3 тактируется от Internal clock. В меню Trigger Event Selection TRGO выбрано формирование импульса по совпадению - значение Event. TIM2 настраиваю как Slave. TIM5 тактируется от External Clock Mode 1, в качестве Trigger Source выбран ITR2 - что соответствует TIM3. Подобнее настройки TIM5 на картинке: Таким образом TIM3 работает на частоте шины, а TIM5 работает на частоте TIM3. На осциллографе наблюдаю следующие сигналы: На осциллограмме верхний сигнал - выход TIM3 сразу после сброса контроллера; нижний сигнал - выход TIM5 сразу после сброса контроллера. На второй осциллограмме те же сигналы позднее - второй и последующие периоды TIM5. Видно, что при старте длительность лог. 0 на выходе TIM5 больше чем в последующих периодах. Кроме того, первый срез на выходах происходит неодновременно. Хотелось бы чтобы первый импульс на выходе TIM5 был аналогичен последующим. Пробовал различные настройки в Cube - не помогло. Как сделать первоначальные срезы синхронными и выровнять длительность первого импульса на TIM2 с остальными?
  7. Вот человек столкнулся с аналогичной проблемой в 18 версии: https://forum.live.altium-ru.com/#posts/231484/719166
  8. После установки Altium Designer 19.1.8 (Build 144) пробую создать новый файл схемы Sheet1.SchDoc. Окно программы выглядит так: Все устраивает, все на месте. Затем пробую создать новый файл платы PCB1.PcbDoc. Окно программы выглядит так: Явное отличие - в редакторе плат отсутствует панель главного меню (File Edit View и т.д.). Кроме того не работают все hotkeys.Как вернуть панель на место и включить hotkeys?
  9. Поподробнее пожалуйста.
  10. У меня нет этой области, поэтому не могу сделать я этот клик. Как включить эту область?
  11. После установки Altium Designer 19.1.8 (Build 144) пробую создать новый файл схемы Sheet1.SchDoc. Окно программы выглядит так: Все устраивает, все на месте. Затем пробую создать новый файл платы PCB1.PcbDoc. Окно программы выглядит так: Явное отличие - в редакторе плат отсутствует панель главного меню (File Edit View и т.д.). Кроме того не работают все hotkeys. Как вернуть панель на место и включить hotkeys?
  12. Имеется плата, которая подключается к компьютере посредством интерфейса RS-485 с использованием MOXA UPort 1130. При подключении всего перечисленного ничего не работает. На MOXA горит постоянно светодиод "Active" и в момент передачи светится "TxD". На осциллографе видны импульсы на выводе 3 Data+(B). Как проверить работоспособность MOXA без подключения платы, чтобы убедиться в её невиновности?
  13. Неважно. Мне лень убеждать и расписывать зачем мне это. Вопрос стоит так: "Как сформировать проекцию по step-модели в Altium? Возможно ли это?"
  14. Мне нужно. Необходимо установить на плату здоровенную железяку, а вокруг нее ещё нужно расположить кучу элементов электрической схемы. Так вот я вставляю STEP-модель, и на виде 2-D железяка отображается в виде заштрихованного прямоугольника сформированного по крайним точкам модели, хотя реальный контур железки занимает меньшую площадь и на свободное место я могу разместить схему. Поэтому чтобы видеть реальный контур железки мне приходится делать проекцию железки в AutoCAD а потом экспортировать её в Altium. И каждый раз нужно повторять эту процедуру если железка чуть изменилась.
  15. Предлагаемый способ не отличается простотой от моего способа.