Stm32 Time Base Interrupt (без какой-либо библиотеки) - PullRequest
0 голосов
/ 01 февраля 2020

Я использую процессор Stm32f103c8t6, ​​и я хочу сделать 1 секунду счетчик. Обычно я не использую обновление таймера, и мой счетчик считает правильно, но когда я добавляю обновление таймера в коде, мой счетчик не считается правильно. Столь быстрый прирост. И я не могу удалить флаг прерывания обновления (UIF) в регистре SR TIM1. Если я уберу этот флаг, мой код будет бесконечно l oop. Я не могу найти решение этой проблемы. Спасибо за помощь

1 Ответ

0 голосов
/ 01 февраля 2020

Я не могу определить точную причину вашей проблемы, но я могу дать некоторые предложения и сделать некоторые предположения.

1) Не используйте числа волхвов c ! Используйте предопределенные имена битов. Вот пример:

USART2->BRR = 0x1a0; // 115200 bps @ 24 MHz (OVER8=1, ONEBIT=1)
USART2->CR1 |= USART_CR1_OVER8 // Oversampling is reduced for higher baud rates
            | USART_CR1_IDLEIE // Idle line detection interrupt is enabled
            | USART_CR1_TE // Transmitter is enabled
            | USART_CR1_RE; // Receiver is enabled
USART2->CR3 |= USART_CR3_ONEBIT // One bit mode for increased clock deviation tolerance
            | USART_CR3_DMAT // DMA for TX
            | USART_CR3_DMAR; // DMA for RX
USART2->CR1 |= USART_CR1_UE; // Enable USART2

2) Использование функций CMSIS для доступа к функциональности NVI C. Вот пример:

NVIC_SetPriority(TIM6_DAC_IRQn, 2);
NVIC_EnableIRQ(TIM6_DAC_IRQn);

3) В регистре TIM1->CR1 установлен Auto-reload preload enable бит. Обычно это задерживает обновление регистра ARR до следующего события обновления. Я не уверен, как он работает во время первого запуска таймера, но я рекомендую избегать его использования, пока вы не уверены, что все работает нормально.

4) Обычно вы этого не делаете Необходимо очистить ожидающие биты в NVI C. Я предлагаю удалить этот код из ISR. Очистка флагов в периферийных регистрах - это все, что вам нужно, и вы уже делаете это с помощью строки TIM1->SR = 0.

5) Причина, по которой вы застряли в Infinite_Loop, - это, вероятно, USART TX прерывание. Его увольняют, но поскольку вы не предоставили ему ISR, он попадает в Default_Handler. Вы загружаете DR вручную в главную l oop, поэтому в этом случае вам даже не нужны прерывания USART TX.

...