STM32 новичку в ARM что к чему
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Мяу коты.
Как записать бит из байта в отдельный пин stm32.
Вот есть функции, но они мне не подходят.
GPIO_ResetBits();
GPIO_SetBits();
Есть байт например 0b11110000(он меняется в программе), мне нужно записать 7 бит этого байта в PD9, 5 бит в РВ4 и т.д. Как это реализовать. Туплю сижу.
Как записать бит из байта в отдельный пин stm32.
Вот есть функции, но они мне не подходят.
GPIO_ResetBits();
GPIO_SetBits();
Есть байт например 0b11110000(он меняется в программе), мне нужно записать 7 бит этого байта в PD9, 5 бит в РВ4 и т.д. Как это реализовать. Туплю сижу.
- Реклама
Re: STM32 новичку в ARM что к чему
Для этого есть регистр BSRR, можно за раз записать любое количество бит не трогая все остальные.alex38779 писал(а):Как записать бит из байта в отдельный пин stm32.
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Используя маску, например, выделяете нужный бит, а по результату (ноль/!ноль) оперируете регистрами "сет-ресет", как сказано выше. Еще через бит-бандинг можно, если он присутствует.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Re: STM32 новичку в ARM что к чему
Есть байт например 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;Re: STM32 новичку в ARM что к чему
Или так
Код: Выделить всё
GPIOD->BSRR = b & 0x80 ? GPIO_BSRR_BS9 : GPIO_BSRR_BR9;
GPIOB->BSRR = b & 0x20 ? GPIO_BSRR_BS4 : GPIO_BSRR_BR4;
Иван Сусанин - первый полупроводник 
- Реклама
Re: STM32 новичку в ARM что к чему
Снова я затупил. может, кто знает, где. Был код на stm32F051. Хочу перенести на stm32F030. Но в 030 нет TIM15. Так как этот таймер мне создавал переодические прерывания и запуск АЦП, пришлось его переместить на TIM1. И вот: нет прерываний (про АЦП еще даже не смотрел).
вот обработчик...
В отладчике что-то считает. в регистре SR значение 0x001F - Все возможные флаги прерываний выставлены. Не мог же я снова перепутать название функции обработчика? ведь делаю NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn) и обработчик зовётся TIM1_BRK_UP_TRG_COM_IRQnHandler.
Добавлено after 1 hour 38 minutes 51 second:
Еще странность... при отладке не разрешает поставить брейкпоинт в этом обработчике. Причем, в соседнем - позволяет (это там где тёмно-серые поля):

Таксс. в хидерах, я не нашел вообще такого названия. Так как должен называться обработчик прерывания от 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;
} Добавлено after 1 hour 38 minutes 51 second:
Еще странность... при отладке не разрешает поставить брейкпоинт в этом обработчике. Причем, в соседнем - позволяет (это там где тёмно-серые поля):

Таксс. в хидерах, я не нашел вообще такого названия. Так как должен называться обработчик прерывания от TIM1 ?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
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;
Re: STM32 новичку в ARM что к чему
Там значение 0 - значит REP+1 = 1. Так что не влияет. Нашел - всё-таки опять напутал с названием функции. Должно было быть TIM1_BRK_UP_TRG_COM_IRQHandler(void) - без 'n'.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
Нет, не так. Update event генерируется когда RCR-1=0, то есть для генерации каждый период надо установить RCR=1. Я лично это уже проходил...uldemir писал(а):Там значение 0 - значит REP+1 = 1.
Извините, вспомнил в чем у меня была проблема - когда инициализировал таймер, не задавал значение TIM_RepetitionCounter и там был мусор.
Re: STM32 новичку в ARM что к чему
Cудя по картинке, мне как раз и нужно там 0. Если записать там 1, то update event будет происходить через раз. О, и у TIM15 тоже был такой регистр. А я и не обратил внимания.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
Подскажите сброс/установку несколько битов в регистр MODER можно сделать как то более по феншуйне( код был по меньше, а то там ещё парочку регистров настроить и растянется это все на всю страницу
)
Код: Выделить всё
#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 что к чему
Использовал поляка вариант, удобно когда кнопки на разных портах:
другой пример и хидер тут:
http://en.radzio.dxp.pl/stm32f429idisco ... oller.html
Спойлер
Код: Выделить всё
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
Re: STM32 новичку в ARM что к чему
О спасибо, я же уже натыкался на этот пример правда давненько забыл на проч про него.
Если ещё добавить X-macros на соотношение порта и пина то будет отлично.
Если ещё добавить X-macros на соотношение порта и пина то будет отлично.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Как подсчитать количество нажатий кнопки таймером?
Использую TIM2, тактирую от ETR2 (pull_up), опускаю ETR2 на землю кнопкой, запускаю таймер HAL_TIM_Base_Start(&htim2)
Значение счётчика получаю __HAL_TIM_GET_COUNTER(&htim2)
Что-то не работает увеличение счётчика TIM2 от нажатий...
Использую 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();
}
}
Никакая контра не уйдёт от нас
- КРАМ
- Друг Кота
- Сообщения: 25218
- Зарегистрирован: Чт янв 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 что к чему
[uquote="КРАМ",url="/forum/viewtopic.php?p=3103121#p3103121"]А как Вы собираетесь ликвидировать дребезг кнопки?[/uquote]
Да никак. Я просто разбираюсь таймерами STM32
Да никак. Я просто разбираюсь таймерами STM32
Никакая контра не уйдёт от нас
Re: STM32 новичку в ARM что к чему
Всем доброго времени суток. Спаял платку с STM32F071. Пока решил не разбираться детально с регистрами, сконфигурирован периферию Кубом. И вот что интересно, МК виснет, если выбрать тактирование от HSE, от HSI работает нормально. Не работал раньше с линейкой F0, и впервые конфигурирую периферию Кубом, поэтому возникают вопросы. Можно на 100% доверять конфигам периферии от Куба? Для F0, если проблемы с HSE, разве не включается автоматически HSI? Если я случайно перегрел при пайке выводы входов тактирования.
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Re: STM32 новичку в ARM что к чему
Версия Куба? Если не ошибаюсь в 20 есть баг с настройкой тактирования.
Re: STM32 новичку в ARM что к чему
Куб 4.20.1. С HSE всё оказалось до смешного банально - не заметил мелкую закоротку между ножками. Убрал - заработало HSE. Теперь та же проблема с LSE - не возводится в 1 бит LSERDY.
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Re: STM32 новичку в ARM что к чему
А почему в итоге проц не завелся от HSI? Ведь по идее, даже если "на ходу" из схемы выдрать кварц, то МК переключится на внутренний RC генератор.


