Jump to content

    

zorromen

Свой
  • Content Count

    322
  • Joined

  • Last visited

Community Reputation

0 Обычный

About zorromen

  • Rank
    Местный
  • Birthday 07/26/1984

Контакты

  • Сайт
    Array

Recent Profile Visitors

3097 profile views
  1. Разобрался, все не так, куб кидает при генерации port.c и portmacro.h из папки \RVDS\ARM_CM4F которая для 5 компилятора, 6 не принимает такого, и ему нужны файлы с \GCC\ARM_CM4F. Когда их скормил, тогда и пошла компиляция.
  2. Здравствуйте, все мои попытки скомпилировать пустой проект от куба, с FreeRTOS и компилятором 6, не имели успеха, только на версии 5 все компилируется, вы скажите, ну таки и пользуйся 5 версией компилятора, а я скажу что она вешает мой компьютер и скорость компиляции очень маленькая, на 6 все быстро происходит. ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c(439): error: expected '(' after 'asm' ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c(283): error: use of undeclared identifier 'PRESERVE8' ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F\portmacro.h(167): error: unknown type name '__forceinline' Ругается на port.c и portmacro.h 115 ошибок У кого получалось запустить это дело?
  3. Патч для FREERTOS я сделал, все как указано в официальном патче только с поправкой на ветер. И работает он только для него. Для вас можно посмотреть в сторону NoOS, и там можно сделать тоже самое, читаем документацию от SysnemView, там что-то с создать таск и все такое, сам когда-то такое писал чтобы видеть как работают свои функции, ну и самое мое любимое это смотреть за работой прерываний. Особенно находил визуально косяки, что требовали изменения приоритетов. Например, для прерываний конструкция void DMA1_Channel5_IRQHandler(void) { SEGGER_SYSVIEW_RecordEnterISR(); SEGGER_SYSVIEW_RecordExitISR(); } Ищем в исходниках _cbSendSystemDesc в конфигах segger, добавляем I#31=DMA1_5 UART RX И теперь в SystemView при прерывании 31 дается имя DMA1_5 UART RX static void _cbSendSystemDesc(void) { SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",D="SYSVIEW_DEVICE_NAME",O=FreeRTOS"); SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick,I#31=DMA1_5 UART RX"); }
  4. Здравствуйте, кто еще не пользовался данной программой от SEGGER тот много потерял. Все хорошо, удобно, но если использовать как для NO_OS, но если нужно использовать с STM32 FREERTOS10 от CubeMX, тот патч рельно отличается от того что идет от ST, только 2 файла из 5 подходят. Кто как патчит, как народ выкручивается? Я написал для себя патчер на лазарусе. Для M3 и M4F ядер, все прикручивал чисто к CubeMX. Инструкция 1. Кидаем в \Middlewares\Third_Party проекта Там кучка батников и мелких консольных прог, каждая патчит свой файл, поэтому не пугаемся. 2. Т.к. я такой еще программер, поэтому делаем по индуски, следующее, FREERTOS_Config.exe копируем в корень проекта И делаем на него ярлык и его копируем в папку SEGGER_FREERTOS_Patcher, это для батника чтобы легче запускать. 3. Запускаем Пропачтить M3.bat или Пропачтить M4.bat, готово, но учтите запускать один раз после генерации проекта, иначе если 10 раз нажать, то 10 раз пропатчит, это ерунда будет. Добавил батники Backup_In.bat и Backup_Out.bat это для бекапа 5 файлов в папку, и обратно в FREERTOS, ну это если кому нужно. Прога патчит абсолютно все что меняет CubeMX. Настройка муторная, но потом запускаете батник и готово. Думаю тем кто занимается FREERTOS будет интересно. SEGGER_FREERTOS_Patcher.rar
  5. Какие мануалы, как отец говорит, все должно работать само, ведь пишем на языке высокого уровня.
  6. Посмотрите мою тему, там может что и увидите подходящее. http://electronix.ru/forum/index.php?showtopic=129361
  7. STM32f4 + emWin

    Есть stm32F429, вроде все из примера запустилось само и работает, скажите, а emWin использует ускоритель DMA2D по умолчанию? И какие накладываются ограничения, на работу, ну типа многослойность или еще что.
  8. То будет не критично, вообще еще дурной вопрос. Нужно будет ловить импульс ответа, и измерить его длину, тут особых проблем не обнаружил, но реализация несколько смущает. Настройка порта на внешнее прерывание, тут настроил на передний фронт, но в самом прерывании после получения переднего фронта перенастраиваю на задний фронт. Сперва делал чтобы прерывание было от обоих фронтов сразу, но зайдя в прерывание тогда не получалось понять какой именно фронт его вызвал, почему-то чтение пина всегда возвращало 0. Сам импульс около 10 mS. Поэтому решил делать с переключением в прерывании. /*Configure GPIO pin : PE2 */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI2_IRQn); void EXTI2_IRQHandler(void) { if ((EXTI->RTSR >> 2) & 1) { ........... EXTI->RTSR = 0; //Otkl rising EXTI->FTSR = 0x4; //Vkl Filling } else { ........... EXTI->RTSR = 4; //Vkl rising EXTI->FTSR = 0; //Otkl Filling } EXTI->PR |=0x04; }
  9. Ну принудительное обновления, я как раз и реализовал, а что такое штатная работа, это когда все на оборот, странно такой фигни например не помню когда програмил AVR и lpc2148.
  10. Упорство победило, если хотят играть по своим правилам, то по ним и с играем. После настройки в прерывании регистров, создаю новое прерывание и ref_register=1, в него заходим сразу после данного прерывания и тем самым обновляем теневые регистры PSC и ARR, и все заработало как нужно. Очень странно видеть, что сколько читал русскую документацию, не все объясняется, только в даташите нашел, что PSC тоже имеет теневой регистр. Настройка TIM6->PSC = 143; TIM6->ARR = 62499; //100 mS TIM6->DIER = TIM_DIER_UIE; TIM6->CR1 |= TIM_CR1_CEN | TIM_CR1_OPM | TIM_CR1_ARPE; void TIM6_DAC_IRQHandler(void) { if (ref_register == 0) { switch (UV_state) { case 0: TIM6->PSC = 0; TIM6->ARR = 0x707;//1799; //20 uS TIM6->CNT = 0; TIM6->EGR = TIM_EGR_UG; //Создать прерывание для обновления регистров ref_register = 1; //Обновить регистры TIM6->CR1 |= TIM_CR1_CEN; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); UV_state = 1; break; case 1: TIM6->PSC = 0x008f;//143 TIM6->ARR = 0xF423;//62499; // 100 mS TIM6->CNT = 0; ref_register = 1; //Обновить регистры TIM6->EGR = TIM_EGR_UG; //Создать прерывание для обновления регистров TIM6->CR1 |= TIM_CR1_CEN; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); UV_state = 0; break; } } else { TIM6->SR = 0; ref_register = 0; } }
  11. А если это делать в прерывании, не вызовет ли это прерывание снова? Пока проверить не могу.
  12. Но ведь PSC тоже с буфером, и он вроде не отключается, и логично чтобы ARR и PSC обновились одновременно, чувствую что нужно использовать UG, но как не понял. Если не трогать вообще PSC, то все работает, управляется ARR без буфера, а если нужно менять еще и PSC?
  13. Можете помочь как нужно написать чтобы работало.
  14. Шим не подойдет, т.к. прерывание будет усложнятся и будут добавленны еще условия которые будут зависить от переферии. А какие еще флаги кроме UIF могут быть установленустановлены? Вот думаю может исрользовать режим импульса, по идее он точно один раз попадет в прерывание. Ну а вообще если логически подумать, приведеный код должен формировать импульс, может в коде ошибаюсь? На счет обновления ARR при установленном ARPE, ничего сказать не смогу т.к. начал изучение только недавно, но попробовать можно, сбросить этот бит и после обновить ARR и установить этот бит.
  15. Здравствуйте, только начал осваивать проц, и столкнулся с непоняткой, уже 3 дня сижу и не могу понять. Есть Выход //Trigger /*Configure GPIO pin : PE3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); Есть таймер 6, его настройка. __TIM6_CLK_ENABLE(); UV_state = 0; HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 1, 0); HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); TIM6->PSC = 143; TIM6->ARR = 62499; //100 mS //TIM6->EGR = TIM_EGR_UG; TIM6->DIER = TIM_DIER_UIE; TIM6->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; Это прерывание void TIM6_DAC_IRQHandler(void) { TIM6->CR1 &= ~TIM_CR1_CEN; //Остнавливаем таймер TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF switch (UV_state) { case 0: TIM6->PSC = 0; TIM6->ARR = 0x707;//1799; //20 uS TIM6->CNT = 0; TIM6->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); UV_state = 1; break; case 1: TIM6->PSC = 0x008f;//143 TIM6->ARR = 0xF423;//62499; //Ñðàáîòàòü íà 100 mS TIM6->CNT = 0; TIM6->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); UV_state = 0; break; } } Хочу иметь импульс 20 us через 100 ms, и вроде все логично, но на выходе все перевернуто Ну где тут можно ошибиться? Заходим по состоянию 0, устанавливаем таймер на 20 us и устанавливаем ногу в 1, чтобы в следующем прерывании ее сбросить и настроить прерывание на 100 ms и потом ее установить в 1 в новом прерывании. Почему на выходе все наоборот?