Я не могу определить точную причину вашей проблемы, но я могу дать некоторые предложения и сделать некоторые предположения.
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.