Проблема при передаче данных по UART в stm32f103c8 (синяя таблетка) - PullRequest
2 голосов
/ 30 апреля 2020

Я новичок во встроенных системах. Я пытаюсь записать данные на UART2 на плате stm32f103c8 (т. Е. На плате blue pill ) и хочу просмотреть данные в одном из портов моего компьютера, используя рекламный блок FTDI , который подключен к UART2 платы stm32f103c8 . Но на моей консоли я получаю некоторый случайный квадратный блок вместо символа, который я хочу передать.

Вот мой код, написанный на Keil IDE.

#include "stm32f10x.h"                  // Device header

void usart2_init(void);
void USART_write(int data);
void delayMs(int delay);

int main(void)
{
    usart2_init();
    while(1)
    {
       USART_write('A');
       delayMs(5000);
    }                                                                                                
}                                                                                                 
void usart2_init(void)                                                                               
{
       //Enable clock source for USART2
       RCC->APB1ENR |= 0x20000;                   //0b 0000 0000 0000 0010 0000 0000 0000 0000
       RCC->APB2ENR |= 0x4;
       GPIOA->CRL |= 0x900;                       //Set PA2 as TX pin (AF)
       USART2->BRR  = 0x341;                      //Setting Baudrate to 9600 @8 MHz.
       USART2->CR1 |= 0x00008;                    //Enable TX only
       USART2->CR1 |= 0x02000;                    //Enable USART module by setting bit 13 to 1 i 
       USART->CR1 register
}
void USART_write(int data)
{
    //We need to wait until Tx buffer is empty for sending data.
    while(!(USART2->SR & 0x0080));                //0x0080
    USART2->DR = (data & 0xFF);
}
void delayMs(int delay)
{
    int i;
    for(;delay>0;delay--)
    {
        for(i=0; i<3195;i++)
        {
        }
    }
}

Ниже я прикрепил скриншот во время отладки. Нажмите здесь, чтобы увидеть скриншот . Вы можете увидеть нежелательный квадратный блок вместо символа вместо символов, которые я хочу передать. На рисунке вы также можете видеть регистры UART и их значения. Я использую st-link2 для загрузки прошивки.

Мне не хватает какой-то информации или я ошибаюсь при работе с FTDI и термином tera? Это мой тера термин конфигурации:

  • Скорость передачи = 9600
  • Данные = 8 бит
  • Четность = нет
  • Стоп бит = 1
  • Контроль потока = нет

Требуется помощь. Заранее спасибо!

1 Ответ

1 голос
/ 01 мая 2020

При работе с этими устройствами необходимо внимательно прочитать таблицы данных / справочные руководства и, возможно, соответствующие 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, что упрощает использование.

...