Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 новичку в ARM что к чему

Вс апр 12, 2020 17:20:11

Да ладно, проехали!
Я уже написал процедуру установки/удаления фильтров. Все нормально работает.
Единственное, что неудобно — нумерация, которую дает STM32 фильтрам: (CAN->RDTR >> 8) & 0xff. Оно считает все потенциальные фильтры. И когда у меня работа идет с 11-битными идентификаторами, CAN->sFilterRegister[bankno] считается как 4 фильтра в режиме list и 2 фильтра в режиме mask, несмотря на то, что там внутри вообще ничего может не быть (и фильтр может быть деактивирован)...
Думал поначалу эту информацию использовать, но вижу, что от нее толку нет. Вот возможность указать FIFO# в фильтре должна быть — при больших потоках данных и необходимости принимать все пакеты, можно все четные идентификаторы отправить на FIFO0, а нечетные — на FIFO1. Тогда меньше будет шансов что-то пропустить.
Скажем, в моем термомониторинге я замечал, что на "широковещательную" команду отвечает меньше половины — видимо, мастер не успевает все запросы принять, обработать в нужном виде и отправить по USB на хост. Поэтому там вместо широковещательных команд пришлось использовать адресные с поочередным перебором...

Re: STM32 новичку в ARM что к чему

Пт апр 17, 2020 22:52:50

Добрый день, подскажите чтто значит вопросительный знак возле файла стартапа?
https://prnt.sc/s1is57

Re: STM32 новичку в ARM что к чему

Вт май 19, 2020 22:10:53

Подскажите, пожалуйста! Настраиваю у stm32f103 DMA SPI в режиме мастера (8 бит) на передачу и приём.
В итоге данные в приёмном буфере отстают от передаваемых данных на один байт. В первом байте приёмного буфера всегда мусор, а полезные данные сдвинуты вправо на 1 байт. Будто после передачи первого байта dma, не дожидаясь флага RXNE, начинает передавать следующий байт.
В чём причина и как наладить?

Re: STM32 новичку в ARM что к чему

Пт июл 03, 2020 21:42:57

А как правильно сделать тривиальнейшую вещь - приём по UART. Проблема в том, что пока я проект начал делать с использованием HAL. Так вот функция приёма меня совершенно не удовлетворяет. Хочу просто - все принимаемые байты запихивать в кольцевой буфер (по прерыванию от приёма байта), и потом, в своём userland-е их оттуда выковыривать. И, смотрю, что я нигде не могу вклинить свою функцию. Вклиниться могу вот здесь:
Код:
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */

  /* USER CODE END USART3_IRQn 1 */
}
Но если я заберу данные в первой врезке - поломается функция HAL_UART_IRQHandler или еще хуже, оно может утащить второй байт, а во второй врезке, уже за поздно. В самой функции HAL_UART_IRQHandler мест для вставки usercode нет. Есть только callback, но он вызывается только по приёму заданного количества байт. делать, как написано во всевозможных "уроках", его равным 1 как-то не тянет - как-то не красиво получается.

Неужели в этом HAL всё делается только через одно место? i2c мастер мне показался гораздо внятнее. хотя, может, со слейвом возникли бы такие же проблемы...

Re: STM32 новичку в ARM что к чему

Сб июл 04, 2020 06:20:11

Мыши плакали, кололись, но продолжали жевать кактус.

Код:
void USART1_IRQHandler(void)

  uint32_t sr = USART1->SR;
  if(sr & USART_SR_RXNE)
  { // причина прерывания окончание приема
    uint8_t data = USART1->DR;   
    if(sr & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE))
    { //была ошибка в приеме байта
      ...
    }
    else
    { // принят байт
      ... делаем с data что хотим
    } 
  } 
}

Re: STM32 новичку в ARM что к чему

Сб июл 04, 2020 07:05:28

