При работе с этими устройствами необходимо внимательно прочитать таблицы данных / справочные руководства и, возможно, соответствующие AN (примечания по применению), широко доступные на сайте производителя.
В конкретном случае c, STM32F10x Семейство работает обычно с системными часами 72 МГц, генерируемыми внутренним генератором, который использует внешний кристалл, имеющий частоту 8 МГц на синей таблетке, в качестве эталона для ФАПЧ (Phase Locked L oop) схема, которая управляет им. Кристаллический генератор 8 МГц называется HSE, что означает High Speed External oscillator.
Я сказал «в общем», потому что пользователь может выбирать разные системные тактовые частоты, программируя заданные c предварительные шкалы и внутренние тактовые схемы, которые может стать очень сложным на первый взгляд (и даже на втором…).
Теперь при условии стандартной конфигурации периферийных интерфейсов, где системная тактовая частота выбрана на 72 МГц, а предварительное масштабирование AHB равно 1, две периферийные тактовые частоты (PCLCKx) установлены на 36 МГц (PCLCK1: prescaler = 2) и 72 МГц (PCLCK2) соответственно.
На чипах STM32F10x только тактовая частота USART1 синхронизируется с PCLCK2, все остальные тактируются с PCKLK1 (макс. 36 МГц) ).
Таким образом, ваше устройство предположительно работает на частоте 36 МГц. Чтобы иметь скорость 9600 бод, нам нужен общий делитель 36 МГц / (9600 * 16) = 234,375.
Генератор скорости передачи может обрабатывать дробные деления, рассматривая целую и дробную части отдельно. Мы получаем:
DIV_Fraction = 16 * 0d0.375 = 0d6 = 0x06
DIV_Mantissa = 0d234 = 0xEA
USART_BRR = (DIV_Mantissa << 4) | DIV_Fraction = 0xEA6
Обозначение 0dxx
взято из документов ST и обозначает десятичное представление.
Заключение
Для работы с эти устройства внимательно прочитайте документацию перед началом программирования, по возможности используйте вспомогательные библиотеки. Лично я предпочитаю libopencm3 стандартным библиотекам HAL, что упрощает использование.