Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 и HAL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mag
Добрый день!

Приступил к освоению Cortex. Имеется KIT STM32F4DISCOVERY.
Первично, до заказа KIT, информация от ST, о их детище под названием HAL (и возможностях появляющихся ввиду его применения) порадовала (после 8 битных MCU). Но при "лобовом" столкновении, радость моя притаилась sm.gif.
При попытке написания своего проекта возникли вопросы. Не до конца понятно как же работать с HALом? Где найти недостающую информацию?
Поясню на примере:

Есть желание использовать таймер в режиме "Output compare mode". HAL содержи функцию инициализации таймера HAL_TIM_OC_Init(). Ей нужно передать указатель на структуру:

TIM_HandleTypeDef
Data Fields
TIM_TypeDef * Instance
TIM_Base_InitTypeDef Init
HAL_TIM_ActiveChannel Channel
DMA_HandleTypeDef * hdma
HAL_LockTypeDef Lock
__IO HAL_TIM_StateTypeDef State

TIM_Base_InitTypeDef
Data Fields
uint32_t Prescaler
uint32_t CounterMode
uint32_t Period
uint32_t ClockDivision
uint32_t RepetitionCounter

Структура сделана универсальной на все случаи. Какие поля необходимы в требуемом мне режиме? В документации на HAL поля структуры описаны крайне лаконично. Проведения параллелей с Reference manual stm32f4хх не всегда возможно. Из примеров, поставляемых с KIT видно, что далеко не все поля структур заполняются при настройке таймера.

Вообщем пока я не нашел "ключа" к HALу. Заниматься исследованием HALа методом проб и ошибок глупо; смотреть потроха функций HALа - больно трудоемко и непрактично.
Подскажите, как Вы работаете с HALом? Может я не нашел нужной pdf?
scifi
Я никогда эти "блюмблюатеки" не пользовал, поэтому предвзят. Но всё равно добавлю свои 5 копеек.
Вижу пользу от этих библиотек только в стандартных ситуациях: настроить тактирование, сконфигурировать пин и т.д. Реально можно сэкономить время, ИМХО.
Но таймер - это совсем другой случай. Учитывая все его режимы и возможности взаимодействия с другими таймерами, там наберётся примерно 100500 различных сценариев использования. Чем там может помочь какой-то HAL - ума не приложу. Скорее, он там будет мешать. В описании таймера фигурируют регистры, их и надо настраивать напрямую. Какая-то мутная надстройка над регистрами со своими глюками и без описания - бред какой-то, честное слово.
Corvus
Если настрой такой, что
Цитата
Какая-то мутная надстройка над регистрами со своими глюками и без описания - бред какой-то, честное слово.
, тогда путного ничего не выйдет.

А так, имён переменных и комментариев вполне достаточно, чтоб провести параллель с референсным мануалом. rolleyes.gif Как ни крути, а тенденции таковы, что железячное программирование, вслед за PC-шным становится всё более высокоуровневым и отвязывается от конкретного "железа". Контроллеры становятся всё сложнее, взаимозависимости выставления битиков всё менее очевидны. Пока что HAL для того же STM - это банальная обёртка, а впереди уже набор готовых функций и совершенствование автогенерации кода. Новый виток борьбы парадигм, после ассемблер - C. biggrin.gif

А волшебной pdf никакой нет.
Цитата
Какие поля необходимы в требуемом мне режиме?

Тут, что с HAL, что без, какая разница? Смотрите аппноуты от ST на применение того же таймера в нужном режиме.
mag
Цитата(Corvus @ Jan 7 2015, 14:05) *
А так, имён переменных и комментариев вполне достаточно, чтоб провести параллель с референсным мануалом. rolleyes.gif
Тут, что с HAL, что без, какая разница? Смотрите аппноуты от ST на применение того же таймера в нужном режиме.


Corvus, нет, настрой "нормальный", без "мутности". Отказаться от HAL можно для случая когда все сам и долго и нудно. Если же хочется пользоваться готовыми и отлаженными вещами, что в терминологии ST названо middleware, то без HALа не пойдет дело.

А по поводу параллелей, давайте на моем примере разберем:

TIM_HandleTypeDef
Data Fields
TIM_TypeDef * Instance
TIM_Base_InitTypeDef Init
HAL_TIM_ActiveChannel Channel
DMA_HandleTypeDef * hdma
HAL_LockTypeDef Lock
__IO HAL_TIM_StateTypeDef State

TIM_Base_InitTypeDef
Data Fields
uint32_t Prescaler
uint32_t CounterMode
uint32_t Period
uint32_t ClockDivision
uint32_t RepetitionCounter

Вот что нужно и нужно ли писать в выделенные поля и нужно ли и если да то зачем писать значение в uint32_t Period?
Чтобы ответить на этот вопрос - пока вижу один путь - лезть в потроха HALа. Но мне кажется это не правильным (где же тогда скорость и удобство разработки; абстракция от аппаратуры?).

Цитата
Смотрите аппноуты от ST на применение того же таймера в нужном режиме
если не сложно - ссылочку (похоже я не все нашел).
Corvus
uint32_t Period, как видно из названия - период работы таймера.
Настройка DMA для "Output compare mode" вам не нужны.