Вопрос не в том, как написать обработчик - это я умею, а в том, как его правильно подсунуть в существующую систему, чтобы не поломать остальное. Если я у себя объявлю void USART3_IRQHandler(void), что линкер скажет на такой же обработчик, который уже находится в stm32_f4xx_it.c ? он же не weak. И ни одна из функций в цепочке обработки void USART3_IRQHandler(void) -> void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) -> static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) не являются таковой. В принципе, я бы хотел подменить именно последнюю функцию.

Про мышей не надо. Я и сам на распутье. Хотелось бы быстро поднять систему, не вникая особенно в некоторые нюансы - потому и HAL, но уже вижу, что система начинает подозрительно быстро достигать "халявного лимита" в 32к в Keil (а другие IDE слишком тормозят на моих компах). Можно было бы и ручками всё написать, но это потребует больше времени пока напишу и отлажу.

Re: STM32 новичку в ARM что к чему

Сб июл 04, 2020 11:16:22

Если мне не изменяет память, генерировать "стандартный" обработчик вообще не обязательно. Где-то в cubemx можно снять соответствующую галочку, и писать чисто свой обработчик.

Re: STM32 новичку в ARM что к чему

Вс июл 05, 2020 01:05:42

Если я у себя объявлю void USART3_IRQHandler(void), что линкер скажет на такой же обработчик, который уже находится в stm32_f4xx_it.c ? он же не weak.
Оставить только свой обработчик Заратустра не позволяет? Вы программист или сторонний наблюдатель?

Re: STM32 новичку в ARM что к чему

Вс июл 05, 2020 12:48:53

Куб делает из программистов сторонних наблюдателей, т. к. слишком много решает за них.

Re: STM32 новичку в ARM что к чему

Вс июл 05, 2020 13:05:04

Я бы проще сказал: программисты калокуб не используют, эта поделка — для вчерашних ардуинщиков.

Re: STM32 новичку в ARM что к чему

Вт июл 14, 2020 02:49:13

