Кто-то любит пирожки, а кто-то - нет.
Ознакомимся с такой очень полезной и простой периферией, как простой таймер (Basic timer), в микроконтроллерах STM32F4 простыми являются таймеры TIM6 и TIM7. Вообще, редкий микроконтроллер не имеет хоть какого-нибудь таймера для точного отсчёта времени. В STM32 все таймеры похожи по основным регистрам, просто в более сложных таймерах появляются новые флаги для настройки и новые регистры для контроля их работы в разных режимах.

Так вот, что же умеет и чем является даже самый простой и примитивный таймер?

читать дальше

<< Предыдущее Следующее >>

@темы: arm, программизмы, электроника, ассемблер, stm32f4discovery, stm32

Комментарии
12.11.2012 в 09:30

Project href doesn't working correctly(
12.11.2012 в 10:13

Кто-то любит пирожки, а кто-то - нет.
Гость, it's strange, for me mediafire.com works... Try a mirror on Google Drive.

If you need, I can send it to e-mail.
19.11.2012 в 20:47

Хотелось бы почитать про АЦП и прерывания. Больше интересует asm. А так в целом очень понравилось, все понятным языком расписано что аж приятно читать. На f103 писал на gcc asm и затруднялся перейти в кейл на f4, здесь нашел все необходимое, спасибо.
19.11.2012 в 21:19

Кто-то любит пирожки, а кто-то - нет.
Гость, прерывания чего? =) Или вообще? Так про прерывания у меня что-то было в цикле про механизмы ОС, в частности, где системный таймер.
АЦП... Хорошо, посмотрим на АЦП =)

Спасибо за отзыв ^^
19.11.2012 в 22:24

Вообще прерывания=)
Настройка, очистка, работа с прерыванием желательна.
Как написано на we.easyelectronics.ru, людей знающих asm на stm(arm) мало, используйте Си.
Поэтому возможно, ваш дневник и блог(+плюс пару статей на we.easyelectronics.ru) помогут увеличить количество людей пишущих именно на asm.
19.11.2012 в 22:35

Кто-то любит пирожки, а кто-то - нет.
Гость, про NVIC у меня было почти готово, потому вот, выложил. Может, несколько сумбурно, но старался выбрать самый минимум.

Надеюсь на это =)
06.03.2013 в 19:43

Здравствуйте, в ходе изучения данной статьи возник 1 глупый вопрос)
teplofizik, 2. Назначить предделитель, записав необходимое число в регистр TIMx_PSC. Частота счёта будет определяться как Ftclk / (TIMx_PSC + 1). Например, если мы тактируем таймер с частотой 8 МГц, а TIMx_PSC равен 7, то частота счёта (с какой скоростью будет увеличиваться значение счётчика) будет равна 8 / (7 + 1) = 1 МГц.

эта самая Ftclk чему равна если настройки предделителей шин не трогал? Где ее посмотреть? Как я понял надо смотреть частоту APB1 и в РМ указано, что максимальная частота этой шины 42МГц, однако реализовав простейшую моргалку на таймере получил результат отличный от ожидаемого(что конечно не удивительно при моем то опыте=D). Вот использованные константы:

длительность импульса вместо ожидаемой 1 секунда получилась 2+ секунды.

заметил еще одну особенность:

в этом варианте обработчика я поместил сброс бита TIM6_SR_UIF в самое начало.
В первом варианте сброс TIM6_SR_UIF был в конце обработчика и я наблюдал такую ситуацию, когда отлаживаю код через дебагер и ставлю брейкпоинт в нутри прерывания все работает гуд(светодиод инвенртируется по переполнению), а когда просто запускаю выполнение программы ничего не происходит(тоесть переполнение происходит, но светодиод не инертируется), как я понял выполнение подпрограммы заканчивалось раньше чем бит TIM6_SR_UIF оказывался сброшен, в результате чего инвертирование происходило повторно и визуально светодиод не успевал даже моргнуть. С чем может быть связанна такая особенность работы контроллера?
07.03.2013 в 07:38

Кто-то любит пирожки, а кто-то - нет.
Хм, точно не смотрел, но по памяти попробую посчитать:
HSI (внутренний RC) частота 16 МГц, предделителей на APB/AHB нет (RCC_CFGR==0). Частота периферийной шины такая же. Предделитель на таймер 42000. Частота счёта: 16 МГц / 42000 = 380 Гц. За 1000 циклов пройдёт порядка 1000/380 = 2,6 сек.

Чтоб 1 секунда была, надо и записать 380 =)

Ессно, это для случая, когда PLL не включён и выбран внутренний RC-генератор.
27.11.2013 в 21:13

Столкнулся с одной проблемкой, совершенно для меня непонятной. Ломаю голову довольно долго над ней. Хотелось бы твоего мнения узнать, может подскажешь чего?
Суть вопроса здесь:
27.11.2013 в 21:38

Кто-то любит пирожки, а кто-то - нет.
Гость, проверяйте источник прерывания. Вполне вероятно, что прерывание вызывается два раза подряд по разным причинам.
28.11.2013 в 00:13

Как оно может так вызываться? прерывание одно, и в обработчике я сбрасываю его флаг
28.11.2013 в 00:43

Кто-то любит пирожки, а кто-то - нет.
Гость, не знаю, надо завтра посмотреть. А что вообще за контроллер?
28.11.2013 в 07:34

Спасибо, ты ГЕНИЙ!!! До меня только утром дошло ))) Контроллер походу и правда 2 раза подряд вызывал программу обработки прерывания. Скорее всего, когда я сбрасываю флаг прерывания он попросту не успевает сбрасываться и обратно в это же прерывание заходит. Я вставил 8 NOP после того как флаг сбрасываю и стало нормально. Нужно еще немного поэкспериментировать, чтобы наверняка удостовериться, что дело в этом. Тут я походу немного не понимаю, как контроллер узнает, что из прерывания вышел? По идее для выхода из прерывания используется просто комманда перехода, так какая процессору нахрен разница? Может после использования регисра ссылки LR коммандой BX у него внутри как-то сбрасывается признак нахождения в прерывании? Можно этот момент пояснить? И еще, лучше наверное флаг прерывания сбрасывать сразу же в начале обработчика, чтобы лишними NOP память не забивать? И еще интересно как такая проблемка в СИ обходится?
28.11.2013 в 07:35

контроллер кстати stm32f103c8
28.11.2013 в 08:30

Кто-то любит пирожки, а кто-то - нет.
Гость, впервые слышу про такую проблему=) Про "не успевает" — выглядит как-то странно. Конечно, есть спец. инструкции, которые обязывают проц завершить все операции с памятью (memory barrier) прежде, чем выполнять следующую... Но, может, действительно, за две инструкции не успевает. Хотя там ещё сохранение/восстановление 8 регистров идёт. Я битбендом вообще не пользовался.

Тут я походу немного не понимаю, как контроллер узнает, что из прерывания вышел? По идее для выхода из прерывания используется просто комманда перехода, так какая процессору нахрен разница? Может после использования регисра ссылки LR коммандой BX у него внутри как-то сбрасывается признак нахождения в прерывании? Можно этот момент пояснить?
Я не очень понял вопрос Оо
Вообще, что проц делает при каждой команде можно посмотреть в technical reference manual на ядро. Там в псевдоинструкциях всё показано.