Документация по таймерам
http://www.st.com/web/en/resource/technica.../DM00042534.pdf
в частности, OCR-mode на стр. 13
Там же
Цитата
For more details on using the timer in this mode, refer to the examples provided in the
STM32xx standard peripheral libraries, in the /Project/STM32xx_StdPeriph_Examples/
TIM/OC_Toggle, /OCActive and /OCInactive folders.


И всё же, советую залезть в "потроха". В stm32f4xx_tim.h ничего страшного нет, зато вполне понятные комментарии к структурам, их полям и возможным значениям.
scifi
Цитата(Corvus @ Jan 7 2015, 14:05) *
Как ни крути, а тенденции таковы, что железячное программирование, вслед за PC-шным становится всё более высокоуровневым и отвязывается от конкретного "железа". Контроллеры становятся всё сложнее, взаимозависимости выставления битиков всё менее очевидны.

Занятный опус.
Но если спуститься с небес на землю, то таймер в STM32 - непростой зверь (что неудивительно, учитывая широкую функциональность). Каким таким образом какой-то HAL может сделать проще? Правильно - никаким, потому что вместе с упрощением уйдёт и часть функциональности. Остаётся сомнительная помощь в установке битов регистров. Сомнительная, потому что для этого достаточно иметь в заголовках дефайны с именами битов. Да и без этого меня совсем не напрягает, заглянув в мануал, расставить битики по местам. Зато при отладке есть полное понимание того, как это работает. И если вдруг что-то не работает, достаточно внимательно посмотреть на содержимое регистров, чтобы понять, что не так.
mag
Corvus, попробую немножко конкретизировать мой вопрос - информации по теме как настроить таймер достаточно. Думаю, что даже ref manuala будет в самый раз. Я хотел бы найти минимально необходимое для понимания работы описание функций и структур HAL. Чтобы не гадать как оно там сделано и что конкретно делает функция. Степеней свободы много. Аппаратура как заметили - сложная. По этой причине и описание на "обертку" должно быть и быть однозначным для интерпретации.

Цитата(Corvus @ Jan 7 2015, 15:17) *
uint32_t Period, как видно из названия - период работы таймера.
Настройка DMA для "Output compare mode" вам не нужны.

sm.gif Да, период работы таймера, но зачем его нужно задавать для режима "Output compare mode". Можно предположить, конечно, что есть возможность еще и менять "базу" таймера. В этом случае работает Autoreload в регистр счетчика? Хоть да, хоть нет, но функция/ее переменные должна быть описана полноценно иначе как можно ее использовать?

Цитата
Документация по таймерам
http://www.st.com/web/en/resource/technica.../DM00042534.pdf
в частности, OCR-mode на стр. 13 Там же. Да, интересно, но опять же без учета HAL. Если речь о ручной конфигурации - то начинать надо с ref manual.


Цитата
И всё же, советую залезть в "потроха". В stm32f4xx_tim.h ничего страшного нет, зато вполне понятные комментарии к структурам, их полям и возможным значениям.

Залез:
/* Timer Output Compare functions **********************************************/
HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim);
................

/**
* @brief TIM Time Base Handle Structure definition
*/
typedef struct
{
TIM_TypeDef *Instance; /*!< Register base address */
TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */
HAL_TIM_ActiveChannel Channel; /*!< Active channel */
DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array
This array is accessed by a @ref DMA_Handle_index */
HAL_LockTypeDef Lock; /*!< Locking object */
__IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */
}TIM_HandleTypeDef;

Ни больше ни меньше - столько же сколько и в описании на HAL drv.
Прошу прощения, но пока описания на HAL скупое.

Цитата(scifi @ Jan 7 2015, 15:50) *
Занятный опус.
Но если спуститься с небес на землю, то таймер в STM32 - непростой зверь (что неудивительно, учитывая широкую функциональность). Каким таким образом какой-то HAL может сделать проще? Правильно - никаким, потому что вместе с упрощением уйдёт и часть функциональности. Остаётся сомнительная помощь в установке битов регистров. Сомнительная, потому что для этого достаточно иметь в заголовках дефайны с именами битов. Да и без этого меня совсем не напрягает, заглянув в мануал, расставить битики по местам. Зато при отладке есть полное понимание того, как это работает. И если вдруг что-то не работает, достаточно внимательно посмотреть на содержимое регистров, чтобы понять, что не так.


scifi, зверь сложный. Но не всегда нужно выжать из него все sm.gif. Есть же и простые типовые задачи. В любом случае, речь не о том "ты за HAL или против HAL" sm.gif. Речь о истине - где почитать чтобы понять что же делает в своих потрохах HAL, и что этот самый HAL ждет от пользователя в качестве исходных данных. Пока ситуацию можно описать так - "пользователь, ты мне дай все что есть, а я там сам сделаю как смогу". При этом пользователю не дано чего -либо ожидать кроме HAL_StatusTypeDef.

http://www.eevblog.com/forum/microcontroll...xx-hal-drivers/ нашел аналогичную темку.
EvgenWL
Цитата(mag @ Jan 7 2015, 12:47) *
Подскажите, как Вы работаете с HALом? Может я не нашел нужной pdf?

UM1725: Description of STM32F4xx HAL drivers смотрели?
mag
Цитата(EvgenWL @ Jan 7 2015, 22:03) *


Конечно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.