Те, что внутри IARа... "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\inc\ST\iostm32f051x8.h"
Аналогично приходилось писать и под STM8L.
Возможно я туп, но никак не могу въехать в SPLовскую структуру.
Пока нашел только что CC1S надо прописывать пока CC1E не установлен в 1. Но это не помогает. Пробник на этих двух выводах ничего не показывает. На порты тактирование подал. Порты как GPIO работают, если MODERx = 1.
Вот ещё вопрос созрел, чистое любопытство .
Как присвоить переменной значение регистра конкретного пина порта (чтоб в переменной был либо "0" либо "1"). Пока делаю только структуру из:
Если как в 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 я знаю. А вот что делать с битовыми полями.
uk8amk писал(а):Просто мне почему-то показалось что запись
TIM16_OCMR1_bit.OC1M = 7; // PWM mode 2 inactive until TIMx_CNT<TIMx_CCR1 else active
Напрямую работает с регистром таймера.
Она и работает напрямую. Читает, модифицирует и записывает. Если несмотреть на оптимальность, то работать, ведь, должно?
uk8amk писал(а):Если как в SPL объявляется структура
__gpio_bits MyStruct;
Заполняется
MyStruct.ODR0 = 1;
И передаётся в порт
GPIOA->ODR = MyStruct
То вопросов нет.
В SPL передаются данные через структуру и работа с битами на уровне масок . Здесь же представление регистра в виде структуры с битовыми полями.
Бросайте SPL , мой вам совет. Иначе будет еще хуже..
SPL и так не использую. Ну иногда бывает конечно по мелочи подсмотреть надо.
Я просто пытаюсь разобраться. Если допустим я объявляю структуру, то она кладётся в область ОЗУ. Чтобы структуру натянуть на адрес конкретного периферийного порта, нужно создать секцию памяти в скрипте линкера и объявлять с соответствующими атрибутами. Причём если порты идут не последовательно, потребуется создать соответствующее кол-во секций. И могут появиться проблемы при невыровненном доступе к данным(а многие модули периферии его не поддерживают).
Через указатели в этом плане конечно проще. Что-то вроде такого:
TIM1_CR1->CEN = 1;
Да и подобная запись весьма удобна. К примеру пишешь TIM1_CR1-> и у тебя сразу вываливается список битовых полей. Не надо по каждому чиху лезть в CMSIS и искать куда же запропастилось объявление этого бита.
А ты думаешь твой код читаем ? Тебе в лом писать как общепринято , мне в лом включать IAR ,создавать проект ...
Например не вижу включения тактирования - ни таймера ни порта ...
К тому же на предыдущих страницах был код инита таймеров и выходов и даже на TIM16 ...
dosikus писал(а):Надо не забывать, в С все что не 0 True ...
Можно, конечно, сохранять значение и в условии потом проверять на соответствие и несоответствие нулю, но может ведь встать задача получить именно единицу при положительном потенциале на выводе МК. Тогда такая структура заведёт нас куды подальше .
uldemir писал(а):Лучше кто-нибудь подсказал бы почему у меня на выходе TIM16_CH1 ничего нет.
Здравствуйте!
Решил ознакомиться с аппаратной поддержкой энкодера. Вроде всё понятно, но один момент вызывает сомнения.
Вот настроили мы работу с энкодером с изменением состояния на каждом выходе, а дальше нам захотелось генерировать прерывание на каждый "щелчок" энкодера. Достаточно ли просто выставить прерывания по захвату с обоих выводов чтоб всё работало адекватно?