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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Если писались 16-битные инициализация не прошла бы.
Реклама
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

если Вы имнеете ввиду, что по 16-битной шине передаются:
LCD_WR_REG(0xff81); 0xff81
LCD_WR_DATA(0x09); 0x0009
то - да, 16+16 = 32
но по сути-то в регистр с адресом ff81 передается 09
что не вяжется с фразой:
"...Видно что в регистр должны писаться 32-битные данные..."
Реклама
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Все понял, спасибо!!!
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Сообщение ivan dimir »

[uquote="mvm",url="/forum/viewtopic.php?p=1195294#p1195294"]Активно пользуюсь PIC'ами, хочу разобраться с STM32 естественно с минимальными затратами.
Читал разного. Но хочется услышать совета людей, которые прошли через это.
Самый простой программатор (может что-то типа пиковского клона существует) или варианты...
Не нашел STM32 в протеусе.
Мне действительно важны Ваши рекомендации. Заранее спасибо.[/uquote]
не получится.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Кто разобрался нормально с CAN-шиной?
Меня смущает поле CAN2SB[5:0] регистра CAN-›FMR: зачем оно вообще нужно, если у STM32F0x2 нет CAN2?
Нужно ли вообще что-нибудь в это поле писать при инициализации фильтров, если мне их N штук надо?
Завел два фильтра вот так:

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

    CAN->FMR = CAN_FMR_FINIT;
    CAN->FA1R = CAN_FA1R_FACT0 | CAN_FA1R_FACT1; 
    CAN->sFilterRegister[0].FR1 = (1<<21)|(1<<5); // all odd IDs
    CAN->FFA1R = 2; // filter 1 for FIFO1, filter 0 - for FIFO0
    CAN->sFilterRegister[1].FR1 = (1<<21); // all even IDs
    CAN->FMR &=~ CAN_FMR_FINIT; 
принимает и четные, и нечетные идентификаторы...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Сообщение 240265 »

С CAN не работал но может быть из за этого :

CAN2SB[5:0] (биты 13:8): CAN2 Start Bank. Эти биты устанавливаются и очищаются программой. Они определяют начальный банк для интерфейса CAN2 (Slave) в диапазоне от 0 до 27.

Примечание: когда CAN2SB[5:0] = 28d, могут быть использованы все фильтры для CAN1. Когда CAN2SB[5:0] = 0, то для CAN1 не назначено ни одного фильтра.

http://microsin.net/programming/arm/stm ... bxcan.html

Добавлено after 3 minutes 23 seconds:
Хотя в референсе CAN_FMR вообще пустой. Х.З.

Добавлено after 1 minute 50 seconds:
CAN filter master register (CAN_FMR)
Address offset: 0x200
Reset value: 0x2A1C 0E01
All bits of this register are set and cleared by software.
IVL ex UA6PJ
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

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

Сообщение baghear »

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

Сообщение pinchemierda »

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

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

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

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

Сообщение WiseLord »

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

Сообщение VladislavS »

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

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

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

Сообщение Eddy_Em »

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

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

Сообщение uldemir »

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

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

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

Сообщение uldemir »

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

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