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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Те, что внутри IARа... "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\inc\ST\iostm32f051x8.h"
Аналогично приходилось писать и под STM8L.

Возможно я туп, но никак не могу въехать в SPLовскую структуру.

Пока нашел только что CC1S надо прописывать пока CC1E не установлен в 1. Но это не помогает. Пробник на этих двух выводах ничего не показывает. На порты тактирование подал. Порты как GPIO работают, если MODERx = 1.
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Вот ещё вопрос созрел, чистое любопытство :) .
Как присвоить переменной значение регистра конкретного пина порта (чтоб в переменной был либо "0" либо "1"). Пока делаю только структуру из:

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

if((GPIOA->IDR & GPIO_IDR_1) == 0) then {(условие при пин = 0);} else{(условие при пин = 1);};

Просто таким макаром мы переводим ресурс МК лишним "IF"...
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

В тех хедерах, что я пользуюсь, это выглядит так

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

test = GPIOA_IDR_bit.IDR1
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uldemir писал(а):В тех хедерах, что я пользуюсь, это выглядит так

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

test = GPIOA_IDR_bit.IDR1



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

test = (GPIOA->IDR & GPIO_IDR_1)


Надо не забывать, в С все что не 0 True ...
Последний раз редактировалось dosikus Вт фев 24, 2015 07:33:46, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Можете выложить свой чудо-хидер? хочу посмотреть как там реализовано обращение к битовым полям.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uk8amk , обычная структура с битовыми полями .
Что привычно выходцам с 8ми биток . Мне так уже глаза режет ...

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

/* Port input data register (GPIOx_IDR) (x=A..E) */
typedef struct {
  __REG32  IDR0           : 1;
  __REG32  IDR1           : 1;
  __REG32  IDR2           : 1;
  __REG32  IDR3           : 1;
  __REG32  IDR4           : 1;
  __REG32  IDR5           : 1;
  __REG32  IDR6           : 1;
  __REG32  IDR7           : 1;
  __REG32  IDR8           : 1;
  __REG32  IDR9           : 1;
  __REG32  IDR10          : 1;
  __REG32  IDR11          : 1;
  __REG32  IDR12          : 1;
  __REG32  IDR13          : 1;
  __REG32  IDR14          : 1;
  __REG32  IDR15          : 1;
  __REG32                 :16;
} __gpio_idr_bits;
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Если как в SPL объявляется структура
__gpio_bits MyStruct;
Заполняется
MyStruct.ODR0 = 1;
И передаётся в порт
GPIOA->ODR = MyStruct
То вопросов нет.

Просто мне почему-то показалось что запись
TIM16_OCMR1_bit.OC1M = 7; // PWM mode 2 inactive until TIMx_CNT<TIMx_CCR1 else active
Напрямую работает с регистром таймера.
Как подобное сотворить с отдельно взятыми битами через bit-band я знаю. А вот что делать с битовыми полями.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

uk8amk писал(а):Просто мне почему-то показалось что запись
TIM16_OCMR1_bit.OC1M = 7; // PWM mode 2 inactive until TIMx_CNT<TIMx_CCR1 else active
Напрямую работает с регистром таймера.

Она и работает напрямую. Читает, модифицирует и записывает. Если несмотреть на оптимальность, то работать, ведь, должно?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Вот и я хочу глянуть как оно там изнутри работает.
Только качать весь IAR ради этого не очень целесообразно.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uk8amk писал(а):Если как в SPL объявляется структура
__gpio_bits MyStruct;
Заполняется
MyStruct.ODR0 = 1;
И передаётся в порт
GPIOA->ODR = MyStruct
То вопросов нет.


В SPL передаются данные через структуру и работа с битами на уровне масок . Здесь же представление регистра в виде структуры с битовыми полями.
Бросайте SPL , мой вам совет. Иначе будет еще хуже..
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

SPL и так не использую. Ну иногда бывает конечно по мелочи подсмотреть надо.

