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

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Ну вот например раздутый код:

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)
{
  uint32_t position;
  uint32_t ioposition = 0x00;
  uint32_t iocurrent = 0x00;
  uint32_t temp = 0x00;
  uint32_t config = 0x00;
  __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */
  uint32_t registeroffset = 0; /* offset used during computation of CNF and MODE bits placement inside CRL or CRH register */
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
  assert_param(IS_GPIO_MODE(GPIO_Init->Mode));

  /* Configure the port pins */
  for (position = 0; position < GPIO_NUMBER; position++)
  {
    /* Get the IO position */
    ioposition = ((uint32_t)0x01) << position;
    
    /* Get the current IO position */
    iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;

    if (iocurrent == ioposition)
    {
      /* Check the Alternate function parameters */
      assert_param(IS_GPIO_AF_INSTANCE(GPIOx));

      /* Based on the required mode, filling config variable with MODEy[1:0] and CNFy[3:2] corresponding bits */
      switch (GPIO_Init->Mode)
      {
        /* If we are configuring the pin in OUTPUT push-pull mode */
        case GPIO_MODE_OUTPUT_PP:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_PP;
          break;
          
        /* If we are configuring the pin in OUTPUT open-drain mode */
        case GPIO_MODE_OUTPUT_OD:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_OD;
          break;
          
        /* If we are configuring the pin in ALTERNATE FUNCTION push-pull mode */
        case GPIO_MODE_AF_PP:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_PP;
          break;
          
        /* If we are configuring the pin in ALTERNATE FUNCTION open-drain mode */
        case GPIO_MODE_AF_OD:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_OD;
          break;
          
        /* If we are configuring the pin in INPUT (also applicable to EVENT and IT mode) */
        case GPIO_MODE_INPUT:
        case GPIO_MODE_IT_RISING:
        case GPIO_MODE_IT_FALLING:
        case GPIO_MODE_IT_RISING_FALLING:
        case GPIO_MODE_EVT_RISING:
        case GPIO_MODE_EVT_FALLING:
        case GPIO_MODE_EVT_RISING_FALLING:
          /* Check the GPIO pull parameter */
          assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
          if(GPIO_Init->Pull == GPIO_NOPULL)
          {  
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_FLOATING;
          }
          else if(GPIO_Init->Pull == GPIO_PULLUP)
          {
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;
            
            /* Set the corresponding ODR bit */
            GPIOx->BSRR = ioposition;
          }
          else /* GPIO_PULLDOWN */
          {
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;
            
            /* Reset the corresponding ODR bit */
            GPIOx->BRR = ioposition;
          }
          break; 
          
        /* If we are configuring the pin in INPUT analog mode */
        case GPIO_MODE_ANALOG:
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_ANALOG;
          break;
        
        /* Parameters are checked with assert_param */
        default:
          break;
      }
      
      /* Check if the current bit belongs to first half or last half of the pin count number
       in order to address CRH or CRL register*/
      configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL     : &GPIOx->CRH;
      registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2) : ((position - 8) << 2);
      
      /* Apply the new configuration of the pin to the register */
      MODIFY_REG((*configregister), ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset ), (config << registeroffset));
      
      /*--------------------- EXTI Mode Configuration ------------------------*/
      /* Configure the External Interrupt or event for the current IO */
      if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) 
      {
        /* Enable AFIO Clock */
        __HAL_RCC_AFIO_CLK_ENABLE();
        temp = AFIO->EXTICR[position >> 2];
        CLEAR_BIT(temp, ((uint32_t)0x0F) << (4 * (position & 0x03)));
        SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)));
        AFIO->EXTICR[position >> 2] = temp;
        

        /* Configure the interrupt mask */
        if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
        {
          SET_BIT(EXTI->IMR, iocurrent); 
        } 
        else
        {
          CLEAR_BIT(EXTI->IMR, iocurrent); 
        } 
        
        /* Configure the event mask */
        if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
        {
          SET_BIT(EXTI->EMR, iocurrent); 
        } 
        else
        {
          CLEAR_BIT(EXTI->EMR, iocurrent); 
        }
        
        /* Enable or disable the rising trigger */
        if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
        {
          SET_BIT(EXTI->RTSR, iocurrent); 
        } 
        else
        {
          CLEAR_BIT(EXTI->RTSR, iocurrent); 
        }
        
        /* Enable or disable the falling trigger */
        if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
        {
          SET_BIT(EXTI->FTSR, iocurrent); 
        } 
        else
        {
          CLEAR_BIT(EXTI->FTSR, iocurrent); 
        }
      }
    }
  }
}
/**
  * @brief  Handles DMA interrupt request.
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
  *               the configuration information for the specified DMA Channel.  
  * @retval None
  */
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
{
  /* Transfer Error Interrupt management ***************************************/
  if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)) != RESET)
  {
    if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET)
    {
      /* Disable the transfer error interrupt */
      __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE);
      
      /* Clear the transfer error flag */
      __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma));
      
      /* Update error code */
      SET_BIT(hdma->ErrorCode, HAL_DMA_ERROR_TE);
      
      /* Change the DMA state */
      hdma->State = HAL_DMA_STATE_ERROR;
      
      /* Process Unlocked */
      __HAL_UNLOCK(hdma); 
      
      if (hdma->XferErrorCallback != NULL)
      {
        /* Transfer error callback */
        hdma->XferErrorCallback(hdma);
      }
    }
  }

  /* Half Transfer Complete Interrupt management ******************************/
  if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)) != RESET)
  {
    if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET)
    { 
      /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */
      if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0)
      {
        /* Disable the half transfer interrupt */
        __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
      }
      /* Clear the half transfer complete flag */
      __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma));

      /* Change DMA peripheral state */
      hdma->State = HAL_DMA_STATE_READY_HALF;

      if(hdma->XferHalfCpltCallback != NULL)
      {
        /* Half transfer callback */
        hdma->XferHalfCpltCallback(hdma);
      }
    }
  }
  
  /* Transfer Complete Interrupt management ***********************************/
  if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)) != RESET)
  {
    if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET)
    {
      if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0)
      {
        /* Disable the transfer complete interrupt */
        __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TC);
      }
      /* Clear the transfer complete flag */
      __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma));
    
      /* Update error code */
      SET_BIT(hdma->ErrorCode, HAL_DMA_ERROR_NONE);

      /* Change the DMA state */
      hdma->State = HAL_DMA_STATE_READY;
    
      /* Process Unlocked */
      __HAL_UNLOCK(hdma);
    
      if(hdma->XferCpltCallback != NULL)
      {       
        /* Transfer complete callback */
        hdma->XferCpltCallback(hdma);
      }
    }
  }
}

