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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

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

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

Сообщение baghear »

Добрый день, подскажите чтто значит вопросительный знак возле файла стартапа?
https://prnt.sc/s1is57
pinchemierda
Встал на лапы
Сообщения: 130
Зарегистрирован: Ср мар 22, 2017 09:52:52

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

Сообщение pinchemierda »

Подскажите, пожалуйста! Настраиваю у stm32f103 DMA SPI в режиме мастера (8 бит) на передачу и приём.
В итоге данные в приёмном буфере отстают от передаваемых данных на один байт. В первом байте приёмного буфера всегда мусор, а полезные данные сдвинуты вправо на 1 байт. Будто после передачи первого байта dma, не дожидаясь флага RXNE, начинает передавать следующий байт.
В чём причина и как наладить?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

А как правильно сделать тривиальнейшую вещь - приём по 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 мастер мне показался гораздо внятнее. хотя, может, со слейвом возникли бы такие же проблемы...
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

Код: Выделить всё

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 что хотим
    } 
  } 
}
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Вопрос не в том, как написать обработчик - это я умею, а в том, как его правильно подсунуть в существующую систему, чтобы не поломать остальное. Если я у себя объявлю 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 слишком тормозят на моих компах). Можно было бы и ручками всё написать, но это потребует больше времени пока напишу и отлажу.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Если мне не изменяет память, генерировать "стандартный" обработчик вообще не обязательно. Где-то в cubemx можно снять соответствующую галочку, и писать чисто свой обработчик.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=3863015#p3863015"]Если я у себя объявлю void USART3_IRQHandler(void), что линкер скажет на такой же обработчик, который уже находится в stm32_f4xx_it.c ? он же не weak.[/uquote]Оставить только свой обработчик Заратустра не позволяет? Вы программист или сторонний наблюдатель?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Куб делает из программистов сторонних наблюдателей, т. к. слишком много решает за них.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Я бы проще сказал: программисты калокуб не используют, эта поделка — для вчерашних ардуинщиков.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Руслан_cnc
Родился
Сообщения: 1
Зарегистрирован: Вт июл 14, 2020 02:27:49

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

Сообщение Руслан_cnc »

Добрый день. Помогите пожалуйста найти где косяк с кодом. Суть в следующем: МК 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();
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

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

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

Сообщение Питание »

В референс-мануале дана формула для расчета: bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4). Просто запишите ее в виде макроса - и будет вам щасьтье.
Почти все плюсы в свою карму и в рейтинги сообщения поставил себе сам, своими же созданными для этих целей клонами. aen
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Спасибо, формулу я знаю. просто и cyprees, и TI со своими хедерами этот макрос предоставляли. Вот и удивляюсь, неужели ST не осчастливил своих клиентов?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Питание
Открыл глаза
Сообщения: 63
Зарегистрирован: Пт июн 26, 2020 16:33:29

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

Сообщение Питание »

Поскольку СТМ берут дешевизной, то остальное - приходится допиливать руками счастливых покупателей. А с тех пор, как в ST понабрали кучу индусов (в прямом смысле слова), сопровождение СТМов стало вообще просто ужасным. И чем новее МК, тем меньше выбора остается...
Я тоже в свое время бы удивлен - почему не вписали макросы битбандинга. Ведь написали же бесполезные макросы SET_BIT и особенно READ_REG... В принципе, я вписал макрос битбандинга в этот же заголовочник, как раз под теми макросами.
Почти все плюсы в свою карму и в рейтинги сообщения поставил себе сам, своими же созданными для этих целей клонами. aen
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Питание, по крайней мере, хотя бы заголовочные файлы с расписанными регистрами есть!
А вот для STM8 мне пришлось ручками все писать по мере продвижения...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25122
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="Питание",url="/forum/viewtopic.php?p=3869561#p3869561"]Поскольку СТМ берут дешевизной[/uquote]
СТМ ни разу не дешев - обычные цены соответствующие уровню чипа (точнее его площади). Дешевыми являются китайские клоны.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

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

КРАМ писал(а):Дешевыми являются китайские клоны.
Они появились недавно и не для всех МК, в то время как мощный STM32H750VBT6 в Китае стоит около 3.5$.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25122
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="Мурик",url="/forum/viewtopic.php?p=3870888#p3870888"]Они появились недавно и не для всех МК, в то время как мощный STM32H750VBT6 в Китае стоит около 3.5$.[/uquote]
Если учесть, что цена у производителя в партиях 10К+ составляет $3,62 , то возникает вопрос о происхождении розничной цены в Китае...
Клоны, это не только дженерики, это еще и сверхтиражный выпуск и просто копии.
Ставить такое в серийную продукцию ни один уважающий себя разработчик не будет.
Сравнивать STM32 с допотопными Мегами не по-пацански.
По современным меркам ниша мощных СТМ32 - телематические терминалы и прочая аналогичная по функционалу продукция. Младшие СТМ32 ничем особенным на фоне современных чипов других производителей не выделяются.
B_Oleg
Родился
Сообщения: 2
Зарегистрирован: Чт июл 30, 2020 23:12:27

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

Сообщение B_Oleg »

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

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

Вернуться в «ARM»