Настройка счетчика на STM32F405xx

Как правильно настроить Timer9 (TIM9) на STM32F405xx для подсчета импульсов по переднему фронту? Существует ли специальная конфигурация для вывода таймера за пределами этого короткого примера?

Вот что я сделал до сих пор, а также следовал примеру BRIEF из справочного руководства, скопированному здесь:

Например, чтобы настроить обратный счетчик для подсчета в ответ на нарастающий фронт на входе TI2, используйте следующую процедуру:

  1. Настройте канал 2 для обнаружения нарастающих фронтов на входе TI2, записав CC2S = '01' в регистре TIMx_CCMR1.

  2. Настройте длительность входного фильтра, записав биты IC2F[3:0] в регистр TIMx_CCMR1 (если фильтр не нужен, оставьте IC2F='0000').

  3. Выберите полярность переднего фронта, написав CC2P='0' и CC2NP='0' в регистре TIMx_CCER.
  4. Настройте таймер в режиме внешних часов 1, написав SMS='111' в регистре TIMx_SMCR.
  5. Выберите TI2 в качестве источника входного сигнала триггера, написав TS='110' в регистре TIMx_SMCR.
  6. Включите счетчик, написав CEN='1' в регистре TIMx_CR1.

Я считаю, что сделал все вышеперечисленное правильно, но чтение регистра всегда возвращает 0. Есть ли какие-либо дополнительные настройки в другом регистре для подключения к таймеру? Я читал, alternate functionsно не мог найти ничего конкретного о таймерах и пинах.

Я свободно следую этому как ссылке на код: https://www.ghielectronics.com/docs/108/register-access

Техническое описание чипа: http://www.st.com/web/en/resource/technical/document/datasheet/DM00037051.pdf

Справочное руководство по семейству микросхем: http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf

Вы включили все необходимые часы? Например, TIM9 находится на APB2, поэтому, если вы не включили эти часы, таймер не будет работать.
@A.Mac Интересно. Нашел регистр: RCC_APB2ENRв ref manual, но не могу найти адрес в datasheet.
@A.Mac, который я нашел RCCв шине AHB1, начиная с 0x40023800, и в справочном руководстве показано смещение 0x44 для RCC_APB2ENR. бит 16 - это TIM9EN. Я установил этот бит, и я все еще получаю ноль.
На самом деле нет необходимости напрямую иметь дело с адресами регистров.
Извините, я новичок в публикации на SE, поэтому я разместил комментарий, когда просто пытался добавить разрыв строки. В любом случае, как я уже говорил, вместо того, чтобы иметь дело непосредственно с адресами регистров, вы можете использовать более понятные для человека #define, такие как <code>RCC_APB2ENR</code>. Пока вы включили правильные заголовки, компилятор будет знать, о чем вы говорите. Например, чтобы включить часы для TIM2, вы должны использовать <code> RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; </code> Вам также было бы полезно опубликовать свой код (желательно после обновления с использованием регистровых адресов).
@A.Mac Я использую собственный класс, написанный GHI для netMF, для доступа к регистрам. Пожалуйста, посмотрите первую ссылку в моем вопросе, чтобы увидеть, как выглядит код. Я должен выкопать фактические регистры из таблиц данных.

Ответы (1)

Первое, что я всегда проверяю, это убедиться, что все часы, которые мне нужны, включены. Вам нужно убедиться, что часы для APB2 (TIM9) и AHB1 (GPIO) включены. Кроме того, функции таймера являются альтернативными функциями, поэтому вам необходимо установить биты GPIOx_MODERдля соответствующего порта и вывода, которые вы используете, а также соответствующие GPIOx_AFRyбиты.

Техническое описание и справочное руководство должны содержать всю необходимую информацию, иногда нужно просто немного потрудиться, чтобы найти то, что вы ищете.

Еще раз спасибо! Я забыл спросить, как правильно сбросить счетчик в TIMx_CNTрегистре обратно на 0? Я пытался использовать RCC_APB2RSTRдля сброса, но я думаю, что это возвращает все по умолчанию.
Я думаю, что понял: установка UGбита в 1, TIMx_EGRкажется, сбрасывает счетчик и не влияет на остальную часть настройки ... пока