И это только то что на поверхности. Зачем эти излишества? Зачем куда-то тратить время и флеш? Причем над каждым модулем (DMA, USART и т.д.) стоят структуры данных для всех этих ваших пустых абстракций которые жрут СОЗУ. Я тоже пишу библиотеки и хочу комфортно программировать, но для хранения например ножки порта у меня тратиться 1 байт, и этот 1 байт описывает на каком порту какая нога привязана. И тоже есть функции для настройки портов, например по списку, но код короче раза в 4 чем в HAL. И мануал на HAL под 2000 страниц, а изучив CMSIS и другие МК будет проще изучать и использовать, CMSIS для всех МК один.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

10 часов назад, Koret сказал:

но достаточное большое кол-во современных программистов на ПК практически понятия не имеют как устроен ПК, но при этом пишут хорошие программы

погуглите информацию о количестве ошибок в коде даже не пользовательских программ, а ОС. насколько помню в них среднее количество ошибок в районе 10 на 1000 строчек кода.

а  объем совеременных ОС уже давно составляет десятки миллионов строк кода. проблемы с памятью которая даже в ядре течет. и всем этим пользуется как прокладкой программист пишущий пользовательскую программу. и который тоже по большому счету мало понимает что за инструменты и "материалы" применяет. потому что его приучили не думать об этом изначально, а довериться тому кто предоставил все это

 

в связи со всем этим мне приходится раз в неделю перезагружать свой смартфон, поскольку он начинает конкретно тупить,  а тупит потому что память течет, результат работы какой_то "хорошей" программы) возможно не одной.

 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

2 часа назад, mail_robot сказал:

ну и в чем тут заключается ужас?

2 часа назад, mail_robot сказал:

или тут он в чем то закопался?

Единственное, в чём тут ужас - избыточность. Кучу тактов потратить, чтобы дёрнуть ножкой...
Да и эти функции, в принципе, можно немного подоптимизировать. Не понятно, что за люди писали тот код. Скорее всего - обычные программисты ПК, для которых понятие "время исполнения кода" неведомо.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

4 часа назад, mail_robot сказал:

