STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Те, что внутри IARа... "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\inc\ST\iostm32f051x8.h"
Аналогично приходилось писать и под STM8L.
Возможно я туп, но никак не могу въехать в SPLовскую структуру.
Пока нашел только что CC1S надо прописывать пока CC1E не установлен в 1. Но это не помогает. Пробник на этих двух выводах ничего не показывает. На порты тактирование подал. Порты как GPIO работают, если MODERx = 1.
Аналогично приходилось писать и под STM8L.
Возможно я туп, но никак не могу въехать в SPLовскую структуру.
Пока нашел только что CC1S надо прописывать пока CC1E не установлен в 1. Но это не помогает. Пробник на этих двух выводах ничего не показывает. На порты тактирование подал. Порты как GPIO работают, если MODERx = 1.
- Реклама
Re: STM32 новичку в ARM что к чему
Вот ещё вопрос созрел, чистое любопытство
.
Как присвоить переменной значение регистра конкретного пина порта (чтоб в переменной был либо "0" либо "1"). Пока делаю только структуру из:
Просто таким макаром мы переводим ресурс МК лишним "IF"...
Как присвоить переменной значение регистра конкретного пина порта (чтоб в переменной был либо "0" либо "1"). Пока делаю только структуру из:
Код: Выделить всё
if((GPIOA->IDR & GPIO_IDR_1) == 0) then {(условие при пин = 0);} else{(условие при пин = 1);};Просто таким макаром мы переводим ресурс МК лишним "IF"...
Re: STM32 новичку в ARM что к чему
В тех хедерах, что я пользуюсь, это выглядит так
Код: Выделить всё
test = GPIOA_IDR_bit.IDR1Re: STM32 новичку в ARM что к чему
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 что к чему
Можете выложить свой чудо-хидер? хочу посмотреть как там реализовано обращение к битовым полям.
- Реклама
Re: STM32 новичку в ARM что к чему
uk8amk , обычная структура с битовыми полями .
Что привычно выходцам с 8ми биток . Мне так уже глаза режет ...
Что привычно выходцам с 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 что к чему
Если как в 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 я знаю. А вот что делать с битовыми полями.
__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 я знаю. А вот что делать с битовыми полями.
Re: STM32 новичку в ARM что к чему
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 что к чему
Вот и я хочу глянуть как оно там изнутри работает.
Только качать весь IAR ради этого не очень целесообразно.
Только качать весь IAR ради этого не очень целесообразно.
Re: STM32 новичку в ARM что к чему
uk8amk писал(а):Если как в SPL объявляется структура
__gpio_bits MyStruct;
Заполняется
MyStruct.ODR0 = 1;
И передаётся в порт
GPIOA->ODR = MyStruct
То вопросов нет.
В SPL передаются данные через структуру и работа с битами на уровне масок . Здесь же представление регистра в виде структуры с битовыми полями.
Бросайте SPL , мой вам совет. Иначе будет еще хуже..
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: STM32 новичку в ARM что к чему
SPL и так не использую. Ну иногда бывает конечно по мелочи подсмотреть надо.
Я просто пытаюсь разобраться. Если допустим я объявляю структуру, то она кладётся в область ОЗУ. Чтобы структуру натянуть на адрес конкретного периферийного порта, нужно создать секцию памяти в скрипте линкера и объявлять с соответствующими атрибутами. Причём если порты идут не последовательно, потребуется создать соответствующее кол-во секций. И могут появиться проблемы при невыровненном доступе к данным(а многие модули периферии его не поддерживают).
Через указатели в этом плане конечно проще. Что-то вроде такого:
TIM1_CR1->CEN = 1;
Да и подобная запись весьма удобна. К примеру пишешь TIM1_CR1-> и у тебя сразу вываливается список битовых полей. Не надо по каждому чиху лезть в CMSIS и искать куда же запропастилось объявление этого бита.
Я просто пытаюсь разобраться. Если допустим я объявляю структуру, то она кладётся в область ОЗУ. Чтобы структуру натянуть на адрес конкретного периферийного порта, нужно создать секцию памяти в скрипте линкера и объявлять с соответствующими атрибутами. Причём если порты идут не последовательно, потребуется создать соответствующее кол-во секций. И могут появиться проблемы при невыровненном доступе к данным(а многие модули периферии его не поддерживают).
Через указатели в этом плане конечно проще. Что-то вроде такого:
TIM1_CR1->CEN = 1;
Да и подобная запись весьма удобна. К примеру пишешь TIM1_CR1-> и у тебя сразу вываливается список битовых полей. Не надо по каждому чиху лезть в CMSIS и искать куда же запропастилось объявление этого бита.
Re: STM32 новичку в ARM что к чему
uk8amk Не битовых полей а именованных констант, кои в данном случае являются битовыми масками.
uldemir, Кстати MISRA против битовых полей , так что мои рвотные рефлексы на IAR'вский код весьма обоснованы .
uldemir, Кстати MISRA против битовых полей , так что мои рвотные рефлексы на IAR'вский код весьма обоснованы .
Re: STM32 новичку в ARM что к чему
Апсалютно блева на ваши рвотные рефлексы. Лучше кто-нибудь подсказал бы почему у меня на выходе TIM16_CH1 ничего нет.
Re: STM32 новичку в ARM что к чему
А ты думаешь твой код читаем ? Тебе в лом писать как общепринято , мне в лом включать IAR ,создавать проект ...
Например не вижу включения тактирования - ни таймера ни порта ...
К тому же на предыдущих страницах был код инита таймеров и выходов и даже на TIM16 ...
Например не вижу включения тактирования - ни таймера ни порта ...
К тому же на предыдущих страницах был код инита таймеров и выходов и даже на TIM16 ...
Re: STM32 новичку в ARM что к чему
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;Вот вам код настройки и запуска таймера с комплиментарными выходами и деад-таймом. Может поможет.
Re: STM32 новичку в ARM что к чему
Спасибо за код, но уже разобрался. Сигнал на выходе уже появился.
Re: STM32 новичку в ARM что к чему
Здравствуйте!
А можно ли в STM32 определить возникло прерывание по возрастающему или убывающему фронту, если прерывание стоит и по тому и по другому?
А можно ли в STM32 определить возникло прерывание по возрастающему или убывающему фронту, если прерывание стоит и по тому и по другому?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: STM32 новичку в ARM что к чему
в прерывании считать состояние ноги порта, пойдет?
Re: STM32 новичку в ARM что к чему
Я так и сделал, просто думал может там есть что-то типа флага, который фиксирует от какого фронта произошло оно... 
Re: STM32 новичку в ARM что к чему
Здравствуйте!
Решил ознакомиться с аппаратной поддержкой энкодера. Вроде всё понятно, но один момент вызывает сомнения.
Вот настроили мы работу с энкодером с изменением состояния на каждом выходе, а дальше нам захотелось генерировать прерывание на каждый "щелчок" энкодера. Достаточно ли просто выставить прерывания по захвату с обоих выводов чтоб всё работало адекватно?
Решил ознакомиться с аппаратной поддержкой энкодера. Вроде всё понятно, но один момент вызывает сомнения.
Вот настроили мы работу с энкодером с изменением состояния на каждом выходе, а дальше нам захотелось генерировать прерывание на каждый "щелчок" энкодера. Достаточно ли просто выставить прерывания по захвату с обоих выводов чтоб всё работало адекватно?