Добрый день. Помогите пожалуйста найти где косяк с кодом. Суть в следующем: МК STM32F030F4P6 должен по приходу команды от главного устройства засыпать на 5 минут. По прошествии пяти минут он опять просыпается, измеряет температуру и ждёт когда мастер запросит данные и снова пришлёт команду заснуть на 5 минут. Загвоздка именно с сном. Пишу на CMSIS, использую код из Snippetsов. Почему-то время сна не такое как надо. Пробовал и с секундами. Например ставлю 21 секунду сна. Первый раз просыпается через 21 секунду, а далее через 1 минуту и 1 секунду. При просыпании в терминал кидаются какие-то ноли и маленькие буквы A, хотя должен кидать отладочную инфу.
Код:
//===========//
__INLINE void Configure_RTC(void)
{
uint32_t alarm;
  /* Enable the peripheral clock RTC */
  /* (1) Enable the LSI */
  /* (2) Wait while it is not ready */
  /* (3) Enable PWR clock */
  /* (4) Enable write in RTC domain control register */
  /* (5) LSI for RTC clock */
  /* (6) Disable PWR clock */
  RCC->CSR |= RCC_CSR_LSION; /* (1) */
  while((RCC->CSR & RCC_CSR_LSIRDY)!=RCC_CSR_LSIRDY) /* (2) */
  {
    /* add time out here for a robust application */
  }
  RCC->APB1ENR |= RCC_APB1ENR_PWREN; /* (3) */
  PWR->CR |= PWR_CR_DBP; /* (4) */
  RCC->BDCR = (RCC->BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_1; /* (5) */
  RCC->APB1ENR &=~ RCC_APB1ENR_PWREN; /* (7) */

  /* Configure RTC */
  /* (7) Write access for RTC regsiters */
  /* (8) Disable alarm A to modify it */
  /* (9) Wait until it is allow to modify alarm A value */
  /* (10) Modify alarm A mask to have an interrupt each 1Hz */
  /* (11) Enable alarm A and alarm A interrupt */
  /* (12) Disable write access */
  RTC->WPR = 0xCA; /* (7) */
  RTC->WPR = 0x53; /* (7) */
  RTC->CR &=~ RTC_CR_ALRAE; /* (8) */
  while((RTC->ISR & RTC_ISR_ALRAWF) != RTC_ISR_ALRAWF) /* (9) */
  {
    /* add time out here for a robust application */
  }
   //alarm = (0x0021);  // 21 секунда
   alarm =   ((uint32_t)5 << 8) ; // 5 минут
   RTC->ALRMAR |= alarm;
   RTC->ALRMAR = RTC_ALRMAR_MSK4 | RTC_ALRMAR_MSK3 ; // день и часы не участвуют в сравнении
   RTC->CR = RTC_CR_ALRAIE | RTC_CR_ALRAE; /* (11) */
   RTC->WPR = 0xFE; /* (12) */
   RTC->WPR = 0x64; /* (12) */
 
  /* Configure exti and nvic for RTC IT */
  /* (13) unmask line 17 */
  /* (14) Rising edge for line 17 */
  /* (15) Set priority */
  /* (16) Enable RTC_IRQn */
  EXTI->IMR |= EXTI_IMR_MR17; /* (13) */
  EXTI->RTSR |= EXTI_RTSR_TR17; /* (14) */
  NVIC_SetPriority(RTC_IRQn, 0); /* (15) */
  NVIC_EnableIRQ(RTC_IRQn); /* (16) */
}

/**
  * @brief  This function configures RTC.
  * @param  uint32_t New time
  * @retval None
  */
__INLINE void Init_RTC_time(uint32_t Time)
{
  /* RTC init mode */
  /* Configure RTC */
  /* (1) Write access for RTC registers */
  /* (2) Enable init phase */
  /* (3) Wait until it is allow to modify RTC register values */
  /* (4) set prescaler, 40kHz/128 => 312 Hz, 312Hz/312 => 1Hz */
  /* (5) New time in TR */
  /* (6) Disable init phase */
  /* (7) Disable write access for RTC registers */
  RTC->WPR = 0xCA; /* (1) */
  RTC->WPR = 0x53; /* (1) */
  RTC->ISR |= RTC_ISR_INIT; /* (2) */
  while((RTC->ISR & RTC_ISR_INITF)!=RTC_ISR_INITF) /* (3) */
  {
    /* add time out here for a robust application */
  }
  RTC->PRER = 0x007F0137; /* (4) */
  RTC->TR = RTC_TR_PM | Time; /* (5) */
  RTC->ISR &=~ RTC_ISR_INIT; /* (6) */
  RTC->WPR = 0xFE; /* (7) */
  RTC->WPR = 0x64; /* (7) */
}

Далее в main:
Код:
       SysTick_Config(48000);/* 1ms config for sys clock 48MHz */

   USART1_Init();
   delay_ms(100);

   if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
  {
    RTC->ISR &=~ RTC_ISR_ALRAF; // clear flag
    EXTI->PR |= EXTI_PR_PR17; // clear exti line 17 flag
   UART1_Transmit_string("\nRTC_Alarm");
  }
  else
  {
    NVIC_DisableIRQ(RTC_IRQn);// Disable RTC_IRQn
  }
   Configure_RTC();
   Init_RTC_time(0);

   
   UART1_Transmit_string("Entering SB\n");
   delay_ms(100);
      // Select STANDBY mode
  PWR->CR |= PWR_CR_PDDS;
  // Set SLEEPDEEP bit of Cortex-M0 System Control Register
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  // Request Wait For Interrupt
   delay_ms(100);
  __WFI();

Re: STM32 новичку в ARM что к чему

Вс июл 19, 2020 17:57:11

Скажите снова тупой вопрос... у STM32 есть уже готовый макрос для получения Bit-Band адреса? А то переношу проект с msp432 на stm32f405 и перестало понимать макрос BITBAND_PERI. Может какой инклюд добавить надо? Или у ST такого не существует, так поиск в гугле даёт только ссылки на "персональные" реализации такого макроса под разными именами. Не хотелось бы плодить очередной велосипед...

Re: STM32 новичку в ARM что к чему

Вт июл 21, 2020 07:45:51

В референс-мануале дана формула для расчета: bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4). Просто запишите ее в виде макроса - и будет вам щасьтье.