логика разработчиков тут совершенно понятна - унифицировать общий синтаксис библиотеки, чтобы сделать код хорошо читаемым.

Читаемый КЕМ? 

 

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Особенно если учесть что излишние дефайны это большое зло. Да что там спорить просто люди не хотят вникать и разбираться, взяли пример работает и хорошо, а что там с оптимизацией и качеством не важно. Вот пример:

const Typ_Port   OutPins[] = {PB12, PB13, PB14, PB15, PA8, PA9, PA10, PA11, NC};

void Sys_ClockInit(void)
{// HSE = 8000000; SYSCLK = 72000000; APB1 = 36000000; APB2 = 72000000
  FLASH->ACR = 0x30 | FLASH_ACR_LATENCY_2;  //

  RCC->CR |= RCC_CR_HSEON;  //включаем генератор HSE
  while(!(RCC->CR & RCC_CR_HSERDY));  //ожидание готовности HSE
  RCC->CFGR = RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9 | RCC_CFGR_PPRE1_2;  //источник тактовых сигналов для PLL выбираем HSE
  RCC->CR |= RCC_CR_PLLON; //включаем PLL
  while(!(RCC->CR & RCC_CR_PLLRDY)); //ожидание готовности PLL
  RCC->CFGR |= RCC_CFGR_SW_PLL; //выбираем PLL для тактирования

  // включаем тактирование модулей
  RCC->AHBENR = 0x00000014 | RCC_AHBENR_DMA1EN;
  RCC->APB1ENR = RCC_APB1ENR_TIM4EN | RCC_APB1ENR_USART2EN | RCC_APB1ENR_USBEN;
  RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

  GPIO_SetModeList((gpOutput_GeneralPushPull | gp50MHz), OutPins);
}

Все просто и понятно, и совсем не асм)

Ссылка на комментарий
Поделиться на другие сайты

4 hours ago, Alex said:

Кучу тактов потратить, чтобы дёрнуть ножкой...

а вы куда то торопитесь? 99,9% задач совершенно не критична к скорости дерганья ножкой. Вся критичная к скорости аппаратка работает обычно на модулях. Поллинг? Тоже нафик не нужна скорость. На критичные события проще зацепить EXTI.

5 hours ago, MasterElectric said:

Зачем эти излишества?

вы привели в качестве примера инитку. Она выполняется один раз и делает это максимально безопасно и правильно. И я лучше использую ее, чем буду экономить 100 байт памяти, которой итак за глаза.

второй кусок кода да, обработка запроса прерывания от ДМА. Состоит по сути из трех блоков - обработчик ошибки, полуфиниш, финиш

рассмотрим к примеру полуфиниш

/* Half Transfer Complete Interrupt management ******************************/
  if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)) != RESET)
  {
    if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET)
    {
      if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0) __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
      __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma));
      hdma->State = HAL_DMA_STATE_READY_HALF;
      if(hdma->XferHalfCpltCallback != NULL) hdma->XferHalfCpltCallback(hdma);
    }
  }

Уберем все что мозолит глаза. И что видим? Блок выполняет все нужные проверки флагов, меняет их, учитывая специфику работы модуля и вызывает функцию колбэка (обработчик) если таковой обьявлен пользователем. Половина кода макросы, даже не функции. В чем заключается криминал? В том что мне не надо штудировать раздел ДМА чтобы случайно не забыть какой то флажочек? Да я пожалуй с удовольствием воспользуюсь этим кодом и сэкономлю себе часа полтора времени на чтении, писанине и отладке.

Вы ссылаетесь на обилие дефайнов. А регистровый код это не дефайны? Ну прям гениальный довод в пользу регистрового кода.

HAL экономит время! А это в тысячу раз ценнее чем потерянная сотня тактов там, где ее и так с запасом почти всегда.

1 hour ago, MasterElectric said:

Все просто и понятно, и совсем не асм)

нихрена не понятно если убрать коменты. А есть такое понятие как самодокументируемый код. Так вот регистровый код никогда не будет таковым, в отличие от кода HAL, который прекрасно читается и без комментариев, потому как написан человеческим языком.

Кто его будет читать? Да я сам его буду читать заново через месяц-два как с нуля, потому как выветривается вся писанина очень быстро. А мне надо опять же тратить свое время на рефреш? Да я вас умоляю...

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, mail_robot сказал:

а вы куда то торопитесь?

Конечно же нет. Но, это же не повод искусственно раздувать код, согласитесь ?

