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

PheeL

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

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

  • Посещение

Репутация

0 Обычный

Информация о PheeL

  • Звание
    Участник
    Участник
  1. STM32СubeMX и подобные

    Господа, вы извините, конечно, но вот я читаю уже не первую страницу данной темы и никак понять не могу, вы постоянно упираете на HAL, но ведь там же есть ещё и LL (Low Layer)! Более того, Cube позволяет в настройках проекта переключать генерацию кода в этот API (LL). А там практически всё, что вы так любите - прямое обращение к регистрам периферии, только с вменяемыми названиями функций и регистров, чтобы можно было потом код _читать_ и поддерживать, а не в битах спотыкаться. Да, конечно, там тоже есть свои нюансы (как пример - настройка секвенсора в АЦП), но их значительно меньше (на мой взгляд) чем в HAL. И, естественно, вы не сможете сделать на LL всё. Например, драйвер FLASH там отсутствует, как-минимум для линейки F3. А для F7 там вообще нет поддержки большей части мощной периферии (SDMMC, USB, DCMI, LTDC, ETH и др.). Но, вы собрались её всю программировать руками? Простите, USB, где в документации 10 страниц одного _перечисления_ регистров! Могу пожелать только много времени, удачи и усердия. P.S. Для простой периферии на STM32 используйте LL и будет вам счастье. Для мощной - решайте сами.
  2. Библиотеки для STM32

    Кстати, просветите насчёт сниппетов, пожалуйста. Насколько я понял ST отказалась и от них тоже, заменив на HAL Low Level Drivers. Это макро-обёртки над регистрами периферии которыми пользуется верхний уровень самого HAL, но если для каких-то драйверов он избыточен и не применяется, то позволяется напрямую пользоваться этими макросами. Причём, поскольку это тоже относительно новое веяние, то например для F4 серии их я не заметил, хотя в HAL для других линеек они присутствуют.
  3. Это для всей линейки STM32F10xxx. В PM0075 на странице 17 написано следующее: "Pages 0-3 (for low- and medium-density devices), or pages 0-1 (for high-density and connectivity line devices) are automatically write-protected. The rest of the memory can be programmed by the code executed from the main Flash memory (for IAP, constant storage, etc.), but it is protected against write/erase (but not against mass erase) in debug mode or when booting from the embedded SRAM." Сам на эти "грабли" наступил недавно. На STM32L1 код самодельного загрузчика обновляется с установленой защитой (первого уровня. Но она там тоже с "нюансами"), а на STM32F1 уже нет. FLASH-контроллер выдаёт WRPERR бит на попытку стирания этих первых страниц. А без защиты всё ок.
  4. Есть галочка "C/C++ Compiler -> Language 1 -> Multi-file Compilation", но она точно не использует все ядра и применение у неё немного другое. Не уверен, что у IAR компилятор многопоточность поддерживает.
  5. Olimex STM32-P407 USB OTG HS

    Вопрос: При подключении USB Flash накопителя в порт физически подключённый к USB OTG HS микроконтроллера, в отладчике вижу, что устройство определяется, происходит подключение(конечный автомат драйвера переходит в состояние Connect), верно читается VID/PID устройства, но не проходит этап энумерации. Хотя на OTG FS всё штатно (устройство подключается и работает без сбоев). Включение\выключение VBUS происходит верно, напряжение во включенном состоянии 5.2(В). Исходные данные: IAR 7.10 (Optimizations None). Все настройки проекта пока не буду перечислять, их много и я почти уверен, что проблема не в них. CMSIS 4.0.1 STM32Cube Firmware 1.3.0 STM32 HAL Driver 1.1.0 STM32 USB Host Library 2.2.0 Далее, статическая конфигурация и код инициализации: //USB Host #define USBH_ENABLED 1 #define USBH_FS_ENABLED 0 #define USBH_HS_ENABLED 1 //USBH Classes #define USBH_HID_ENABLED 1 #define USBH_MSC_ENABLED 1 /*---------- -----------*/ #define USBH_MAX_NUM_ENDPOINTS 4 /*---------- -----------*/ #define USBH_MAX_NUM_INTERFACES 10 /*---------- -----------*/ #define USBH_MAX_NUM_CONFIGURATION 1 /*---------- -----------*/ #define USBH_KEEP_CFG_DESCRIPTOR 0 /*---------- -----------*/ #define USBH_MAX_NUM_SUPPORTED_CLASS 2 /*---------- -----------*/ #define USBH_MAX_SIZE_CONFIGURATION 255 /*---------- -----------*/ #define USBH_MAX_DATA_BUFFER 512 /*---------- -----------*/ #define USBH_DEBUG_LEVEL 0 /******************************************************************************/ Status USBH_Init_(void* args_p) { const OS_UsbhHd* usbh_hd_p = (OS_UsbhHd*)args_p; Status s = S_OK; usbh_fs_hd_p = (USBH_HandleTypeDef*)usbh_hd_p->usbh_fs_hd; usbh_hs_hd_p = (USBH_HandleTypeDef*)usbh_hd_p->usbh_hs_hd; // Interface #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_Init(usbh_fs_hd_p, USBH_UserProcess, USBH_ID_FS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_Init(usbh_hs_hd_p, USBH_UserProcess, USBH_ID_HS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED // Class #if (1 == USBH_HID_ENABLED) #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_RegisterClass(usbh_fs_hd_p, USBH_HID_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_RegisterClass(usbh_hs_hd_p, USBH_HID_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED #endif // USBH_HID_ENABLED #if (1 == USBH_MSC_ENABLED) #if (1 == USBH_FS_ENABLED) if (S_OK != drv_usbh_v[DRV_ID_USBH_FS_MSC]->itf.Init(usbh_fs_hd_p)) { return s = S_HARDWARE_FAULT; } if (USBH_OK != USBH_RegisterClass(usbh_fs_hd_p, USBH_MSC_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (S_OK != drv_usbh_v[DRV_ID_USBH_HS_MSC]->itf.Init(usbh_hs_hd_p)) { return s = S_HARDWARE_FAULT; } if (USBH_OK != USBH_RegisterClass(usbh_hs_hd_p, USBH_MSC_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED #endif // USBH_MSC_ENABLED return s; } /******************************************************************************/ Status USBH_Open(void* args_p) { Status s = S_OK; usbhd_stdin_qhd = (OS_QueueHd)args_p; #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_Start(usbh_fs_hd_p)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_Start(usbh_hs_hd_p)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED return s; } /******************************************************************************/ void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd) { ... ... else if(hhcd->Instance == USB_OTG_HS) { __GPIOB_CLK_ENABLE(); __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); /**USB_OTG_HS GPIO Configuration PB12 ------> USB_OTG_HS_ID PB13 ------> USB_OTG_HS_VBUS PB14 ------> USB_OTG_HS_DM PB15 ------> USB_OTG_HS_DP */ GPIO_InitStruct.Pin = GPIO_PIN_12|/*GPIO_PIN_13|*/GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* Peripheral clock enable */ __USB_OTG_HS_CLK_ENABLE(); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(OTG_HS_IRQn, OS_PRIORITY_INT_MIN, 0); HAL_NVIC_EnableIRQ(OTG_HS_IRQn); } /******************************************************************************/ USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost) { ... ... else if (phost->id == USBH_ID_HS) { hcd_hs_hd.Instance = USB_OTG_HS; hcd_hs_hd.Init.Host_channels = 8; hcd_hs_hd.Init.speed = HCD_SPEED_FULL; hcd_hs_hd.Init.dma_enable = DISABLE; hcd_hs_hd.Init.phy_itface = HCD_PHY_EMBEDDED; hcd_hs_hd.Init.Sof_enable = DISABLE; hcd_hs_hd.Init.low_power_enable = DISABLE; hcd_hs_hd.Init.vbus_sensing_enable = ENABLE; hcd_hs_hd.Init.use_external_vbus = ENABLE; /* Link The driver to the stack */ hcd_hs_hd.pData = phost; phost->pData = &hcd_hs_hd; HAL_HCD_Init(&hcd_hs_hd); USBH_LL_SetTimer (phost, HAL_HCD_GetCurrentFrame(&hcd_hs_hd)); } Весь остальной низкоуровневый код реализации драйвера взят из примеров (они все одинаковые, сгенерированные оболочкой Cube), проектов в STM32 Firmware.
  6. Imx6 без линухи

    Ну, например, как вот здесь в разделе "Download". upd. Я не понимаю, судя по сайту для вашей платы должен быть доступен набор ПО из: Неужели в комплекте даже диска никакого не шло?
  7. Imx6 без линухи

    Возможно вы действительно приобрели не совсем подходящий для вас DevKit. Я являюсь обладателем MarS Board от Embest. На ней выведена площадка под разъём JTAG (PLLD1.27-10). Мне его любезно припаяли, а я интереса ради попробовал загрузить и исполнить файл из ОЗУ простенькую тестовую программу через SEGGER J-Link v8.0 и IAR7.10. На этом DevKit'е установлен Dual вариант SoC i.MX6 , но IAR (там есть конфигурация конкретно под этот вариант чипа) в отладчике выводит информацию о регистрах только одного из них. Как переключиться на второе и возможно ли это в принципе в этой версии IDE я пока не знаю. Ничего интересного больше не скажу, т.к. брал плату для экспериментов с Linux и Android.
  8. Если очень нужен Ethernet, можно поступить так: http://zaozmi.ru/catalog/servoprivod/spsh.html + http://zaozmi.ru/catalog/ethernet_can_shluz.html
  9. Каждый из элементов enum - это int. Так что если машинное слово 32-х разрядное, то всё верно.
  10. Господа, чтобы не изобретать очередной велосипед, обращаюсь к "коллективному разуму" специалистов с просьбой навести на готовую спецификацию\реализацию протокола удволетворяющего следующим формальным требованиям: Цели протокола. Обеспечение надёжной доставки пакетов по заданному маршруту в пределах сетевого сегмента из приборов/интеллектуальных датчиков содержащих в себе программируемый микроконтроллер уровня не ниже Atmel AVR Mega8. Основные требования. Надёжная доставка (с подтверждением (квитированием)). Одноранговая (или гибридная?) сеть. Маршрутизация в пределах сетевого сегмента. Без установки соединения. Пакетная коммутация. Фрагментация\дефрагментация (сетевой или канальный уровень?). Дуплексный обмен. Управление потоком. Минимальный размер заголовка относительно полезной нагрузки кадра. Возможность формирования кадров для потоковых интерфейсов (Byte stuffing). Работа через интерфейсы: Ethernet, USB, CAN, SPI, I2C, UART(RS-232, Bluetooth), RS-485. Ограничения. Не гарантируется соблюдение "реального времени". Не подходит для трансляции высоко-нагруженного (аудио\видео) трафика. Особенности реализации. Язык реализации — ANSI C.
  11. Хочу посоветовать обратить внимание на систему сообщений в QNX. Я сейчас не готов предметно обсуждать возможность использования формата применяемых там сообщений для IPC как универсального протокола обмена через различные аппаратные интерфейсы, но возможно стоит взглянуть на заложенные там идеи (тем более, что документация отличная). Во всяком случае я сам планирую более детально это изучить когда буду чуть более разгружен на работе.
  12. Вы забыли упомянуть, что это всё надо делать только под Линуксом, потому что микро-РТОС для таких задач совершенно не подходят, т.к. для них нет готовых коммуникационных стеков и драйверов! )
  13. Конкретно для этого случая есть в наличие тоже стандартная memove();
×
×
  • Создать...