Jump to content
    

Search the Community

Showing results for tags 'новичок'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Сайт и форум
    • Новости и обсуждения сайта и форума
    • Другие известные форумы и сайты по электронике
    • В помощь начинающему
    • International Forum
    • Образование в области электроники
    • Обучающие видео-материалы и обмен опытом
  • Cистемный уровень проектирования
    • Вопросы системного уровня проектирования
    • Математика и Физика
    • Операционные системы
    • Документация
    • Системы CAD/CAM/CAE/PLM
    • Разработка цифровых, аналоговых, аналого-цифровых ИС
    • Электробезопасность и ЭМС
    • Управление проектами
    • Neural networks and machine learning (NN/ML)
  • Программируемая логика ПЛИС (FPGA,CPLD, PLD)
    • Среды разработки - обсуждаем САПРы
    • Работаем с ПЛИС, области применения, выбор
    • Языки проектирования на ПЛИС (FPGA)
    • Системы на ПЛИС - System on a Programmable Chip (SoPC)
    • Methods and tools for FPGA/ASIC verification
  • Цифровая обработка сигналов - ЦОС (DSP)
    • Сигнальные процессоры и их программирование - DSP
    • Алгоритмы ЦОС (DSP)
  • Микроконтроллеры (MCU)
    • Cредства разработки для МК
    • ARM
    • RISC-V
    • AVR
    • MSP430
    • Все остальные микроконтроллеры
    • Отладочные платы
  • Печатные платы (PCB)
    • Разрабатываем ПП в САПР - PCB development
    • Работаем с трассировкой
    • Изготовление ПП - PCB manufacturing
  • Сборка РЭУ
    • Пайка и монтаж
    • Корпуса
    • Вопросы надежности и испытаний
  • Аналоговая и цифровая техника, прикладная электроника
    • Вопросы аналоговой техники
    • Цифровые схемы, высокоскоростные ЦС
    • RF & Microwave Design
    • Метрология, датчики, измерительная техника
    • АВТО электроника
    • Умный дом
    • 3D печать
    • Робототехника
    • Repair and debug
  • Силовая электроника - Power Electronics
    • Силовая Преобразовательная Техника
    • Обратная Связь, Стабилизация, Регулирование, Компенсация
    • Первичные и Вторичные Химические Источники Питания
    • Высоковольтные Устройства - High-Voltage
    • Электрические машины, Электропривод и Управление
    • Индукционный Нагрев - Induction Heating
    • Системы Охлаждения, Тепловой Расчет – Cooling Systems
    • Моделирование и Анализ Силовых Устройств – Power Supply Simulation
    • Компоненты Силовой Электроники - Parts for Power Supply Design
  • Интерфейсы
    • Форумы по интерфейсам
  • Поставщики компонентов для электроники
    • Поставщики всего остального
    • Компоненты
  • Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
    • Обсуждение Майнеров, их поставки и производства
  • Дополнительные разделы - Additional sections
    • Встречи и поздравления
    • Ищу работу
    • Предлагаю работу
    • Куплю
    • Продам
    • Объявления пользователей
    • Общение заказчиков и потребителей электронных разработок

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Город


Код проверки


skype


Facebook


Vkontakte


LinkedIn


Twitter


G+


Одноклассники