Я просто пытаюсь разобраться. Если допустим я объявляю структуру, то она кладётся в область ОЗУ. Чтобы структуру натянуть на адрес конкретного периферийного порта, нужно создать секцию памяти в скрипте линкера и объявлять с соответствующими атрибутами. Причём если порты идут не последовательно, потребуется создать соответствующее кол-во секций. И могут появиться проблемы при невыровненном доступе к данным(а многие модули периферии его не поддерживают).
Через указатели в этом плане конечно проще. Что-то вроде такого:
TIM1_CR1->CEN = 1;
Да и подобная запись весьма удобна. К примеру пишешь TIM1_CR1-> и у тебя сразу вываливается список битовых полей. Не надо по каждому чиху лезть в CMSIS и искать куда же запропастилось объявление этого бита.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uk8amk Не битовых полей а именованных констант, кои в данном случае являются битовыми масками.

uldemir, Кстати MISRA против битовых полей , так что мои рвотные рефлексы на IAR'вский код весьма обоснованы . :)))
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Апсалютно блева на ваши рвотные рефлексы. Лучше кто-нибудь подсказал бы почему у меня на выходе TIM16_CH1 ничего нет.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

А ты думаешь твой код читаем ? Тебе в лом писать как общепринято , мне в лом включать IAR ,создавать проект ...
Например не вижу включения тактирования - ни таймера ни порта ... :)))

К тому же на предыдущих страницах был код инита таймеров и выходов и даже на TIM16 ...
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

dosikus писал(а):Надо не забывать, в С все что не 0 True ...

Можно, конечно, сохранять значение и в условии потом проверять на соответствие и несоответствие нулю, но может ведь встать задача получить именно единицу при положительном потенциале на выводе МК. Тогда такая структура заведёт нас куды подальше :) .

uldemir писал(а):Лучше кто-нибудь подсказал бы почему у меня на выходе TIM16_CH1 ничего нет.


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

RCC->AHBENR |= (RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOAEN);
    RCC->APB2ENR |= RCC_APB2ENR_TIM16EN;
         
   GPIOA->MODER |= GPIO_MODER_MODER6_1;
   GPIOB->MODER |= GPIO_MODER_MODER6_1;
   GPIOA->AFR[0] |= 0x05000000;
   GPIOB->AFR[0] |= 0x02000000;
   GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR6;
   GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR6;

   TIM16->CR1 |= TIM_CR1_ARPE;
   TIM16->CR2 |= TIM_CR2_OIS1N;
   TIM16->CR2 |= TIM_CR2_OIS1;
   TIM16->PSC = 8000 - 1;
  TIM16->CCMR1 |= TIM_CCMR1_OC1M_1| TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE;
   TIM16->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1NE;
   TIM16->ARR = 100;
  TIM16->CCR1 = 50;
   TIM16->BDTR |= TIM_BDTR_MOE; // Dead-Time
   TIM16->BDTR |= TIM_BDTR_AOE; // Dead-Time
   TIM16->BDTR |= TIM_BDTR_DTG_1 | TIM_BDTR_DTG_4 | TIM_BDTR_DTG_5; // Dead-Time
  TIM16->CR1 |= TIM_CR1_CEN; // запуск таймера
   //TIM16->EGR |= TIM_EGR_UG;


Вот вам код настройки и запуска таймера с комплиментарными выходами и деад-таймом. Может поможет.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Спасибо за код, но уже разобрался. Сигнал на выходе уже появился.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Здравствуйте!
А можно ли в STM32 определить возникло прерывание по возрастающему или убывающему фронту, если прерывание стоит и по тому и по другому?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

в прерывании считать состояние ноги порта, пойдет?
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Я так и сделал, просто думал может там есть что-то типа флага, который фиксирует от какого фронта произошло оно... :dont_know:
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Здравствуйте!
Решил ознакомиться с аппаратной поддержкой энкодера. Вроде всё понятно, но один момент вызывает сомнения.
Вот настроили мы работу с энкодером с изменением состояния на каждом выходе, а дальше нам захотелось генерировать прерывание на каждый "щелчок" энкодера. Достаточно ли просто выставить прерывания по захвату с обоих выводов чтоб всё работало адекватно?
Ответить

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