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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Мяу коты.

Как записать бит из байта в отдельный пин stm32.

Вот есть функции, но они мне не подходят.
GPIO_ResetBits();
GPIO_SetBits();

Есть байт например 0b11110000(он меняется в программе), мне нужно записать 7 бит этого байта в PD9, 5 бит в РВ4 и т.д. Как это реализовать. Туплю сижу.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

alex38779 писал(а):Как записать бит из байта в отдельный пин stm32.
Для этого есть регистр BSRR, можно за раз записать любое количество бит не трогая все остальные.
Реклама
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

Используя маску, например, выделяете нужный бит, а по результату (ноль/!ноль) оперируете регистрами "сет-ресет", как сказано выше. Еще через бит-бандинг можно, если он присутствует.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

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

Сообщение zöner »

Есть байт например 0b11110000(он меняется в программе), мне нужно записать 7 бит этого байта в PD9, 5 бит в РВ4 и т.д. Как это реализовать. Туплю сижу.

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

if (b & 0x80) GPIOD->BSRR = 1 << 9; else GPIOD->BRR = 1 << 9;
if (b & 0x20) GPIOB->BSRR = 1 << 4; else GPIOB->BRR = 1 << 4;
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

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

Сообщение Myp3ik »

Или так

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

GPIOD->BSRR = b & 0x80 ? GPIO_BSRR_BS9 : GPIO_BSRR_BR9;
GPIOB->BSRR = b & 0x20 ? GPIO_BSRR_BS4 : GPIO_BSRR_BR4;
Иван Сусанин - первый полупроводник :solder:
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Снова я затупил. может, кто знает, где. Был код на stm32F051. Хочу перенести на stm32F030. Но в 030 нет TIM15. Так как этот таймер мне создавал переодические прерывания и запуск АЦП, пришлось его переместить на TIM1. И вот: нет прерываний (про АЦП еще даже не смотрел).

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

// TIM1 - timebase
  TIM1->CR1 &= ~TIM_CR1_CEN ; // disable timer
  TIM1->PSC = 0;
  TIM1->ARR = 20000-1; // 8MHz / 20000 = 400Hz 
  TIM1->CR1 |= TIM_CR1_URS | TIM_CR1_ARPE ; // only overfow generate UEV
  TIM1->DIER |= TIM_DIER_UIE; // Update interrupt 1 for enable.
  TIM1->CR1  |= TIM_CR1_CEN   ; //enable timer
  TIM1->CR2 |= TIM_CR2_MMS_1 ; // trigger update event    
  NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); 
вот обработчик...

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

void TIM1_BRK_UP_TRG_COM_IRQnHandler(void) {
         
    TIM1->SR &= (uint32_t) (~TIM_SR_UIF);
    flag.tick = 1;
} 
В отладчике что-то считает. в регистре SR значение 0x001F - Все возможные флаги прерываний выставлены. Не мог же я снова перепутать название функции обработчика? ведь делаю NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn) и обработчик зовётся TIM1_BRK_UP_TRG_COM_IRQnHandler.

Добавлено after 1 hour 38 minutes 51 second:
Еще странность... при отладке не разрешает поставить брейкпоинт в этом обработчике. Причем, в соседнем - позволяет (это там где тёмно-серые поля):
Изображение

Таксс. в хидерах, я не нашел вообще такого названия. Так как должен называться обработчик прерывания от TIM1 ?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

TIM1 немного отличается от других таймеров. У него надо еще задавать количество повторений в регистре RCR, иначе update event не будет происходить.
Спойлер

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

  uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounter
                                       reaches zero, an update event is generated and counting restarts
                                       from the RCR value (N).
                                       This means in PWM mode that (N+1) corresponds to:
                                          - the number of PWM periods in edge-aligned mode
                                          - the number of half PWM period in center-aligned mode
                                       This parameter must be a number between 0x00 and 0xFF. 
                                       @note This parameter is valid only for TIM1. */
} TIM_TimeBaseInitTypeDef;       
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Там значение 0 - значит REP+1 = 1. Так что не влияет. Нашел - всё-таки опять напутал с названием функции. Должно было быть TIM1_BRK_UP_TRG_COM_IRQHandler(void) - без 'n'.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

uldemir писал(а):Там значение 0 - значит REP+1 = 1.
Нет, не так. Update event генерируется когда RCR-1=0, то есть для генерации каждый период надо установить RCR=1. Я лично это уже проходил...
Извините, вспомнил в чем у меня была проблема - когда инициализировал таймер, не задавал значение TIM_RepetitionCounter и там был мусор.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Cудя по картинке, мне как раз и нужно там 0. Если записать там 1, то update event будет происходить через раз. О, и у TIM15 тоже был такой регистр. А я и не обратил внимания.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Подскажите сброс/установку несколько битов в регистр MODER можно сделать как то более по феншуйне( код был по меньше, а то там ещё парочку регистров настроить и растянется это все на всю страницу :shock: )

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