Found 0 results

  1. В GD32F103RBT6 имеется Timer1. В Timer1 имеется 4 канала. Каждый канал можно настроить в режим захвата по фронту/срезу на пине контроллера и настроить соответствующие прерывания. Собственно я так и настроил. Функция обработки прерывания от Timer1 выглядит так: void TIMER1_IRQHandler (void) { uint32_t temp = 0; uint8_t ch = 0; // Переменная определяет номер канала. static uint16_t prev_tim_capture_reg_val [NUMBER_OF_DALI_CHANNELS] = {0}; // Предыдущее значение регистра захвата для каждого канала. //---If channel 0 capture/compare interrupt flag is set---// if (TIMER_INTF(TIMER1) & TIMER_INTF_CH0IF) // If channel 0 capture/compare interrupt flag is set. { //---Input capture event--------------------------------------------------------------// //-Clear capture/compare interrupt flag-// TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF); // NVIC_ClearPendingIRQ(TIMER1_IRQn); //--------------------------------------// ch = 0; // Выбор номера канала. temp = TIMER_CH0CV(TIMER1) & 0xFFFF; if (wait_start_bit_flag[ch] == RESET) { if (temp > prev_tim_capture_reg_val[ch]) PulseDuration[ch] = temp - prev_tim_capture_reg_val[ch]; else PulseDuration[ch] = 0xFFFF - prev_tim_capture_reg_val[ch] + temp; } else PulseDuration[ch] = 0; // Сброс счётчика длительности импульса. prev_tim_capture_reg_val[ch] = temp; if (TIMER_CHCTL2(TIMER1) & TIMER_CHCTL2_CH0P) // Если было настроено прерывание на срез... { CallbackInputPulse_ch0(DALI_BUS_LOG0, PulseDuration[ch]); // Раз словили срез, то надо начинать отслеживать stop, отслеживаем его после каждого среза. StopDuration[ch] = 0; // Для старта отслеживания stop-а, сбрасываем длительность стоп-интервала. Другой счётчик воспримет этот сброс как старт к подсчёту длительности. } else // Если было настроено прерывание на фронт... Для микроконтроллера посылка начинается с фронта на его пине, поэтому при приёме посылки, сначала придём сюда!!! { if (wait_start_bit_flag[ch]) // Если словили стартовый фронт... wait_start_bit_flag[ch] = RESET; else CallbackInputPulse_ch0(DALI_BUS_LOG1, PulseDuration[ch]); } TIMER_CHCTL2(TIMER1) ^= TIMER_CHCTL2_CH0P; // Change channel x capture/compare function polarity. DaliStates[ch] = (!DaliStates[ch]); // Присваиваем новое лог. значение установившееся на шине DALI. //------------------------------------------------------------------------------------// } //--------------------------------------------------------// //---If channel 1 capture/compare interrupt flag is set---// if (TIMER_INTF(TIMER1) & TIMER_INTF_CH1IF) // If channel 1 capture/compare interrupt flag is set. { //---Input capture event--------------------------------------------------------------// TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH1IF); // Clear capture/compare interrupt flag. ch = 1; // Выбор номера канала. temp = TIMER_CH1CV(TIMER1) & 0xFFFF; if (wait_start_bit_flag[ch] == RESET) { if (temp > prev_tim_capture_reg_val[ch]) PulseDuration[ch] = temp - prev_tim_capture_reg_val[ch]; else PulseDuration[ch] = 0xFFFF - prev_tim_capture_reg_val[ch] + temp; } else PulseDuration[ch] = 0; // Сброс счётчика длительности импульса. prev_tim_capture_reg_val[ch] = temp; // i_ch1++; if (TIMER_CHCTL2(TIMER1) & TIMER_CHCTL2_CH1P) // Если было настроено прерывание на срез... { CallbackInputPulse_ch1(DALI_BUS_LOG0, PulseDuration[ch]); StopDuration[ch] = 0; // Для старта отслеживания stop-а, сбрасываем длительность стоп-интервала. Другой счётчик воспримет этот сброс как старт к подсчёту длительности. } else // Если было настроено прерывание на фронт... { if (wait_start_bit_flag[ch]) wait_start_bit_flag[ch] = RESET; else CallbackInputPulse_ch1(DALI_BUS_LOG1, PulseDuration[ch]); } TIMER_CHCTL2(TIMER1) ^= TIMER_CHCTL2_CH1P; // Change channel x capture/compare function polarity. DaliStates[ch] = (!DaliStates[ch]); // Присваиваем новое лог. значение установившееся на шине DALI. //------------------------------------------------------------------------------------// } //--------------------------------------------------------// //---If channel 2 capture/compare interrupt flag is set---// if (TIMER_INTF(TIMER1) & TIMER_INTF_CH2IF) // If channel 2 capture/compare interrupt flag is set. { //---Input capture event--------------------------------------------------------------// TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH2IF); // Clear update interrupt flag. ch = 2; // Выбор номера канала. temp = TIMER_CH2CV(TIMER1) & 0xFFFF; if (wait_start_bit_flag[ch] == RESET) { if (temp > prev_tim_capture_reg_val[ch]) PulseDuration[ch] = temp - prev_tim_capture_reg_val[ch]; else PulseDuration[ch] = 0xFFFF - prev_tim_capture_reg_val[ch] + temp; } else PulseDuration[ch] = 0; // Сброс счётчика длительности импульса. prev_tim_capture_reg_val[ch] = temp; if (TIMER_CHCTL2(TIMER1) & TIMER_CHCTL2_CH2P) // Если было настроено прерывание на срез... { CallbackInputPulse_ch2(DALI_BUS_LOG0, PulseDuration[ch]); StopDuration[ch] = 0; // Для старта отслеживания stop-а, сбрасываем длительность стоп-интервала. Другой счётчик воспримет этот сброс как старт к подсчёту длительности. } else // Если было настроено прерывание на фронт... { if (wait_start_bit_flag[ch]) wait_start_bit_flag[ch] = RESET; else CallbackInputPulse_ch2(DALI_BUS_LOG1, PulseDuration[ch]); } TIMER_CHCTL2(TIMER1) ^= TIMER_CHCTL2_CH2P; // Change channel x capture/compare function polarity. DaliStates[ch] = (!DaliStates[ch]); // Присваиваем новое лог. значение установившееся на шине DALI. //------------------------------------------------------------------------------------// } //--------------------------------------------------------// //---If channel 3 capture/compare interrupt flag is set---// if (TIMER_INTF(TIMER1) & TIMER_INTF_CH3IF) // If channel 3 capture/compare interrupt flag is set. { //---Input capture event--------------------------------------------------------------// TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH3IF); // Clear capture/compare interrupt flag. ch = 3; // Выбор номера канала. temp = TIMER_CH3CV(TIMER1) & 0xFFFF; if (wait_start_bit_flag[ch] == RESET) { if (temp > prev_tim_capture_reg_val[ch]) PulseDuration[ch] = temp - prev_tim_capture_reg_val[ch]; else PulseDuration[ch] = 0xFFFF - prev_tim_capture_reg_val[ch] + temp; } else PulseDuration[ch] = 0; // Сброс счётчика длительности импульса. prev_tim_capture_reg_val[ch] = temp; if (TIMER_CHCTL2(TIMER1) & TIMER_CHCTL2_CH3P) // Если было настроено прерывание на срез... { CallbackInputPulse_ch3(DALI_BUS_LOG0, PulseDuration[ch]); StopDuration[ch] = 0; // Для старта отслеживания stop-а, сбрасываем длительность стоп-интервала. Другой счётчик воспримет этот сброс как старт к подсчёту длительности. } else // Если было настроено прерывание на фронт... { if (wait_start_bit_flag[ch]) wait_start_bit_flag[ch] = RESET; else CallbackInputPulse_ch3(DALI_BUS_LOG1, PulseDuration[ch]); } TIMER_CHCTL2(TIMER1) ^= TIMER_CHCTL2_CH3P; // Change channel x capture/compare function polarity. DaliStates[ch] = (!DaliStates[ch]); // Присваиваем новое лог. значение установившееся на шине DALI. //------------------------------------------------------------------------------------// } //--------------------------------------------------------// } //------------------------------------------------------------------------------// Когда фронты/срезы поступают на один из 4 каналов, всё работает как надо и вопросов не возникает. Но если фронты/срезы будут поступать одновременно на два и более каналов, то вопросы возникают. Если слать фронты/срезы на канал 0 и канал 1, то на канале 1 будут пропуски в обработке прерываний. Выяснил это просто инкрементируя счётчики фронтов/срезов при обработке прерываний от каналов. Причём, если код как в посте, то пропуски будут на канале 1. Если в коде поменяю местами очерёдность обработки каналов (сначала канал 1, а потом канал 0), то пропуски всё равно будут на канале 1. Если уберу обработку канала 0, и буду слать фронты/срезы на каналы 1 и 2. То пропуски будут на канале 2. Вангую, что мне ответят: 1) читай Джозефа Ю.; 2) не нужно совать всю обработку события в функцию обработки прерывания. Нужно установить флаг события, а уж в основном цикле разбираться; 3) использовать другие таймеры - не могу, остальные все заняты; 4) в UserManualе ответа не нашёл, Erratы не нашёл на сайте производителя. Если есть у кого-нибудь другие комментарии, очень прошу подсказать. Как устранить или минимизировать пропуски? Сам пробовал увеличить стек - не помогло. Приоритет прерываний от Timer1 равен 7. Приоритеты остальных прерываний ниже (значение больше 7).
  2. Контроллер GigaDevice GD32F103RBT6. Вопрос в заголовке. Использую FWDGT. Запускается и ресетится как надо, а как его выключить, если он перестал быть нужным? В регистрах нужного бита не нашёл.
  3. Имеется контроллер от GigaDevice GD32F103R. В контроллере имеется аппаратный модуль CAN. Этот модуль настроил согласно UserManual и успешно использовал это ПО сначала в отладчике, а затем и в целевом устройстве. Всё было замечательно до тех пор, пока не пришлось прошить очередной образец устройства уже отлаженным ПО. В этом конкретном образце устройства обнаружился баг в работе CAN. Баг проявляется, когда устройству необходимо направить в шину помимо ID ещё и байты с данными. В моём проекте устройство отправляет в шину за раз до 8 байт данных. В случае если устройство отправляет от 0 до 6 байт включительно, багов не возникает. В случае если устройство отправляет 7 байт, то последний байт данных представляет случайное значение, хотя при формировании посылки байт имеет определённое значение. В случае если устройство отправляет 8 байт, то уже последние два байта представляют случайные значения. Что было сделано: 1) Естественно, сначала проверил, что я записываю в почтовый ящик для отправки. Оказалось что записываю я всё верно. 2) Проверил работу внешнего преобразователя TTL->CAN на плате и даже заменил его - не помогло. 3) Проверил посылку осциллографом прямо на ноге микроконтроллера: 7й и 8й байт - всегда случайные значения. 4) Проверил ещё раз ПО на отладчике и ещё раз на другом образце целевого устройства - всё работает правильно, никаких случайных значений в 7м и 8м байтах. 5) На косячном образце стёр всю FLASH и заново записал ПО - не помогло. 6) Заменил на косячном образце микроконтроллер на новый, записал ПО, и....... БАГ ПРОПАЛ! Всё стало работать правильно. Что это было? Кто сталкивался? Есть ли какие-то особенности в использовании/настройке CAN, которые могут влиять подобным образом?
  4. Привет, народ. Купил себе на пробу STM32F103C8T6 (BluePill) с программатором STLink-V2. Вот что о нем рассказывает st-info --probe: Found 1 stlink programmers serial: 132014026315303030303032 openocd: "\x13\x20\x14\x02\x63\x15\x30\x30\x30\x30\x30\x32" flash: 65536 (pagesize: 1024) sram: 20480 chipid: 0x0410 descr: F1 Medium-density device Установил среду STM32CubeIDE Version: 1.8.0 Build: 11526_20211125_0815 (UTC). И попытался собрать и запустить программку мигания светодиодом. Сделал новый проект для STM32F103C8Tx, настройки брал из вот этого видео: https://www.youtube.com/watch?v=e_NSqz5P8Qk По-сути сгенерировался дефолный проект для STM32F103C8Tx, частота настроена на 72MHz, активирован пин PC13 на режим Output. В коде в бесконечный цикл вписаны команды: while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } По ходу попыток запуска, вначале STM32CubeIDE сказал, что прошивка устарела, и надо обновить. Я согласился, но пришлось пару раз вставить-вытащиить программатор в USB, так как была ошибка: st-link is not in the DFU mode. Please restart it. Прошивка залилась, а в сети нашел инфу что если обновление прошивки предваряется такой ошибкой, то это нормально. Потом пришлось подредактировать файл stm32f1x.cfg, так как при запуске была ошибка: linux gdb ST-LINK: Could not verify ST device! Abort connection. Эту ошибку убрал по инструкции: https://stackoverflow.com/questions/58783393/atollic-couldnt-verify-st-device, заодно отладку переключил с STLink GDB Server на STLink OpenOCD (сам GDB, естественно, установлен и работает, обычный C/C++ код через него отлаживается). В результате, после устранения предыдущей ошибки, стали появляться другие ошибки: Error: STM32F103C8Tx.cpu -- clearing lockup after double fault Polling target STM32F103C8Tx.cpu failed, trying to reexamine Насколько я понял, эти ошибки возможны из-за того, что программа либо не запускается, либо крашится уже на самом микроконтроллере по причине неправильной настройки диапазонов адресного пространства или какой-то периферии. Тогда я решил снова сделать новый проект, все повторил заново, и на этот раз почти получилось. Во всяком случае, явных ошибок в логе запуска нет. Но светодиод не мигает, отладка не работает: Open On-Chip Debugger 0.11.0+dev-00438-ga75fc63 (2021-11-03-15:26) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : STLINK V2J39S7 (API v2) VID:PID 0483:3748 Info : Target voltage: 2.427853 Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : clock speed 4000 kHz Info : stlink_dap_op_connect(connect) Info : SWD DPIDR 0x2ba01477 Info : STM32F103C8Tx.cpu: Cortex-M3 r2p1 processor detected Info : STM32F103C8Tx.cpu: target has 6 breakpoints, 4 watchpoints Info : starting gdb server for STM32F103C8Tx.cpu on 3333 Info : Listening on port 3333 for gdb connections Info : accepting 'gdb' connection on tcp/3333 Info : device id = 0x20036410 Info : flash size = 64kbytes undefined debug reason 8 - target needs reset O.K. O.K.:0xE00FFFD0 undefined debug reason 8 - target needs reset shutdown command invoked Info : dropped 'gdb' connection Я пробовал собрать и запуститься в режиме релиза (переткнул и конфигурацию и билд на Release), но почему-то при запуске RUN все равно IDE пытается запустить дебаггер, ей это не удается, лог запуска все тот же. Дальше я уже не знаю что делать. Прошу посоветовать что где еще надо докрутить, чтобы помигать светодиодом. * * * UPD: Иногда запуск почему-то происходит по-другому, хотя ничего ни в коде ни в конфигурации не меняю. Запуск сопровождается появлением окна с ошибкой: Could not verify STM device! Хотя, как написано выше, такая ошибка была, и верификация устройства отключена (в начало файла stm32f1x.cfg добавлена строка set CPUTAPID 0). Выхлоп запуска при этом немного другой, строки с Info те же самые, но в конце такие ошибки: undefined debug reason 8 - target needs reset O.K. O.K.:0xE00FFFD0 Error: Failed to read memory at 0xfffffffe Error: Failed to read memory at 0xfffffffe undefined debug reason 8 - target needs reset shutdown command invoked Info : dropped 'gdb' connection Вот как выглядит скриншот: https://ibb.co/JvyD2HK
  5. В данном устройстве https://media.digikey.com/pdf/Data Sheets/Texas Instruments PDFs/GC3011A.pdf используется 15 отводный интерполирующий фильтр с 4096 коэффициентами не совсем поняла что это значит и какой алгоритм, и каким образом можно понять что это за фильтр и рассчитать его ? и где в целом можно подчерпнуть информации по данной теме?
  6. День добрый, Надеюсь не нарушаю правил, так в предмете ветки форума объявлен также и выбор. Случайно наткнулся на книгу по схемотехнике (за авторством Харрисов) и увлекло, что решил приобрести плату с FPGA для хобби вечерами. Цель - процедурный синтез звука (для начала FM ), если получится (даже со сроками не могу определится, так как все теоретически на данный момент) - подключение MIDI клавиатуры для управления. Планировал приобрести плату для экспериментов (учитывая длинные выходные) на базе Altera (4 или Макс 10) с периферией, которая бы максимально упростила сопутствующие задачи: наличие USB для заливки программ, видеовыхода, кнопок. В лоб на Ali покупать не зная темы - не лучшая идея, поэтому планирую Marsohod3bis + плата расширения с портами (аудиовыход и USB) ~6000 руб, более дорогая Marsohod3 (10500руб - но как я понимаю у нее в разы больше ячеек/памяти/умножителей) не доступна, ибо дефицит. Может кто подскажет лучшие варианты (пределах +-12000 руб, при серфинге радиотехнический онлайн магазинов натыкался на разброс цен в разы за вроде одинаковые по характеристикам платы - возможно в их комплектацию входит софт-лицензии что мне не критично, не знаю ) с необходимой периферией - если конечно это не нарушает правила форума. Заранее спасибо.
×
×
  • Create New...