1 час назад, mail_robot сказал:

На критичные события проще зацепить EXTI

А если человек по этому EXTI будет подряд 20 ПИНов опрашивать ? И, к примеру, вместо 1 мкс. опроса, получит 10-20 мкс. А это уже, будет критично.
И не понимая, что там скрывается за этими функциями, человек просто не сможет решить эту проблему. Он не будет вообще понимать, почему у него всё так долго происходит. И побежит он на форум, с сообщением "МК работает на частоте 50 Мгц, а 20 опросов выполняются за 20 мкс. В чём дело ? Хелп, ...".

Вариантов полно, и ситуации бывают разные. По этому, разработчик библиотек должен задумываться об оптимизации, а не думать "А они куда то торопятся что-ли ?".
Вот в чём вся соль...

1 час назад, mail_robot сказал:

HAL экономит время!

Ну не знаю, не знаю. Запомнить названия : __HAL_DMA_GET_FLAG , __HAL_DMA_GET_HT_FLAG_INDEX, и им подобные - это нужно ещё умудриться :) В любом случае, за ними нужно лезть во всякие документации или хидеры.
Многим начинающим, которые здесь пишут, он сэкономил время ? Постоянно вижу, что люди натыкаются на подводные камни, от непонимания работы HAL'а.

Ссылка на комментарий
Поделиться на другие сайты

кмк вы раздуваете сфероконя в вакууме. Тому кому понадобится так быстро опрашивать ногу врятли потребуется HAL ) Он и без вас разберется что и как писать в каком месте.

я бы так особо и не упирался, если бы уже с три десятка проектов небыло реализованно на HAL очень и очень успешно. А главное быстро. 1-3 вечера на весь код, это согласитесь просто реактивная скорость. Оценивая время, которое бы я затратил на тот же код в регистровом исполнении у меня выходит не меньше недели. И тут встает вопрос - что ценнее? Процессрное время или личное, если результат абсолютно тот же самый? Все работает, скорость устраивает, ошибок нет. И опять вопрос - а нафига мне тогда самому себе раскладывать грабли?

Я не знаю ребята. По моему вы слишком драматизируете. Инструмент вполне рабочий и удобный. Я думаю так - Не обязательно быть самым лучшим всегда, часто достаточно быть не хуже других. И тогда останется еще немного времени на пивко при том же гонораре. А заказчику пох..еру на чем вы писали. Он не заценит и больше не заплатит. А для себя я напишу так, что никто не докопается

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, mail_robot сказал:

Тому кому понадобится так быстро опрашивать ногу врятли потребуется HAL ) Он и без вас разберется что и как писать в каком месте

Т.е. Вы соглашаетесь, что HAL - как абдурина, только для помигать светодиодом ? :)

21 минуту назад, mail_robot сказал:

Инструмент вполне рабочий и удобный.

Да никто не говорит, что этот инструмент нерабочий. Я высказал мнение по поводу кода, который писался явно не специалистами в этой области. А если и специалистами, то раздут специально. Не знаю для чего, м.б. чтобы люди покупали камни пожирнее...
Эти куски кода, которые Вы привели, можно раза в два по времени исполнения ужать. А если вместо функций сделать макросы, то он вообще превратится в одну-две операции (не путать с тактами). Вы не задумывались, почему он так раздут ? Или просто не видите этого ?

Ссылка на комментарий
Поделиться на другие сайты

13 minutes ago, Alex said:

Т.е. Вы соглашаетесь, что HAL - как абдурина, только для помигать светодиодом ?

ну если вы на бОльшее не способны, то пожалуй придется согласиться. Ну и светодиоды у меня тоже там местами мигали, да. Пока дисплей 320х240 отрисовывал 12 полных кадров в секунду, а по вайфаю выдавался полный лог с ацп в режиме реального времени на скорости 3,5 мегабита под управлением ос. Фигня конечно, что тут скажешь. Практически абдурина. Светодиод в дефолтном треде отмигивал, что все в порядке. Да, мигал на HAL. Ну и консоль управления там гдето на уарте болталась прицепом. Говно этот хал, я вам честно скажу

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Причём тут Вы ? Вы всё сделаете и без HAL'а, и "разберётесь что и как писать в каком месте" (c) Тут сомнений нет никаких.
Речь идёт о тех, кто не может разобраться и применяет исключительно HAL-овскую библиотеку, не вникая в её работу и код. Разве не может подобный человек столкнуться с проблемой по скорости выполнения ? Может. И он не полезет разбираться. Он, скорее всего, побежит на форум с истерическими вопросами.