Re: STM32 новичку в ARM что к чему

Вт июл 21, 2020 10:47:20

Спасибо, формулу я знаю. просто и cyprees, и TI со своими хедерами этот макрос предоставляли. Вот и удивляюсь, неужели ST не осчастливил своих клиентов?

Re: STM32 новичку в ARM что к чему

Вт июл 21, 2020 12:45:35

Поскольку СТМ берут дешевизной, то остальное - приходится допиливать руками счастливых покупателей. А с тех пор, как в ST понабрали кучу индусов (в прямом смысле слова), сопровождение СТМов стало вообще просто ужасным. И чем новее МК, тем меньше выбора остается...
Я тоже в свое время бы удивлен - почему не вписали макросы битбандинга. Ведь написали же бесполезные макросы SET_BIT и особенно READ_REG... В принципе, я вписал макрос битбандинга в этот же заголовочник, как раз под теми макросами.

Re: STM32 новичку в ARM что к чему

Вт июл 21, 2020 15:06:41

Питание, по крайней мере, хотя бы заголовочные файлы с расписанными регистрами есть!
А вот для STM8 мне пришлось ручками все писать по мере продвижения...

Re: STM32 новичку в ARM что к чему

Пт июл 24, 2020 17:08:50

Поскольку СТМ берут дешевизной

СТМ ни разу не дешев - обычные цены соответствующие уровню чипа (точнее его площади). Дешевыми являются китайские клоны.

Re: STM32 новичку в ARM что к чему

Пт июл 24, 2020 17:44:07

КРАМ писал(а):СТМ ни разу не дешев - обычные цены соответствующие уровню чипа (точнее его площади).
Видимо имелось в виду цена/производительность/возможности.
К примеру STM32 можно купить по той же цене что AVR8, но при этом у STM32 производительность выше, периферия функциональнее, есть отладка и т. д.

КРАМ писал(а):Дешевыми являются китайские клоны.
Они появились недавно и не для всех МК, в то время как мощный STM32H750VBT6 в Китае стоит около 3.5$.

Re: STM32 новичку в ARM что к чему

Пт июл 24, 2020 22:05:10

Они появились недавно и не для всех МК, в то время как мощный STM32H750VBT6 в Китае стоит около 3.5$.

Если учесть, что цена у производителя в партиях 10К+ составляет $3,62 , то возникает вопрос о происхождении розничной цены в Китае...
Клоны, это не только дженерики, это еще и сверхтиражный выпуск и просто копии.
Ставить такое в серийную продукцию ни один уважающий себя разработчик не будет.
Сравнивать STM32 с допотопными Мегами не по-пацански.
По современным меркам ниша мощных СТМ32 - телематические терминалы и прочая аналогичная по функционалу продукция. Младшие СТМ32 ничем особенным на фоне современных чипов других производителей не выделяются.

Re: STM32 новичку в ARM что к чему

Чт июл 30, 2020 23:44:09

Здравствуйте. Подскажите кто сталкивался. Прислали китайцы STM32F107, ревизия "А".
Гугль ничего про такую не знает, ST-Link ее не видит. Тестером соответстующие ноги питания между собой не прозваниваются, в отличии от ревизии Z.

Посмотрел, корме обычных "Z" у китайцев есть разные ревизии - "A", "X", "1".
Что за ерунда такая? Чем они отличаются от ревизии Z?
Ответить