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

a-styuf

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о a-styuf

  • Звание
    Частый гость
    Частый гость

Посетители профиля

1 845 просмотров профиля
  1. Хм, даже в голову, если честно, не пришло. Сейчас попробую.
  2. Добрый день. Подскажите, пожалуйста, может кто сталкивался. Реализую обработчик прерываний от GPIO (PORTD-16). Микроконтроллер работает на частот 40 МГц (HSE0 - 10 МГц, PLL2 генерирует 40 МГц). Прерывания работают в целом корректно, но им для запуска нужен импульс длительностью не менее 50 мкс, а мне по ТЗ надо 2 мкс. Если посмотреть на схему тактирования от аналога 1986ВЕ8 получаем, что порты тактируются той же частотой, что и ЦПУ (путь clk - желтый): Казалось бы тактирование входного сигнала на GPIO имеет дискрету по времени 25 нс, что с большим запасом должно зарегистрировать 2 мкс импульс, но вижу срабатывание только при ширине импульса >53 мкс. Посмотрев схему прерывания от GPIO также не обнаружил никаких проблем: все либо на комбинаторное логике, либо на частоте процессора (40 МГц). Код настройки портов следующий: /* PD[31,30,24,23,21:19,14:0] - D1,D0,~WE,~OE,(*CS2:*CS0),A16:A2 */ //тут пока ошибка по назначению CS[] /* к PD[19] соединили с PA[10] (~CS0), PD16 - прерывание 02, PD18 - прерывание 03 */ PORTD->KEY = _KEY_; PORTD->SANALOG = 0xFFFFFFFF; PORTD->CFUNC[1] = 0xF0000000; PORTD->CFUNC[2] = 0x0F000FFF; PORTD->CFUNC[3] = 0x00FFFFF0; PORTD->CPULLUP = PORTD->CPULLDOWN = 0xFFFFFFFF; PORTD->SPULLUP = 0x01B00000; PORTD->SPULLDOWN= 0x3E478000; PORTD->SRXTX = (1<<21)|(1<<20); PORTD->SPWR[1] = (3<<(21-16)*2) | (3<<(20-16)*2); PORTD->SOE = (1<<21)|(1<<20); Может кто-то встречался с подобной проблемой, либо знает что-то, что заставляет работать прерывание так медленно?
  3. Спасибо. Попробую реализовать и отпишусь, как получу или не получу результат.
  4. PLL тактирует от внешнего источника (на это указывает данный параметр - RCC_PLLSource_PREDIV1). Схема тактирования проинициализирована согласна reference manual: внешний источник подается через предделитель с коэффициентом 1 на PLL (в котором умножается на 6), затем выбирается как источник для системного клока. В то-то и проблема. Я сначала написал код. потом те же коэффициенты и клоки использовал в сube. В первом случае нет результата, во втором присутствует.
  5. Добрый день! Разобравшись с правильным тактирование USB в мк данного типа, обнаружил, что не могу через функции стандартной библиотеки переферии rcc сконфигурировать частоты шин, и, соответственно, таймера. Что хочу: хочу, имея внешинй кварц на 8 МГц, получить 48 МГц на шине USB, 48 - Мгц SYSCLK, 24 МГц - APB1, 48 МГц - TIM2. Пишу код вот такой: /* rcc init start */ RCC_DeInit(); //reset all rcc settings RCC_HSICmd(DISABLE); //hsi off RCC_HSEConfig(RCC_HSE_ON); //hse on RCC_PREDIV1Config(RCC_PREDIV1_Div1); //div1-hse pll_in RCC_PLLConfig(RCC_PLLSource_PREDIV1 ,RCC_PLLMul_6); // pll_clock=(8MHz/1)*6=48MHz RCC_PLLCmd(ENABLE); // pll enable RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //pll_clk is system clk source RCC_HCLKConfig(RCC_SYSCLK_Div2); //ahb_clk_devider RCC_PCLK1Config(RCC_HCLK_Div2); //apb1_clk_devider /* rcc init end */ Далее настраиваю таймер, на мегание в 1-у секунду. И он мигает с частотой около одной секунды. Экспериментально установлено, что он мигает с частотой, соответствующей частоте таймера в 72МГц, а не 48, как планировалось. 72 - это цифра для настроек по умолчанию, но ведь я их заменяю на новые! Попробовал все тоже самое проделать через CubeMX - и получилось с первого раза. Есть какой-то нюанс, видимо в ручной настройки тактирования. Если кто-то понимает в чем дело - помогите, пожалуйста.
  6. Спасибо всем за поддрежку моей решительности разобраться с usb! ) В итоге я все-таки решил проблему. Оказалось, что МК не дает подключить внутренний источник к шине USB, что соответствует написаному в даташите. Перепаяв внешний источник с 4,194304 Мгц на 8 МГц и проблема решилась. Параллельно я разобрался с устройством тактирования данного МК, так что если у кого-то возникнут вопросы - обращайтесь, я постараюсь помочь.
  7. Обновил информацию по мере осознания матчасти.
  8. STM32F373 - проблемы с USB

    Доброе время суток, форумчане! Разобравшись с прошлой проблемой, связанной с прошивкой МК (https://electronix.ru/forum/index.php?showtopic=139692), решил освоить ввод и вывод информации стандартным USB. Воспользовался стандартными библиотеками от STM. Поправил их под свой камень. Но вот беда - при подключении usb-устройство опредеяется с ошибкой (Device Descriptor Request Failed). Использую внешний источник тактового сигнала с частотой 4194398 Гц. Возможно проблема тут. Есть подозрения на тактирование USB-шины, но я нигде не могу найти, как правильно её настроить и откуда она берет клок. Разобрался я со схемой тактирования для данного МК. В итоге переписал инициализирование тактового сигнала: /* rcc init start */ RCC_DeInit(); //reset all rcc settings RCC_HSEConfig(RCC_HSE_ON); //hse on RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //HSE like system clk source RCC_HSICmd(ENABLE); //HSI 8 MHz on RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12); //pll work with (hsi/2)*12=48MHz RCC_PLLCmd(ENABLE); // pll enable /* rcc init end */ /* usb init start*/ Set_System(); Set_USBClock(); USB_Interrupts_Config(); USB_Init(); /* usb init end */ Так выглядит Set_USBClock(): void Set_USBClock(void) { /* Select USBCLK source */ RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); /* Enable the USB clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); } Насоклько я понял, необходимо, что бы USB тактировалась частотой 48 МГц. Её я беру от внутренних 8 МГц, путем деления и умножения. В итоге на выходе PLL у меня стоит 48 МГц (теоритически). Их на прямую я пуская на USB модуль. Но по прежнему не работает. Если кто-то реализовывал USB на этом камне, поделитесь,пожалуста проектом на попробовать для keil. Удивительно, что в интернетах у людей получается это с наскока. Видимо я что-то не учел, раз отхватил пролем и тут. Если меня направите на нужную информацию или подскажите что сделать - огромное человеческое спасибо! Понимаю, что информация не полная, так что буду пополнять необходимую информацию по мере поступления вопросов.
  9. Проблема вот в чем: плата уже используется по целевому назначению, никто переразводить её не будет ради добавления шины ресет от МК до порта SWD. А с напаянным к ножке МК проводком плату ни заказчику не покажешь, не на испытания не поставишь. Во и приходится изгаляться(
  10. Проблема решилась добавкой ресета к SWD шине. Как правильно говорил amiller, если перезагрузить МК, то порт А не успеет проинициализироваться и прошиться удастся. Думаю добавить теперь в код задержку перед инициализацией ног в несколько секунд, на всякий пожарный, что бы успевать прошиться, если что-то пойдет не так.
  11. Попробовал сейчас снизить частоту для ST-LINK до 100 кГц. Не подключился. Перепробовал все комбинации режимов и ресетов - тоже самое. Не пробовал еще подключить кроме ног SWDIO и SWCLK еще ногу ресета. Завтра попробую, но очень сложно - она никак не разведена на плате(
  12. Код действительно не имеет смысла, о чем я и говорил в топике. Он был создан с единственной целью - прошить что-то в МК. опять же с другой стороны данный код не должен мешать последующей прошивке. Но проблема на лицо: первый раз проект залился в МК, после чего МК перестал определяться средствами прошивки и отладки. И понимаю ваш скепсис по поводу проблемы. Проблема не с кодом, который не претендует на что-то правильное и работающее. Проблема вот с чем: мог ли я програмно обрезать себе функцию отладки и прошивки через порт SW, и если да, то как это исправить.
  13. Поправил! Спасибо, что указали на ошибку. Как я уже сказал, код я старый затер, но точно помню, что все порты были в соответствии.
  14. Добрый день, товарищи! Возникла у меня такая проблема: появилась необходимость запрограммировать STM32F373 в наборе с разной периферией. В качестве программатара использую stm32l-discovery. В качестве среды - keil 5. Проект собрал, в качестве тестовой програмки решил помигать светодиодом на плате (PA1). Получился вот такой код: #include "stm32f37x.h" int i=0; int main(void) { GPIO_InitTypeDef GPIO_IS; /* GPIOD Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_IS.GPIO_Pin = GPIO_Pin_All; GPIO_IS.GPIO_Mode = GPIO_Mode_OUT; GPIO_IS.GPIO_Speed = GPIO_Speed_2MHz; GPIO_IS.GPIO_OType = GPIO_OType_PP; GPIO_IS.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_IS); while(1) { GPIO_Write(GPIOA, 0xFF); while(i<100000) i++; i=0; GPIO_Write(GPIOA, 0xFF); while(i<100000) i++; i=0; } } #include "stm32f37x.h" Сразу оговорюсь, не осознал прблему и затер старый код, так что возможно использовался порт B. Сам код эффекта не имеет (ибо при переходе по внутренним while-ам состояние не меняется). Далее, я попытался прошиться из под keil через SW. Плата увиделась, прошивка прошла. А тут и началась беда. больше плата не распознавалась, понять почему, а тем более исправить, я не смог. Попробовал стандартуную утилиту к ST-LINK - эффект тот-же: скорее всего исключил проблему с keil. Попробовал вернуть программатар на МК discovery - работает: вроде как исключил проблемы с программатором. Не пробовал: подключить кроме ног SWDIO и SWCLK еще ногу ресета. Завтра попробую, но очент=ь сложно - она никак не разведена на плате( В голове созрел такой вариант: раз ноги SWDIO и SWCLK сопряжены с шиной порта A, я снял с них функцию отладочных входов/выходов. Больше вариантов я не придумал, разве что МК погорел (чур меня). Надеюсь на вашу мудрость и понимание вороса .
  15. Есть, думаю, что к следующей итерации я постараюсь её и использовать. А кто-то знает - они уже продаются или нет в России?
×
×
  • Создать...