Ссылка на комментарий
Поделиться на другие сайты

не вникая, это не правильно. В любую библиотеку. И не вникая ничего толкового не напишешь, хоть с халом, хоть без. Поэтому не надо утрировать. Просто многие от чнго то говорят, что хал говно, что на самом деле далеко от истины. А все потому, что вникать не хотят. Могут, но не хотят. И у меня это ничего кроме недоумения не вызывает

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Можно просьбу, если Вам будет не сложно ?
Валяется у меня практически неюзаная дискавери. Лет несколько назад запускал её и забросил в нижнюю полку.
Скажите, что мне и откуда скачать, установить, и т.д... Всё как с нуля... Желательно по порядку и прямыми ссылкми.
Хочу посмотреть что это за HAL такой и поколдовать над ним. А то в слепую общаться неудобно.

PS: Можно и в личке пообщаться, если есть желание и время...

Ссылка на комментарий
Поделиться на другие сайты

элементарно. На диско уже есть программатор и отладчик. для нулевых серий лицензия не требуетсяВоткнуть для начала в USB

скачать  Keil MDK ARM с официального сайта или торрента.  почти бесплатен

скачать CubeMX с сайта ST. Бесплатен.

ставим, вникаем в кнопки, работаем. Настраивать ничего почти не надо. Ну разве что флаг автостарта после заливки, чтобы ресет не тыкать каждый раз после заливки кода. Ну и есть опасность через неделю забыть про пики. К сожалению очень серьезная

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

по сравнению с STM хороших пиков к сожалению нет. С этим фактом придется смириться. 

На STM-ке экономить на скорости, это все равно что ехать на феррари 60 и гордиться тем, что бережешь стрелку спидометра от поломки. Шикарные пушки

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, mail_robot сказал:

по сравнению с STM хороших пиков к сожалению нет.

Вы, по всей видимости, просто не в курсе. Существуют ещё и 32-ые ПИКи. И по скорости они не хуже, и по периферии, и по цене не дороже...
Но это уже тема из области "Что лучше", которая обычно заканчивается плачевно. Не будем об этом...

Ссылка на комментарий
Поделиться на другие сайты

я знаю про 32 пики. И даже про DS пики. И поверьте, раньше я думал что лучше камней не существует.

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

а на пики есть? )

на сегодняшний день камней оптимальнее по цене за мипс просто не существует. Их нет. А мипсов там просто дохрена на любую задачу. И никакой пик или авр не дотянется даже близко до 407-го камня. Но парадокс в том, что почти всегда и простая сотка уделывает все. А она в 6 раз менее производительна и стоит паршивых полтора бакса. Про нулевку я вообще молчу, там ценник в десятки центов, а скорости на 50 атмег 328-ых

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, mail_robot сказал:

я знаю про 32 пики.

Значит плохо знаете :)
Повторюсь - есть они и шустрые, и жирные, и ... , и ....
И свои плюсы есть у них, относительно других, и минусы есть, и ... , и ....

Так что, не стоит так говорить, можно и обидеть кого ненароком :)

Ссылка на комментарий
Поделиться на другие сайты

ну если авр охвачен, то считай 16 поколение пиков тоже. Там разницы не существенно. 18-е уже гораздо круче. 32-е ну примерно как половина нулевого STM. Чисто как опыт, возможно и минус, но не сильно

1 minute ago, Alex said:

Значит плохо знаете :)

я промолчу. Попробуйте. Просто попробуйте

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Проба мне ничего не даст. Чтобы узнать возможности камня, достаточно заглянуть в документацию на него.
Попробовать я хочу HAL. Чтобы на одном уровне разговаривать о нём. А то могу только судить по выставленным сюда кускам кода. Пользоваться, конечно же, не собираюсь.

Ссылка на комментарий
Поделиться на другие сайты

я пожалуй чуть оговорюсь.32-е пики хорошие камни, но я цениваю их в комплексе цена/производительность. Цена решает. Производительность в порядке

ну и цену сопутчтвующего оборудования и софта я бы тоже учел. У ST бюджет старта практически околонулевой

ну и 10-битный ацп... как то уже не серьезно

у 32-го пика ценник начинается от полутора баксов за самую дохлую модель. У ст это 30 центов за то же самое. Cortex M0 48 MHz

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...