#define PIN_F1 			15
#define PIN_F2 			14
#define PIN_F3 			13
#define PIN_F4 			12

#define MASK_KEY2	((1<<PIN_F1)|(1<<PIN_F2)|(1<<PIN_F3)|(1<<PIN_F4))

#define KEY_PORT2	GPIOB


    KEY_PORT2->MODER  &= ~(GPIO_MODER_MODER0 << (PIN_F1 * 2)
						|GPIO_MODER_MODER0 << (PIN_F2 * 2)
						|GPIO_MODER_MODER0 << (PIN_F3 * 2)
						|GPIO_MODER_MODER0 << (PIN_F4 * 2)
						);
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

Использовал поляка вариант, удобно когда кнопки на разных портах:
Спойлер

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

static  GPIO_TypeDef * const KeyGPIOInitTable[] = {
		GPIOC, GPIOC, GPIOC, GPIOC, GPIOA, 
		0
};
static uint8_t const KeyPINInitTable[] = {
		5, 10, 11, 12, 15,
		0
};

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

void gpio_conf(GPIO_TypeDef *GPIO, uint8_t pin, uint8_t mode, uint8_t type, uint8_t speed, uint8_t pullup, uint8_t af)
{
    GPIO->MODER = (GPIO->MODER & MASK2BIT(pin)) | (mode << (pin * 2));
    GPIO->OTYPER = (GPIO->OTYPER & MASK1BIT(pin)) | (type << pin);
    GPIO->OSPEEDR = (GPIO->OSPEEDR & MASK2BIT(pin)) | (speed << (pin * 2));
    GPIO->PUPDR = (GPIO->PUPDR & MASK2BIT(pin)) | (pullup << (pin * 2));
    if (pin > 7)
    {
		GPIO->AFR[1] = (GPIO->AFR[1] & AFMASKH(pin)) | (af << ((pin - 8) * 4));
    }
    else
    {
		GPIO->AFR[0] = (GPIO->AFR[0] & AFMASKL(pin)) | (af << ((pin)*4));
    }
}

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

....................
	while(KeyGPIOInitTable[i] != 0)
	{
		gpio_conf(KeyGPIOInitTable[i], KeyPINInitTable[i], MODE_INPUT, TYPE_PUSHPULL, SPEED_2MHz, PULLUP_UP, 0);
		i++;
	}
..................
другой пример и хидер тут:
http://en.radzio.dxp.pl/stm32f429idisco ... oller.html
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

О спасибо, я же уже натыкался на этот пример правда давненько забыл на проч про него. :(
Если ещё добавить X-macros на соотношение порта и пина то будет отлично. :))
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Как подсчитать количество нажатий кнопки таймером?
Использую TIM2, тактирую от ETR2 (pull_up), опускаю ETR2 на землю кнопкой, запускаю таймер HAL_TIM_Base_Start(&htim2)
Значение счётчика получаю __HAL_TIM_GET_COUNTER(&htim2)
Что-то не работает увеличение счётчика TIM2 от нажатий...

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

/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
  sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
  sClockSourceConfig.ClockFilter = 0;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}
Никакая контра не уйдёт от нас
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

[uquote="prinv",url="/forum/viewtopic.php?p=3102851#p3102851"]Как подсчитать количество нажатий кнопки таймером?[/uquote]
А как Вы собираетесь ликвидировать дребезг кнопки?
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3103121#p3103121"]А как Вы собираетесь ликвидировать дребезг кнопки?[/uquote]
Да никак. Я просто разбираюсь таймерами STM32 :)))
Никакая контра не уйдёт от нас
Аватара пользователя
Porada
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Сб авг 22, 2015 08:32:37
Откуда: Киев

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

Сообщение Porada »

Всем доброго времени суток. Спаял платку с STM32F071. Пока решил не разбираться детально с регистрами, сконфигурирован периферию Кубом. И вот что интересно, МК виснет, если выбрать тактирование от HSE, от HSI работает нормально. Не работал раньше с линейкой F0, и впервые конфигурирую периферию Кубом, поэтому возникают вопросы. Можно на 100% доверять конфигам периферии от Куба? Для F0, если проблемы с HSE, разве не включается автоматически HSI? Если я случайно перегрел при пайке выводы входов тактирования.
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

Версия Куба? Если не ошибаюсь в 20 есть баг с настройкой тактирования.
Аватара пользователя
Porada
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Сб авг 22, 2015 08:32:37
Откуда: Киев

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

Сообщение Porada »

Куб 4.20.1. С HSE всё оказалось до смешного банально - не заметил мелкую закоротку между ножками. Убрал - заработало HSE. Теперь та же проблема с LSE - не возводится в 1 бит LSERDY.
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

А почему в итоге проц не завелся от HSI? Ведь по идее, даже если "на ходу" из схемы выдрать кварц, то МК переключится на внутренний RC генератор.
Ответить

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