|
|
  |
HAL, сколько можно фиксить ? |
|
|
|
Apr 12 2016, 11:38
|
Местный
  
Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471

|
Цитата(x893 @ Apr 12 2016, 14:31)  Из плюсов - не надо лазить по RM в поисках битов/регистров, более-менее понятные коментарии. Жесть.
|
|
|
|
|
Apr 12 2016, 11:39
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (x893 @ Apr 12 2016, 14:31)  У меня такой подход - сначала кубом делается инициализация и настройка по максимуму Я во всякие вещи типа "библиотек" и "примеров" заглядываю только в одном случае, если что-то упорно не получается по документации сделать. Но помогает далеко не всегда, ибо не получается сразу обычно что-то более хитрое, чем два байта переслать. В чем смысл делать "инициализация и настройка по максимуму" вообще не понимаю. Разбираться с железом надо по любому постепенно и только с тем, которое СЕЙЧАС нужно. Шаг за шагом - GPIO помигать светодиодом, UART - поднять консольку, таймер - операционку поднять,.....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 12 2016, 13:26
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Tarbal @ Apr 12 2016, 16:01)  Но не все делают как вы всегда делаете. Да, я это очень хорошо знаю. Но в определеной мере такой подход к делу меня устраивает - к тому, кто смог написать надежную фирмварь ПОСЛЕ того, как были познаны все прелести гимморидальной болезни, как минимум, отношение почтительное. В какой-то степени это является моим куском хлеба с маслом.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 13 2016, 06:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(zltigo @ Apr 12 2016, 14:33)  Я инода все-же такое делаю. Помогает, что срок жизни изделий по железу очень большой (10 лет типично), вот и становится разумным переодически вдыхать новую жизнь в старое железо. При этом рефакторинг тоже делаю. Да тоже делаю. И, кстати, это одна из причин, по которой стараюсь библиотеки не применять. В последнем проекте, за время жизни даже CMSIS поменялся, сцуко. У меня ещё оставался на тот момент RCC (ну он один раз вначале проекта используется, для инициализации кварца.) Так пришлось переписать, так как IAR/CMSIS/HAL всё поменялось... Цитата(x893 @ Apr 12 2016, 19:33)  Особо вдаваться не хочется. Да и для разных типов процессоров держать в голове это всё - мало GВ под волосами. В общем-то каждый делает как ему удобнее. Ещё раз повторяю. Вас никто уговаривать не собирается. Вы сами к этому придёте. А держать в голове ничего не надо. Да и у программиста не держится ничего ... ))))) Я вообще сразу всё выкидываю. Иначе меня бы в толпе с расстояния пол километра видно было бы, по этой голове... )) Я сейчас и даташит бегло читаю. Сразу открываю регистры и поехал ... )) Вся эта периферия более/ менее похожа. Нюансы - это незначительная часть.
|
|
|
|
|
Apr 13 2016, 07:17
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(ViKo @ Apr 13 2016, 07:56)  Не, одними регистрами не отделаешься. Приходится читать нужный раздел, и не раз. Всплывают всяческие зависимости от других периферийных устройств. А так, да, программирую регистры, не пропуская ни одного бита (умножаю на 0 ненужные). Последним часто программирую регистр, в котором включается это периферийное устройство. Обычно, работает. В-общем, команд - минимум.
Не, одними регистрами не отделаешься. Приходится читать нужный раздел, и не раз. Всплывают всяческие зависимости от других периферийных устройств. А так, да, программирую регистры, не пропуская ни одного бита (умножаю на 0 ненужные). Последним часто программирую регистр, в котором включается это периферийное устройство. Обычно, работает. В-общем, команд - минимум. ОТ: По нескольку раз перечитывая разделы, Вы уже и пишете по нескольку раз  . SCNR.
|
|
|
|
|
Apr 13 2016, 08:04
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(KnightIgor @ Apr 13 2016, 10:17)  ОТ: По нескольку раз перечитывая разделы, Вы уже и пишете по нескольку раз  . SCNR. С АндроЕда, в метро. То есть связь, то нема. Однако, движок Электроникса пропускает такие голы. Вот пример моего "творчества". Код // RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST; // RCC->APB1RSTR = 0; /* Timer 4 задает интервал работы АЦП для измерения напряжений VREG, VACC */ TIM4->CR2 = TIM_CR2_CCDS * 0 | // Capture/Compare DMA Selection TIM_CR2_MMS_0 * 2 | // Master Mode Selection: Update TIM_CR2_TI1S * 0; // TI1 Selection TIM4->SMCR = 0; TIM4->DIER = 0;
// TIM4->CCMR1, TIM4->CCMR2 не используются // TIM4->CCER не используется // TIM4->CNT = 60E3 - 5; TIM4->PSC = PCLK1 * 2 / 1E3 - 1; // Prescaler: 1 kHz, 1 ms TIM4->ARR = 60E3 - 1; // Auto-reload: 60 s // Note that the actual counter enable signal CNT_EN is set 1 clock cycle after CEN. TIM4->CR1 = TIM_CR1_CEN * 1 | // Counter enable TIM_CR1_UDIS * 0 | // Update disable TIM_CR1_URS * 0 | // Update request source: Overflow, UG bit... TIM_CR1_OPM * 0 | // One pulse mode TIM_CR1_DIR * 0 | // Direction: Up TIM_CR1_CMS_0 * 0 | // Center-aligned mode selection TIM_CR1_ARPE * 1 | // Auto-reload preload enable: buffered TIM_CR1_CKD_0 * 0; // Clock division // __nop(); __nop(); __nop(); __nop(); // DELAY(1333, _US);
/* Так как Prescale Buffer обновляется по Update Event, то его нужно создать */ TIM4->EGR = TIM_EGR_UG; // Update Generation // TIM4->SR = 0;
|
|
|
|
|
Apr 13 2016, 08:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Apr 13 2016, 09:56)  Не, одними регистрами не отделаешься. Приходится читать нужный раздел, и не раз. Всплывают всяческие зависимости от других периферийных устройств. А так, да, программирую регистры, не пропуская ни одного бита (умножаю на 0 ненужные). Чрезмерно кучеряво с "умножением". Да и понимания не добавляет, ибо в Вашем-же примере CODE TIM_CR2_MMS_0 * 2 Я, ествественно понимаю, от чего на два, но если бы в Вашем-же стиле было написано CODE TIM_CR2_MMS_0 * 1 То для читающего никак не следует, что можно умножать на какое-то другое число и где предел? на 999 можно  ? Посему подобное нужно описывать или тупо все TIM_CR2_MMS_0 TIM_CR2_MMS_1 .... Или, привычнее для меня, хотя и без защиты на 999  , но игнорировать залезание в другие поля при указании 999 это можно и нужно. TIM_CR2_MMS(x) В упоминании незначаших битов особого смысла не вижу, поскольку надо или явно задекларировать, или просто посмотреть в хидере ВСЕ биты, причем с КОММЕНТАРИЯМИ. Редактор ДОЛЖЕН уметь работать с TAG и посмотреть в хидере выливается в один хоткей. Если перед глазами будет все время маячить такая крастота со множителями, то лично у меня просто глаза разбегутся и замылятся.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 13 2016, 09:58
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
У меня все биты с комментариями. В комментарии до двоеточия - документированное описание бита (из хидера), после двоеточия - конкретная выбранная функция. И, вообще, все биты, что есть в устройстве. Ни один не пропущен (кроме битовых полей, из которых использую младший, умножая; конкретную функцию задает-то все поле). И я могу: 1. Легко изменить режим работы, меняя нолики на единички, или одно число на другое. 2. Использовать этот фрагмент, как заготовку, в другом проекте. Умножаю на столько, сколько описано в руководстве для этого поля. Конкретно, для показанного случая, читаем: Цитата Bits 6:4 MMS[2:0]: Master mode selection These bits allow to select the information to be sent in master mode to slave timers for synchronization (TRGO). The combination is as follows: 000: Reset - the UG bit from the TIMx_EGR register is used as trigger output (TRGO). If the reset is generated by the trigger input (slave mode controller configured in reset mode) then the signal on TRGO is delayed compared to the actual reset. 001: Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is useful to start several timers at the same time or to control a window in which a slave timer is enabled. The Counter Enable signal is generated by a logic OR between CEN control bit and the trigger input when configured in gated mode. When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO, except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR register). 010: Update - The update event is selected as trigger output (TRGO). For instance a master timer can then be used as a prescaler for a slave timer. 011: Compare Pulse - The trigger output send a positive pulse when the CC1IF flag is to be set (even if it was already high), as soon as a capture or a compare match occurred. (TRGO) 100: Compare - OC1REF signal is used as trigger output (TRGO) 101: Compare - OC2REF signal is used as trigger output (TRGO) 110: Compare - OC3REF signal is used as trigger output (TRGO) 111: Compare - OC4REF signal is used as trigger output (TRGO) Защиты от превышения нет. Ну, так, мало ли что кому в голову взбредет. Можно и однобитовую переменную умножить на 999, если мозгов нет. То, что бит не один, а целое поле, видно по его названию, где в конце всегда стоит _0. Были косяки в хидерах, но они исправляются.
|
|
|
|
|
Apr 13 2016, 10:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Apr 13 2016, 12:58)  У меня все биты с комментариями. Вижу. Это и ДОПОЛНИТЕЛЬНО и напрягает. QUOTE 1. Легко изменить режим работы, меняя нолики на единички, или одно число на другое. А НЕ изменить при этом комментарий ЕЩЕ проще  . По этой причине ститя комментирования подобного Вышему категорически избегаю. QUOTE Защиты от превышения нет. Ну, так, мало ли что кому в голову взбредет. Можно и однобитовую переменную умножить на 999, если мозгов нет. А где граница наличия мозгов? Умножение на 3 это есть мозги, или уже нет?  QUOTE То, что бит не один, а целое поле, видно по его названию, где в конце всегда стоит _0. Это Ваше личное знание. Я первым делом-бы подумал, что это таки значение поля. Наверное мозгов нет ;(
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 13 2016, 10:24
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(zltigo @ Apr 13 2016, 13:20)  Это Ваше личное знание. Я первым делом-бы подумал, что это таки значение поля. Наверное мозгов нет ;( Основано на изучении кейловского хидера. Пример: Код #define PWR_CR_PLS ((uint32_t)0x000000E0) /*!< PLS[2:0] bits (PVD Level Selection) */ #define PWR_CR_PLS_0 ((uint32_t)0x00000020) /*!< Bit 0 */ #define PWR_CR_PLS_1 ((uint32_t)0x00000040) /*!< Bit 1 */ #define PWR_CR_PLS_2 ((uint32_t)0x00000080) /*!< Bit 2 */ А значение поля у них кодируется иначе: Код #define PWR_CR_PLS_LEV0 ((uint32_t)0x00000000) /*!< PVD level 0 */ #define PWR_CR_PLS_LEV1 ((uint32_t)0x00000020) /*!< PVD level 1 */ #define PWR_CR_PLS_LEV2 ((uint32_t)0x00000040) /*!< PVD level 2 */ #define PWR_CR_PLS_LEV3 ((uint32_t)0x00000060) /*!< PVD level 3 */ #define PWR_CR_PLS_LEV4 ((uint32_t)0x00000080) /*!< PVD level 4 */ #define PWR_CR_PLS_LEV5 ((uint32_t)0x000000A0) /*!< PVD level 5 */ #define PWR_CR_PLS_LEV6 ((uint32_t)0x000000C0) /*!< PVD level 6 */ #define PWR_CR_PLS_LEV7 ((uint32_t)0x000000E0) /*!< PVD level 7 */ Вот этим не пользуюсь. Если битов в поле больше трех, то описывать все их комбинации - мазохизм. Их и нет в хидере. Вот тогда на помощь приходит красивое решение - умножить младший бит. P.S. Насчет мозгов можно сомневаться, а вот объективности в суждениях точно не хватает. Какие же упертые, эти латыши. Что один, что другой.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|